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 derOnInit
-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 derOnPlayerLoadGame
-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
oderFindClosestReferenceOfAnyTypeInListFromRef
, erfordern geladene Objektverweise. Wenn deine Update-/Installationslogik von diesen abhängt, verwende dieOnCellAttach
-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 verwendeForceRefTo
, um deinen Alias darauf zu verweisen. -
Questphasen:
- 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.
- Erwäge einen Quest-Ersatz: Beende bei größeren Überarbeitungen die ursprüngliche Quest mit
Stop
und führe eine ganz neue Quest ein. - Quest-Rekonstruktion: Wenn du eine bestehende Quest mit der gleichen Form neu erstellen musst, verwende
Stop
,Reset
undSetStage
, 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:
- 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.
- 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:
-
Fraktionsränge: Veränderbar mit
SetFactionRank
,AddToFaction
undRemoveFromFaction
. -
Beziehungsränge: Anpassbar mit
SetRelationshipRank
. -
NPC-Outfits: Veränderbar mit
SetOutfit
.
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.