Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Ergebnis 1 bis 4 von 4
  1. Homepage besuchen Beiträge anzeigen #1 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline

    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.

  2. Beiträge anzeigen #2 Zitieren
    Knight Avatar von Draxes
    Registriert seit
    Aug 2007
    Ort
    Mainz
    Beiträge
    1.920
     
    Draxes ist offline
    Ohne Gewähr: Du könntest es mal mit AI_StandUpQuick(self); gefolgt von Npc_ClearAIQueue (self); probieren.

  3. Beiträge anzeigen #3 Zitieren
    Local Hero
    Registriert seit
    Feb 2017
    Beiträge
    270
     
    F a w k e s ist offline
    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);
        ...

  4. Homepage besuchen Beiträge anzeigen #4 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von F a w k e s Beitrag anzeigen
    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
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide