-
ZS_Follow_Player - Problem mit verschiedenen "Gangarten" für den NPC
Ich habe den Tagesablauf "ZS_Follow_Player" etwas umgebaut, damit der NPC, der dem Spieler folgt, seine Gangart der des Spielers anpasst. Das funktioniert soweit ganz gut, trotzdem gibt es folgenden "Schönheitsfehler": Wenn der Spieler zum Beispiel vom schleichen zum rennen wechselt, der NPC aber dem Spieler in diesem Moment noch folgt weil die Distanz zum Helden größer ist, als self.aivar[AIV_FollowDist], schleicht er dem Spieler weiterhin hinterher, wechselt also die Gangart nicht mit. Das tut er so lange, bis er dann nah genug an ihm dran ist und stehen bleibt. Erst dann wechselt auch die Gangart vom NPC.
Ich denke, das Problem ist, dass die Gangart einfach nicht gewechselt wird, solange der NPC sich noch in der vorherigen Gangart-Animation befindet. Ich müsste den NPC doch also eigentlich einfach nur immer, wenn sich die Gangart (BodyState) vom Helden geändert hat und sich auch die vom NPC ändern soll, irgendwie dazu bringen, ganz kurz stehen zu bleiben. Nur wie?
Die Funktion sieht so aus (ZS_Follow_Player_Loop):
(rot --> Neu)
Code:
func int ZS_Follow_Player_Loop ()
{
if (Npc_GetDistToNpc (self, hero) > self.aivar[AIV_FollowDist])
{
// ------ normale Behandlung ------
if (!C_BodyStateContains(self, BS_SWIM))
{
if (C_BodyStateContains(hero, BS_WALK)) && (!C_BodyStateContains(self, BS_WALK)) { // HERO LÄUFT
AI_SetWalkMode (self, NPC_WALK);
} else if (C_BodyStateContains(hero, BS_RUN)) && (!C_BodyStateContains(self, BS_RUN)) { // HERO RENNT
AI_SetWalkMode (self, NPC_RUN);
} else if (C_BodyStateContains(hero, BS_SNEAK)) && (!C_BodyStateContains(self, BS_SNEAK)) { // HERO SCHLEICHT
if (Npc_GetTalentSkill (self, NPC_TALENT_SNEAK) >= 1) {
AI_SetWalkMode (self, NPC_SNEAK);
};
};
};
AI_StopLookAt (self);
AI_GotoNpc (self, hero);
self.aivar[AIV_TAPOSITION] = FALSE;
}
else
{
if (Npc_GetStateTime(self) > 1)
{
Npc_SetStateTime (self, 0);
if (!Npc_CanSeeNpc (self, hero))
{
B_TurnToNpc (self, hero);
} else if (Npc_CanSeeNpc (self, hero)) {
AI_LookAtNpc (self, hero);
};
};
};
return LOOP_CONTINUE;
};
Ich habe auch schon probiert, das ganze einfach vor Npc_GetDistToNpc zu schreiben, es besteht aber auch dann leider immer noch das gleiche Problem.
-
Ohne Gewähr: Du könntest es mal mit AI_StandUpQuick(self); gefolgt von Npc_ClearAIQueue (self); probieren.
-
NPC while it is in state ZS_Follow_Player has it's AI queue busy with command AI_GotoNPC.
You can however use perception PERC_ASSESSPLAYER to have your code, which checks walk-mode running in parallel with ZS_Follow_Player:
(I am using NPC_GetWalkMode function [using G1], so you might have to rewrite this - but this should give you an idea on how to change your function )
Code:
FUNC VOID B_Follow_Player_AssessPlayer ()
{
if (NPC_GetWalkMode (hero) == NPC_SNEAK)
{
if (NPC_GetWalkMode (self) != NPC_SNEAK)
{
B_FullStop (self);
AI_SetWalkMode (self, NPC_SNEAK);
};
} else
if (NPC_GetWalkMode (self) == NPC_SNEAK)
{
B_FullStop (self);
AI_SetWalkMode (self, NPC_RUN);
};
};
FUNC VOID ZS_Follow_Player ()
{
NPC_PercEnable (self, PERC_ASSESSPLAYER, B_Follow_Player_AssessPlayer);
...
-
Zitat von F a w k e s
NPC while it is in state ZS_Follow_Player has it's AI queue busy with command AI_GotoNPC.
You can however use perception PERC_ASSESSPLAYER to have your code, which checks walk-mode running in parallel with ZS_Follow_Player:
(I am using NPC_GetWalkMode function [using G1], so you might have to rewrite this - but this should give you an idea on how to change your function )
Code:
FUNC VOID B_Follow_Player_AssessPlayer ()
{
if (NPC_GetWalkMode (hero) == NPC_SNEAK)
{
if (NPC_GetWalkMode (self) != NPC_SNEAK)
{
B_FullStop (self);
AI_SetWalkMode (self, NPC_SNEAK);
};
} else
if (NPC_GetWalkMode (self) == NPC_SNEAK)
{
B_FullStop (self);
AI_SetWalkMode (self, NPC_RUN);
};
};
FUNC VOID ZS_Follow_Player ()
{
NPC_PercEnable (self, PERC_ASSESSPLAYER, B_Follow_Player_AssessPlayer);
...
That works very well. Many thanks!
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|