{"id":192928,"date":"2025-08-15T16:20:47","date_gmt":"2025-08-15T14:20:47","guid":{"rendered":"https:\/\/fivemx.com\/?p=192928"},"modified":"2026-08-10T07:53:33","modified_gmt":"2026-08-10T05:53:33","slug":"konvertieren-von-fivem-skripten","status":"publish","type":"post","link":"https:\/\/rpcrate.com\/de\/converting-fivem-scripts\/","title":{"rendered":"FiveM-Skripte zwischen ESX, QBCore und Qbox konvertieren"},"content":{"rendered":"<p>Konvertiere eine FiveM-Ressource, indem du ihre Framework-, Inventar- und Datenbankabh\u00e4ngigkeiten zuordnest und dann einen Gameplay-Flow nach dem anderen testest. Das Umbenennen von ESX-Ereignissen in QBCore-Ereignisse ist keine vollst\u00e4ndige Konvertierung. Eine serverweite Charaktermigration ist ein separates Projekt.<\/p>\n<h2 id=\"before-changing-code\">Bevor du Code \u00e4nderst<\/h2>\n<p>Arbeite auf einem isolierten Entwicklungsserver mit einer Kopie der Ressource und einer tempor\u00e4ren Datenbank. Notiere die genauen Quell- und Ziel-Framework-Versionen, das Inventar, die Targeting-Bibliothek, die UI-Bibliothek und die Ressourcenlizenz. Gesch\u00fctzte Dateien erfordern eine unterst\u00fctzte Version vom Autor; eine alleinige editierbare Konfiguration ist m\u00f6glicherweise nicht ausreichend.<\/p>\n<h2 id=\"1-inventory-the-integration-points\">1. Bestandsaufnahme der Integrationspunkte<\/h2>\n<p>Durchsuche die Ressourcendateien nach <code data-no-translation=\"\" translate=\"no\">ESX<\/code>, <code data-no-translation=\"\" translate=\"no\">QBCore<\/code>, <code data-no-translation=\"\" translate=\"no\">qbx_core<\/code>, <code data-no-translation=\"\" translate=\"no\">exports<\/code>, <code data-no-translation=\"\" translate=\"no\">RegisterNetEvent<\/code>, <code data-no-translation=\"\" translate=\"no\">MySQL<\/code> und SQL-Tabellennamen. Klassifiziere jede \u00dcbereinstimmung als Server, Client oder geteilt. Liste die erwarteten Eingaben, R\u00fcckgabewerte und Fehlerverhalten auf, bevor du sie ersetzt.<\/p>\n<p>Zum Beispiel umfasst ein Shop-Flow das \u00d6ffnen der Benutzeroberfl\u00e4che, das \u00dcberpr\u00fcfen des Zugriffs, das Lesen von Preisen, das Bezahlen, das Hinzuf\u00fcgen zum Inventar und das Speichern des Ergebnisses. Die Konvertierung nur der Benachrichtigung l\u00e4sst das wichtige Verhalten unver\u00e4ndert.<\/p>\n<h2 id=\"2-map-behavior-explicitly\">2. Verhalten explizit abbilden<\/h2>\n<p>Ermittle zum Zeitpunkt der Aktion serverseitig das Spielerobjekt des Ziel-Frameworks. ESX-Kennungen und QBCore-\/Qbox-Charakter-IDs haben unterschiedliche Bedeutungen; erzeuge keine Charakter-IDs aus gek\u00fcrzten Hashes und \u00fcberschreibe keine Kontokennungen. Bewahre eine gepr\u00fcfte Zuordnung auf, wenn bestehende Daten migriert werden m\u00fcssen.<\/p>\n<p>W\u00e4hle die Inventarintegration bewusst. Artikelnamen, Gewichtseinheiten, Slot-Handhabung, Metadaten und Kapazit\u00e4tspr\u00fcfungen unterscheiden sich. Greife nicht stillschweigend zwischen Inventarsystemen zur\u00fcck. Entscheide, wie Bargeld, Bankguthaben und jede Mechanik f\u00fcr illegale W\u00e4hrungen abgebildet werden, ohne nicht verwandte Konten als gleichwertig zu behandeln.<\/p>\n<h2 id=\"3-implement-a-small-adapter\">3. Implementiere einen kleinen Adapter<\/h2>\n<p>Halte die frameworkspezifischen Spieler-, Job-, Geld- und Inventaraufrufe in einem reinen Servermodul. Client-Benachrichtigungen und UI-Callbacks geh\u00f6ren in ein separates Client-Modul. Deklariere tats\u00e4chliche Abh\u00e4ngigkeiten in <code data-no-translation=\"\" translate=\"no\">fxmanifest.lua<\/code> und starte sie vor der Ressource.<\/p>\n<p>F\u00fcr Qbox konsultiere <a href=\"https:\/\/docs.qbox.re\/resources\/qbx_core\/exports\/server\">die Server-Exporte<\/a> und seine Kompatibilit\u00e4tsanleitung. Eine Kompatibilit\u00e4tsbr\u00fccke kann bestehenden QB-Ressourcen helfen, garantiert aber keine Kompatibilit\u00e4t mit jedem Inventar, jeder Datenbankabfrage oder jedem modifizierten Kern.<\/p>\n<h2 id=\"4-preserve-the-trust-boundary\">4. Bewahre die Vertrauensgrenze<\/h2>\n<p>Der Server muss zul\u00e4ssige Gegenst\u00e4nde, Preise, Guthaben, Jobberechtigungen und den Abschluss belohnter Aufgaben bestimmen. Behandle jedes Client-Ereignisargument als nicht vertrauensw\u00fcrdig. Ein Jobname allein beweist nicht, dass eine Lieferung stattgefunden hat; ein wiederholtes Ereignis darf nicht wiederholt bezahlen. \u00dcberpr\u00fcfe sowohl die Abbuchungs- als auch die Artikel-Lieferergebnisse und definiere eine Entsch\u00e4digung, wenn die zweite Aktion fehlschl\u00e4gt.<\/p>\n<h2 id=\"5-convert-resource-owned-storage\">5. Konvertiere ressourceneigenen Speicher<\/h2>\n<p>Vergleiche das installierte Quell- und Zielschema, bevor du eine Migration schreibst. Verwende ein separates, versioniertes Skript f\u00fcr genau dieses Schema. Erhalte urspr\u00fcngliche Kennungen, Kennzeichen, Metadaten und eine dauerhaft gespeicherte Zuordnung. Melde doppelte oder nicht zugeordnete Zeilen, statt sie zu ignorieren. \u00c4ndere keine vom Framework verwalteten Guthaben per SQL, w\u00e4hrend das Framework sie im Arbeitsspeicher h\u00e4lt.<\/p>\n<h2 id=\"6-verify-and-release\">6. \u00dcberpr\u00fcfen und freigeben<\/h2>\n<ol>\n<li>Teste einen neuen und einen bestehenden Charakter: Login, die konvertierte Aktion, erneute Verbindung und Serverneustart. \u00dcberpr\u00fcfe die Persistenz nach jedem Schritt.<\/li>\n<li>Teste verweigerte Berechtigungen, unzureichende Mittel, volles Inventar, ung\u00fcltige Eingaben, wiederholte Anfragen und Verbindungsabbr\u00fcche w\u00e4hrend des Vorgangs. Best\u00e4tige, dass keine unbeabsichtigten Gelder oder Gegenst\u00e4nde erstellt werden.<\/li>\n<li>Vergleiche Datenbankzeilen und Salden vor und nach bekannten Testaktionen. Untersuche jede unerwartete Differenz.<\/li>\n<li>Stelle die \u00fcberpr\u00fcften Dateien und alle erforderlichen Migrationen w\u00e4hrend eines Wartungsfensters bereit. Halte passende Datei-\/Datenbank-Backups und ein Rollback-Verfahren bereit, das Schreibvorg\u00e4nge nach der Ver\u00f6ffentlichung ber\u00fccksichtigt.<\/li>\n<\/ol>\n<h2 id=\"if-the-conversion-fails\">Wenn die Konvertierung fehlschl\u00e4gt<\/h2>\n<p>Ein fehlender Export deutet normalerweise auf die falsche Ressource\/Version oder Startreihenfolge hin. Ein Callback, der nie zur\u00fcckkehrt, erfordert eine \u00dcberpr\u00fcfung sowohl der Registrierung als auch des Aufrufs, einschlie\u00dflich Argumenten und Ausf\u00fchrungsseite. Fehlende Elemente k\u00f6nnen Inventarmetadaten oder Kapazit\u00e4tsregeln widerspiegeln. Diagnostiziere die fehlerhafte Grenze, anstatt breite Kompatibilit\u00e4tsschichten hinzuzuf\u00fcgen.<\/p>\n<h2 id=\"reference-documentation\">Referenzdokumentation<\/h2>\n<p><a href=\"https:\/\/docs.fivem.net\/docs\/scripting-reference\/resource-manifest\/\">Cfx.re \u2014 Ressourcenmanifest<\/a> \u00b7 <a href=\"https:\/\/docs.fivem.net\/docs\/developers\/server-security\/\">Cfx.re \u2014 Serversicherheit<\/a><\/p>\n<p><a href=\"https:\/\/rpcrate.com\/de\/gleichzeitige-nutzung-von-esx-qbcore\/\">Gleichzeitige Nutzung von ESX und QBCore: Warum das nicht machbar ist<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Konvertiere eine FiveM-Ressource, indem du ihre Framework-, Inventar- und Datenbankabh\u00e4ngigkeiten zuordnest und dann einen Gameplay-Flow nach dem anderen testest. Das Umbenennen von ESX-Ereignissen in QBCore-Ereignisse ist keine vollst\u00e4ndige Konvertierung. Eine serverweite Charaktermigration ist ein separates Projekt.<\/p>","protected":false},"author":1,"featured_media":192929,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2882,2340],"tags":[2858,3001,2950,2859,2940],"class_list":["post-192928","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-framework-conversion","category-lua-scripting","tag-esx","tag-fivem-script","tag-framework","tag-qbcore","tag-qbox"],"_links":{"self":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/posts\/192928","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/comments?post=192928"}],"version-history":[{"count":4,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/posts\/192928\/revisions"}],"predecessor-version":[{"id":209815,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/posts\/192928\/revisions\/209815"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/media\/192929"}],"wp:attachment":[{"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/media?parent=192928"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/categories?post=192928"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rpcrate.com\/de\/wp-json\/wp\/v2\/tags?post=192928"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}