PlaySound - utwór grany w grze 2461 8

O temacie

Autor TheKetrab

Zaczęty 24.12.2017 roku

Wyświetleń 2461

Odpowiedzi 8

TheKetrab

TheKetrab

Użytkownicy
posty334
Propsy217
ProfesjaProducent
  • Użytkownicy
Dzień dobry,

chcę, by wieczorem w karczmie był grany minutowy utwór na gitarze (mniej więcej jak, 'przez mgłę widzę wyspę'). Zrobiłem to w następujący sposób: w rutynie Play_Lute usunąłem grane dźwięki i wstawiłem swój utwór.

// *********************************
// NSC benutzt Item Lute an Stand-FP
// *********************************

func void ZS_Play_Lute ()
{
Perception_Set_Normal();

B_ResetAll (self);

AI_SetWalkmode (self,NPC_WALK);

if (Npc_GetDistToWP (self,self.wp) > TA_DIST_SELFWP_MAX)
    {
AI_GotoWP (self, self.wp);
};

if (Npc_HasItems (self,ItMi_Lute) == 0)
{
CreateInvItem (self,ItMi_Lute);
};
self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

func int ZS_Play_Lute_Loop ()
{
if (Npc_IsOnFP (self, "STAND"))
{
AI_AlignToFP (self);
if (self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
  {
  self.aivar[AIV_TAPOSITION] = NOTINPOS;
  };
}
else if (Wld_IsFPAvailable(self,"STAND"))
{
AI_GotoFP (self, "STAND");
AI_StandUp (self);
AI_AlignToFP (self);
self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
}
else
{
AI_AlignToWP (self);
if (self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
  {
  self.aivar[AIV_TAPOSITION] = NOTINPOS;
  };
};

if (self.aivar[AIV_TAPOSITION] == NOTINPOS)
{
AI_UseItemToState (self,ItMi_Lute,1);
Snd_Play ("FREE_MINE_GUITAR");
self.aivar[AIV_TAPOSITION] = ISINPOS;
};

return LOOP_CONTINUE;
};

func void ZS_Play_Lute_End ()
{
AI_UseItemToState (self, ItMi_Lute, -1);
};


Dźwięk działa, ale problemy są inne:
1. Muzyka (która normalnie gra) się nie wycisza.
2. Gdy zagaduję gościa, który gra, on rozmawia ze mną, nie przerywa dźwięku, a gdy przestaję z nim gadać, to ponawia swoją rutynę i nakładają się na siebie dwie melodie niczym kanon.
3. Utwór słychać z za dużej odległości, oraz gdy odejdę na odległość (a utwór już gra) to się nie wycisza - a powinien.

Czy ktoś mógłby mi doradzić, jak pozbyć się dwóch ww. problemów?
 

Cruc

Cruc

Użytkownicy
posty667
Propsy236
Profesjabrak
  • Użytkownicy

Cruc

PlaySound - utwór grany w grze
#1 2017-12-24, 10:53(Ostatnia zmiana: 2017-12-24, 11:00)
W Mrocznych Tajemnicach było to rozwiązane w ten sposób, że dodany był nowy item, który odgrywał własny utwór.

EDIT: Przejrzałem skrypty z MT. To jednak nie przez nowy item. Przepraszam za błędne info.
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

TheKetrab

TheKetrab

Użytkownicy
posty334
Propsy217
ProfesjaProducent
  • Użytkownicy
A co w takim razie mówią tamtejsze skrypty?
 

Cruc

Cruc

Użytkownicy
posty667
Propsy236
Profesjabrak
  • Użytkownicy
Rutyna Play_EXTune to praktycznie przepisanie rutyny Play_Tune.

Spoiler
FUNC VOID ZS_PlayEXTune()
{
    PrintDebugNpc(PD_TA_FRAME,"ZS_PlayTune");
   
   
   AI_SetWalkmode (self,NPC_WALK);
   if !(Npc_IsOnFP(self,"PLAYTUNE"))
   {
      AI_GotoWP(self, self.wp);               // Gehe zum Tagesablaufstart
   };
};

FUNC VOID ZS_PlayEXTune_Loop ()
{
    PrintDebugNpc(PD_TA_LOOP,"ZS_PlayTune_Loop");
   
   if (Npc_HasItems (self,EXLute) <=1)
   {
      CreateInvItem ( self, EXLute);
   };   
   if !(Npc_IsOnFP(self,"PLAYTUNE"))
   {
      AI_GotoFp (self,"PLAYTUNE");
      AI_AlignToFP( self );            //Richte Dich aus
   };
   if (!C_BodyStateContains(self, BS_ITEMINTERACT))
   {
      AI_UseItemToState    (self,EXLute,1);
      
      
   };

};

FUNC VOID ZS_PlayEXTune_End()
{
   AI_UseItemToState    (self,EXLute,-1);
   
   PrintDebugNpc(PD_TA_FRAME,"ZS_PlayTune_End");
};

W skrypcie itemku też nic nie ma:

Spoiler
INSTANCE ExLute (C_Item)
{
   name             =   "Lutnia Exclusive";

   mainflag          =   ITEM_KAT_NONE;
   flags             =   ITEM_MULTI;
   value             =   Value_Laute;

   visual             =   "ItMi_Lute_01.3DS";
   material          =   MAT_WOOD;

   scemeName         =   "LUTE";
   on_state[0]         = UseEXLute;
   description         = name;
   TEXT[4]            = NAME_Value;               COUNT[4]   = value;
};
func void UseEXLute()
{
   if (Play_EXLute == FALSE)
   && Npc_IsPlayer (self)
   {
      B_GiveXP (10);
      Play_EXLute = TRUE;
   
   };
};

Co więcej, użycie tej lutni daje graczowi dokładnie taki sam efekt jak użycie zwykłej.

Co ciekawe, w pliku z dźwiękami można znaleźć taką linijkę:

Spoiler
INSTANCE Inst_EXLute                  (C_SFX_DEF) {file= "lute_01.wav";               vol = 0;         };

Niczego więcej nie znalazłem, więc jedynie domyślam się, że w tawernie mógł być jakiś trigger, ale nie mogę tego sprawdzić, bo nie mam spacera do pierwszej części :/
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

Splash

Splash

Moderator
posty4209
Propsy3412
ProfesjaNierób
  • Moderator
Wydałeś grze polecenie by odtworzyła dźwięk, to teraz go odtwarza. To nie działa tak, że dopóki funkcja jest wywoływana non-stop, to dźwięk będzie odtwarzany dalej. Ba, ta funkcja została wywołana raz, to też dźwięk został odtworzony tylko raz. Gdyby to działało na tej zasadzie, odtwarzanie dźwięków lutni byłoby w skryptach, a nie MDSie.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Cruc

Cruc

Użytkownicy
posty667
Propsy236
Profesjabrak
  • Użytkownicy
Podrzucam Ci oryginalne skrypty z InExtremo. Jak myślałem - rozwiązaniem jest trigger.

Spoiler
func void B_InExtremoStartMusic()
{
//   Um die Musikzone zu aktivieren (damit die OC-Musik um die Bühne herum nicht zu hören ist, solange IE spielen!)
   Wld_SendTrigger ("INEXTREMO_IE");

// SoundVob zu aktivieren, der das Musikstück spielt
   Wld_SendTrigger ("INEXTREMO_MUSIK");

   InExtremoPlaying = TRUE;
};

func void B_InExtremoStopMusic()
{
// Sound-Vob deaktivieren, der das Musikstück spielt
   Wld_SendUnTrigger ("INEXTREMO_MUSIK");

// Um die Musikzone zu deaktivieren (OC-Musik-Zone wieder aktiv)
   Wld_SendUnTrigger ("INEXTREMO_IE");

   InExtremoPlaying = FALSE;
};
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

TheKetrab

TheKetrab

Użytkownicy
posty334
Propsy217
ProfesjaProducent
  • Użytkownicy
Gdyby to działało na tej zasadzie, odtwarzanie dźwięków lutni byłoby w skryptach, a nie MDSie.

Czyli MT zrobiło to przez MDSa? Np. tym: ?
*eventSFX (numer_klatki "nazwa_sfx_lub_pliku_wav" R:zasięg_w_cm EMPTY_SLOT - odtworzenie dźwięku, np *eventSFX (10 "Swim"), część parametrów jest opcjonalna: zasięg słyszalności i EMPTY_SLOT (którego nie użycie powoduje że poprzedni efekt dźwiękowy zostanie przerwany przez ten)
 

Bogdan Zwei

Bogdan Zwei

Użytkownicy
Wulgarny skurwiel pierdolony.
posty1864
Propsy541
Profesjabrak
  • Użytkownicy
  • Wulgarny skurwiel pierdolony.
Nie. W MT to zrobili na triggerach. Każdy trigger wyzwala się raz na [długość melodii]. Jest parę rodzajów triggerów, np. ten który odpowiada za muzykę (ale to akurat chyba się nie nazywa trigger, nie pamiętam).
 
:ok: zachęca do dalszej pomocy. Nie zapominaj o tym!

Prywatne wiadomości typu "Ej, pomocy" kasuję od razu. Od tego jest forum, a nie PW.

To me, defeat in anything is merely temporary, and its punishment is but an urge for me to greater effort to achieve my goal. Defeat simply tells me that something is wrong in my doing; it is a path leading to success and truth.

In order to realize our true self we must be willing to live without being dependent upon the opinion of others.

Splash

Splash

Moderator
posty4209
Propsy3412
ProfesjaNierób
  • Moderator
Ten trigger po prostu aktywuje obiekt zCVobSound, który odtwarza przypisany mu dźwięk. W tym przypadku muzyka In Extremo. W MT działa to dokładnie tak samo, z tą różnicą, że ten dźwięk to kilka utworów zapisanych w jednym pliku.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry