-
NPCs kehren erst zu ihrem Wegpunkt zurück, bevor sie in einen anderen Zustand wechseln
Hallo,
ich versuche schon seit gestern dieses blöde Problem zu lösen, das ich momentan habe.
Ich möchte, dass NPC's mit einer bestimmten Gilde in den Zustand ZS_Flee_Endfight wechseln, sobald sie einen Feind mit einer bestimmten Gilde wahrnehmen. Das funktioniert so weit auch ganz gut. Problem ist allerdings, dass die NPCs, sobald sie ZS_Flee_Endfight_End erreicht haben und auf den Rückweg zu ihrem eigentlichen Wegpunkt sind, um dort wieder ihren Tagesablauf auszuführen, nicht sofort wieder in den Zustand ZS_Flee_Endfight zu wechseln scheinen, sobald sie wieder einen Feind mit dieser bestimmten Gilde wahrnehmen können. Erst wenn sie wieder an ihrem eigentlichen Wegpunkt sind und dort den Feind wahrnehmen, wechseln sie auch wieder in den Zustand.
Prüfen lasse ich das in der B_AssessEnemy, dort wird auch in den Zustand gewechselt:
Code:
func int B_AssessEnemy()
{
// EXIT IF...
if (self.guild == GIL_VLK)
{
if (other.guild == GIL_SLD)
{
if (!Npc_IsInState (self, ZS_Flee_Endfight))
{
AI_StandUpQuick (self);
Npc_SetTarget (self, other);
AI_TurnToNPC (self, other);
AI_StartState (self, ZS_Flee_Endfight, 0, "");
};
return FALSE;
};
};
Der Zustand sieht so aus:
Code:
func void ZS_Flee_Endfight (){
Npc_PercDisable (self, PERC_ASSESSMURDER);
Npc_PercDisable (self, PERC_ASSESSTHEFT);
Npc_PercDisable (self, PERC_ASSESSENTERROOM);
Npc_PercDisable (self, PERC_ASSESSFIGHTSOUND);
Npc_PercDisable (self, PERC_DRAWWEAPON);
Npc_PercDisable (self, PERC_ASSESSTALK);
self.aivar[AIV_FLEEINGNPC] = TRUE;
// B_ValidateOther();
// DIV_ClearAIState (self);
// AI_StandUpQuick (self);
AI_SetWalkmode (self, NPC_RUN);
// AI_TurnToNPC (self, other);
AI_Dodge (self);
AI_Wait (self, 0.2);
AI_PlayAni (self, "R_SCRATCHHEAD");
AI_Wait (self, 0.3);
B_Say (self, other, "$RUNAWAY"); //Nichts wie weg!
if (!Npc_IsInFightMode (self, FMODE_NONE))
{
AI_RemoveWeapon (self);
};
Npc_GetTarget (self); // other = target
AI_Flee (self);
Print ("ZS_Flee_Endfight wird ausgeführt!");
};
func int ZS_Flee_Endfight_Loop ()
{
Npc_GetTarget (self); // other = target
if (Npc_GetDistToNpc(self, other) >= 3500) || (C_NpcIsDown (other))
{
AI_StandUpQuick (self);
Npc_ClearAIQueue (self);
return LOOP_END;
Print ("Abstand zum Feind groß genug ODER NPC ist am Boden! --> ZS_Flee_Endfight_End");
} else {
AI_Flee (self);
return LOOP_CONTINUE;
};
};
func void ZS_Flee_Endfight_End ()
{
self.aivar[AIV_FLEEINGNPC] = FALSE;
AI_StandUpQuick (self);
AI_PlayAni (self, "T_SEARCH");
Npc_PercEnable (self, PERC_ASSESSMURDER, B_AssessMurder);
Npc_PercEnable (self, PERC_ASSESSTHEFT, B_AssessTheft);
Npc_PercEnable (self, PERC_ASSESSENTERROOM, B_AssessPortalCollision);
Npc_PercEnable (self, PERC_ASSESSFIGHTSOUND, B_AssessFightSound);
Npc_PercEnable (self, PERC_DRAWWEAPON, B_AssessDrawWeapon);
Npc_PercEnable (self, PERC_ASSESSTALK, B_AssessTalk);
Npc_PercEnable (self, PERC_ASSESSMAGIC, B_AssessMagic);
Npc_PercEnable (self, PERC_ASSESSDAMAGE, B_AssessDamage);
Npc_PercEnable (self, PERC_ASSESSTHREAT, B_AssessThreat);
Npc_PercEnable (self, PERC_ASSESSWARN, B_AssessWarn);
Npc_PercEnable (self, PERC_ASSESSQUIETSOUND, B_AssessQuietsound);
Npc_PercEnable (self, PERC_ASSESSENEMY, B_ASSESSENEMY);
Print ("ZS_Flee_Endfight_End wird ausgeführt!");
};
-
Wenn in den g2 Skripten ein neuer Zustand gestartet wird, wird für gewöhnlich erst noch die AIQueue geleert und die perceptions weggehauen(weil die dann vom Zustand neu gesetzt werden).
Beispiel:
Code:
Npc_ClearAIQueue (self);
B_ClearPerceptions (self);
AI_StartState (self, ZS_ReactToWeapon, 0, "");
Wie wäre es hiermit?:
Code:
func int B_AssessEnemy()
{
// EXIT IF...
if (self.guild == GIL_VLK)
{
if (other.guild == GIL_SLD)
{
if (!Npc_IsInState (self, ZS_Flee_Endfight))
{
Npc_ClearAIQueue (self);
//B_ClearPerceptions (self); // wenn du die perceptions in ZS_Flee_Endfight() neu setzten würdest
AI_StandUpQuick (self); // evt. in ZS_Flee_Endfight() verschieben
Npc_SetTarget (self, other);
AI_TurnToNPC (self, other); // evt. in ZS_Flee_Endfight() verschieben
AI_StartState (self, ZS_Flee_Endfight, 0, "");
};
return FALSE;
};
};
Geändert von Cryp18Struct (15.04.2019 um 14:03 Uhr)
-
Zitat von Cryp18Struct
Wenn in den g2 Skripten ein neuer Zustand gestartet wird, wird für gewöhnlich erst noch die AIQueue geleert und die perceptions weggehauen(weil die dann vom Zustand neu gesetzt werden).
Beispiel:
Code:
Npc_ClearAIQueue (self);
B_ClearPerceptions (self);
AI_StartState (self, ZS_ReactToWeapon, 0, "");
Wie wäre es hiermit?:
Code:
func int B_AssessEnemy()
{
// EXIT IF...
if (self.guild == GIL_VLK)
{
if (other.guild == GIL_SLD)
{
if (!Npc_IsInState (self, ZS_Flee_Endfight))
{
Npc_ClearAIQueue (self);
//B_ClearPerceptions (self); // wenn du die perceptions in ZS_Flee_Endfight() neu setzten würdest
AI_StandUpQuick (self); // evt. in ZS_Flee_Endfight() verschieben
Npc_SetTarget (self, other);
AI_TurnToNPC (self, other); // evt. in ZS_Flee_Endfight() verschieben
AI_StartState (self, ZS_Flee_Endfight, 0, "");
};
return FALSE;
};
};
So einfach ist es also... Funktioniert nun perfekt, vielen Dank!
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
|