Code:
func void ZS_FollowPC()
{
PrintDebugNpc(PD_TA_FRAME,"ZS_FollowPC");
Npc_PercEnable(self,PERC_ASSESSENEMY,B_AssessEnemy);
Npc_PercEnable(self,PERC_ASSESSPLAYER,B_FollowPC_AssessSC);
Npc_SetPercTime(self,1);
self.senses = SENSE_SEE | SENSE_HEAR | SENSE_SMELL;
Npc_PercEnable(self,PERC_ASSESSDAMAGE,ZS_ReactToDamage);
Npc_PercEnable(self,PERC_ASSESSCASTER,B_AssessCaster);
Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagic);
Npc_PercEnable(self,PERC_ASSESSMURDER,ZS_AssessMurder);
Npc_PercEnable(self,PERC_ASSESSDEFEAT,ZS_AssessDefeat);
Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_AssessFightSound);
Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk);
Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob);
self.aivar[AIV_ITEMFREQ] = 0;
};
func int ZS_FollowPC_Loop()
{
if(C_BodyStateContains(hero,BS_CLIMB) && (self.aivar[AIV_ITEMFREQ] == 0))
{
hero.wp = Npc_GetNearestWP(hero);
self.aivar[AIV_ITEMFREQ] = 1;
AI_SetWalkMode(self,NPC_RUN);
AI_GotoWP(self,hero.wp);
return LOOP_CONTINUE;
}
else if(C_BodyStateContains(hero,BS_CLIMB) && (self.aivar[AIV_ITEMFREQ] == 1))
{
AI_Wait(self,0.5);
return LOOP_CONTINUE;
}
else if(!C_BodyStateContains(hero,BS_CLIMB) && (self.aivar[AIV_ITEMFREQ] == 1))
{
hero.wp = Npc_GetNearestWP(hero);
self.aivar[AIV_ITEMFREQ] = 2;
AI_StopLookAt(self);
AI_SetWalkMode(self,NPC_RUN);
AI_GotoWP(self,hero.wp);
return LOOP_CONTINUE;
}
else if(self.aivar[AIV_ITEMFREQ] == 2)
{
if(C_BodyStateContains(hero,BS_CLIMB))
{
self.aivar[AIV_ITEMFREQ] = 0;
return LOOP_CONTINUE;
}
else if(Npc_GetDistToNpc(self,hero) > 400)
{
self.aivar[AIV_ITEMFREQ] = 1;
return LOOP_CONTINUE;
};
self.aivar[AIV_ITEMFREQ] = 0;
};
if((self.id == 524) && !self.aivar[AIV_PARTYMEMBER])//vlk_524_dusty
{
return LOOP_END;
};
if(C_BodyStateContains(hero,BS_WALK))
{
AI_SetWalkMode(self,NPC_WALK);
}
else if(!C_BodyStateContains(self,BS_SWIM))
{
AI_SetWalkMode(self,NPC_RUN);
};
if(Npc_GetDistToNpc(self,hero) > 300)
{
AI_GotoNpc(self,hero);
}
else if(!C_BodyStateContains(self,BS_CLIMB))
{
B_SmartTurnToNpc(self,hero);
};
return LOOP_CONTINUE;
};
func void ZS_FollowPC_End()
{
PrintDebugNpc(PD_TA_FRAME,"ZS_FollowPC_End");
self.senses = hero.senses;
self.aivar[AIV_ITEMFREQ] = 0;
};
func void B_FollowPC_AssessSC()
{
PrintDebugNpc(PD_TA_FRAME,"B_FollowPC_AssessSC");
if((Npc_GetDistToNpc(self,hero) < 300) && !C_BodyStateContains(self,BS_CLIMB) && !self.aivar[AIV_ITEMFREQ])
{
PrintDebugNpc(PD_TA_CHECK,"...SC-Meister jetzt nahe genug!");
B_FullStop(self);
};
if(Npc_CheckInfo(self,1))
{
PrintDebugNpc(PD_TA_CHECK,"...wichtige Info zu vergeben!");
if(!hero.aivar[AIV_INVINCIBLE])
{
hero.aivar[AIV_IMPORTANT] = TRUE;
B_FullStop(other);
B_FullStop(self);
};
AI_StartState(self,ZS_Talk,0,"");
return;
};
};