Wie man dieses Cheat-Sheet verwendet#

Identifizieren Sie zuerst die Sprache. XPath, MD und Lua drücken ähnliche Absichten anders aus. Dies ist eine Auswahl, die zum Lesen dieser Beispiele und Projektcode nützlich ist, keine statistische Rangfolge oder vollständige Sprachreferenz. wie X4-Code funktioniert wenn die Begriffe nicht bekannt sind. Neue Schnipsel sind Lernbeispiele, die nicht in-game-Tests beansprucht werden.

Vier Grundkonzepte#

Eine Variable speichert einen Wert. Eine Bedingung wählt, ob etwas getan werden soll. Eine Funktion erhält Argumente und führt Arbeit aus, manchmal gibt sie ein Ergebnis zurück. Ein Ereignishandler ist eine Funktion oder MD-Node-Run für ein bestimmtes Ereignis. getName, Anruf getName() und die Speicherung des zurückgegebenen Wertes.

XML-Elemente, Attribute und Selektoren#

Vordruck Bedeutung
<hull max="1800" /> Ein Element mit einem Attribut und ohne Kindinhalt
<actions> ... </actions> Beginn und Ende eines Behälters
<!-- comment --> XML-Kommentar
replace, add, remove Diff Operationen zum Ersetzen, Hinzufügen oder Entfernen ausgewählter Inhalte
/properties/hull/@max XPath zu einem Attribut
[@name='example'] XPath Attributfilter

Innerhalb eines XML-Attributs, Escape Ampersands als &amp; und weniger als &lt;. XML wird vor MD-Ausdrücken geparst, weshalb lt/le/gt/ge bequeme Vergleiche sind. Ein Diff Selektor und ein do_if-Ausdruck verwenden verschiedene Grammatiken.

MD: Eine kleine Aktion nach der anderen#

Bauen Zweck
set_value Einen Wert zuweisen oder aktualisieren
do_if, do_elseif, do_else Einen Zweig auswählen
do_for_each Prozesslistenelemente
append_to_list Ein Element anhängen
remove_value Eine Variable entfernen oder aufzeichnen
debug_text Schreibdiagnostik
run_actions Führen Sie eine entsprechende Aktionsbibliothek aus
event_ui_triggered Erhalten Sie ein UI Ereignis unter Stichwortbedingungen
raise_lua_event Senden Sie ein Ereignis an Lua

Das sind MD-Elementenamen, nicht Standard-XML-Funktionen. Die Engine definiert Attribute und gültigen Kontext. Das untenstehende Aktionsbeispiel erstellt eine eigene Liste und endet mit Count gleich 2. operation=add exact=1 erhöht es; Element bezeichnet das aktuelle Element.

XML
<set_value name="$Items" exact="['Корпус', 'Двигатель']" />
<set_value name="$Count" exact="0" />
<do_for_each name="$Item" in="$Items">
  <set_value name="$Count" operation="add" exact="1" />
</do_for_each>
<do_if value="$Count == 2">
  <debug_text text="'Обработано два элемента'" />
</do_if>

MD-Ausdrücke#

Vordruck Bedeutung
$Count, Init.$States Eine Variable oder eine Variable in einem expliziten Cue-Kontext
==, != Gleich, nicht gleich
lt, le, gt, ge Weniger, weniger oder gleich, größer, größer oder gleich
and, or, not Logische Operationen
+, -, *, /, % Arithmetik; Prozent ist Rest
'Name: ' + $Label Streichkonditionierung
$Value?, $Object.exists Variable/Eigentumsauflösung versus Objektexistenz
typeof $D == datatype.list Prüfung der Wertart
$D.{1}, $D.count Erste Liste Element und Element zählen
table[], [] Leere Tabelle und leere Liste
if $Ready then 'yes' else 'no' Ein bedingter Wertausdruck

Die angezeigten MD-Listen beginnen bei 1. Eine resolvierbare Variable kann falsch enthalten; Existenz und Wahrheit sind unterschiedlich. Variablenkontext, besonders mit instantisierten Stichworten.

Lua: Eine gewöhnliche Funktion lesen#

Das unten stehende Beispiel verwendet keine X4-Funktionen. Sein Ergebnis ist 8, vorausgesetzt, jedes Element hat ein numerisches Mengenfeld. {} erstellt eine Tabelle, die sowohl für Sequenzen als auch für benannte Datensätze verwendet wird. item.amount Mittel item["amount"]. DieIn for _, item, Die erste Variable erhält den Index; Unterstrich ist ein gewöhnlicher Name, der konventionell einen nicht verwendeten Wert markiert.

LUA
local function total(items)
    if type(items) ~= "table" then
        return 0
    end
    local result = 0
    for _, item in ipairs(items) do
        result = result + item.amount
    end
    return result
end

local amount = total({{amount = 3}, {amount = 5}})

Lua-Betreiber#

Vordruck Bedeutung
= Zuweisung
==, ~= Gleich, nicht gleich
<, <=, >, >= Vergleiche
and, or, not Logische Operationen
+, -, *, /, % Arithmetik
.. Streichkonditionierung
#value String Bytelänge oder Sequenzgrenze
object.field Zugang zum Tabellenfeld
object:method(x) Äquivalent zu object.method(object, x)

#table ist keine Anzahl beliebiger Schlüssel. Holes und String-Schlüssel bilden keine dichte Sequenz. Stringlängen zählen Bytes, was für UTF-8 wichtig ist. Nur false und nil sind false in Lua; 0 und ein leerer String sind wahr. value or fallback Ersetzt auch false. Logisch und/oder gibt einen ausgewählten Wert zurück, nicht unbedingt ein Boolean.

Lua-Standardfunktionen#

type einen Werttyp meldet; tostring Formate eines Wertes; tonumber nel zurück. ipairs die dichten Indizes von 1 bis zu einem fehlenden Gegenstand gehen; pairs hat keine Auftragsgarantie. table.insert, table.remove und table.concat Sequenzen manipulieren. string.format erstellt formatierten Text; Match/gsub verwenden Lua-Muster. math.min und math.max Wählen Sie numerische Grenzen. pcall Lua-Fehler; require Lademodule unter Umweltvorschriften.

Nicht jedes Modul ist in Spiel UI verfügbar. Nehmen Sie nicht den Debug- oder Dateizugriff an. Überprüfen Sie die Aufruf-Flagge und Fehler, anstatt einen Fehler still zu verbergen. Ein geschützter Lua-Aufruf macht keinen ungültigen nativen Anruf-Safe. Siehe die Primärreferenzen Lua 5.1 und LuaJIT unten.

X4-Funktionen versus Mod-Funktionen#

Lösen Sie Objekt-IDs in der korrekten Darstellung. Eine Zufallszahl, Schiffsname, Netzwerk-ID, UI-Handle und UniverseID sind nicht austauschbar: ID-Präzision.

Fünf Fehler, die Sie beim Lesen erkennen können#

  1. Verwendung von Lua ~=, während MD verwendet != für Ungleichheit.
  2. Lua verbindet Strings mit ..; MD-Verwendungen + in den gezeigten Formen.
  3. Lua-Zuweisung ist =, Vergleich ist ==.
  4. Fenstertext ändern beweist nicht, dass sich das Weltobjekt verändert.
  5. Eine Handler-Definition benötigt noch eine geladene Datei, ein empfangenes Ereignis und validierte Eingaben.

Lies Lua ↔ MD und erklären Sie jede Zeile, bevor Sie das Beispiel in einem Testprofil installieren.