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 15 von 15
  1. Beiträge anzeigen #1 Zitieren
    Hero Avatar von lali
    Registriert seit
    Feb 2016
    Beiträge
    5.471
     
    lali ist offline

    Npc_ExchangeRoutine Problem

    Hab hier folgendes Skript:

    Code:
    FUNC VOID Info_XY_Bandits_Info()
    {
        AI_DrawWeapon (self);
        AI_Output    (self,other,"Info_XY_Bandits_11_00"); //... 
        Npc_ExchangeRoutine    (ORG_XXX_XY,"Start");
        Npc_ExchangeRoutine    (ORG_YYY_XX,"Start");
        AI_Wait (self, 2);
        AI_RemoveWeapon (self);
        AI_Output(hero,self,"Info_XY_Bandits_15_00");    //...
        AI_Output(self,hero,"Info_XY_Bandits_11_01"); //....
        AI_Output(self,hero,"Info_XY_Bandits_11_02"); //...    
        
        self.aivar[AIV_PARTYMEMBER] = FALSE;
        Npc_ExchangeRoutine(self,"FirstMeeting");
        AI_StopProcessInfos(self);
    };

    Also: Die Routine dieser beiden NPCs soll nach der Aussage des NPCs oben (Info_XY_Bandits_11_00) wieder geändert werden in die "Start" Routine. Aber nachdem der Dialog hier vorbei ist, stehen die NPCs weiterhin einfach nur dumm rum. Idealerweise sollten sie losgehen, während der NPC noch die Waffe gezogen hat, so hätte ich es gern. Aber selbst nach dem Dialog bewegen sie sich nicht. Erst wenn ich sie einzeln anspreche, gehen sie in ihre Start-Routine über. Wo liegt der Fehler?
    Phoenix Dev | Website | Discord

  2. Beiträge anzeigen #2 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.484
     
    Cryp18Struct ist offline
    Um die beiden dazu zu bringen zur neuen Routine zu wechseln kannst du AI_ContinueRoutine benutzen (oder besser: direkt B_StartOtherRoutine wegen der enthaltenen Sicherheitsabfrage). Das würde dann aber direkt passieren wenn Info_XY_Bandits_Info() aufgerufen wird (also am Start des Gesprächs).
    Wenn es erst nach einer bestimmten Dialogzeile passieren soll wäre eine Kombination mit AI_Function aus LeGo möglich:
    Code:
    func void forceRoutineChangeNOW(){
        B_StartOtherRoutine    (ORG_XXX_XY,"Start");
        B_StartOtherRoutine    (ORG_YYY_XX,"Start");
    };
    
    FUNC VOID Info_XY_Bandits_Info()
    {
        AI_DrawWeapon (self);
        AI_Output    (self,other,"Info_XY_Bandits_11_00"); //... 
        AI_Function(self, forceRoutineChangeNOW);
        AI_Wait (self, 2);
        AI_RemoveWeapon (self);
        AI_Output(hero,self,"Info_XY_Bandits_15_00");    //...
        AI_Output(self,hero,"Info_XY_Bandits_11_01"); //....
        AI_Output(self,hero,"Info_XY_Bandits_11_02"); //...    
        
        self.aivar[AIV_PARTYMEMBER] = FALSE;
        Npc_ExchangeRoutine(self,"FirstMeeting");
        AI_StopProcessInfos(self);
    };

  3. Beiträge anzeigen #3 Zitieren
    research Avatar von NicoDE
    Registriert seit
    Dec 2004
    Beiträge
    7.409
     
    NicoDE ist offline
    Ich würde den Namen der Routine sicherheitshalber groß schreiben.
    "Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
    Geändert von NicoDE (23.04.2019 um 14:59 Uhr)

  4. Beiträge anzeigen #4 Zitieren
    Hero Avatar von lali
    Registriert seit
    Feb 2016
    Beiträge
    5.471
     
    lali ist offline
    Okay, danke euch beiden. Der Name der Routine war so auch in den Originalskripten (der NPCs) geschrieben, deswegen dachte ich, schreibe ich es hier im Dialog auch so. Durch AI_ContinueRoutine gehen sie jetzt wie gewünscht direkt ihrer alten Routine nach. Allerdings folgt ihnen dann die Kamera hinterher, bis sie auf ihrem neuen Platz stehen und man kommt leider auch nicht mehr aus dem Dialog heraus (ohne F8), also die Kamera bleibt auf sie fokussiert und es passiert nichts mehr. Auch ein AI_StopProcessInfos(self); am Ende ändert das nicht.

    Als nächstes müsste ich es dann mit B_StartOtherRoutine versuchen.
    Phoenix Dev | Website | Discord

  5. Beiträge anzeigen #5 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Alle (External-) Funktionen die mit AI_* beginnen, werden nicht sofort ausgeführt, sondern werden in die AI-Queue des betroffenen NPCs eingereiht und dann abgearbeitet. Wenn du also erst AI_ContinueRoutine(self) und dann AI_StopProcessInfos(self) ausführst, kann letzteres erst passieren, wenn der NPC seine Routine erfolgreich aufgenommen hat (was auch immer das genau bedeutet).

    Reicht es vielleicht schon, AI_StopProcessInfos vor AI_ContinueRoutine aufzurufen?

  6. Beiträge anzeigen #6 Zitieren
    Hero Avatar von lali
    Registriert seit
    Feb 2016
    Beiträge
    5.471
     
    lali ist offline
    Danke Lehona. Es scheint jetzt zu funktionieren. Die Kamera folgt immernoch den beiden Banditen, bis sie ihre Routine wieder eingenommen haben. Aber das wirkt eigentlich ganz cool. Noch besser wäre es, wenn die Kamera ihnen nur ~3 Sekunden folgen würde. Aber das wird ohne Trickserei mit Lego wohl nicht möglich sein.

    Neues Problem:

    Code:
    AI_AlignToWP        (self);
    AI_PointAt(self,"WP_XX");
    AI_Output(self,other,"Info_XY_Scavenger_11_01"); //Siehst du XY da drüben?
    AI_StopPointAt(self);            
    //AI_AlignTo...                // Florian: TODO: XZ soll sich hier erst wieder zum Spieler zurückdrehen. Wie? 
    AI_Output(self,other,"Info_XY_Scavenger_11_02"); //....
    AI_Output(self,other,"Info_XY_Scavenger_11_03"); //....
    AI_StopProcessInfos(self);

    Also zuerst will ich, dass er sich in eine bestimmte Richtung dreht, wo er hinzeigt, dann soll er sich aber erst zum Spieler zurückdrehen, bevor er weiter spricht. Wie ist das machbar? Kann man ihn sich auch zu einem bestimmten NPC oder Monster drehen lassen statt dieses "AlignToWP", was weniger präzise ist?
    Phoenix Dev | Website | Discord

  7. Beiträge anzeigen #7 Zitieren
    Schwertmeister
    Registriert seit
    May 2009
    Beiträge
    924
     
    Umfi ist offline
    Code:
    AI_TurnToNpc(self, hero);
    Versuch es mal damit.

  8. Beiträge anzeigen #8 Zitieren
    Hero Avatar von lali
    Registriert seit
    Feb 2016
    Beiträge
    5.471
     
    lali ist offline
    Wunderbar! Danke. Gibt es auch eine Funktion, die es ermöglicht, dass ein NPC, der eine important Info hat, dich nicht aus einer zu weiten Entfernung anspricht, sondern nur wenn du ca. 1,5m vor ihm stehst oder so?
    Phoenix Dev | Website | Discord

  9. Beiträge anzeigen #9 Zitieren
    Serima Avatar von Fisk2033
    Registriert seit
    Dec 2010
    Ort
    Dresden
    Beiträge
    5.802
     
    Fisk2033 ist offline
    Du könntest als Bedienung für den Dialog ja den Abstand mit GetDistToNPC abfragen, oder?

  10. Beiträge anzeigen #10 Zitieren
    Hero Avatar von lali
    Registriert seit
    Feb 2016
    Beiträge
    5.471
     
    lali ist offline
    Das werde ich ausprobieren, danke Fisk. Da lässt sich ja nur mit Daedalus schon ganz schön viel machen.
    Phoenix Dev | Website | Discord

  11. Beiträge anzeigen #11 Zitieren
    Hero Avatar von lali
    Registriert seit
    Feb 2016
    Beiträge
    5.471
     
    lali ist offline
    Code:
    FUNC int  Org_XXX_XYX_First_Condition()            
    {
        if    ( Npc_KnowsInfo(hero,Info_XY_Outlook)) 
        &&    (Npc_GetDistToNpc( other, self ) < 500)
        {
            return 1;
        };
    };

    Ich hab das jetzt so versucht. Neben < 500 habe ich auch < 1000 getestet. Es machte keinerlei Unterschied. Hat jemand eine Idee?
    Phoenix Dev | Website | Discord

  12. Beiträge anzeigen #12 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.204
     
    Milky-Way ist offline
    Zitat Zitat von lali Beitrag anzeigen
    Code:
    FUNC int  Org_XXX_XYX_First_Condition()            
    {
        if    ( Npc_KnowsInfo(hero,Info_XY_Outlook)) 
        &&    (Npc_GetDistToNpc( other, self ) < 500)
        {
            return 1;
        };
    };

    Ich hab das jetzt so versucht. Neben < 500 habe ich auch < 1000 getestet. Es machte keinerlei Unterschied. Hat jemand eine Idee?
    Die Zahl sind Zentimeter, daher sind 500 immer noch 5 Meter. Vielleicht mal eine kleinere Zahl probieren für einen sichtbaren Unterschied?

  13. Beiträge anzeigen #13 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.484
     
    Cryp18Struct ist offline
    Zitat Zitat von lali Beitrag anzeigen
    Code:
    FUNC int  Org_XXX_XYX_First_Condition()            
    {
        if    ( Npc_KnowsInfo(hero,Info_XY_Outlook)) 
        &&    (Npc_GetDistToNpc( other, self ) < 500)
        {
            return 1;
        };
    };
    Was anderes: Bei solch einer Abfrage besteht auch immer das Problem(falls die Distanz eher klein gewählt ist) das der Spieler den NPC anspricht und keine Dialogoption hat(weil er halt als zu weit weg erkannt wird). Ich würde bei einer solchen Distanzabfrage immer zusätzlich abfragen ob der NPC in ZS_TALK ist und falls ja: Distanzabfrage ignorieren und Dialog einfach trotzdem verfügbar machen. Beispiel:
    Code:
    FUNC INT DIA_Kdf_213_Feris_Ende_condition ()
    {    
        IF (Npc_KnowsInfo(other, DIA_None_830_Geist_ruhig))
        && (Npc_getDistToNPC(self, other) < 310 || NPC_IsInState(self, ZS_Talk)) {
            return TRUE;
        };
    };

  14. Beiträge anzeigen #14 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.634
     
    Bisasam ist offline
    AI_ContinueRoutine sollte man nicht für den Npc benutzen, der sich gerade im Dialog befindet. In dem Fall hängt der sich komplett auf, geht zu seinem Tagesablaufstart und beendet den Dialog nicht.
    Normalerweise reicht es für den im Dialog befindlichen Npc, einfach Npc_ExchangeRoutine zu benutzen. Wenn der mit ZS_Talk durch ist, macht der dann automatisch schon das richtige.


    "Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
    -Korallenkette

  15. Beiträge anzeigen #15 Zitieren
    Hero Avatar von lali
    Registriert seit
    Feb 2016
    Beiträge
    5.471
     
    lali ist offline
    Aber im Skript oben wars ja so. Und es hat nicht funktioniert.
    Phoenix Dev | Website | Discord

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