[Modding] Einfügen eines weiteren Triggers in ein bestehendes Script

Dieses Thema im Forum "Modding Forum" wurde erstellt von Acifer, 7. Juni 2020.

  1. Acifer

    Acifer Senior Member

    Registriert seit:
    Apr. 2019
    Beiträge:
    763
    Zustimmungen:
    52
    Ich habe mich bisher wenig mit dem Eingriff in NPC-Scripts und -Dialoge beschäftigt.
    Nun habe ich das Problem, dass in mehreren meiner selbst erstellten Areas die Jaheira-Romanze weiterläuft, weil dort die Area-Types "OUTDOOR" bzw !AreaType(DUNGEON) gecheckt werden.
    Dies betrifft zum Einen die Träume über Khalid als auch das Erscheinen bestimmter mit der Romanze verbundener Kreaturen.

    Ich würde gerne in einzelne Scriptblöcke einen !AreaCheck("MYAREA") einfügen, z.B. in den Trigger, der Jaheiras Traum über Khalid triggert:
    Code:
    IF
        PartyRested()
        !Global("JaheiraRomanceActive","GLOBAL",0)
        !Global("JaheiraRomanceActive","GLOBAL",3)
        Global("JaheiraMatch","GLOBAL",1)
        !AreaType(DUNGEON)
            !AreaCheck("MYAREA")
        See(Player1)
        CombatCounter(0)
        OR(4)
            Global("LoveTalk","LOCALS",7)
            Global("LoveTalk","LOCALS",11)
            Global("LoveTalk","LOCALS",55)
            Global("LoveTalk","LOCALS",69)
    THEN
        RESPONSE #100
            IncrementGlobal("LoveTalk","LOCALS",1)
            RealSetGlobalTimer("JaheiraRomance","GLOBAL",1)
            PlaySong(36)
            Interact(Player1)
    END
    Nur: Wie mache ich das?
     
  2. Jastey

    Jastey Matron Modderholic

    Registriert seit:
    Mai 2004
    Beiträge:
    7.770
    Zustimmungen:
    185
    Ich würde hier "REPLACE_TEXTUALLY" vorschlagen. Das Problem dabei: man muss einen wirklich eindeutigen Textschnipsel heraussuchen, da alle erkannten Instanzen im Skript damit gepatcht werden.
    Problem Nummer zwei: REPLACE_TEXTUALLY ist unglaublich zickig. Wenn es den Textschnipsel nicht genau so erkennt wie angegeben, dann patcht es nicht. Das kann man aber entsprechend vorbereiten.

    Beispiel einer Anwendung, bitte entsprechend anpassen. (Das Ausgeben der gepatchten Zeile und der Fehlermeldung, wenn nichts gefunden wurde ist natürlich optional und habe ich von k4thos.)

    Ich habe die Stelle
    Code:
        OR(4)
            Global("LoveTalk","LOCALS",7)
            Global("LoveTalk","LOCALS",11)
    rausgesucht, um diesen Skriptblock explizit zu treffen. Um sicherzugehen, dass REPLACE_TEXTUALLY nicht aussteigt, weil es die Zeilenumbrüche und daher den Text nicht erkennt, werden der Zeilenumbruch entsprechend mit [%newline%]* für alle Betriebssysteme etc. fit gemacht.

    Bei dem Text, der stattdessen hingeschrieben werden soll, steht die \1 für das, was man vorher hat erkennen lassen (eingebettet in "\( \)"), hier könnte man theoretisch auch ein \2 etc. definieren.)
    Wenn im Text eine eckige Klammer oder ein Punkt steht, dann muss vor diese Zeichen eine zusätzliche Backslash \ geschrieben werden, z.B.
    Code:
    ActionOverride("imoen2?",JumpToPoint(\[1770\.1520\]))
    (Das "?" steht da, damit "imoen" und "imoen2" ekannt wird.)

    Dies kommt alles in die tp2, extra_regexp_vars.tph ist angehängt:
    Code:
    INCLUDE ~%MOD_FOLDER%/lib/extra_regexp_vars.tph~
    OUTER_SPRINT newline ~%WNL%%LNL%%MNL%%TAB% ~
    
    
    
    COPY_EXISTING ~JAHEIRA.BCS~ ~override~
        DECOMPILE_AND_PATCH BEGIN
            SPRINT textToReplace ~\(OR(4)[%newline%]*Global("LoveTalk","LOCALS",7)[%newline%]*Global("LoveTalk","LOCALS",11)\)~
            COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
            PATCH_IF (num_matches > 0) BEGIN
                REPLACE_TEXTUALLY ~%textToReplace%~ ~!AreaCheck("XXXXXX") \1~
                PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
            END ELSE BEGIN
                PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
            END
        END
    BUT_ONLY
    Nach dem Patchen müsste der Skriptblock dann so aussehen:

     

    Anhänge:

  3. Jastey

    Jastey Matron Modderholic

    Registriert seit:
    Mai 2004
    Beiträge:
    7.770
    Zustimmungen:
    185
    Ohne das Drumrum sieht es so aus, ist vielleicht zum Verstehen etwas übersichtlicher:
    Code:
    COPY_EXISTING ~JAHEIRA.BCS~ ~override~
        DECOMPILE_AND_PATCH BEGIN
                REPLACE_TEXTUALLY ~\(OR(4)[%newline%]*Global("LoveTalk","LOCALS",7)[%newline%]*Global("LoveTalk","LOCALS",11)\)~ ~!AreaCheck("XXXXXX") \1~
        END
    BUT_ONLY
     
  4. Acifer

    Acifer Senior Member

    Registriert seit:
    Apr. 2019
    Beiträge:
    763
    Zustimmungen:
    52
    :wuerg::wunder:;) Wow, toll! Vielen lieben Dank für Deine schnelle Hilfe und die verständlichen und ausführlichen Erklärungen! Es ist jedes Mal aufs Neue beeindruckend, wie professionell Du Dich auf diesem riesigen WeiDU-Terrain bewegst. :up::up:
    Habe schon alles in die Installationsdatei gepackt, installiert, die Jaheira BCS ist jetzt perfekt geupdatet, habe noch probeweise in besagter Area im Freien geschlafen und Jaheira hält den Mund. ;)
    1000x Danke! :)
     
  5. Jastey

    Jastey Matron Modderholic

    Registriert seit:
    Mai 2004
    Beiträge:
    7.770
    Zustimmungen:
    185
    Gerne! :) Das muss (s)ich ja auch mal auszahlen, was ich an Zeit und Nachfragen da reingesteckt habe, um das selbst zum Laufen zu bringen. :up:
     
    Zuletzt bearbeitet: 7. Juni 2020
    Acifer gefällt das.
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden