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

    NPC spricht Spieler nicht von selbst an

    Hallo,
    ich möchte, dass ein bestimmter dem Spieler folgender NPC diesen ansprechen soll, sobald eine bestimmte Bedingung erfüllt ist.

    Es handelt sich hierbei um diesen Dialog:

    Code:
    instance DIA_MAIK_WEDIDIT (C_INFO)
    {
        npc            = MIL_541_Maik;
        nr            = 1;
        condition    = DIA_MAIK_WEDIDIT_condition;
        information    = DIA_MAIK_WEDIDIT_info;
        important    = TRUE;
    };
    
    
    FUNC int DIA_MAIK_WEDIDIT_condition()
    {
        if (Npc_KnowsInfo (hero, DIA_MAIK_YOUAREMAIK))
        && (Npc_IsDead (DIV_SkeletonWarrior_Light_Jasonquest_01))
        && (Npc_IsDead (DIV_SkeletonWarrior_Light_Jasonquest_02))
        && (Npc_IsDead (DIV_SkeletonWarrior_Heavy_Jasonquest_01))
        && (Npc_IsDead (DIV_SkeletonWarrior_Heavy_Jasonquest_02)) 
        && (Npc_IsDead (DIV_Zombie_Jasonquest_01))
        && (Npc_IsDead (DIV_Zombie_Jasonquest_02))
        && (Npc_IsDead (DIV_Zombie_Jasonquest_03))
        {
            return TRUE;
        };
    };
    
    
    FUNC void DIA_MAIK_WEDIDIT_info()
    {
        B_StartOtherRoutine (self, "START");
    
    
        AI_Output (self, other, "DIA_MAIK_WEDIDIT_00"); //Scheiße... Haben wir es etwa tatsächlich geschafft?
        AI_Output (other, self, "DIA_MAIK_WEDIDIT_01"); //Ich denke schon.
        AI_Output (self, other, "DIA_MAIK_WEDIDIT_02"); //Puh... Bei Innos... Hätte nicht gedacht, dass ich hier wieder lebend rauskomme...
        AI_Output (other, self, "DIA_MAIK_WEDIDIT_03"); //Ist ja nochmal gut gegangen.
        AI_Output (self, other, "DIA_MAIK_WEDIDIT_04"); //Allerdings! Hast übrigens gut gekämpft.
        AI_Output (other, self, "DIA_MAIK_WEDIDIT_05"); //Danke. Du warst aber auch nicht schlecht. Na ja, ich bin mal weiter. Muss Jason noch davon berichten, dass der Stollen frei ist...
        AI_Output (self, other, "DIA_MAIK_WEDIDIT_06"); //Tu das. Wir sehen uns!
        
        AI_StopProcessInfos (self);
    };

    Problem ist, dass der NPC den Spieler einfach nicht ansprechen will, sondern dieser Dialog erst abgespielt wird, wenn der Spieler selbst den NPC anspricht. Ich sehe hier keinen Fehler und seltsam ist auch, dass der Dialog problemlos mit anderen NPCs funktioniert.

    Hier noch das Skript vom NPC MIL_541_Maik:

    Code:
    instance MIL_541_Maik (Npc_Default)
    {
        // ------ NSC ------
        name        = "Maik";
        guild        = GIL_MIL;
        id        = 541;
        voice        = 11;
        flags        = NPC_FLAG_IMMORTAL;
        npctype        = NPCTYPE_MAIN;
    
    
        // ----- Attribute -----
        B_SetAttributesToChapter (self,3);
    
    
        // ------ Kampf-Talente ------
        B_SetFightSkills (self, 40);
        fight_tactic    = FAI_HUMAN_NORMAL;
    
    
        // ------ NSC-relevante Talente vergeben ------
        B_GiveNpcTalents (self);
    
    
        // ------ Equippte Waffen ------
        EquipItem (self, ItMw_DIV_1h_Schwert_Wache);
        EquipItem (self, ItRw_Mil_Crossbow);
        Equip_Item (self, ItHl_DIV_Wache_L);
    
    
        // ------ Inventory ------
        B_CreateAmbientInv (self);
    
    
        // ------ visuals ------
        B_SetNpcVisual    (self, MALE, "HUM_HEAD_BALD", Face_L_Tough02, BodyTex_L, ITAR_DIV_Armor_Miliz_L);
        Mdl_ApplyOverlayMds    (self, "Humans_Militia.mds");
    
    
        // ------ TA anmelden ------
        daily_routine     = Rtn_Start_541;
    };
    
    
    FUNC VOID Rtn_Start_541 ()
    {
        TA_Stand_Guarding    (07,00,20,00,"WP_GOLDMINE_GUARD_VORGRUFT");
        TA_Stand_Eating        (20,00,21,00,"WP_GOLDMINE_GUARD_VORGRUFT");
        TA_Stand_Drinking    (21,00,23,00,"WP_GOLDMINE_GUARD_VORGRUFT");
        TA_Stand_Guarding    (23,00,07,00,"WP_GOLDMINE_GUARD_VORGRUFT");
    };
    
    
    FUNC VOID Rtn_JasonQuestFollowPlayer_541 ()
    {
        TA_Follow_Player    (07,00,23,00,"WP_GOLDMINE_GRUFT_22");
        TA_Follow_Player    (23,00,07,00,"WP_GOLDMINE_GRUFT_22");
    };
    
    
    FUNC VOID Rtn_ImDead_541 ()
    {
        TA_BeDead    (07,00,23,00,"DIV_GM_TOT");
        TA_BeDead    (23,00,07,00,"DIV_GM_TOT");
    };

    Auch hier kann ich keinen Fehler entdecken.

    Jemand 'ne Idee?

    Edit: Scheinbar liegt es am Tagesablauf:

    Code:
    // ****************// ZS_Follow_Player
    // ****************
    
    
    FUNC void B_AssessFollowPlayer ()
    {
            
        //FUNC
        
        if (Npc_GetDistToNpc(self, hero) < self.aivar[AIV_FollowDist])
        && (self.aivar[AIV_TAPOSITION] == FALSE)
        {
            Npc_ClearAIQueue (self);
            AI_StandUp (self);
            self.aivar[AIV_TAPOSITION] = TRUE;
                
        } else {    
        
            B_AssessPlayer ();
        };
    };
    
    
    // ---------------------------------
    func void B_AssessFollowFightSound()
    {
        if (Npc_IsPlayer(other))
        || (Npc_IsPlayer(victim))
        || (other.aivar[AIV_PARTYMEMBER] == TRUE)
        || (victim.aivar[AIV_PARTYMEMBER] == TRUE)
        {
            B_AssessFightSound ();
        };
    };
    
    
    // ---------------------------------
    func void B_MoveFollowNpc()
    {
        //zuckelt nur
    };
    
    
    // --> PATCH: VELEN --> DAMIT DER NPC SEINE GANGART AN DIE DES HELDEN ANPASST
    func void B_Follow_Player_AssessPlayer ()
    {
        if (!C_BodyStateContains(self, BS_SWIM))
        {
            if (C_BodyStateContains(hero, BS_RUN)) && (!C_BodyStateContains(self, BS_RUN)) {    // HERO RENNT (STANDARD)
            
                Npc_ClearAIQueue    (self);
                AI_StandUpQuick        (self);
                AI_SetWalkMode        (self, NPC_RUN);
            
            } else if (C_BodyStateContains(hero, BS_WALK)) && (!C_BodyStateContains(self, BS_WALK)) {    // HERO GEHT
            
                Npc_ClearAIQueue    (self);
                AI_StandUpQuick        (self);
                AI_SetWalkMode        (self, NPC_WALK);
            
            } else if (C_BodyStateContains(hero, BS_SNEAK)) && (!C_BodyStateContains(self, BS_SNEAK)) {        // HERO SCHLEICHT
            
                Npc_ClearAIQueue    (self);
                AI_StandUpQuick        (self);
                AI_SetWalkMode        (self, NPC_SNEAK);
                
            } else if (!C_BodyStateContains(hero, BS_RUN)) && (!C_BodyStateContains(hero, BS_WALK)) && (!C_BodyStateContains(hero, BS_SNEAK)) {        // HERO MACHT IRGENDETWAS ANDERES (BEFINDET SICH ALSO NICHT IN BS_RUN, NICHT IN BS_WALK UND AUCH NICHT IN BS_SNEAK)
                
                if (!C_BodyStateContains(self, BS_RUN)) && (!C_BodyStateContains(self, BS_SNEAK))
                {
                    Npc_ClearAIQueue    (self);
                    AI_StandUpQuick        (self);
                    AI_SetWalkMode        (self, NPC_RUN);
                };
            };
        };
    };
    
    
    // --------------------------
    func void ZS_Follow_Player ()
    {
        self.senses            = SENSE_SEE|SENSE_HEAR|SENSE_SMELL;
        self.senses_range    = 2000;        
        
        Npc_SetPercTime    (self, 0.3);
        
        Perception_Set_Minimal();
        
        if (self.aivar[AIV_PARTYMEMBER] == FALSE)
        {
            self.aivar[AIV_PARTYMEMBER] = TRUE;
        };
        
        Npc_PercEnable (self, PERC_ASSESSPLAYER    , B_AssessFollowPlayer); 
        Npc_PercEnable (self, PERC_ASSESSENEMY    , B_AssessEnemy); 
        Npc_PercEnable (self, PERC_ASSESSTALK    , B_AssessTalk); 
        Npc_PercEnable (self, PERC_MOVEMOB        , B_MoveMob); 
        
        //lokale Wahrnehmungen
        Npc_PercEnable (self, PERC_ASSESSFIGHTSOUND , B_AssessFollowFightSound);
        //Npc_PercEnable (self, PERC_MOVENPC, B_MoveFollowNpc);
        
        // VELEN: GANGART VON NPC AN DIE DES HELDEN ANPASSEN
        Npc_PercEnable (self, PERC_ASSESSPLAYER, B_Follow_Player_AssessPlayer);
    
    
        B_ResetAll (self);
        
        AI_StandUp (self);
        AI_SetWalkmode    (self,    NPC_RUN);
        
        // ------ init aivars ------
        if (self.aivar[AIV_FollowDist] == 0)
        {
            self.aivar[AIV_FollowDist] = 500;
        };
    };
    
    
    func int ZS_Follow_Player_Loop ()
    {
        if (Npc_GetDistToNpc (self, hero) > self.aivar[AIV_FollowDist])
        {
            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;
    };
    
    
    func void ZS_Follow_Player_End ()
    {
    };

    Seltsam, da andere NPCs, die auch diesen Tagesablauf haben und den Spieler von selbst ansprechen sollen, dies auch tun?

    Edit2: Ich habe das Problem nun gelöst, indem ich Maik einfach einen anderen Tagesablauf, TA_Guide_Player, ausführen lasse, sobald die Bedingung für diesen Dialog erfüllt ist. Sieht zwar nicht ganz so toll aus, wenn Maik dann einfach plötzlich losrennt, ist wohl aber die einfachste und schnellste Möglichkeit, dieses Bug zu beheben. Sollte aber noch jemand eine Idee haben, warum es mit dem TA_Follow_Player nicht klappt, gerne her damit!
    Geändert von Bloodfly91 (04.06.2019 um 15:03 Uhr)

  2. Beiträge anzeigen #2 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.484
     
    Cryp18Struct ist offline
    Zitat Zitat von Bloodfly91 Beitrag anzeigen
    Code:
    // --------------------------
    func void ZS_Follow_Player ()
    {
        Npc_PercEnable (self, PERC_ASSESSPLAYER    , B_AssessFollowPlayer); 
        [...]
        Npc_PercEnable (self, PERC_ASSESSPLAYER, B_Follow_Player_AssessPlayer);
    };
    Du kannst nur eine Funktion für PERC_ASSESSPLAYER anmelden.

    B_AssessFollowPlayer() wird also nie aufgerufen (und in B_AssessFollowPlayer() ist der Aufruf von B_AssessPlayer (), In B_AssessPlayer () wird das starten von Dialogen von NPCs behandelt).

    Warum es bei einigen NPCs funktioniert ist mir komplett unklar, für mich sieht das so aus als sollte kein NPC in diesem Zustand den hero ansprechen können. Wahrscheinlich übersehe ich da noch was.

  3. Homepage besuchen Beiträge anzeigen #3 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Oh, das wusste ich nicht, danke. Du hast recht. Ich habe die B_FollowPlayer_AssessPlayer nun einfach mit in die B_AssessPlayer geschrieben, jetzt funktioniert scheinbar alles!

  4. Beiträge anzeigen #4 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.484
     
    Cryp18Struct ist offline
    Naja, die normale B_AssessPlayer wird ja auch von allen möglichen anderen Zuständen benutzt.

    Ich würde in ZS_Follow_Player eine (für diesen Zustand spezifische) Funktion für PERC_ASESSPLAYER anmelden und dort dann das rein packen was in B_AssessFollowPlayer() und B_Follow_Player_AssessPlayer() steht.
    Die wechseln der Gangart macht in der normalen B_AssessPlayer() ja eher wenig Sinn.

  5. Homepage besuchen Beiträge anzeigen #5 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Jo, das stimmt natürlich und gut, dass du mich darauf hinweist. Ich habe in der B_AssesPlayer Funktion zwar speziell für das Gangart wechseln eine Abfrage drinnen, nämlich, ob ein bestimmter Aivar, der in der ZS_Follow_Player gesetzt wird, von self true ist, allerdings wird diese auch in ZS_Guide_Player gesetzt. Und in diesem Zustand soll der NPC ja eigentlich nicht die Gangart an die des Helden anpassen.
    Schaue mir das morgen nochmal an. Ich hatte zwar vorhin zuerst schon mal so 'ne Funktion geschrieben, allerdings wollte der NPC sich dann gar nicht mehr ansprechen lassen, sobald die Bedingungen für den Dialog erfüllt waren. Aber vermutlich hatte ich nur irgendetwas übersehen.

    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Naja, die normale B_AssessPlayer wird ja auch von allen möglichen anderen Zuständen benutzt.

    Ich würde in ZS_Follow_Player eine (für diesen Zustand spezifische) Funktion für PERC_ASESSPLAYER anmelden und dort dann das rein packen was in B_AssessFollowPlayer() und B_Follow_Player_AssessPlayer() steht.
    Die wechseln der Gangart macht in der normalen B_AssessPlayer() ja eher wenig Sinn.

    Edit: Ich habe nun eine Funktion geschrieben, die beide Funktionen enthält (ZS_Follow_Player, B_Follow_Player_AssessPlayer). Dass Maik gestern nicht mehr mit mir reden wollte, lag wohl an dem Aufruf Npc_ClearAIQueue der B_Follow_Player_AssessPlayer. Mit der zusätzlichen Abfrage vor dem Aufruf für das anpassen der Gangart, ob der NPC einen important-Dialog hat, klappt es aber scheinbar problemlos.
    Geändert von Bloodfly91 (05.06.2019 um 15:53 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