AI Core

Ein Skript aktualisieren

Bring ein ai-*-Skript, ein Paket oder ein Drittanbieter-Skript auf die neue Version und behalte deine Einstellungen, Panel-Daten, Secrets, Texte und Datenbank.

Ein Update hat zwei Hälften: Installiere die neue Version genau so, wie sie ausgeliefert wird, und übertrage dann die eigenen Änderungen deines Servers darauf. Alte Dateien über die neuen zu kopieren ist nie der richtige Weg: Es bringt alten Code, alte Schlüssel und alte Fehler zurück, und die neue Version geht auf eine Weise kaputt, die schwer zu finden ist.

Diese Seite ist für zwei Leser geschrieben: für dich und für den KI-Coding-Agenten (Claude Code, Codex, Cursor...), den du auf sie verweist. Beide folgen demselben Ablauf.

Frag deine KI

Öffne deinen Server-Datenordner in deinem Coding-Agenten und füge das hier ein, mit ausgefülltem Umfang:

Aktualisiere Skripte auf diesem AI-Core-Server nach https://aifivem.com/docs/update-a-script.md
Wenn dieser Ordner .claude/skills/aicore-script-update/ hat, lies seine SKILL.md und references: derselbe Ablauf.

Umfang: <jedes veraltete ai-*-Skript und Paket | ai-inventory ai-garages | die Drittanbieter-Skripte in C:\pfad\zu\neuen-versionen>

- Zeig mir zuerst die Liste (Name, Pfad, aktuelle -> neue Version, Release Notes mit Handlungsbedarf) und warte auf mein Okay.
- Sichere jeden Ordner, bevor du ihn anfasst, auch von git ignorierte Dateien wie data/secrets.json.
- Hol dir drei Stände pro Skript: altes Upstream (die Version, die ich nutze, wie ausgeliefert), unseres (der Ordner jetzt), neues Upstream.
  Führe sie Datei für Datei mit diesem Drei-Wege-Modell zusammen. Kopiere nie eine alte Datei über eine neue.
- Behalte meine data/*.json-Panel-Inhalte, data/secrets.json, meine Locale-Texte und meine Datenbank.
  Gib nie ein Secret im Chat aus und committe nie eins.
- Kein SQL ohne mein Okay und ein Backup der betroffenen Tabellen. security.cfg wird nie gelockert.
- Nimm generierte Dateien (dist/, fxmanifest.lua, resource/server/tables.ts, data/schemas/) aus der neuen Version
  und erzeuge sie per Build neu; bearbeite sie nie von Hand.
- Baue, refreshe, starte neu und lies das Konsolen-Log auf Fehler, nicht nur auf "Started resource".
- Committe oder pushe nur, wenn ich darum bitte.
- Schließe mit einem Bericht pro Skript in meiner Sprache: Versionswechsel, was sich upstream geändert hat, was du
  übertragen hast und wohin, was weggefallen ist (mit dem alten Wert), neue Optionen auf ihrem Standard, Datenbank,
  cfg-Änderungen, Ergebnis von Build / Neustart / Log, was im Spiel zu testen ist und welche Entscheidungen ich treffen muss.

Jeder AI-Core-Server-Ordner enthält diesen Ablauf als Projekt-Skill in .claude/skills/aicore-script-update/: Das txAdmin-Recipe installiert ihn zusammen mit den Regeln, tools/, docs/compat/, CLAUDE.md und AGENTS.md, genau wie die Installation von Hand. Claude Code lädt ihn von selbst, wenn du "aktualisiere meine Skripte" oder "eine neue Version ist da" sagst; andere Agenten finden ihn über AGENTS.md. Einem Server, der mit einem älteren Recipe installiert wurde, können diese Dateien fehlen: Lade sie wie unter Von Hand installieren aus dem aicore-server-Repository in deinen Server-Ordner und behalte deine eigenen cfg-Dateien.

Was dir bleibt

WasWoWas das Update damit macht
Panel-Einstellungen und -Inhaltedata/*.json in jedem SkriptBleiben erhalten. Werden nur ins neue Format umgewandelt, wenn die neue Version andere Felder liest.
Secretsdata/secrets.json (von git ignoriert)Werden unverändert aus dem Backup zurückgeholt. Nie ausgegeben, nie committet.
Deine Textelocales/*.json, locales/ oder languages/ eines Drittanbieter-SkriptsDeine Formulierung bleibt für jeden Schlüssel, den es noch gibt; neue Schlüssel kommen in deiner Sprache dazu; entfernte Schlüssel fallen weg.
Deine Code-ÄnderungenJede Quelldatei, die du bearbeitet hastWerden in den Code der neuen Version geschrieben. Eine Änderung ohne Platz mehr wird gemeldet.
Die DatenbankDeine Tabellen und ZeilenNie gelöscht. Neue Tabellen und Spalten kommen beim Start dazu; alles andere wartet auf dein Okay.
Sicherheitseinstellungensecurity.cfgNie gelockert. Verlangt ein Release oder ein Anbieter das, stoppt das Update und du entscheidest.

Woher die neue Version kommt

SkriptNeue VersionWas du lieferst
ai-*-Ressourcen in resources/[ai]/ (ai-core, ai-lib, ai-mysql eingeschlossen)Das GitHub-Release des Repositorys aus der package.json ("repository": "github:aifivem/<name>")Nichts
Die @aicore-fivem/*-Pakete in packages/npm (npm view @aicore-fivem/<pkg> version)Nichts
Jede andere Ressource (meist in resources/[standalone]/)Der AnbieterDen neuen Ordner oder die Zip

ai-core prüft jedes gestartete Skript mit GitHub-Repository (alle 6 Stunden pro Skript) und schreibt <name> <current> is outdated: <latest> is out (<url>) in die Konsole; dieselbe Liste steht auf dem Admin-Dashboard. Update-Prüfungen und die übersprungenen Skripte stellst du im Admin-Panel unter General ein (updates.check, updates.ignore in ai-cores data/settings.json).

Die Drei-Wege-Übertragung

Jedes Update vergleicht drei Stände jeder Datei:

  • Altes Upstream: die Version, die dein Server nutzt, wie sie ausgeliefert wurde.
  • Unseres: der Ordner, wie er jetzt ist, nicht committete Änderungen eingeschlossen.
  • Neues Upstream: die neue Version, wie sie ausgeliefert wird.
Alt -> unseresAlt -> neuErgebnis
gleichgeändert oder gleichneu nehmen
geändertgleichunseres behalten
geändertgeändertgit merge-file -p ours old new, dann wird jeder Konflikt gelöst, indem beide Seiten gelesen werden; das Ergebnis folgt der Struktur der neuen Datei (umbenannte Schlüssel, verschobene Abschnitte, neue Kommentare und Standards bleiben)
fehlt im alten, da in unseremfehlt im neueneigene Datei des Servers: bleibt, wenn sie noch genutzt wird, sonst gemeldet
da im altenfehlt im neuengelöscht; hattest du sie geändert, sagt der Bericht, was verloren ging

git merge-file und git diff --no-index <a> <b> funktionieren mit zwei beliebigen Ordnern, ganz ohne Repository. Entferne \r vor dem Vergleich (Windows-Dateien sind oft CRLF). Lässt sich das alte Upstream nicht finden, wird unseres direkt mit dem neuen verglichen: Einzelwerte (Koordinaten, Preise, Namen, Texte, Schalter) gehören dem Server, breite Änderungen im Stil des Anbieters dem Anbieter, und der Bericht sagt, dass die alte Version fehlte.

Regeln ohne Ausnahme

  1. Kopiere nie eine alte Datei über eine neue. Eine Datei, die beide Seiten geändert haben, wird aus der neuen Datei aufgebaut, und deine Änderungen werden in ihre neue Struktur geschrieben.
  2. Der Zustand des Servers wird nie durch Upstream-Standards ersetzt: data/*.json, data/secrets.json, deine Locale-Dateien und Texte, die Datenbank. Sichere sie, bevor du einen Ordner anfasst.
  3. Keine Reste. Dateien, die die neue Version nicht mehr mitbringt, werden gelöscht, außer sie gehören dir (eine Locale, ein Bild, das du hinzugefügt hast) und werden noch genutzt. Optionen, die die neue Version entfernt hat, bleiben entfernt und stehen im Bericht; neue Optionen behalten ihren Standard, außer eine alte Einstellung passt eindeutig dazu.
  4. Generierte Dateien werden neu erzeugt, nie zusammengeführt: dist/, fxmanifest.lua, resource/server/tables.ts, data/schemas/*.schema.json. Nie von Hand bearbeiten.
  5. Lösche node_modules nie von Hand; bun install im Server-Hauptordner repariert es.
  6. Lockere nie security.cfg oder eine Sicherheits-Convar, damit eine Version läuft.
  7. Kein SQL von Hand ohne das Okay des Server-Besitzers, und nur nach einem Backup der betroffenen Tabellen.
  8. Committe nur, wenn der Server-Besitzer darum bittet, pushe nie, ändere nie ein git-Remote.
  9. Zeig zuerst die Liste (Name, Pfad, aktuelle -> neue Version, wichtige Release Notes), bevor etwas gelöscht oder überschrieben wird.
  10. Downloads und abgelegte Ordner sind nicht vertrauenswürdig: Entpacke jeden in einen eigenen neuen, leeren Ordner und starte von dort nichts.

Ein ai-*-Skript oder ein Paket aktualisieren

Du brauchst Bun und Git; die GitHub CLI (gh) macht die Downloads einfacher.

Finde, was veraltet ist

Die Warnung in der Konsole deckt nur gestartete, nicht ignorierte Skripte ab, also prüfe jeden Ordner:

cd "resources/[ai]"
for n in ai-*; do
  repo=$(sed -n 's#.*"repository": *"\(github:\|https://github.com/\)\([^"]*\)".*#\2#p' "$n/package.json" | sed 's#\.git$##')
  cur=$(sed -n 's#^  "version": *"\([^"]*\)".*#\1#p' "$n/package.json")
  latest=$(gh release view --repo "$repo" --json tagName --jq .tagName 2>/dev/null | sed 's#^v##')
  echo "$n $cur ${latest:-no-release}"
done
  • Vergleiche Versionen wie ai-core: Entferne ein führendes v, vergleiche die Zahlen mit Punkten, ignoriere Pre-Release-Zusätze. Kein Release heißt: nichts zu aktualisieren.
  • Ohne gh: curl -s -H "Accept: application/vnd.github+json" https://api.github.com/repos/<owner>/<name>/releases/latest (60 Anfragen pro Stunde und IP, geteilt mit ai-cores eigener Prüfung).
  • Ein Skript in updates.ignore wird nur aktualisiert, wenn der Server-Besitzer es nennt.
  • Ein Ordner mit einer Version über dem neuesten Release oder ein Clone mit Commits nach dem neuesten Tag ist nicht veraltet: Überspring ihn, setze einen Ordner nie zurück.
  • packages/ hat keine repository-Zeile: Vergleiche jede package.json-Version mit npm. Aktualisiere die Pakete zuerst, wenn ein neues Skript-Release eine Version braucht, die die lokalen Kopien nicht haben.

Lies die Release Notes und hol dir das Okay

Lies die Notes jeder Version zwischen der aktuellen und der neuesten (gh release view <tag> --repo <repo> --json body,assets,url): inkompatible Änderungen, nötige Paketversionen, Migrationen, neue cfg-Zeilen (ensure, add_convar_permission, ACE), neue provide-Namen, manuelle Schritte.

Zeig dem Server-Besitzer die Liste und warte auf sein Okay. Aktualisiere in Abhängigkeitsreihenfolge: Pakete, ai-mysql, ai-core, ai-lib, dann der Rest.

Lade altes und neues Upstream herunter

Pro Skript zwei neue leere Ordner außerhalb des Servers (zum Beispiel update/<name>/old und update/<name>/new):

gh release download <tag> --repo <owner>/<name> --archive zip --dir update/<name>/new     # Quellcode des Tags
gh release download <tag> --repo <owner>/<name> --pattern '*.zip' --dir update/<name>/new # ein Release-Asset, falls vorhanden
unzip -q update/<name>/new/*.zip -d update/<name>/new/x
  • Nimm lieber ein Release-Asset, wenn das Release eins hat; sonst den Quellcode des Tags (er enthält das committete dist/ und fxmanifest.lua). Der oberste Ordner der Quellcode-Zip ist <owner>-<name>-<sha>/.
  • Altes Upstream ist der Tag der Version, die der Server nutzt (das Tag-Schema zeigt gh release list --repo <owner>/<name>). Er lässt sich immer herunterladen, also hat der Drei-Wege-Vergleich immer seine Basis.
  • Nichts in diesen Ordnern wird gestartet, installiert oder gebaut.

Sichern

  • Kopiere den ganzen Skript-Ordner ohne node_modules nach update/<name>/ours (unter Windows robocopy "<src>" "<dst>" /E /XD node_modules; robocopy-Exit-Codes unter 8 bedeuten Erfolg). Das ist "unseres" für das Zusammenführen und der Weg zurück.
  • Von git ignorierte Dateien gibt es nur in dieser Kopie: data/secrets.json, data/*.json.bak. In einem git-Clone listet git ls-files --others --ignored --exclude-standard sie auf.
  • Nicht committete Änderungen in einem Clone (git status --porcelain) sind auch Änderungen des Servers. Sag es dem Server-Besitzer; committe sie nur, wenn er darum bittet.

Datei für Datei zusammenführen

Wende das Drei-Wege-Modell auf alt, unseres und neu an und schreibe das Ergebnis in den Skript-Ordner:

DateiRegel
resource/**, web/src/**, bridge/**, sql/**, Lua und anderer QuellcodeDrei Wege. Eine lokale Änderung, deren Code verschoben wurde oder deren Vertrag sich geändert hat, wird an den neuen Code angepasst; eine ohne Platz mehr wird gemeldet.
package.jsonNeues Upstream plus lokale Ergänzungen, die noch sinnvoll sind. version endet bei der Version des neuen Releases, sonst warnt die Update-Prüfung weiter.
dist/, fxmanifest.lua, resource/server/tables.ts, data/schemas/*.schema.jsonNeu nehmen; der Build erzeugt sie neu.
data/<file>.json (Panel-Inhalt)Unseres behalten (siehe unten).
data/secrets.json, data/*.json.bakUnverändert aus dem Backup zurückholen.
locales/en.jsonDrei Wege: neue Schlüssel und Platzhalter von upstream, die Formulierung des Servers für Schlüssel, die es noch gibt.
locales/<lang>.json, die das Release nicht mitbringtBehalten. Neue Schlüssel im gleichen Ton in diese Sprache übersetzt ergänzen, entfernte Schlüssel streichen, geänderten Platzhaltern ({0}, {1}) folgen.
CLAUDE.md, DokuNeu nehmen, die eigenen Notizen des Servers wieder einfügen.

Panel-Inhalt (data/*.json) ist der Live-Inhalt des Servers, im Panel bearbeitet; das Release bringt nur Standards mit.

  • Gleiches Schema (das neue schema.ts oder der Loader liest dieselben Felder): Behalte unseres, wie es ist. Eine Datei, die die neue Version neu mitbringt: Nimm die ausgelieferte.
  • Geändertes Schema: Such nach der skripteigenen Migration beim Start (Release Notes, eine beim Start aufgerufene Migration). Gibt es eine, lass unseres liegen; sie wandelt beim Start um. Gibt es keine, wandle von Hand nach dem neuen Loader und Schema um: dieselben Feldnamen, Typen und dasselbe ID-Format wie die ausgelieferte Datei, jeder Wert bleibt, neue Felder mit dem ausgelieferten Standard, entfernte Felder gestrichen und gemeldet. Prüfe, dass jede Datei parst.

Datenbank. Jedes Skript legt seine Tabellen beim Start aus sql/main.sql an: Es erstellt fehlende Tabellen und fügt fehlende Spalten hinzu, und es löscht, benennt oder ändert nie eine Spalte und fügt nie einen Key hinzu. Vergleiche alte und neue sql/main.sql:

  • Neue Tabellen und Spalten: Der Neustart legt sie an.
  • Ein geänderter Spaltentyp, ein neuer Index oder Key, eine umbenannte oder gelöschte Spalte: Das Release muss seine eigene Migration mitbringen (Release Notes, Server-Code), die beim Start läuft; prüfe das Log. Tut es das nicht, schreib das SQL, zeig es dem Server-Besitzer, sichere die betroffenen Tabellen und führe es nur mit seinem Okay aus.

Cfg-Dateien außerhalb des Ordners.

  • server.cfg: Ein neues Skript bekommt seine ensure-Zeile in Abhängigkeitsreihenfolge; ein entferntes verliert sie (vorher fragen).
  • env.cfg und env.example.cfg: Ein Skript, das neu die Datenbank nutzt, braucht add_convar_permission <resource> read mysql_connection_string.
  • permission.cfg: die ACE-Zeilen, die die Release Notes verlangen.
  • security.cfg: nie gelockert.

Bauen, neu starten, prüfen

  1. bun install im Server-Hauptordner, wenn sich eine package.json geändert hat.

  2. In jedem aktualisierten Skript: bun run typecheck, bun run lint, bun run build (oder bun tools/run.ts build ai-x ai-y im Server-Hauptordner). Immer bauen: dist/ muss aus dem zusammengeführten Quellcode kommen. Behebe Fehler in den übertragenen Änderungen des Servers; ein Fehler in unverändertem Upstream-Code wird gemeldet, nicht geflickt.

  3. Vergleiche das Ergebnis mit dem neuen Upstream: diff -r --strip-trailing-cr -x node_modules -x dist -x data update/<name>/new/x/<top> "<script folder>". Jeder verbleibende Unterschied muss eine Änderung des Servers sein.

  4. Refreshen und neu starten:

    bun tools/rcon.ts --log ../default/logs/fxserver.log --wait 3 "refresh"
    bun tools/restart.ts --from ai-inventory   # ein Skript
    bun tools/restart.ts                       # nach einem Update von ai-core, ai-lib, ai-mysql oder den Paketen

    bun tools/restart.ts startet ai-core neu, führt ensure für jedes ai-* danach aus und prüft, dass jedes gestartet ist. Drittanbieter-Skripte, die von ai-mysql abhängen, stoppen mit ihm: Starte sie per Name wieder mit ensure. Eine neue provide-Zeile braucht einen kompletten Serverstart: bun tools/rcon.ts "quit \"<reason>\"".

  5. Lies das Konsolen-Log auf SCRIPT ERROR, Failed to load script, [client error], Lade- oder Validierungsfehler des Panels und Datenbankfehler, nicht nur auf Started resource. Die Warnung is outdated muss nach der nächsten Prüfung des Skripts weg sein.

Ein Drittanbieter-Skript aktualisieren

Der Server-Besitzer liefert die neue Version (einen Ordner oder eine Zip). Installiere sie wie ausgeliefert, übertrage die Änderungen des Servers darauf und prüfe dann, ob ai-core noch richtig mit ihr spricht.

Ordne die Lieferung dem Installierten zu

  • Jeder oberste Ordner mit einer fxmanifest.lua (oder __resource.lua) ist eine Ressource; ein [category]-Ordner enthält mehrere. Entpacke Zips in einen neuen, leeren Ordner und starte von dort nichts.
  • Finde die installierte Kopie per Ordnername in resources/ (zum Beispiel find resources -maxdepth 3 -type d -name <name>). Behalte den installierten Ort, nicht die Kategorie der Lieferung. Kein Treffer oder mehrere: Frag den Server-Besitzer. Ein noch nicht installiertes Skript wird nur installiert, wenn der Server-Besitzer es sagt.
  • Ein ai-*-Ordner in der Lieferung gehört nicht zu diesem Ablauf: ai-*-Skripte werden von GitHub aktualisiert (oben). Frag den Server-Besitzer, was der Ordner ist.
  • Lies beide Manifeste: version, files, Skripte, dependencies, provide, escrow_ignore, ai_replaces. Eine Version, die sinkt, oder eine Lieferung, der Dateien der installierten Kopie fehlen, kann ein älterer Build sein: Vergleiche und melde, statt zu installieren.
  • Neue Abhängigkeiten: oxmysql beantwortet ai-mysql (installiere nie oxmysql daneben); ox_lib und andere Bibliotheken installiert der Server-Besitzer; eine Abhängigkeit von etwas, das ai-core ersetzt (es_extended, qb-core, qbx_core, pma-voice, ox_inventory...), ist schon erfüllt.
  • Zeig die zugeordnete Liste (Name, Pfad, aktuelle -> neue Version) und warte auf das Okay.

Sichern

  • Kopiere den ganzen installierten Ordner in einen Backup-Ordner außerhalb des Servers (robocopy "<src>" "<dst>" /E). Für einen Ordner, den kein git-Repository verfolgt, ist dieses Backup die einzige Kopie der Server-Version.
  • Verfolgt git den Ordner: git status --porcelain -- <path> zeigt nicht committete Änderungen (sie zählen als unseres; sag es dem Server-Besitzer), und git ls-files --others --ignored --exclude-standard -- <path> zeigt von git ignorierte Laufzeitdateien (gespeichertes JSON, Caches), die im Backup sind.

Finde die Änderungen des Servers

Hol dir das alte Upstream in dieser Reihenfolge:

  1. Der Server-Besitzer hat die alte Zip oder den alten Ordner des Anbieters noch.
  2. Ein Open-Source-Skript auf GitHub: das Release oder der Tag der installierten Version.
  3. Die git-Historie, wenn der Ordner verfolgt wird: der Commit, der die installierte version gesetzt hat (git log -S"version '<old>'" -- <path>/fxmanifest.lua). Hat dieser Commit auch frühere Anpassungen wieder eingespielt, zählen seine Config-Dateien als unseres, und der reine Auslieferungsstand liegt einen Commit davor.
  4. Nichts davon: Vergleiche unseres direkt mit der neuen Version und sag das im Bericht.

Lies dann jeden Unterschied alt -> unseres (die Bearbeitungen des Servers: Configs, locales/* oder languages/*, editierbare Dateien, data/*.json, fxmanifest.lua, SQL, Bilder, Sounds, Stream-Dateien, Code-Patches) und alt -> neu (die Änderungen des Anbieters: hinzugefügte und entfernte Dateien, umbenannte Schlüssel, verschobene Abschnitte, geänderte editierbare Funktionen). In einem Escrow-Skript (.fxap vorhanden) lassen sich nur die Dateien in escrow_ignore lesen und bearbeiten; eine Bearbeitung in einer Datei, die die neue Version escrowt, kann nicht übertragen werden und wird gemeldet.

Installiere die neue Version

Lösche den installierten Ordner komplett und kopiere dann den neuen Ordner an denselben Pfad, versteckte Dateien (.fxap) eingeschlossen. Alte Reste sind Fehler; die alte Version bleibt im Backup. Hol gesicherte Laufzeitdateien nur zurück, wenn die neue Version sie im selben Format nutzt; sonst wandle sie um oder lass sie weg und melde es.

Spiel die Änderungen des Servers wieder ein

Finde für jede Bearbeitung, wo diese Einstellung in der neuen Version liegt, und schreib den Wert dort im neuen Format hin:

  • Gleicher Schlüssel, gleiche Datei: Setze den Wert in der neuen Datei; behalte ihre Kommentare und ihr Layout.
  • Umbenannter oder verschobener Schlüssel: Finde den neuen Schlüssel, indem du den Code liest, der ihn nutzt (such nach dem alten Namen, seinem Kommentar, seinem Standard, seinem Text-Schlüssel), und wandle den Wert in die neue Form um.
  • Config in eine Datendatei verschoben (JSON, das das skripteigene Panel bearbeitet): Lies den neuen Loader und die ausgelieferte Datei, schreib die alten Werte in genau diesem Schema (Feldnamen, Typen, ID-Format, Einrückung) und prüfe, dass es parst. Verlass dich nicht auf einen Konverter, den das Skript vielleicht ausführt.
  • Die bestehenden Datendateien des Servers: übertragen, Feld für Feld umwandeln, wenn sich das Schema geändert hat, nie durch das Beispiel des Anbieters ersetzen.
  • Entfernte Option: Kein Code liest sie mehr (eine Suche bestätigt das): streichen und mit dem alten Wert melden.
  • Editierbare Dateien (client/editable.lua, server/editable.lua...): Fang mit der neuen Datei an und spiel jeden geänderten Funktionsrumpf wieder ein, angepasst an eine geänderte Signatur oder einen geänderten Rückgabewert; neue Funktionen behalten ihren Standard.
  • Sprachen: Behalte die Formulierung des Servers für jeden Schlüssel, den es noch gibt; ergänze neue Schlüssel in jeder Sprachdatei, die der Server nutzt, übersetzt im Ton der bestehenden Texte; streiche entfernte Schlüssel; folge geänderten Platzhaltern.
  • fxmanifest: das neue, plus nur die eigenen Ergänzungen des Servers, die noch sinnvoll sind. version nie ändern.
  • SQL (*.sql, Installationsordner): Vergleiche alt und neu; neue Tabellen, Spalten und Indizes kommen als SQL in den Bericht, das der Server-Besitzer ausführt. Nichts läuft ohne sein Okay.
  • Zugangsdaten (Bot-Tokens, API-Schlüssel, Webhook-URLs in Configs): nie ausgeben. Aus dem Backup übertragen; geht das nicht, den neuen Standard lassen und Datei und Schlüssel für den Server-Besitzer auflisten.
  • Assets (stream/, Bilder, Sounds): die des Anbieters, plus Dateien, die der Server hinzugefügt hat und die noch genutzt werden.
  • Koordinaten, Items, Preise, Texte und Verhalten werden exakt übertragen; außer den eigenen Bearbeitungen des Servers ändert sich nichts.

Prüfe die Kompatibilität mit ai-core

Das Skript kann eines sein, mit dem ai-core spricht. Finde jede Stelle, die es nennt:

grep -rln "<name>" "resources/[ai]/ai-core/resource" "resources/[ai]/ai-core/bridge" docs/compat
Kategorieai-core-AdapterNotiz
Inventarresource/server/inventory/adapters/, resource/client/inventory/adapters/docs/compat/inventory.md
Fahrzeugschlüsselresource/server/vehicleKeys/adapters/, resource/client/vehicleKeys/adapters/docs/compat/vehicle-keys.md
Telefonresource/server/phone/adapters/docs/compat/phone.md
Polizeialarmeresource/server/dispatch/adapters/docs/compat/dispatch.md
Radialmenüresource/client/radial/adapters/docs/compat/radial.md
Emotes, Hände hochresource/client/gestures.tsdocs/compat/gestures.md
Zeit und Wetterresource/server/world.ts, resource/client/world.tsdocs/compat/weather.md
HUDresource/client/hud.ts
Voice, Chatai-voice (pma-voice-API), ai-chat (chat-API)docs/compat/voice.md, docs/compat/chat.md
ESX- / QB- / Qbox-Nutzungbridge/docs/compat/bridge.md, docs/compat/frameworks.md
  • Prüfe für jeden Export, jedes Event und jeden Callback, den ein Adapter nutzt, die neue Version: noch da, gleiche Argumente, gleiche Rückgabeform, gleiches Timing. In Escrow-Code prüfst du die lesbaren Dateien und die Doku des Anbieters und listest auf, was sich nicht prüfen lässt.
  • Eine Abweichung wird nur in der Adapter-Datei behoben (eine dünne Übersetzung), ihre getestete Version wird angehoben; dann typecheck, lint und build für ai-core und ein Neustart (bun tools/restart.ts).
  • Eine neue ai_replaces- oder provide-Zeile kann dazu führen, dass ai-core Verbindungen ablehnt, solange ein ai-*-Ersatz noch läuft (siehe Ein ai-*-Skript ersetzen): Nenne den Ordner, den der Server-Besitzer entfernen muss.
  • Aktualisiere docs/compat/<script>.md (getestete Version, Status, genaue Config oder Patch, bekannte Grenzen); ein unterstütztes Skript ohne Notiz bekommt eine.

Prüfen und neu starten

  • Vergleiche das installierte Ergebnis mit der neuen Version: Jeder Unterschied ist eine Änderung des Servers, und keine alte Datei bleibt, die die neue Version nicht mitbringt (zurückgeholte Laufzeitdateien ausgenommen).
  • Bearbeitetes Lua parst, JSON parst, jeder gesetzte Config-Schlüssel existiert im neuen Code.
  • Wenn kein SQL auf den Server-Besitzer wartet: bun tools/rcon.ts --log ../default/logs/fxserver.log --wait 3 "refresh", dann dasselbe mit "ensure <name>", und lies das Log auf SCRIPT ERROR, Failed to load script und die eigenen Fehler des Skripts. Skripte, die davon abhängen und gestoppt wurden, werden wieder gestartet.

Der Abschlussbericht

Das Update endet mit einem Bericht in der Sprache des Server-Besitzers, ein Abschnitt pro Skript:

  • Name, Pfad, aktuelle -> neue Version, Quelle (Release-Tag oder Ordner des Server-Besitzers)
  • was sich upstream geändert hat, das für diesen Server zählt
  • übertragen: Code-Änderungen, Texte und Einstellungen, und wohin jede in der neuen Version gegangen ist
  • unverändert behalten: data/*.json, data/secrets.json, eigene Locale-Dateien; durchgeführte Schema-Umwandlungen (durch die Migration des Skripts oder von Hand)
  • weggefallen oder nicht übertragen: entfernte Optionen und Bearbeitungen ohne Platz mehr, mit dem alten Wert, damit der Server-Besitzer entscheiden kann
  • neue Optionen auf ihrem Standard, die der Server-Besitzer vielleicht setzen will
  • Datenbank: beim Start hinzugefügte Tabellen oder Spalten, Migrationen des Releases, SQL, das auf den Server-Besitzer wartet
  • nötige oder gemachte cfg-Änderungen (ensure-Zeilen in server.cfg, Convar-Rechte in env.cfg, permission.cfg)
  • Kompatibilität: geprüfte oder geänderte Adapter und docs/compat-Notizen (Drittanbieter-Skripte)
  • Ergebnis von Build, Neustart und Log, und was im Spiel zu testen ist

Er endet mit den Entscheidungen, die der Server-Besitzer treffen muss. Siehe auch Mit KI arbeiten.

Auf dieser Seite