[Modding] Crossmod- Modding

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.379
Also ich plane gerade eine NPC-Mod, bei der es auch Cross-Mod geben soll. Und ich bin am Überlegen, wie ich das technisch am Besten angehe. Da gibt es für mich zwei Fallunterscheidungen (oder drei) und halt zwei Möglichkeiten: als eigene CrossMod-Komponente und über Skripte, die Existenz von Triggern abfragen

a) Quest-Mods: die werden eigentlich immer vor den NPC installiert, da kann man davon ausgehen. Und wenn man die Existenz von Triggern abfrägt wie Variablen auf einem bestimmten Wert oder Exists() in Areas, dann spielt das nach meinem Verständnis keine Rolle, ob die Quest-Mod vorher installiert wurde oder nicht. Wenn nach der Existenz von Kreaturen gefragt wird, dann gibt es halt im Skript selbst eine Fehlermeldung, wenn die Ressource gar nicht existiert, aber keinen Fehler im Spiel. Und solche Dinge in einen CrossMod-Komponente auszugliedern ist halt ziemlich viel Arbeit (zumindest mal beim Nachdenken drüber) und vor allem auch fehleranfällig, wenn irgendwelche Reihenfolgen durcheinanderkommen, weil andere Mods was dazwischen schreiben etc. Da würde ich eher dazu tendieren, dafür keine Cross-Mod-Komponenten zu schreiben, sondern direkt in der Hauptkomponente der Mod das zu richten.

b) NPC-Mods: bei Interjections würde ich einfach im Code prüfen, ob der NPC ValidForPartyDialogue ist, weil das ist entscheidend und nicht, ob er installiert ist oder nicht. Banter könnte man in eine eigene CrossMod-Komponente bringen, das macht Sinn, weil NPC ja durchaus alle an derselben Stelle installiert werden und die Reihenfolge beliebig kompliziert werden kann, wenn das passiert. Ist zwar auch doof, weil man für jeden kurzen Zweizeiler mit einem anderen NPC eine Abfrage in die tp2 schreiben muss (und immer checken, ob nicht ein Update beim anderen NPC die Komponente verschiebt oder der Name einer Ressource geändert wurde) und eine eigene d-Datei dazu kompilieren muss (also nicht das kompilieren an sich, aber das Schreiben davon ;) ). Aber das könnte es im Ergebnis wert sein.

c) Kit-Mods: hier ist es eigentlich einfach: in der tp2 abfragen, ob das Kit da ist. Wenn nicht, die Variante ohne das Kit installieren, wenn doch, dann mit Kit. Alles andere ist keine Option, denke ich.

Vor allem an diejenigen, die hier mehr Ahnung und Erfahrung haben wie ich: übersehe ich bei meinen Überlegungen was? Läuft da irgendwas anders wie von mir angenommen? Habe ich was übersehen?
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.920
Ich bin mir nicht sicher, ob ich alle Deine Überlegungen richtig verstanden habe. Daher meine zu Crossmod:

-Alles, wo Du Ressourcen (anderer Mods) patchen möchtest, funktioniert logischeweise nur, wenn diese Ressourcen (dlg, bcs, are) vorliegen*. Das heißt, wenn Du einen (anderen Mod-)NPC sprechen lassen möchtest und daher die B.dlg patchen, dann kannst Du das nur machen, wenn der andere NPC auch installiert ist. Soweit so logisch.

-Wenn Du nur Bezug auf andere Ressourcen nehmen möchtest - also in einer Mod-Area soll Dein NPC was sagen (AreaCheck()), oder wenn ein anderer NPC in der Gruppe ist darauf reagieren (InParty()), oder eine Questvariable einer Questmod in Deinen Skripten als Trigger verwendet wird, dann kannst Du dies immer machen, da Du hier keine wirklichen Ressourcen dazu verwenden musst. Liegen die anderen Dateien nicht vor, wird hier nur NI beim Anschauen der Skripte eine Fehlermeldung geben, aber im Spiel wird es eben übersprungen, wenn die Trigger nicht wahr sind. Soweit auch klar.

-Ich füge nur Crossmodinhalte in die Hauptkomponente, die nötig sind, wenn sonst wirklich technische Inkompatibilitäten auftreten würden. Dazu verbiete ich auch (wenn ich Zugriff habe) bei der entsprechenden anderen Mod die vorherige Installation der Mod, die Kompatibilitätsanpassungen braucht. Das ist also ein "geschlossenes System": erst Mod 1 installieren, dann Mod 2, und Mod 2 macht Kompatibilitätsanpassungen, damit sie zusammen laufen. (Beispiel wäre bg1re mit der Scar Return-Komponente für EndlessBg1 und Transitions. Wenn man hier bg1re zuerst installieren würde wär das nicht nur irgendwie ungünstig, sondern eben wirklich inkompatibel).

-Was ich ebenfalls in die Hauptkomponente tue sind Abfragen, deren späteres Einfügen einfach zu mühselig wäre. Zum Beispiel das Checken in NTotSC nach dem Leuchtstein aus der Grabmalmod. Die habe ich da gleich reingeschrieben, weil es unter anderem eine OR() Abfrage ist mit den ganzen anderen Leuchtmitteln, mit denen man den letzten (dunklen) Level des Feuerweinbrücken-Dungeon betreten kann. Diese Abfrage über eine Crossmodkomponente einzufügen wär einfach zu fitzelig.

-Ich tue alle anderen Crossmodinhalte in eine eigene Komponente. Einfach, weil ich mir dann wirklich keine Gedanken mehr über die Reihenfolge machen muss. Es gibt Leute, die installieren meinen SoD tweakpack als Questmod. Ich selbst installiere sie eher spät. Vielleicht soll eine Mod doch Crossmod ("richtigen", nicht nur Verwendung von den Variablen) zu Road to Discovery kriegen, oderoderoder. Ist alles in einer eigenen Komponente, muss entsprechend spät installiert werden, alles wird abgedenkt, fertig.

*Wenn Du eine CHAIN-Syntax hast und andere NPCs etwas sagen, dann kann man hier auch mit IF_EXISTS(?) arbeiten und so dlg-Dateien verwenden, die zu dem Zeitpunkt nicht vorliegen - sie werden dann entsprechend übersprungen und die Inhalte eben nicht installiert. Das würde dann aber wieder eine definierte Installationsreihenfolge voraussetzen, die man mit einer unabhängigen Crossmodkomponente vermeiden kann. (Denn: Spieler machen alles. Alles! BG1-Mods auf BGII installieren, EET Mods nach EET_End installieren... alles! ...)
 

Jastey

Matron Modderholic
Registriert
16.05.2004
Beiträge
12.920
Noch eine Sache: wenn Du überprüfen möchtest, ob eine andere Mod installiert ist, dann ist es sicherer, nach einer bcs oder dlg zu suchen, als nach einer are oder cre. Der grund ist, dass aus Legacy-Gründen die Abfrage FILE_EXISTS_IN_GAME auch wahr ist, wenn der Spieler die Datei nur in einem Ordner vorliegen hat (aber nicht installiert). Da Mods in der regel keine bcs oder dlg vorlegen, ist das ein Check, ob die Mod wirklich installiert ist.
Man kann natürlich auch MOD_IS_INSTALLED nehmen - ich bin nur manchmal zu faul, das rauszusuchen, wenn ich weiß, dass es ausreicht, nach der installierten dlg zu checken, die ich für Banter patchen möchte (als beispiel).
 

Maus

Senior Member
Registriert
07.08.2002
Beiträge
9.379
Also zur ersten Antwort: Ja, das war ziemlich genau meine Frage. Und die zweite Antwort gibt da auch einen guten Hinweis zusammen mit der ersten:
Die Dinge, bei denen Dateien ergänzt/verändert werden sollen, müssen logischerweise in eine Cross-Mod-Komponente und dann frägt man genau diese Datei-Ressource (oder halt eine davon) auch ab, damit das alles klappt. MOD_IS-INSTALLED ist schwierig, weil da sich bei Updates die Komponentenreihenfolgen etc. gerne mal ändern und man dann falsch liegt.
Aber so abfragen nach Items oder so ist glaube ich easy ohne Cross-Mod-Komponente, weil dann hat die Gruppe das Item halt nicht, wenn die Mod nicht installiert wurde. Und die Reihenfolge ist ja egal.
 
Oben