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

    NPCs mit der Gilde GIL_NONE sprechen den Spieler nicht mehr von selbst an

    Wir haben momentan das Problem, dass alle NPCs, die die Gilde GIL_NONE (Gildenlos) haben, den Spieler trotz important Dialog nicht mehr von selbst ansprechen. Sie schauen dem Spieler zwar meistens hinterher, was denke ich bedeutet, dass sie es zwar versuchen, aber aus irgendeinem Grund einfach nicht machen. Vor wenigen Tagen hat das noch perfekt funktioniert, ich weiß leider auch nicht, was dafür verantwortlich sein könnte, weil in den letzten Tagen auch einfach zu viel schon an verschiedenen Skripten geändert wurde, soweit ich weiß allerdings an keinem, das irgendwie mit dem Fehler zu tun haben könnte. Ich habe auch schon den kompletten content Ordner nach GIL_NONE durchsuchen lassen, aber auch nichts gefunden. Gebe ich diesen NPCs eine andere Gilde, zum Beispiel GIL_MIL, funktioniert alles wieder.

    Weiß vielleicht jemand, wie ich herausfinden kann, woran das genau liegt?

  2. Beiträge anzeigen #2 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    In B_AssessPlayer() nimmt der NPC den hero wahr.
    Von dort aus wird dann B_AssessTalk() aufgerufen wenn der NPC important infos hat (oder eben auch nicht falls was dagegen spricht).

    Ich vermute mal es hat bei euch mit der Rüstungsabfrage (C_PlayerHasFakeGuild()?) zu tun.
    Geändert von Cryp18Struct (15.08.2018 um 18:21 Uhr)

  3. Homepage besuchen Beiträge anzeigen #3 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    In B_AssessPlayer() nimmt der NPC den hero wahr.
    Von dort aus wird dann B_AssessTalk() aufgerufen wenn der NPC important infos hat (oder eben auch nicht falls was dagegen spricht).

    Ich vermute mal es hat bei euch mit der Rüstungsabfrage (C_PlayerHasFakeGuild()?) zu tun.
    Danke, ich konnte jetzt herausfinden, dass das Problem durch (B_GetPlayerCrime(self) == CRIME_NONE) in der B_AssessPlayer verursacht wird. Denn wenn ich das auskommentiere, funktioniert alles wieder. Das macht auch Sinn, ich habe letztens eine Funktion eingebaut, die dafür sorgt, dass der Spieler eine Strafe bezahlen muss, wenn er etwas klaut etc. und einiges, das damit zu tun hat, habe ich verändert.

    Ich habe das hier:
    Code:
    if (slf.guild == GIL_NONE)
    {
         return CRIME_NONE;
    };
    jetzt einfach in die B_GetPlayerCrime geschrieben und es scheint wieder zu funktionieren. Allerdings verstehe ich trotzdem nicht, warum B_GetPlayerCrime nicht CRIME_NONE ist. Der erste gildenlose NPC spricht den Spieler nämlich direkt an, nachdem er ein neues Spiel gestartet hat. Man hat zu diesem Zeitpunkt also noch gar kein Verbrechen begangen.

  4. Beiträge anzeigen #4 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    Naja, wenn du das Strafe zahlen System neu geschrieben hast kann es ja sein das da irgendwo der Wurm drin ist.
    Zeig doch mal deine B_GetPlayerCrime(self) welche das Problem verursacht.

  5. Homepage besuchen Beiträge anzeigen #5 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Naja, wenn du das Strafe zahlen System neu geschrieben hast kann es ja sein das da irgendwo der Wurm drin ist.
    Zeig doch mal deine B_GetPlayerCrime(self) welche das Problem verursacht.
    Das ist die hier:

    Code:
    // ****************
    // B_GetPlayerCrime
    // ****************
    
    func int B_GetPlayerCrime (var C_NPC slf)
    {
        // EXIT IF...
        if (slf.guild == GIL_NONE)
        {
            return CRIME_NONE;
        };
        
        // ------ wenn Schlägerei länger als 2 Tage her, Crime "verjährt" ------
        if (slf.aivar[AIV_NpcSawPlayerCommit] <= CRIME_ATTACK) //WICHTIG! Alles was weniger schlimm ist, als Attack darf höchstens dieselbe Verjährungszeit haben!
        {
            if (slf.aivar[AIV_NpcSawPlayerCommitDay] < (Wld_GetDay()-2))
            {
                return CRIME_NONE;
            };
        };
        
        // ------ wenn seit der Tat Absolution erteilt wurde, ist die Tat vergeben  ------
        if (slf.aivar[AIV_CrimeAbsolutionLevel] < B_GetCurrentAbsolutionLevel(slf))
        {
            //Für NSCs, die nicht City/Monastery/Farm angehören, 
            //ist B_GetCurrentAbsolutionLevel immer 0, 
            //somit ist die Abfrage hier immer false
                                                                        
            return CRIME_NONE;
        };
        
        // FUNC
        
        // ------ Inhalt der AIV(=Crime) zurückliefern ------
        return slf.aivar[AIV_NpcSawPlayerCommit];
    };
    Das ist die hier, allerdings habe ich an der B_GetPlayerCrime selbst glaube ich gar nichts geändert, nur das rot markierte, das ich jetzt hinzugefügt habe.
    Andere Skripte, die damit zu tun haben, allerdings schon.

    Die B_AssignAmbientNews, bei der ich mir vorstellen könnte, dass in der irgendetwas das Problem verursacht, weil ich da das meiste geändert habe:

    Code:
    // ************************************************************
    //                         Ambient - NEWS
    // ************************************************************
    
    INSTANCE DIA_Ambient_NEWS (C_INFO)
    {
        //npc        = alle;    //wird in ZS_Talk zugeordnet
        nr            = 1;
        condition    = DIA_Ambient_NEWS_Condition;
        information    = DIA_Ambient_NEWS_Info;
        permanent    = TRUE;
        important     = TRUE;
    };                       
    
    FUNC INT DIA_Ambient_NEWS_Condition()
    {
        if (Npc_IsInState(self, ZS_Talk))
        && (B_GetPlayerCrime(self) != CRIME_NONE)
        && (C_NpcBelongsToCity(self))
        && (Markus_Schulden <= 0)
        //&& (!self.guild == GIL_NONE)
        {
            return TRUE;
        };
    };
    
    FUNC VOID DIA_Ambient_NEWS_Info()
    {
        // ------ CRIME ------
        if (B_GetPlayerCrime(self) == CRIME_SHEEPKILLER)
        {
            AI_Output (self, other, "DIA_NpcThatBelongsToCity_Angry_01"); //Einfach so unsere Schafe zu schlachten... Warte nur, bis Kommandant Markus davon erfährt!
        };
    
        if (B_GetPlayerCrime(self) == CRIME_ATTACK)
        {
            if (other.guild == GIL_MIL)
            && (self.guild != GIL_MIL)
            {
                AI_Output (self, other, "DIA_NpcThatBelongsToCity_Angry_02"); //Einfach so Unschuldige anzugreifen... Da sieht man mal wieder, wie schlecht die Fürstenwache doch eigentlich ist. Kommandant Markus wird das aber bestimmt nicht gefallen!
            
            } else if (other.guild == GIL_MIL)
                   && (self.guild == GIL_MIL) {
                
                AI_Output (self, other, "DIA_NpcThatBelongsToCity_Angry_03"); //Einfach so die eigenen Kameraden anzugreifen... Kommandant Markus wird sicherlich nicht erfreut darüber sein!
            
            } else {
            
                AI_Output (self, other, "DIA_NpcThatBelongsToCity_Angry_04"); //Einfach so Unschuldige anzugreifen... Kommandant Markus wird das bestimmt nicht gefallen!
            };
        };
                
        if (B_GetPlayerCrime(self) == CRIME_THEFT)
        {
            if (other.guild == GIL_MIL)
            && (self.guild != GIL_MIL)
            {
                AI_Output (self, other, "DIA_NpcThatBelongsToCity_Angry_05"); //Einfach so die Inselbewohner zu beklauen... Da sieht man mal wieder, wie schlecht die Fürstenwache doch eigentlich ist. Kommandant Markus wird das aber bestimmt nicht gefallen!
            
            } else if (other.guild == GIL_MIL)
                   && (self.guild == GIL_MIL) {
                
                AI_Output (self, other, "DIA_NpcThatBelongsToCity_Angry_06"); //Einfach so die eigenen Kameraden zu beklauen... Kommandant Markus wird sicherlich nicht erfreut darüber sein!
    
            } else {
            
                AI_Output (self, other, "DIA_NpcThatBelongsToCity_Angry_07"); //Einfach so die Inselbewohner zu beklauen... Kommandant Markus wird das bestimmt nicht gefallen!
            };
        };
    
        // ------ Dialog beenden ------    
        AI_StopProcessInfos(self);
    };
    
    // *************************************************************************
    // -------------------------------------------------------------------------
    
    func void B_AssignAmbientNEWS (var C_NPC slf)
    {
        DIA_AMBIENT_NEWS.npc = Hlp_GetInstanceID(slf);
    };
    Die B_MemorizePlayerCrime:

    Code:
    // ***********************************************************************
    // B_MemorizePlayerCrime
    // ---------------------    
    // Neue Tat überschreibt alte Tat, wenn sie schwerer oder gleichschwer ist
    // Tag wird gemerkt
    // CrimeAbsolutionLevel wird gemerkt
    // ---------------------------------
    // Ausserdem wird gepetzt, wenn NSC Mitglied einer Petz-Gruppe ist
    // ***********************************************************************
    
    func void B_MemorizePlayerCrime (var C_NPC slf, var C_NPC taeter, var int crime)
    {    
        // EXIT IF...
        
        // ------ Sicherheitsabfrage ------
        if (!Npc_IsPlayer (taeter))
        {
            return;
        };
        
        // ------ Gilden, die nicht auf Crimes reagieren ------
        if (slf.guild == GIL_DMT)
        //|| (slf.guild == GIL_BDT) Addon Banditen reagieren auf Crimes, allerdings nur die im Lager 
        {
            return;
        };
        
        // FUNC
        
        // ------ PETZCRIME für HomeLocation überschreiben, wenn schwerer als vorherige ------
        if (crime > B_GetPlayerCrime(slf)) 
        {
            B_DeletePetzCrime(slf);
            
            B_AddPetzCrime(slf, crime);
        };
    
        // ------ neue Straftat überschreibt alte, wenn sie schwerer (oder gleichschwer) ist ------    
        if (crime >= B_GetPlayerCrime(slf))
        {
            slf.aivar[AIV_NpcSawPlayerCommit]         = crime;
            slf.aivar[AIV_NpcSawPlayerCommitDay]     = Wld_GetDay();
            slf.aivar[AIV_CrimeAbsolutionLevel]     = B_GetCurrentAbsolutionLevel(slf); //bleibt für NSCs, die NICHT zu City/Monastery/Farm gehören, immer 0 
        };
    };
    In dieser habe ich aber glaube ich nur || (slf.guild == GIL_BDT) auskommentiert.

    Sonst ist da nur noch der Dialog von dem NPC selbst, bei dem man die Strafe bezahlen muss, aber der sollte denke ich nicht weiter wichtig sein.


    EDIT: An der B_MemorizePlayerCrime habe ich anscheinend doch nichts geändert, habe das gerade mal mit der originalen verglichen.
    Geändert von Bloodfly91 (15.08.2018 um 19:09 Uhr)

  6. Beiträge anzeigen #6 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.487
     
    Cryp18Struct ist offline
    Da in B_GetPlayerCrime ja quasi nichts anderes gemacht wird als den aivar Inhalt zurückzugeben
    Code:
    // ------ Inhalt der AIV(=Crime) zurückliefern ------
        return slf.aivar[AIV_NpcSawPlayerCommit];
    könntest du als nächstes prüfen was da für ein Wert drinsteht.

  7. Homepage besuchen Beiträge anzeigen #7 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Da in B_GetPlayerCrime ja quasi nichts anderes gemacht wird als den aivar Inhalt zurückzugeben
    Code:
    // ------ Inhalt der AIV(=Crime) zurückliefern ------
        return slf.aivar[AIV_NpcSawPlayerCommit];
    könntest du als nächstes prüfen was da für ein Wert drinsteht.
    Das habe ich gemacht und das ist CRIME_NONE.

    Konnte das Problem jetzt aber denke ich lösen, indem ich in der B_GetPlayerCrime einfach folgendes hinzugefügt habe:

    Code:
    // Wenn NPC Spieler bei keiner Straftat gesehen hat --> Return CRIME_NONE
    if (slf.aivar[AIV_NpcSawPlayerCommit] == CRIME_NONE)
    {
       return CRIME_NONE;
    };

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