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ć?