Beginnen Sie mit einer Idee#
Ein Mod liefert Anweisungen und Daten, die X4 zum richtigen Zeitpunkt liest. Es braucht keine Hauptdatei, durch die jedes Ereignis passiert. Schiffsdaten werden als Ressourcen geladen, MD wartet auf Bedingungen, AI läuft Verhalten, und Lua behandelt UI.
Die Engine ist der ausführbare Teil des Spiels: Sie erstellt Objekte, berechnet Bewegungen, speichert die Welt und führt Operationen durch, die Skripten ausgesetzt sind. Ihre vollständige Quelle befindet sich nicht in einem Mod-Ordner. Eine Erweiterung verwendet unterstützte Formate und APIs. Eine API ist eine Reihe von verfügbaren Möglichkeiten, um mit einem System zu interagieren, wie das Lesen eines Objektnamens oder das Senden eines Ereignisses.
Diese Anleitung umfasst regelmäßige Modding. Neue Beispiele erklären und wurden nicht separat im Spiel ausgeführt. Original Elite Werte wurden gegen die installierten X4 9.00 Dateien überprüft.
Warum mehrere Sprachen beteiligt sind#
Verschiedene Aufträge benötigen unterschiedliche Darstellungen. Ein Rumpfwert wird bequem als Daten gespeichert; eine Ereignisreaktion benötigt einen Handler; eine Schaltfläche benötigt ein Widget und eine Klickfunktion.
| Ebene | Typischer Standort | Arbeit |
|---|---|---|
| XML-Daten | assets/, libraries/, t/ |
Eigenschaften, Waren und übersetzter Text |
| XML diff | Zielressourcenpfade anpassen | Ausgewählte Teile eines Dokuments ändern |
| Mission Director | md/*.xml |
Reagieren Sie auf Ereignisse und führen Sie Weltlogik |
| KI-Skripte | aiscripts/*.xml |
Verhalten und Befehle der Akteure |
| Lua UI | ui/*.lua, registriert in ui.xml |
Fenster, Tabellen und Eingaben |
| Native Code | Motor oder DLL eines Mods | Integration auf niedrigerer Ebene |
MD und KI verwenden XML, haben aber eigene Elemente und Ausführungsregeln. Prüfen Sie das Root-Element und das Verzeichnis, anstatt nach der Erweiterung allein zu beurteilen. Python oder C# können in Werkzeugen und komplexen Projekten erscheinen; das macht sie nicht zu integrierten MD-Sprachen. Ein erster XML-Patch benötigt nur seine Manifestierung und Diff.
Was passiert, wenn eine Erweiterung geladen wird#
Das folgende Originaldiagramm fasst die Verantwortlichkeiten zusammen, anstatt eine exakte universelle Lastreihenfolge zu versprechen. X4-Version, DLC, Abhängigkeiten, andere Mods und gespeicherter Zustand beeinflussen das Ergebnis. content.xml die Erweiterung und ihre Version/Abhängigkeiten zu identifizieren. ui.xml Listen Lua-Dateien für eine Benutzeroberfläche. Die Felder der Versionsversion von Danielo haben ein definiertes numerisches Format; ersetzen Sie keine beliebigen menschlichen Versionen wie z.B. 0.1.0.
extensions/имя_мода/content.xml
→ игра узнаёт расширение и его зависимости
→ получает ресурсы с учётом расширений и патчей
→ загружает подходящие скрипты и UI
→ события и callbacks вызывают обработчики
→ движок меняет состояние мираBeispiel 1: XML speichert eine Eigenschaft#
In der unten stehenden gekürzten Makro-Abbildung ist Rumpf ein Element, max ist ein Attribut und 1800 ist sein Wert. XML selbst führt keine Schleife aus; die Engine interpretiert dieses Feld im Ressourcenkontext. Ein separater Diff ändert das ausgewählte Attribut.
Den Selektor lesen als: geben Sie ein /macros/macro, das Makro mit dem angegebenen Namen speichern, eingeben /properties/hull, dann wählen /@max. Dies ist XPath über einem Dokument, nicht eine MD Bedingung oder eine Suche nach einem Live-Schiff. Eine Ressourcenänderung muss noch auf vorhandenen gespeicherten Objekten getestet werden. Siehe das komplette erste Pflaster.
<properties>
<hull max="1800" />
</properties><diff>
<replace sel="/macros/macro[@name='ship_arg_s_fighter_02_a_macro']/properties/hull/@max">3600</replace>
</diff>Beispiel 2: MD führt Aktionen aus#
Das erste Fragment weist 3 auf $Count, prüft, ob es größer als Null ist und druckt eine Diagnose. Es gehört in einem geeigneten Queue's actions; es ist keine eigenständige Erweiterung. XML-Außenanführungszeichen begrenzen ein Attribut; im Inneren genau unterscheidet sich die Zahl 3 von einem zitierten String.
Ein vollständiges MD-Skript hat mdscript, cues, cue Bedingungen und Aktionen. Ein cue ist ein Logikknoten mit Zustand: es kann warten, aktivieren und komplett. Denken Sie an ereignisgesteuerte Handler anstatt einer gesamten Datei, die kontinuierlich von oben wieder läuft. instantiate=true namespace=this lässt wiederholte Ereignisse Instanzen mit ihren eigenen variablen Kontexten haben. Lesen cues, Variablen und die verknüpfte Primärdokumentation für die eigentliche Spielversion.
<set_value name="$Count" exact="3" />
<do_if value="$Count gt 0">
<debug_text text="'Есть элементы для обработки'" />
</do_if><set_value name="$Count" exact="3" />
<set_value name="$Label" exact="'Три'" />Beispiel 3: Lua wird von der UI aufgerufen#
Das Beispiel Lua unten verwendet keine Spiel-APIs. local erstellt einen lokalen Namen, function definiert eine Funktion, ihr Argument erhält Eingabe, return ein Ergebnis erzielt, und .. verbindet Strings. Die Original-Beispielmeldungen behalten ihre Originalsprache.
Eine Funktion, die einem Button zugewiesen wird, wird später von der Benutzeroberfläche aufgerufen; dies ist ein Rückruf. Eine Funktion zuweisen und sofort aufrufen sind verschiedene Operationen. Beispiele dafür sind die Unterscheidung ohne eine Schaltfläche API zu erfinden.
local function makeLabel(name)
if type(name) ~= "string" or name == "" then
return "Без имени"
end
return "Корабль: " .. name
end
local label = makeLabel("Север")local callback = makeLabel -- сохранить саму функцию
local result = makeLabel("Север") -- вызвать и сохранить ответWie ein Fenster und die Welt kommunizieren#
Lua hat Spiele lesen APIs und einige Engine-Operationen; MD stellt eine andere Reihe von Aktionen und Eigenschaften. Wählen Sie die Ebene auf der Grundlage der verfügbaren Betrieb und Lebenszyklus. Nicht jede Weltänderung muss durch MD passieren.
Ein gemeinsamer Austausch verwendet AddUITriggeredEvent zu MD, dann raise_lua_event zu einem RegisterEvent-Rückruf. Dies sind X4-Umgebungs-Einrichtungen: gewöhnliche Lua stellt sie nicht zur Verfügung. MD set_value und raise_lua_event sind XML-Elemente, nicht Lua-Funktionen. Siehe das gepaarte Beispiel.
Lua: AddUITriggeredEvent(screen, control, payload)
→ MD: event_ui_triggered
→ данные запроса: event.param3
→ действия и чтение результата
→ MD: raise_lua_event
→ Lua: RegisterEvent(name, callback)Warum das Bearbeiten einer Datei das alte Ergebnis hinterlassen kann#
Ein Patch kann ein anderes Makro anvisieren oder durch einen Kompatibilitätskonflikt überschrieben werden. Lua kann in ui.xml fehlen. Ein Queue kann bereits im Speichern abgeschlossen sein. Eine Objektreferenz kann nach dem Laden vertagt sein. Ein Save stellt Welt und MD Zustand zurück, anstatt einfach jede Quelldatei neu zu starten. Einige Änderungen müssen initialisiert oder Migration.
Fragt separat: Hat die Datei geladen, hat der beabsichtigte Handler ausgeführt und hat das Objekt geändert und diese Änderung beibehalten? Ein Logmarker für den Handler beweist nicht den endgültigen Effekt. Prüfen Sie neue Spiele und relevante bestehende Speicher separat.
Was als nächstes zu lesen ist#
Weiter mit Betreiber und gemeinsame Funktionen, dann wählen ein Eigenschaftspatch, ein MD-Skript oder ein Fenster. Offizielle Modding Support ist unter den Quellen dieses Artikels verknüpft.