Naprawa rutyn z oryginalnego Gothic I 2305 4

O temacie

Autor

Zaczęty 23.12.2013 roku

Wyświetleń 2305

Odpowiedzi 4

Kaldr
  • Gość
Hej! Chciałem naprawić rutyny z oryginału. Konkretnie chodzi mi o spanie i granie na lutni. Czynności są ciągle przerywane i wykonywane od nowa. Zacząłem już trochę zmieniać. Z ZS_Sleep usunąłem fragment kodu. Na razie dział dobrze, ale nie wiem czy nie wywoła to jakichś komplikacji. Wychodziłoby na to, że każda funkcja z ZS jest wywoływana po kolei od razu po sobie, a ja sądziłem, że ZS_x_end jest wywoływane tylko na końcu 9gdy kończy się czas zdefiniowany w rutynie w skrypcie NPC). Może można jakoś to zmienić, żeby ZS_x_loop była wywoływana cały czas, a ZS_x_end dopiero jak się kończy czas rutyny ustalony w skrypcie NPC? Mam tutaj ten kod:
/************************************************
*              NSC benutzt Bett,                *
* wenn kein Bett da, macht der ZS_StandAround   *
*************************************************/
/*

AI_PlayAniBS (self, "T_BED_FRONT_S1_2_S0",BS_SIT );
AI_PlayAniBS (self, "T_BED_FRONT_S0_2_STAND",BS_SIT );
/*  */
func void ZS_Sleep()
{
PrintDebugNpc (PD_TA_FRAME,"ZS_Sleep");

B_SetPerception (self);   
AI_SetWalkmode (self, NPC_WALK);
if (!C_BodyStateContains(self,BS_MOBINTERACT))
{
if (Hlp_StrCmp(Npc_GetNearestWP(self), self.wp)== 0)
        {
AI_GotoWP (self, self.wp);
};
};
AI_StartState (self, ZS_SleepBed, 1, "");
};

func void ZS_SleepBed()
{
    PrintDebugNpc (PD_TA_FRAME,"ZS_SleepBed_Loop");
   
    LightSleepPerception();
   
if (Wld_IsMobAvailable (self,"BED"))
{
    AI_UseMob (self, "BED",1);
}
else if (Wld_IsMobAvailable (self,"BEDHIGH")||Wld_IsMobAvailable (self,"BEDLOW"))
{
    AI_UseMob (self, "BEDHIGH",1); //Mehrfache Mob-Benutzung okay, weil nachfolgende UseMobs ignoriert werden, wenn UseMob schon aktiv ist
    AI_UseMob (self, "BEDLOW",1); // Mobs werden nur benutzt, wenn NSC sie sehen kann und wenn sie frei sind (sagt Ulf)
}
else
{
AI_StartState (self, ZS_StandAround, 1, "");
};
};

func int ZS_SleepBed_Loop()
{
PrintDebugNpc (PD_TA_LOOP,"ZS_SleepBed_Loop");

// SN: Workaround dafür, daß Wld_IsMobAvailable() zwar TRUE geliefert hat, AI_UseMob() aber gescheitert ist!
if !C_BodyStateContains(self,BS_MOBINTERACT)
&& (Npc_GetStateTime(self) > 3)
{

// AI_StartState (self, ZS_SitAround, 1, "");
AI_StartState (self, ZS_SleepBed, 1, ""); //edit by gothic1210
print ("Debug trololo");
};

AI_Wait (self, 1);
return LOOP_CONTINUE;
};

func void ZS_SleepBed_End()
{
PrintDebugNpc (PD_TA_FRAME,"ZS_SleepBed_End");

if Wld_IsTime(07,00, 08,30)
{
B_Say (self, NULL, "$AWAKE");
};
/*******\
//!!!!! TO USUNĄŁEM !!!
/*******\
// AI_UseMob (self,"BEDHIGH",-1);
// AI_UseMob (self,"BEDLOW",-1);
// AI_UseMob (self,"BED",-1);
};

func void B_SleepQuietSound ()
{
PrintDebugNpc (PD_TA_DETAIL, "B_SleepQuietSound");

if ((Npc_GetDistToNpc(self,other) < PERC_DIST_DIALOG)
&& Npc_CanSeeNpcFreeLOS(self,other) )
{
AI_StartState (self, ZS_WakeUp, 0, "");
}
else
{
B_TossAndTurn ();
};
};

A druga rutyna:
/*****************************************
* NSC sucht PLAYTUNE-FP und spielt Laute *
*****************************************/

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

FUNC VOID ZS_PlayTune_Loop ()
{
    PrintDebugNpc(PD_TA_LOOP,"ZS_PlayTune_Loop");

if (Npc_HasItems (self,ItMiLute) ==0)
{
CreateInvItem ( self, ItMiLute);
};
/* if !(Npc_IsOnFP(self,"PLAYTUNE"))
{
AI_GotoFp (self,"PLAYTUNE");
AI_AlignToFP( self ); //Richte Dich aus
};
if (!C_BodyStateContains(self, BS_ITEMINTERACT))
{
AI_UseItemToState (self,ItMiLute,1);
};*/
AI_UseItem (self,ItMiLute);//ToState,1

/*
if (C_BodyStateContains(self, BS_ITEMINTERACT))
{
    var int tunereaktion;
    tunereaktion = Hlp_Random (100);
   
    if (tunereaktion >= 50)
    {
    AI_PlayAniBS (self,"T_LUTE_RANDOM_1",BS_ITEMINTERACT);
    }
    else if (tunereaktion >= 00)
    {
    AI_PlayAniBS (self,"T_LUTE_RANDOM_2",BS_ITEMINTERACT);
    };
    };
//AI_AlignToFP(self);
*/
};

FUNC VOID ZS_PlayTune_End()
{
// AI_UseItemToState (self,ItMiLute,-1);

PrintDebugNpc(PD_TA_FRAME,"ZS_PlayTune_End");
};
Tutaj większość dałem w komentarz i zostawiłem tylko AI_Useitemtosate. Gdy tego używałem npc grali ciągle, ale nie było widać lutni. Kiedy użyłem AI_Useitem to znów przerywali co chwila czynność.
Jakieś sugestie? Pomysły jak to rozwiązać?
 

chicken

chicken

RaveN Studio
posty1230
Propsy559
ProfesjaNierób
  • RaveN Studio
Na lutnie
/*****************************************
* NSC sucht PLAYTUNE-FP und spielt Laute *
*****************************************/
FUNC VOID ZS_PlayTune()
{
    PrintDebugNpc(PD_TA_FRAME,"ZS_PlayTune");
    
   B_SetPerception (self);    
   AI_SetWalkmode (self,NPC_WALK);
   if !(Npc_IsOnFP(self,"PLAYTUNE"))
   {
      AI_GotoWP(self, self.wp);               // Gehe zum Tagesablaufstart
   };
};
FUNC VOID ZS_PlayTune_Loop ()
{
    PrintDebugNpc(PD_TA_LOOP,"ZS_PlayTune_Loop");
   
   if (Npc_HasItems (self,ItMiLute) <=1)
   {
      CreateInvItem ( self, ItMiLute);
   };   
   if !(Npc_IsOnFP(self,"PLAYTUNE"))
   {
      AI_GotoFp (self,"PLAYTUNE");
      AI_AlignToFP( self );            //Richte Dich aus
   };
   if (!C_BodyStateContains(self, BS_ITEMINTERACT))
   {
      AI_UseItemToState    (self,ItMiLute,1);
   };
/*   
   if (C_BodyStateContains(self, BS_ITEMINTERACT))
   {
       var int tunereaktion;
       tunereaktion = Hlp_Random (100);
      
       if (tunereaktion >= 50)
       {
          AI_PlayAniBS (self,"T_LUTE_RANDOM_1",BS_ITEMINTERACT);
       }
       else if (tunereaktion >= 00)
       {
          AI_PlayAniBS (self,"T_LUTE_RANDOM_2",BS_ITEMINTERACT);
       };
    };   
   //AI_AlignToFP(self);
*/   
};
FUNC VOID ZS_PlayTune_End() 

   AI_UseItemToState    (self,ItMiLute,-1);
   
   PrintDebugNpc(PD_TA_FRAME,"ZS_PlayTune_End");
};

Na spanie
/************************************************
*              NSC benutzt Bett,                *
* wenn kein Bett da, macht der ZS_StandAround   *
*************************************************/
func void ZS_Sleep()
{
   PrintDebugNpc       (PD_TA_FRAME,"ZS_Sleep");
   
   B_SetPerception      (self);    
   AI_SetWalkmode       (self,   NPC_WALK);
   if (!C_BodyStateContains(self,BS_MOBINTERACT))
   {
      if (Hlp_StrCmp(Npc_GetNearestWP(self), self.wp)== 0)
        {
         AI_GotoWP   (self, self.wp);
      };
   };
   AI_StartState      (self, ZS_SleepBed, 1, "");
};     
     
func void ZS_SleepBed()     
{
    PrintDebugNpc       (PD_TA_FRAME,"ZS_SleepBed_Loop");
    
    LightSleepPerception();
    
   if (Wld_IsMobAvailable (self,"BED"))
   {
       AI_UseMob      (self,   "BED",1);
   }
   else if (Wld_IsMobAvailable (self,"BEDHIGH")||Wld_IsMobAvailable (self,"BEDLOW"))
   {
       AI_UseMob      (self,   "BEDHIGH",1); //Mehrfache Mob-Benutzung okay, weil nachfolgende UseMobs ignoriert werden, wenn UseMob schon aktiv ist
       AI_UseMob       (self,   "BEDLOW",1); // Mobs werden nur benutzt, wenn NSC sie sehen kann und wenn sie frei sind (sagt Ulf)
   }
   else
   {
      AI_StartState   (self, ZS_StandAround, 1, "");
   };
};
func int ZS_SleepBed_Loop()
{
   PrintDebugNpc       (PD_TA_LOOP,"ZS_SleepBed_Loop");
   // SN: Workaround dafür, daß Wld_IsMobAvailable() zwar TRUE geliefert hat, AI_UseMob() aber gescheitert ist!
   if   !C_BodyStateContains(self,BS_MOBINTERACT)
   &&   (Npc_GetStateTime(self) > 3)
   {
      AI_StartState   (self, ZS_SitAround, 1, "");
   };   
   
   AI_Wait            (self, 1);
   return            LOOP_CONTINUE;
};
func void ZS_SleepBed_End()
{
   PrintDebugNpc       (PD_TA_FRAME,"ZS_SleepBed_End");
   if   Wld_IsTime(07,00,   08,30)
   {
      B_Say         (self, NULL, "$AWAKE");   
   };
   AI_UseMob         (self,"BEDHIGH",-1);
   AI_UseMob         (self,"BEDLOW",-1);
   AI_UseMob         (self,"BED",-1);
};
func void B_SleepQuietSound ()
{
   PrintDebugNpc       (PD_TA_DETAIL,   "B_SleepQuietSound");
   
   if ((Npc_GetDistToNpc(self,other) < PERC_DIST_DIALOG)
   &&    Npc_CanSeeNpcFreeLOS(self,other)               )
   {
      AI_StartState   (self,   ZS_WakeUp, 0, "");
   }
   else
   {
      B_TossAndTurn   ();
   };
};
   

Kaldr
  • Gość
Przecież ty mi podałeś rutyny z oryginału! A wiadomo, że one źle działają. Ja je właśnie chcę poprawić. 
 

chicken

chicken

RaveN Studio
posty1230
Propsy559
ProfesjaNierób
  • RaveN Studio
Ja nie mam problemu. Tam nie ma co poprawiać.

RafalBudzis

RafalBudzis

Użytkownicy
posty1967
Propsy808
ProfesjaSkrypter
  • Użytkownicy
Loop - wykonuje się cały czas
End - wykonuje się przy kończeniu ZS`a

ZS`a można "zakończyć" na 3 sposóby
1) dać AI_StartState   (self, ZS_NAZWA 1, ""); //zmieniasz wykonywanego ZSa wiec poprzedni się musi zakończyć więc dając  te linijke do Loop można wywołać zakończenie.
2) zadziałanie którejś z reakcji przypisywanych do rutyn np. rozpoczęcie dialogu.
3) zakończenie się czasu wykonywanej rutyny.


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