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 2 von 2
  1. Homepage besuchen Beiträge anzeigen #1 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline

    NPC soll nicht ansprechbar sein

    Hey,
    ich habe vorhin ein kleines Skript geschrieben, das verhindern soll, dass man NPCs ansprechen kann, falls sie gerade keinen Dialog bzw. nur einen "Ende" Dialog haben. Der Code sieht so aus:

    Code:
    func void B_AssessTalk ()
    {
        // --- Es gibt gerade nichts zu bereden --> Kein Dialog verfügbar ---
        if (!Npc_CheckInfo (self, 0)) 
        {
            if (!Npc_CheckInfo (self, 1))
            {
                var int notalk_rnd; notalk_rnd = Hlp_Random(100);
                if         (notalk_rnd <= 25)    {    B_Say (self,other,"$SMALLTALK28");    }
                else if (notalk_rnd <= 50)    {    B_Say (self,other,"$SMALLTALK27");    }
                else if (notalk_rnd <= 75)    {    B_Say (self,other,"$SMALLTALK26");    }
                else if (notalk_rnd <= 99)  {    B_Say (self,other,"$SMALLTALK25");    };
            };
            return;
        };
    Er steht ganz oben in der B_AssessTalk.

    Soweit funktioniert es auch. Allerdings ist es jetzt (jedenfalls soweit ich das sehen konnte) eher Zufall, ob ein NPC noch ansprechbar ist (obwohl er eigentlich einen Dialog hat), oder ob er nicht mehr ansprechbar ist, und nur irgendeinen dieser "B_Say" Sätze sagt. Ich habe aber auch gesehen, dass sich die NPCs, die einen Important-Dialog haben und den Helden eigentlich von selbst ansprechen sollten, sich auch manchmal zum Helden drehen, so als würden sie ihn ansprechen wollen, aber es nicht machen.

    Da es erst gar nicht funktionierte, und NPCs die mind. einen Ende-Dialog hatten trotzdem noch ansprechbar waren, habe ich es so gemacht wie hier: https://forum.worldofplayers.de/foru...1#post22255572
    Also in jeden Ende-Dialog noch "if (Npc_IsInState (self, ZS_Talk))" geschrieben.

    (z.B.)
    Code:
    Func int DIA_Wilbrecht_EXIT_Condition()
    {
        if (Npc_IsInState (self, ZS_Talk))
        {
            return TRUE;
        };
    };
    Nur warum funktioniert das jetzt immer noch nicht richtig? Sieht jemand den/die Fehler?

  2. Homepage besuchen Beiträge anzeigen #2 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline

    blume

    Ich konnte den Fehler jetzt beheben (hoffentlich.. jedenfalls hat es bei mir funktioniert. ). Hier das Skript, falls es jemand verwenden will:
    Code:
    // --- Es gibt gerade nichts zu bereden --> Kein Dialog verfügbar ---
        
        if (Npc_CheckInfo (self, 0) == FALSE) && (Npc_CheckInfo (self, 1) == FALSE)
        {
        
        AI_StandUp (self);
        
        // --- Drehe NPC zum Spieler ---
        if (!C_BodystateContains(self, BS_SIT))
        {
            B_TurnToNpc (self,    other);
        };
        
        // --- Drehe Spieler zum NPC ---
        
        if (!C_BodystateContains(other, BS_SIT))
        {    
            B_TurnToNpc (other, self);
                
            // ------ Spieler zu nah dran ------
            if (Npc_GetDistToNpc(other,self) < 80) 
            {
                AI_Dodge (other);
            };
        };
        
        // --- Spiele SVMs ab ---
        
        var int notalk_rnd; notalk_rnd = Hlp_Random(100);
                    
        if (notalk_rnd <= 25)  
        {    
                        
            B_Say (self,other,"$SMALLTALK28");
            AI_WaitTillEnd (self, self);
            AI_WaitTillEnd (other, self);
            AI_ContinueRoutine (self);
                        
            } else if (notalk_rnd <= 50) {    
                    
                B_Say (self,other,"$SMALLTALK27"); 
                AI_WaitTillEnd (self, self);
                AI_WaitTillEnd (other, self);
                AI_ContinueRoutine (self);
                    
            } else if (notalk_rnd <= 75) {    
                    
                B_Say (self,other,"$SMALLTALK26"); 
                AI_WaitTillEnd (self, self);
                AI_WaitTillEnd (other, self);
                AI_ContinueRoutine (self);
                    
            } else if (notalk_rnd <= 99) {
                            
                B_Say (self,other,"$SMALLTALK25");
                AI_WaitTillEnd (self, self);
                AI_WaitTillEnd (other, self);
                AI_ContinueRoutine (self);
            };
            return;
        };
    Was genau macht das Skript?
    Es verhindert, dass man NPCs ansprechen kann, die eigentlich gerade nichts zu sagen haben oder gar keinen Dialog haben. Es wäre also zum Beispiel gut für Ambient NPCs, wenn man nicht für jeden einzelnen einen Dialog schreiben will.
    Wenn man so einen NPC anklickt, dreht sich der Held ganz normal zu ihn und der NPC zum Helden und es wird eine der SVM's abgespielt. Während die SVM abgespielt wird, kann sich der Spieler nicht bewegen. Danach führt der NPC ganz normal weiter seinen Tagesablauf aus. Es funktioniert also ähnlich wie "ZS_CommentFakeGuild".

    Der Code muss in die B_AssesTalk.d und sollte unter:

    Code:
    // ------ Spieler labert NSC an ------
        if (self.aivar[AIV_NpcStartedTalk] == FALSE)
        {
            if ( C_BodyStateContains(self,BS_WALK) || C_BodyStateContains(self,BS_RUN) )
            {
                B_Say (other,self,"$SC_HEYWAITASECOND");
            }
            else if (!Npc_CanSeeNpc(self, other))
            {
                var int rnd; rnd = Hlp_Random(100);
                if         (rnd <= 25)    {    B_Say (other,self,"$SC_HEYTURNAROUND");        }
                else if (rnd <= 50)    {    B_Say (other,self,"$SC_HEYTURNAROUND02");    }
                else if (rnd <= 75)    {    B_Say (other,self,"$SC_HEYTURNAROUND03");    }
                else if (rnd <= 99) {    B_Say (other,self,"$SC_HEYTURNAROUND04");    };
            };
        };
    
        Npc_ClearAIQueue    (self);
        B_ClearPerceptions    (self);
    Außerdem muss man in den Ende-Dialog von jedem NPC noch "if (Npc_IsInState (self, ZS_Talk))" als Bedingung eintragen, sonst funktioniert es nicht.

    Beispiel:
    Code:
    //--------------------------------------------------
    //--------------------------------------------------
    INSTANCE DIA_Markus_EXIT   (C_INFO)
    {
        npc         = MIL_512_Markus;
        nr          = 999;
        condition   = DIA_Markus_EXIT_Condition;
        information = DIA_Markus_EXIT_Info;
        permanent   = TRUE;
        description = DIALOG_ENDE;
    };
    
    FUNC INT DIA_Markus_EXIT_Condition()
    {
        if (Npc_IsInState (self, ZS_Talk))
        {
            return TRUE;
        };
    };
    
    FUNC VOID DIA_Markus_EXIT_Info()
    {
        AI_StopProcessInfos (self);
    };
    Edit: Vorsicht, nicht benutzen! Es scheint doch noch nicht ganz zu funktionieren. Manche NPCs sind trotzdem noch ansprechbar. Sollte ich das Problem noch irgendwann beheben können, werde ich dieses Skript hier editieren.
    Geändert von Bloodfly91 (21.04.2017 um 19:46 Uhr)

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