Skyrim Modding Guide: So sicherst du die Kompatibilität deiner Mods während des Spielens

So machst du deine Skyrim-Mod mitten im Spiel kompatibel

Die Bedeutung der Kompatibilität während des Spielens

Skyrim-Spieler sind bekannt für ihre Hingabe und investieren oft Hunderte, sogar Tausende von Stunden in ein einziges Durchspielen. Diese Spieler zu zwingen, ein neues Spiel zu beginnen, um deine Mod oder sogar ein Update zu erleben, kann sehr abschreckend sein. Aus Benutzersicht bedeutet ein Neustart, unzählige Stunden an Fortschritt zu verlieren und möglicherweise ganz auf deine Mod zu verzichten.

Dieser Leitfaden richtet sich an Mod-Autoren, insbesondere an diejenigen, die mit dem Creation Kit und den Grundlagen des Moddings vertraut sind. Wir werden untersuchen, wie du Techniken implementierst, die es ermöglichen, deine Mod während des Spielens zu installieren oder zu aktualisieren, um deinen Benutzern ein reibungsloseres und angenehmeres Erlebnis zu bieten.

Umgang mit Updates und Installationen

Der Schlüssel zur Kompatibilität während des Spielens liegt darin, zu verstehen, wie man Skripte, Quests und Objektverweise während eines Mod-Updates oder einer erstmaligen Installation verwaltet. Da diese Szenarien die gleichen Prinzipien teilen, werden wir sie zusammen behandeln.

Timing ist alles: Ausführen deiner Logik

  • OnInit-Ereignis: Ein einfacher Ansatz ist die Verwendung der OnInit-Funktion innerhalb einer neuen Quest, die speziell für Updates/Installationen entwickelt wurde. Diese Quest sollte im Creation Kit Quest Data Tab als "Start Game Enabled" gekennzeichnet sein. Hänge ein Skript über den Scripts Tab an diese Quest an und platziere deinen Update-/Installationscode innerhalb der OnInit-Funktion.

  • OnPlayerLoadGame-Ereignis: Für Updates bietet das OnPlayerLoadGame-Ereignis eine Alternative. Erstelle einen Alias auf dem Alias Tab, zwinge ihn, auf den Spieler zu verweisen, und hänge ein Skript (das das ReferenceAlias-Skript erweitert) an diesen Alias an. Implementiere deine Update-Logik innerhalb der OnPlayerLoadGame-Funktion. Beachte, dass dieses Ereignis nur beim Laden eines Spielstands ausgelöst wird, nicht bei der Initialisierung einer neuen Quest. OnInit wird jedoch trotzdem für dieses Alias-Skript ausgeführt, wenn die Quest startet.

  • OnCellAttach-Ereignis: Einige Funktionen, wie GetDistance oder FindClosestReferenceOfAnyTypeInListFromRef, erfordern geladene Objektverweise. Wenn deine Update-/Installationslogik von diesen abhängt, verwende die OnCellAttach-Funktion.

Skripte entmystifizieren

Skripte sind oft eine Quelle der Angst für Mod-Autoren, die sich Sorgen um die Kompatibilität während des Spielens machen. Solange ein Skript jedoch nicht während des Speicherns aktiv ausgeführt wird (was selten vorkommt), werden sein Code und sein Ausführungszustand nicht gespeichert. Skripte werden in der Regel schnell ausgeführt, insbesondere wenn du RegisterForSingleUpdate und OnUpdate für längere Verzögerungen anstelle von Utility.Wait verwendest.

Das Hauptproblem liegt bei den Eigenschaften und Instanzvariablen von Skripten, die gespeichert werden. Glücklicherweise sind diese jedoch überschaubar:

  • Eigenschaften: Setze ihre Werte direkt mit Papyrus auf den gewünschten Zustand.

  • Instanzvariablen: Da diese privat für ihr Skript sind, erstelle Setter-Funktionen, um sie zu aktualisieren:

    int myInstanceVar = 5
    
    Function SetMyInstanceVar(int newValue)
      myInstanceVar = newValue
    EndFunction
    

Wichtig ist, dass neu hinzugefügte Eigenschaften zu einem bereits initialisierten Skript automatisch auf den in deinem Plugin angegebenen Wert voreingestellt werden, sodass du nur vorhandene Eigenschaften anpassen musst.

Arbeiten mit Quests

Sobald eine Quest läuft (nicht nur im Tagebuch sichtbar ist), werden ihre Phasen, Skripteigenschaften und Aliase fixiert. So gehst du damit um:

  • Aliase: Einfach zu aktualisieren mit der ForceRefTo-Funktion. Füge die neue Referenz als Skripteigenschaft in deiner Update-/Installationslogik hinzu und verwende ForceRefTo, um deinen Alias darauf zu verweisen.

  • Questphasen:

    1. Vermeide unnötige Änderungen: Behalte im Idealfall deine ursprüngliche Phasenindexsequenz bei. Entwirf deine Quest mit genügend Phasen-IDs, um zukünftige Ergänzungen zu ermöglichen.
    2. Erwäge einen Quest-Ersatz: Beende bei größeren Überarbeitungen die ursprüngliche Quest mit Stop und führe eine ganz neue Quest ein.
    3. Quest-Rekonstruktion: Wenn du eine bestehende Quest mit der gleichen Form neu erstellen musst, verwende Stop, Reset und SetStage, um den Spieler nach dem Update in den gewünschten Zustand zu führen.

Verwalten von Objektverweisen

Mods, die die Spielwelt verändern, können Konflikte bei der Platzierung von Objekten verursachen, was oft dazu führt, dass Autoren ein neues Speichern benötigen. Dies liegt daran, dass die Positionen von persistenten Referenzen gespeichert werden.

Denke daran, dass nur persistente Objektverweise ein Problem darstellen. Temporäre Objekte werden automatisch auf ihre neuen Positionen aktualisiert, da sie nicht gespeichert werden.

  • Bewegliche Objekte: Die meisten persistenten Objekte wie Activators, Containers, MovableStatics und Marker können mit Skripten verschoben werden. Die MoveToMyEditorLocation-Funktion ist dafür besonders hilfreich.

  • Unbewegliche Objekte: Trees, Flora, Statics und Furniture können nicht per Skript verschoben werden. Hier sind ein paar Lösungen:

    1. Deaktivieren und Ersetzen: Wenn das Objekt nicht von anderen Mods verwendet wird, deaktiviere das alte und füge ein neues an der gewünschten Stelle hinzu. Stelle sicher, dass alle Quest-Aliase oder Skripteigenschaften, die auf diese Objekte verweisen, entsprechend aktualisiert werden.
    2. Save Unbaker-Anforderung: Füge die Mod Save Unbaker als Voraussetzung hinzu. Dieses Tool verschiebt diese Objekte automatisch an ihre neuen Positionen.

Andere persistente Datensätze

Denke an diese zusätzlichen Datensätze, die in Spielständen erhalten bleiben:

Beispiel: Rückwirkendes Update-Skript

ScriptName RetroactiveFixAlias Extends ReferenceAlias

MyQuestScript Property myQuest Auto
ObjectReference Property myQuestProperty1Ref Auto
ObjectReference Property myQuestProperty2Ref Auto

ReferenceAlias Property myAlias1 Auto
ReferenceAlias Property myAlias2 Auto
ObjectReference Property myAlias1Ref Auto
ObjectReference Property myAlias2Ref Auto

ObjectReference Property myRef1 Auto
ObjectReference Property myRef2 Auto

ObjectReference Property myActor1 Auto
Outfit Property myActor1Outfit Auto

int currentVersion = -1

Event OnInit()
  HandleInstallOrUpdates()
EndEvent

Event OnPlayerLoadGame()
  HandleInstallOrUpdates()
EndEvent

Function HandleInstallOrUpdates()
  If currentVersion != 2
    myQuest.myQuestProperty1 = myQuestProperty1Ref
    myQuest.myQuestProperty2 = myQuestProperty2Ref

    myAlias1.ForceRefTo(myAlias1Ref)
    myAlias2.ForceRefTo(myAlias2Ref)

    myRef1.MoveToMyEditorLocation()
    myRef2.MoveToMyEditorLocation()

    myActor1.SetOutfit(myActor1Outfit)

    currentVersion = 2
  EndIf
EndFunction

Beispiel: Korrigieren einer Objektverweis nach dem Laden der Zelle

ScriptName RetroactiveFixObjectReference extends ObjectReference

int currentVersion = -1
ObjectReference Property myRef Auto
FormList Property myRefTypes Auto

Event OnInit()
  ; Initialisiert mit Version 2, keine Korrektur erforderlich
  currentVersion = 2
EndEvent

Event OnCellAttach()
  If currentVersion != 2
    myRef = Game.FindClosestReferenceOfAnyTypeInListFromRef(myRefTypes, self, 100.0)
    currentVersion = 2
  EndIf
EndEvent

Fazit

Obwohl dieser Leitfaden nicht jedes Szenario abdeckt, bietet er eine solide Grundlage, um deine Skyrim-Mod zugänglicher und benutzerfreundlicher zu gestalten. Denke daran, dass es zwar eine Herausforderung sein kann, eine perfekte Kompatibilität während des Spielens zu erreichen, aber selbst kleine Schritte in diese Richtung das Erlebnis für deine Benutzer deutlich verbessern können.

Analytics