├── .gitattributes
├── package.json
├── README.md
└── index.js
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "fivem-script-converter",
3 | "version": "1.1.2",
4 | "description": "a fivem script converter",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [
10 | "Fivem",
11 | "ESX",
12 | "Qbus"
13 | ],
14 | "author": "Amped#5557",
15 | "license": "ISC",
16 | "dependencies": {
17 | "colors": "^1.4.0",
18 | "finalhandler": "^1.1.2",
19 | "fs": "0.0.1-security",
20 | "node-fetch": "^3.2.0",
21 | "requestify": "^0.2.5",
22 | "router": "^1.3.6"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | ---
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 | ---
21 |
22 | # THIS IS A LIBRARY THIS WILL ONLY WORK IN JS USE THE CLI FOR NORMAL USE
23 |
24 | ---
25 | ## How it works
26 |
27 | This libary can convert FiveM ESX scripts to Qbus and Qbus to ESX
28 |
29 | ---
30 |
31 | ### Usage
32 |
33 | ```js
34 | const converter = require('fivem-script-converter');
35 |
36 | // to convert a qbus script to esx
37 | converter.qbustoesx('path/to/qbus/script.lua');
38 | // ===============================
39 |
40 |
41 | // to convert a esx script to qbus
42 | converter.esxtoqbus('path/to/esx/script.lua');
43 | // ===============================
44 | ```
45 |
46 | ---
47 |
48 | # Fivem Script Converter CLI
49 |
50 |
51 | ## Discord
52 |
53 |
54 | ## Npm Page
55 |
56 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | const colors = require('colors');
3 | var requestify = require('requestify');
4 | var pjson = require('./package.json');
5 |
6 | console.log(" __ ___ __ ___ ___ __ ".brightCyan)
7 | console.log(" / |/ /__ ____/ /__ / _ )__ __ / _ | __ _ ___ ___ ___/ / ".brightCyan)
8 | console.log(" / /|_/ / _ `/ _ / -_) / _ / // / / __ |/ ' \\/ _ \\/ -_) _ / ".brightCyan)
9 | console.log("/_/ /_/\\_,_/\\_,_/\\__/ /____/\\_, / /_/ |_/_/_/_/ .__/\\__/\\_,_/ ".brightCyan)
10 | console.log(" /___/ /_/ ".brightCyan)
11 | console.log("\n [+] Fivem Qbus to Esx / Esx to Qbus Converter [+] ".brightCyan)
12 |
13 | requestify.get('https://ampedscripts.nl/version.txt')
14 | .then(function(response) {
15 | // Get the response body (JSON parsed or jQuery object for XMLs)
16 | var responselmae = response.getBody();
17 | var version = pjson.version;
18 | if (response.getBody() === `${version}\n`) {
19 | } else {
20 | console.log(`\n\nThis version is outdated make sure to npm i fivem-script-converter\n\nCurrent Version: ${version}\nNewest Version: ${responselmae}`);
21 | process.exit();
22 | }
23 | });
24 |
25 |
26 | var esxtoqbus = function esxtoqbus(file){
27 | var code = fs.readFileSync(file,'utf8')
28 |
29 | code = code.replaceAll(`TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)`, `TriggerEvent('QBCore:GetObject', function(obj) QBCore = obj end)`);
30 | code = code.replaceAll(`while ESX == nil do`, `while QBCore == nil do`);
31 | code = code.replaceAll(`ESX.TriggerServerCallback`, `QBCore.Functions.TriggerCallback`);
32 | code = code.replaceAll(`ESX.Game.GetVehicleProperties`, `QBCore.Functions.GetVehicleProperties`);
33 | code = code.replaceAll(`ESX.Game.DeleteVehicle`, `QBCore.Functions.DeleteVehicle`);
34 | code = code.replaceAll(`ESX.Game.SpawnVehicle`, `QBCore.Functions.SpawnVehicle`);
35 | code = code.replaceAll(`ESX.Game.GetClosestVehicle`, `QBCore.Functions.GetClosestVehicle`);
36 | code = code.replaceAll(`ESX = nil`, `QBCore = nil `);
37 | code = code.replaceAll(`ESX = nil`, `QBCore = nil `);
38 | code = code.replaceAll(`RegisterNetEvent('esx:playerLoaded'`, `RegisterNetEvent('QBCore:Client:OnPlayerLoaded'`);
39 | code = code.replaceAll(`AddEventHandler('esx:playerLoaded',`, `AddEventHandler('QBCore:Client:OnPlayerLoaded',`);
40 | code = code.replaceAll(`RegisterNetEvent('esx:setJob'`, `RegisterNetEvent('QBCore:Client:OnJobUptade'`);
41 | code = code.replaceAll(`AddEventHandler('esx:setJob',`, `AddEventHandler('QBCore:Client:OnJobUptade', `);
42 | code = code.replaceAll(`RegisterNetEvent('esx:onPlayerDeath'`, `RegisterNetEvent('QBCore:Client:OnPlayerUnload'`);
43 | code = code.replaceAll(`AddEventHandler('esx:onPlayerDeath',`, `AddEventHandler('QBCore:Client:OnPlayerUnload',`);
44 | code = code.replaceAll(`ESX.Game.GetClosestPlayer()`, `QBCore.Functions.GetClosestPlayer()`);
45 | code = code.replaceAll(`ESX.UI.Menu.Open`, `QBCore.UI.Menu.Open`);
46 | code = code.replaceAll(`ESX.UI.Menu.CloseAll()`, `QBCore.UI.Menu.CloseAll()`);
47 | code = code.replaceAll(`xPlayer.getInventoryItem`, `xPlayer.Functions.GetItemByName `);
48 | code = code.replaceAll(`RegisterNetEvent('esx:setJob'`, `RegisterNetEvent('QBCore:Client:OnJobUpdate'`);
49 | code = code.replaceAll(`AddEventHandler('esx:setJob', function(job)`, `AddEventHandler('QBCore:Client:OnJobUpdate', function(job)`);
50 | code = code.replaceAll(`xPlayer.removeAccountMoney('bank', amount)`, `ply.Functions.AddMoney('bank', amount, "Bank depost")`);
51 | code = code.replaceAll(`xPlayer.addMoney(amount)`, `ply.Functions.RemoveMoney('cash', amount, "Bank depost")`);
52 | code = code.replaceAll(`xPlayer.getAccount('bank').money`, `ply.PlayerData.money["bank"]`);
53 | code = code.replaceAll(`xPlayer.removeInventoryItem `, `xPlayer.Functions.RemoveItem `);
54 | code = code.replaceAll(`xPlayer.addInventoryItem`, `xPlayer.Functions.AddItem`);
55 | code = code.replaceAll(`ESX.GetPlayerFromId`, `QBCore.Functions.GetPlayer`);
56 | code = code.replaceAll(`ESX.GetPlayerFromIdentifier`, `QBCore.Functions.GetPlayerByCitizenId`);
57 | code = code.replaceAll(`ESX.Math.Trim(value)`, `QBCore.Functions.MathTrim`);
58 | code = code.replaceAll(`ESX.GetPlayerData()`, `QBCore.Functions.GetPlayerData()`);
59 | code = code.replaceAll(`ESX.RegisterUsableItem()`, `QBCore.Functions.CreateUseableItem()`);
60 | code = code.replaceAll(`xPlayer.removeMoney(money)`, `Player.Functions.RemoveMoney()`);
61 | code = code.replaceAll(`ESX.RegisterServerCallback()`, `QBCore.Functions.CreateCallback()`);
62 | code = code.replaceAll(`ESX.TriggerServerCallback()`, `QBCore.Functions.TriggerCallback()`);
63 | code = code.replaceAll(`ESX.Game.SetVehicleProperties`, `QBCore.Functions.SetVehicleProperties`);
64 | code = code.replaceAll(`LoadModel`, `QBCore.Functions.LoadModel`);
65 | code = code.replaceAll(`ESX.RegisterServerCallback("system:fetchStatus", function(source, cb)
66 | local src = source
67 | local user = ESX.GetPlayerFromId(src)
68 | local fetch = [[
69 | SELECT
70 | skills
71 | FROM
72 | users
73 | WHERE
74 | identifier = @identifier
75 | ]]
76 | MySQL.Async.fetchScalar(fetch, {
77 | ["@identifier"] = user.identifier
78 | }, function(status)
79 | if status ~= nil then
80 | cb(json.decode(status))
81 | else
82 | cb(nil)
83 | end
84 | end)
85 | end)`, `QBCore.Functions.CreateCallback('system:fetchStatus', function(source, cb)
86 | local Player = QBCore.Functions.GetPlayer(source)
87 | if Player then
88 | exports['ghmattimysql']:execute('SELECT skills FROM players WHERE citizenid = @citizenid', {
89 | ['@citizenid'] = Player.PlayerData.citizenid
90 | }, function(status)
91 | if status ~= nil then
92 | cb(json.decode(status))
93 | else
94 | cb(nil)
95 | end
96 | end)
97 | else
98 | cb()
99 | end
100 | end)`);
101 | code = code.replaceAll(`RegisterCommand `, `QBCore.Commands.Add()`);
102 | code = code.replaceAll(`local user = ESX.GetPlayerFromId(src)`, `local Player = QBCore.Functions.GetPlayer(source)`);
103 | code = code.replaceAll(`["@identifier"] = user.identifier`, `['@citizenid'] = Player.PlayerData.citizenid`);
104 |
105 | fs.writeFileSync('output.lua', code, function (err) {
106 | if (err) return console.log(err);
107 | });
108 |
109 | console.log(`Succesfully converted the ${file} from ESX to Qbus!`)
110 | };
111 |
112 | var qbustoesx = function qbustoesx(file){
113 | var code = fs.readFileSync(file,'utf8')
114 | code = code.replaceAll(`TriggerEvent('QBCore:GetObject', function(obj) QBCore = obj end)`, `TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)`);
115 | code = code.replaceAll(`QBCore = exports['qb-core']:GetCoreObject()`, `TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)`);
116 | code = code.replaceAll(`local QBCore = exports['qb-core']:GetCoreObject()`,`ESX = nil\nTriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)`);
117 | code = code.replaceAll(`while QBCore == nil do`, `while ESX == nil do`);
118 | code = code.replaceAll(`QBCore.Functions.TriggerCallback`, `ESX.TriggerServerCallback`);
119 | code = code.replaceAll(`QBCore.Functions.GetVehicleProperties`, `ESX.Game.GetVehicleProperties`);
120 | code = code.replaceAll(`QBCore.Functions.DeleteVehicle`, `ESX.Game.DeleteVehicle`);
121 | code = code.replaceAll(`QBCore.Functions.SpawnVehicle`, `ESX.Game.SpawnVehicle`);
122 | code = code.replaceAll(`QBCore.Functions.GetClosestVehicle`, `ESX.Game.GetClosestVehicle`);
123 | code = code.replaceAll(`QBCore = nil`, `ESX = nil`);
124 | code = code.replaceAll(`QBCore == nil`, `ESX == nil`);
125 | code = code.replaceAll(`RegisterNetEvent('QBCore:Client:OnPlayerLoaded'`, `RegisterNetEvent('esx:playerLoaded'`);
126 | code = code.replaceAll(`AddEventHandler('QBCore:Client:OnPlayerLoaded',`, `AddEventHandler('esx:playerLoaded',`);
127 | code = code.replaceAll(`RegisterNetEvent('QBCore:Client:OnJobUptade'`, `RegisterNetEvent('esx:setJob'`);
128 | code = code.replaceAll(`AddEventHandler('QBCore:Client:OnJobUptade', `, `AddEventHandler('esx:setJob',`);
129 | code = code.replaceAll(`RegisterNetEvent('QBCore:Client:OnPlayerUnload'`, `RegisterNetEvent('esx:onPlayerDeath'`);
130 | code = code.replaceAll(`AddEventHandler('QBCore:Client:OnPlayerUnload',`, `AddEventHandler('esx:onPlayerDeath',`);
131 | code = code.replaceAll(`QBCore.Functions.GetClosestPlayer()`, `ESX.Game.GetClosestPlayer()`);
132 | code = code.replaceAll(`QBCore.UI.Menu.Open`, `ESX.UI.Menu.Open`);
133 | code = code.replaceAll(`QBCore.UI.Menu.CloseAll()`, `ESX.UI.Menu.CloseAll()`);
134 | code = code.replaceAll(`xPlayer.Functions.GetItemByName `, `xPlayer.getInventoryItem`);
135 | code = code.replaceAll(`RegisterNetEvent('QBCore:Client:OnJobUpdate'`, `RegisterNetEvent('esx:setJob'`);
136 | code = code.replaceAll(`AddEventHandler('QBCore:Client:OnJobUpdate', function(job`, `AddEventHandler('esx:setJob', function(job)`);
137 | code = code.replaceAll(`ply.Functions.AddMoney`, `xPlayer.removeAccountMoney`);
138 | code = code.replaceAll(`ply.Functions.RemoveMoney`, `xPlayer.addMoney`);
139 | code = code.replaceAll(`ply.PlayerData.money["bank"]`, `xPlayer.getAccount('bank').money`);
140 | code = code.replaceAll(`xPlayer.Functions.RemoveItem `, `xPlayer.removeInventoryItem`);
141 | code = code.replaceAll(`xPlayer.Functions.AddItem`, `xPlayer.addInventoryItem`);
142 | code = code.replaceAll(`QBCore.Functions.GetPlayer`, `ESX.GetPlayerFromId`);
143 | code = code.replaceAll(`QBCore.Functions.GetPlayerByCitizenId`, `ESX.GetPlayerFromIdentifier`);
144 | code = code.replaceAll(`QBCore.Functions.MathTrim`, `ESX.Math.Trim(value)`);
145 | code = code.replaceAll(`QBCore.Functions.GetPlayerData`, `ESX.GetPlayerData`);
146 | code = code.replaceAll(`QBCore.Functions.CreateUseableItem`, `ESX.RegisterUsableItem`);
147 | code = code.replaceAll(`Player.Functions.RemoveMoney`, `xPlayer.removeMoney`);
148 | code = code.replaceAll(`QBCore.Functions.CreateCallback`, `ESX.RegisterServerCallback`);
149 | code = code.replaceAll(`QBCore.Functions.TriggerCallback`, `ESX.TriggerServerCallback`);
150 | code = code.replaceAll(`QBCore.Functions.CreateCallback('system:fetchStatus', function(source, cb)
151 | local Player = QBCore.Functions.GetPlayer(source)
152 |
153 | if Player then
154 | exports['ghmattimysql']:execute('SELECT skills FROM players WHERE citizenid = @citizenid', {
155 | ['@citizenid'] = Player.PlayerData.citizenid
156 | }, function(status)
157 | if status ~= nil then
158 | cb(json.decode(status))
159 | else
160 | cb(nil)
161 | end
162 | end)
163 | else
164 | cb()
165 | end
166 | end)`, `ESX.RegisterServerCallback("system:fetchStatus", function(source, cb)
167 | local src = source
168 | local user = ESX.GetPlayerFromId(src)
169 |
170 |
171 | local fetch = [[
172 | SELECT
173 | skills
174 | FROM
175 | users
176 | WHERE
177 | identifier = @identifier
178 | ]]
179 |
180 | MySQL.Async.fetchScalar(fetch, {
181 | ["@identifier"] = user.identifier
182 |
183 | }, function(status)
184 |
185 | if status ~= nil then
186 | cb(json.decode(status))
187 | else
188 | cb(nil)
189 | end
190 |
191 | end)
192 | end)`);
193 | code = code.replaceAll(`QBCore.Commands.Add`, `RegisterCommand`);
194 | code = code.replaceAll(`local Player = QBCore.Functions.GetPlayer(source)`, `local user = ESX.GetPlayerFromId(src)`);
195 | code = code.replaceAll(`['@citizenid'] = Player.PlayerData.citizenid`, `["@identifier"] = user.identifier`);
196 |
197 | fs.writeFileSync('output.lua', code, function (err) {
198 | if (err) return console.log(err);
199 | });
200 |
201 | console.log(`Succesfully converted the ${file} from Qbus to ESX!`)
202 | };
203 |
204 | module.exports.qbustoesx = qbustoesx;
205 | module.exports.esxtoqbus = esxtoqbus;
--------------------------------------------------------------------------------