From 698397fcb20d568953ae285012672ce3805a4ac3 Mon Sep 17 00:00:00 2001 From: Linden Date: Sun, 27 Jun 2021 12:55:54 +1000 Subject: [PATCH 001/132] tweak(client): Move SetupCharacters Server trigger; added locales --- client/main.lua | 7 +++---- locales/cs.lua | 2 ++ locales/de.lua | 2 ++ locales/en.lua | 2 ++ locales/pt.lua | 2 ++ locales/tr.lua | 2 ++ 6 files changed, 13 insertions(+), 4 deletions(-) diff --git a/client/main.lua b/client/main.lua index 0f9384dc..522522b8 100644 --- a/client/main.lua +++ b/client/main.lua @@ -8,8 +8,6 @@ if ESX.GetConfig().Multichar then while not GetResourceState('esx_menu_default') == 'started' do Citizen.Wait(0) end - Citizen.Wait(200) - TriggerServerEvent("esx_multicharacter:SetupCharacters") TriggerEvent("esx_multicharacter:SetupCharacters") break end @@ -38,6 +36,8 @@ if ESX.GetConfig().Multichar then ShutdownLoadingScreen() ShutdownLoadingScreenNui() TriggerEvent('esx:loadingScreenOff') + Citizen.Wait(200) + TriggerServerEvent("esx_multicharacter:SetupCharacters") end) StartLoop = function() @@ -97,7 +97,7 @@ if ESX.GetConfig().Multichar then if Characters[index] then local skin = Characters[index].skin or Config.Default if not Characters[index].model then - if Characters[index].sex == 'Female' then skin.sex = 1 else skin.sex = 0 end + if Characters[index].sex == _('female') then skin.sex = 1 else skin.sex = 0 end end TriggerEvent('skinchanger:loadSkin', skin) end @@ -315,7 +315,6 @@ if ESX.GetConfig().Multichar then AddEventHandler('esx:onPlayerLogout', function() DoScreenFadeOut(0) Spawned = false - TriggerServerEvent("esx_multicharacter:SetupCharacters") TriggerEvent("esx_multicharacter:SetupCharacters") TriggerEvent('esx_skin:resetFirstSpawn') end) diff --git a/locales/cs.lua b/locales/cs.lua index f4ffd7b5..a9734076 100644 --- a/locales/cs.lua +++ b/locales/cs.lua @@ -1,4 +1,6 @@ Locales['cs'] = { + ['male'] = "Muž", + ['female'] = "Žena", ['delete_label'] = "Vymazat %s %s?", ['select_char'] = "Zvolit Postavu", ['create_char'] = "Vytvořit novou postavu", diff --git a/locales/de.lua b/locales/de.lua index 8ffefc6b..654971af 100644 --- a/locales/de.lua +++ b/locales/de.lua @@ -1,4 +1,6 @@ Locales['de'] = { + ['male'] = "Männlich", + ['female'] = "Weiblich", ['delete_label'] = "Lösche %s %s?", ['select_char'] = "Charakter auswählen", ['create_char'] = "Neuen Charakter erstellen", diff --git a/locales/en.lua b/locales/en.lua index 72aa9cbe..f814d78a 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -1,4 +1,6 @@ Locales['en'] = { + ['male'] = "Male", + ['female'] = "Female", ['delete_label'] = "Delete %s %s?", ['select_char'] = "Select Character", ['create_char'] = "Create new character", diff --git a/locales/pt.lua b/locales/pt.lua index bd83f35e..04b828a3 100644 --- a/locales/pt.lua +++ b/locales/pt.lua @@ -1,4 +1,6 @@ Locales['pt'] = { + ['male'] = "Masculino", + ['female'] = "Feminino", ['delete_label'] = "Eliminar %s %s?", ['select_char'] = "Selecionar personagem", ['create_char'] = "Criar novo personagem", diff --git a/locales/tr.lua b/locales/tr.lua index 6fc35dab..8a3aa060 100644 --- a/locales/tr.lua +++ b/locales/tr.lua @@ -1,4 +1,6 @@ Locales['tr'] = { + ['male'] = "Erkek", + ['female'] = "Kadın", ['delete_label'] = "Sil %s %s?", ['select_char'] = "Karakter Seç", ['create_char'] = "Yeni Karakter Oluştur", From 7acd7bc5a04f52d4b84ab24b4149abe5c127f501 Mon Sep 17 00:00:00 2001 From: Linden Date: Sun, 27 Jun 2021 12:59:08 +1000 Subject: [PATCH 002/132] feat(server): Set VARCHAR(60) automatically; improvements to SQL.ready functions --- fxmanifest.lua | 14 +++++----- server/main.lua | 72 +++++++++++++++++++++---------------------------- 2 files changed, 38 insertions(+), 48 deletions(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index 2916b49e..9ee95603 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'adamant' game 'gta5' description 'https://github.com/thelindat/esx_multicharacter' -version '1.1.1' +version '1.1.2' dependencies { 'es_extended', @@ -10,18 +10,20 @@ dependencies { 'esx_skin' } -shared_script 'config.lua' +shared_scripts { + '@es_extended/locale.lua', + 'locales/*.lua', + 'config.lua' +} server_scripts { '@es_extended/imports.lua', '@mysql-async/lib/MySQL.lua', - 'server/*.lua', + 'server/*.lua' } client_scripts { - '@es_extended/locale.lua', - 'client/main.lua', - 'locales/*.lua', + 'client/*.lua' } ui_page { diff --git a/server/main.lua b/server/main.lua index 09cf277f..c7fd07be 100644 --- a/server/main.lua +++ b/server/main.lua @@ -1,30 +1,20 @@ if not ESX then SetTimeout(3000, print('[^3WARNING^7] Unable to start Multicharacter - your version of ESX is not compatible ')) elseif ESX.GetConfig().Multichar == true then - local fetchCharacters = -1 - local IdentifierTables = {} - + local IdentifierTables, Fetch = {}, -1 + -- enter the name of your database here Config.Database = 'es_extended' + -- enter a prefix to prepend to all user identifiers (keep it short) Config.Prefix = 'char' - - RegisterCommand('varchar', function(source) - if source == 0 then - if next(IdentifierTables) == nil then print(' Unable to update your tables - have you defined the correct database?') return end - for _, itable in pairs(IdentifierTables) do - print('Setting `'..itable.table..'` column `'..itable.column..'` to VARCHAR(60)') - MySQL.Sync.execute("ALTER TABLE "..itable.table.." MODIFY COLUMN "..itable.column.." VARCHAR(60)", {}) - end - Citizen.Wait(100) - print(' Updated your tables to use the correct field length - you should remove this command') - end - end, true) - SetupCharacters = function(playerId) - while fetchCharacters == -1 do Citizen.Wait(100) end + local SetupCharacters = function(playerId) + while Fetch == -1 do Citizen.Wait(500) end local identifier = Config.Prefix..'%:'..ESX.GetIdentifier(playerId) - MySQL.Async.fetchAll(fetchCharacters, {'identifier', {identifier} + MySQL.Async.fetchAll(Fetch, { + identifier, + Config.Slots }, function(result) local characters = {} for i=1, #result, 1 do @@ -46,41 +36,43 @@ elseif ESX.GetConfig().Multichar == true then dateofbirth = result[i].dateofbirth, skin = json.decode(result[i].skin) } - if result[i].sex == 'm' then characters[id].sex = 'Male' else characters[id].sex = 'Female' end + if result[i].sex == 'm' then characters[id].sex = _('male') else characters[id].sex = _('female') end end TriggerClientEvent('esx_multicharacter:SetupUI', playerId, characters) end) end - DeleteCharacter = function(playerId, charid) + local DeleteCharacter = function(playerId, charid) local identifier = Config.Prefix..charid..':'..ESX.GetIdentifier(playerId) - for _, itable in pairs(IdentifierTables) do - MySQL.Async.execute("DELETE FROM "..itable.table.." WHERE "..itable.column.." = @identifier", { - ['@identifier'] = identifier + for k, v in pairs(IdentifierTables) do + MySQL.Async.execute("DELETE FROM "..v.table.." WHERE "..v.column.." = ?", { + identifier }) end + print(('[^2INFO^7] Player [%s] %s has deleted a character (%s)'):format(GetPlayerName(playerId), playerId, identifier)) end Citizen.CreateThread(function() MySQL.ready(function () - fetchCharacters = MySQL.Sync.store("SELECT `identifier`, `accounts`, `job`, `job_grade`, `firstname`, `lastname`, `dateofbirth`, `sex`, `skin` FROM `users` WHERE ?? LIKE ?") - - MySQL.Async.fetchAll('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = @id AND TABLE_SCHEMA = @db', { ['@id'] = "owner", ["@db"] = Config.Database}, function(result) - if result then - for k, v in pairs(result) do - IdentifierTables[#IdentifierTables+1] = {table = v.TABLE_NAME, column = 'owner'} - end + local result = MySQL.Sync.fetchAll('SELECT `TABLE_NAME`, `COLUMN_NAME`, `CHARACTER_MAXIMUM_LENGTH` FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND (COLUMN_NAME = ? OR COLUMN_NAME = ?) ', { + Config.Database, 'identifier', 'owner' + }) + if result then + local varchar, varsize = {}, 0 + for k, v in pairs(result) do + if v.CHARACTER_MAXIMUM_LENGTH < 60 then varchar[v.TABLE_NAME] = v.COLUMN_NAME varsize = varsize+1 end + table.insert(IdentifierTables, {table = v.TABLE_NAME, column = v.COLUMN_NAME}) end - end) - MySQL.Async.fetchAll('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = @id AND TABLE_SCHEMA = @db', { ['@id'] = "identifier", ["@db"] = Config.Database}, function(result) - if result then - for k, v in pairs(result) do - IdentifierTables[#IdentifierTables+1] = {table = v.TABLE_NAME, column = 'identifier'} + if next(varchar) then + for k, v in pairs(varchar) do + MySQL.Sync.execute("ALTER TABLE "..k.." MODIFY COLUMN "..v.." VARCHAR(60)") end + print(('[^2INFO^7] Attempted to update ^5%s^7 columns to use VARCHAR(60)'):format(varsize)) end - end) + end + if not next(ESX.Jobs) then ESX.Jobs = GetJobs() end + Fetch = MySQL.Sync.store("SELECT `identifier`, `accounts`, `job`, `job_grade`, `firstname`, `lastname`, `dateofbirth`, `sex`, `skin` FROM `users` WHERE identifier LIKE ? LIMIT ?") end) - if not next(ESX.Jobs) then ESX.Jobs = GetJobs() end end) RegisterServerEvent("esx_multicharacter:SetupCharacters") @@ -98,8 +90,6 @@ elseif ESX.GetConfig().Multichar == true then else TriggerEvent('esx:onPlayerJoined', src, Config.Prefix..charid) end - else - -- Trigger Ban Event here to ban individuals trying to use SQL Injections end end) @@ -118,8 +108,6 @@ elseif ESX.GetConfig().Multichar == true then if type(charid) == "number" and string.len(charid) <= 2 then DeleteCharacter(src, charid) SetupCharacters(src) - else - -- Trigger Ban Event here to ban individuals trying to use SQL Injections end end) @@ -133,6 +121,6 @@ elseif ESX.GetConfig().Multichar == true then TriggerEvent('esx:playerLogout', source) end, true) -elseif ESX.GetConfig().Multichar == false then +else SetTimeout(3000, print('[^3WARNING^7] Multicharacter is disabled - please check your ESX configuration')) end From 7332a64ef634ac1247164368d2713b2004dfabb2 Mon Sep 17 00:00:00 2001 From: Linden Date: Sun, 27 Jun 2021 18:05:50 +1000 Subject: [PATCH 003/132] improvements(client): Overhauled most of the character selection and spawning logic --- client/main.lua | 109 ++++++++++++++++++++++-------------------------- fxmanifest.lua | 2 +- 2 files changed, 50 insertions(+), 61 deletions(-) diff --git a/client/main.lua b/client/main.lua index 522522b8..5b859a7d 100644 --- a/client/main.lua +++ b/client/main.lua @@ -13,10 +13,8 @@ if ESX.GetConfig().Multichar then end end) - local cam, cam2 = nil, nil + local canRelog, cam, Spawned = true local Characters = {} - local canRelog = true - local Spawned RegisterNetEvent('esx_multicharacter:SetupCharacters') AddEventHandler('esx_multicharacter:SetupCharacters', function() @@ -42,8 +40,9 @@ if ESX.GetConfig().Multichar then StartLoop = function() hidePlayers = true + MumbleSetVolumeOverride(PlayerId(), 0.0) Citizen.CreateThread(function() - local keys = {18, 27, 172, 173, 176, 177, 187, 188, 191, 201} + local keys = {18, 27, 172, 173, 176, 177, 187, 188, 191, 201, 108, 109} while hidePlayers do DisableAllControlActions(0) for i=1, #keys do @@ -53,31 +52,35 @@ if ESX.GetConfig().Multichar then SetLocalPlayerVisibleLocally(1) SetPlayerInvincible(PlayerId(), 1) Citizen.Wait(3) + local vehicles = GetGamePool('CVehicle') + for i=1, #vehicles do + SetEntityLocallyInvisible(vehicles[i]) + end end + local playerId, playerPed = PlayerId(), PlayerPedId() + MumbleSetVolumeOverride(playerId, -1.0) + SetEntityVisible(playerPed, 1, 0) + SetPlayerInvincible(playerId, 0) + FreezeEntityPosition(playerPed, false) + Citizen.Wait(10000) + canRelog = true end) Citizen.CreateThread(function() - local players, vehicles + local playerPool = {} while hidePlayers do - players = GetActivePlayers() + local players = GetActivePlayers() for i=1, #players do - if players[i] ~= PlayerId() then NetworkConcealPlayer(players[i], true, true) end - end - vehicles = ESX.Game.GetVehicles() - for i=1, #vehicles do - NetworkConcealEntity(vehicles[i], true) + local player = players[i] + if player ~= PlayerId() and not playerPool[player] then + playerPool[player] = true + NetworkConcealPlayer(players[player], true, true) + end end Citizen.Wait(500) end - for i=1, #players do - if players[i] ~= PlayerId() then NetworkConcealPlayer(players[i], false, false) end + for i=1, #playerPool do + NetworkConcealPlayer(playerPool[i], false, false) end - for i=1, #vehicles do - NetworkConcealEntity(vehicles[i], false) - end - SetEntityVisible(PlayerPedId(), 1, 0) - SetPlayerInvincible(PlayerId(), 0) - Citizen.Wait(10000) - canRelog = true end) end @@ -144,10 +147,12 @@ if ESX.GetConfig().Multichar then z = Config.Spawn.z, heading = Config.Spawn.w, model = `mp_m_freemode_01`, - skipFade = false + skipFade = true }, function() exports.spawnmanager:setAutoSpawn(false) canRelog = false + DoScreenFadeIn(400) + while not IsScreenFadedIn() do Citizen.Wait(200) end local playerPed = PlayerPedId() SetPedAoBlobRendering(playerPed, false) SetEntityAlpha(playerPed, 0) @@ -155,8 +160,6 @@ if ESX.GetConfig().Multichar then TriggerEvent('esx_identity:showRegisterIdentity') end) else - DoScreenFadeIn(400) - while not IsScreenFadedIn() do Citizen.Wait(200) end for k,v in pairs(Characters) do if not v.model and v.skin then if v.skin.model then v.model = v.skin.model elseif v.skin.sex == 1 then v.model = `mp_f_freemode_01` else v.model = `mp_m_freemode_01` end @@ -165,6 +168,8 @@ if ESX.GetConfig().Multichar then local label = v.firstname..' '..v.lastname elements[#elements+1] = {label = label, value = v.id} end + DoScreenFadeIn(200) + Citizen.Wait(200) if #elements < Config.Slots then elements[#elements+1] = {label = _('create_char'), value = (#elements+1), new = true} end @@ -184,12 +189,10 @@ if ESX.GetConfig().Multichar then }, function(data, menu) if data.current.action == 'play' then ESX.UI.Menu.CloseAll() - DoScreenFadeOut(300) SendNUIMessage({ action = "closeui" }) TriggerServerEvent('esx_multicharacter:CharacterChosen', data.current.value, false) - Citizen.Wait(300) else local elements2 = {} elements2[1] = {label = _('cancel')} @@ -248,25 +251,19 @@ if ESX.GetConfig().Multichar then RegisterNetEvent('esx:playerLoaded') AddEventHandler('esx:playerLoaded', function(playerData, isNew, skin) + DoScreenFadeOut(100) local spawn = playerData.coords - DoScreenFadeOut(0) - Citizen.Wait(300) local playerPed = PlayerPedId() - cam2 = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA", spawn.x,spawn.y,spawn.z+200, 0.0, 0.0, 0.0, 100.00, false, 0) - PointCamAtCoord(cam2, spawn.x,spawn.y,spawn.z+10) - SetCamActiveWithInterp(cam2, cam, 400, true, true) - - Citizen.Wait(700) - DoScreenFadeIn(500) FreezeEntityPosition(playerPed, true) - SetEntityVisible(playerPed, true, 0) - SetEntityCoords(playerPed, spawn.x, spawn.y, spawn.z, true, false, false, false) + SetEntityCoords(playerPed, spawn.x, spawn.y, spawn.z-1.3, true, false, false, false) + SetEntityHeading(playerPed, spawn.heading) + Citizen.Wait(300) + SetCamActive(cam, false) + RenderScriptCams(0, 0) + DestroyAllCams(true) + DoScreenFadeIn(400) + Citizen.Wait(400) - cam = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA", spawn.x,spawn.y,spawn.z+10, 0.0, 0.0, 0.0, 100.00, false, 0) - PointCamAtCoord(cam, spawn.x,spawn.y,spawn.z) - SetCamActiveWithInterp(cam, cam2, 1700, true, true) - - PlaySoundFrontend(-1, "Zoom_Out", "DLC_HEIST_PLANNING_BOARD_SOUNDS", 1) if isNew or not skin or #skin == 1 then local sex = skin.sex or 0 if sex == 0 then model = `mp_m_freemode_01` else model = `mp_f_freemode_01` end @@ -280,35 +277,27 @@ if ESX.GetConfig().Multichar then skin = Config.Default skin.sex = sex TriggerEvent('skinchanger:loadSkin', skin, function() - Citizen.CreateThread(function() - playerped = PlayerPedId() - SetPedAoBlobRendering(playerPed, true) - ResetEntityAlpha(playerPed) - Citizen.Wait(1500) - TriggerEvent('esx_skin:openSaveableMenu') - SetEntityHeading(playerPed, spawn.heading) + playerPed = PlayerPedId() + SetPedAoBlobRendering(playerPed, true) + ResetEntityAlpha(playerPed) + TriggerEvent('esx_skin:openSaveableMenu', function() + finished = true end, function() finished = true end) + SetEntityHeading(playerPed, spawn.heading) end) + while not finished do Citizen.Wait(200) end else + local playerPed = PlayerPedId() + SetEntityHeading(playerPed, spawn.heading) TriggerEvent('skinchanger:loadSkin', skin or Characters[Spawned].skin) - Citizen.Wait(1500) + playerPed = PlayerPedId() + SetEntityVisible(playerPed, true, 0) end - Characters = {} TriggerServerEvent('esx:onPlayerSpawn') TriggerEvent('esx:onPlayerSpawn') TriggerEvent('playerSpawned') TriggerEvent('esx:restoreLoadout') - playerPed = PlayerPedId() - FreezeEntityPosition(playerPed, false) - SetEntityHeading(PlayerPed, spawn.heading) - Citizen.Wait(500) - RenderScriptCams(false, true, 500, true, true) - PlaySoundFrontend(-1, "CAR_BIKE_WHOOSH", "MP_LOBBY_SOUNDS", 1) - SetCamActive(cam, false) - DestroyAllCams(true) - DisplayHud(true) - DisplayRadar(true) - hidePlayers = false + Characters, hidePlayers = {}, false end) RegisterNetEvent('esx:onPlayerLogout') diff --git a/fxmanifest.lua b/fxmanifest.lua index 9ee95603..e41f9719 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'adamant' game 'gta5' description 'https://github.com/thelindat/esx_multicharacter' -version '1.1.2' +version '1.2.0' dependencies { 'es_extended', From b081008863bd69f82fad315c419ab9bfc8fe612f Mon Sep 17 00:00:00 2001 From: Linden Date: Sun, 27 Jun 2021 18:05:50 +1000 Subject: [PATCH 004/132] improvements(client): Fix nil value; overhauled most of the character selection and spawning logic --- server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/main.lua b/server/main.lua index c7fd07be..790e41bc 100644 --- a/server/main.lua +++ b/server/main.lua @@ -60,7 +60,7 @@ elseif ESX.GetConfig().Multichar == true then if result then local varchar, varsize = {}, 0 for k, v in pairs(result) do - if v.CHARACTER_MAXIMUM_LENGTH < 60 then varchar[v.TABLE_NAME] = v.COLUMN_NAME varsize = varsize+1 end + if v.CHARACTER_MAXIMUM_LENGTH and v.CHARACTER_MAXIMUM_LENGTH >= 40 and v.CHARACTER_MAXIMUM_LENGTH < 60 then varchar[v.TABLE_NAME] = v.COLUMN_NAME varsize = varsize+1 end table.insert(IdentifierTables, {table = v.TABLE_NAME, column = v.COLUMN_NAME}) end if next(varchar) then From d6c7e10594395fbf03651c0615c5d6a41e321ec0 Mon Sep 17 00:00:00 2001 From: Linden Date: Mon, 28 Jun 2021 18:02:15 +1000 Subject: [PATCH 005/132] improvements(client): Disable spawnmanager auto spawning --- client/main.lua | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/client/main.lua b/client/main.lua index 5b859a7d..4ea6edb5 100644 --- a/client/main.lua +++ b/client/main.lua @@ -2,17 +2,21 @@ ESX = exports['es_extended']:getSharedObject() if ESX.GetConfig().Multichar then Citizen.CreateThread(function() - while NetworkIsPlayerActive(PlayerId()) and not ESX.IsPlayerLoaded() do - Citizen.Wait(5) - DoScreenFadeOut(0) - while not GetResourceState('esx_menu_default') == 'started' do - Citizen.Wait(0) + while not ESX.PlayerLoaded do + Citizen.Wait(0) + if NetworkIsPlayerActive(PlayerId()) then + exports.spawnmanager:setAutoSpawn(false) + DoScreenFadeOut(0) + while not GetResourceState('esx_menu_default') == 'started' do + Citizen.Wait(0) + end + TriggerEvent("esx_multicharacter:SetupCharacters") + break end - TriggerEvent("esx_multicharacter:SetupCharacters") - break end end) + local canRelog, cam, Spawned = true local Characters = {} @@ -86,8 +90,6 @@ if ESX.GetConfig().Multichar then SetupCharacter = function(index) if Spawned == false then - exports.spawnmanager:setAutoSpawn(false) - exports.spawnmanager:forceRespawn() exports.spawnmanager:spawnPlayer({ x = Config.Spawn.x, y = Config.Spawn.y, @@ -104,7 +106,6 @@ if ESX.GetConfig().Multichar then end TriggerEvent('skinchanger:loadSkin', skin) end - exports.spawnmanager:setAutoSpawn(false) end) elseif Characters[index] and Characters[index].skin then if Characters[Spawned] and Characters[Spawned].model then @@ -149,10 +150,9 @@ if ESX.GetConfig().Multichar then model = `mp_m_freemode_01`, skipFade = true }, function() - exports.spawnmanager:setAutoSpawn(false) canRelog = false DoScreenFadeIn(400) - while not IsScreenFadedIn() do Citizen.Wait(200) end + Citizen.Wait(400) local playerPed = PlayerPedId() SetPedAoBlobRendering(playerPed, false) SetEntityAlpha(playerPed, 0) @@ -168,8 +168,8 @@ if ESX.GetConfig().Multichar then local label = v.firstname..' '..v.lastname elements[#elements+1] = {label = label, value = v.id} end - DoScreenFadeIn(200) - Citizen.Wait(200) + DoScreenFadeIn(400) + Citizen.Wait(400) if #elements < Config.Slots then elements[#elements+1] = {label = _('create_char'), value = (#elements+1), new = true} end From f3eb335547bf326dc8567235ac11461b85d482d2 Mon Sep 17 00:00:00 2001 From: Linden Date: Mon, 28 Jun 2021 18:54:50 +1000 Subject: [PATCH 006/132] refactor(server): Should be using Async here --- server/main.lua | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/server/main.lua b/server/main.lua index 790e41bc..4a52cac9 100644 --- a/server/main.lua +++ b/server/main.lua @@ -52,11 +52,10 @@ elseif ESX.GetConfig().Multichar == true then print(('[^2INFO^7] Player [%s] %s has deleted a character (%s)'):format(GetPlayerName(playerId), playerId, identifier)) end - Citizen.CreateThread(function() - MySQL.ready(function () - local result = MySQL.Sync.fetchAll('SELECT `TABLE_NAME`, `COLUMN_NAME`, `CHARACTER_MAXIMUM_LENGTH` FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND (COLUMN_NAME = ? OR COLUMN_NAME = ?) ', { - Config.Database, 'identifier', 'owner' - }) + MySQL.ready(function() + MySQL.Async.fetchAll('SELECT `TABLE_NAME`, `COLUMN_NAME`, `CHARACTER_MAXIMUM_LENGTH` FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND (COLUMN_NAME = ? OR COLUMN_NAME = ?) ', { + Config.Database, 'identifier', 'owner' + }, function(result) if result then local varchar, varsize = {}, 0 for k, v in pairs(result) do @@ -69,9 +68,9 @@ elseif ESX.GetConfig().Multichar == true then end print(('[^2INFO^7] Attempted to update ^5%s^7 columns to use VARCHAR(60)'):format(varsize)) end + if not next(ESX.Jobs) then ESX.Jobs = GetJobs() end + Fetch = MySQL.Sync.store("SELECT `identifier`, `accounts`, `job`, `job_grade`, `firstname`, `lastname`, `dateofbirth`, `sex`, `skin` FROM `users` WHERE identifier LIKE ? LIMIT ?") end - if not next(ESX.Jobs) then ESX.Jobs = GetJobs() end - Fetch = MySQL.Sync.store("SELECT `identifier`, `accounts`, `job`, `job_grade`, `firstname`, `lastname`, `dateofbirth`, `sex`, `skin` FROM `users` WHERE identifier LIKE ? LIMIT ?") end) end) From c97daae2a963dd6e5e424d3aaf092e8fcc49549c Mon Sep 17 00:00:00 2001 From: Linden Date: Mon, 28 Jun 2021 19:00:17 +1000 Subject: [PATCH 007/132] improvements(client): Hide HUD components while active; refactor --- client/main.lua | 23 +++++++++++++---------- fxmanifest.lua | 2 +- readme.md | 7 +++---- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/client/main.lua b/client/main.lua index 4ea6edb5..f79c29b5 100644 --- a/client/main.lua +++ b/client/main.lua @@ -32,8 +32,6 @@ if ESX.GetConfig().Multichar then SetCamActive(cam, true) RenderScriptCams(true, false, 1, true, true) ESX.UI.HUD.SetDisplay(0.0) - DisplayHud(false) - DisplayRadar(false) StartLoop() ShutdownLoadingScreen() ShutdownLoadingScreenNui() @@ -55,6 +53,11 @@ if ESX.GetConfig().Multichar then SetEntityVisible(PlayerPedId(), 0, 0) SetLocalPlayerVisibleLocally(1) SetPlayerInvincible(PlayerId(), 1) + ThefeedHideThisFrame() + HideHudComponentThisFrame(11) + HideHudComponentThisFrame(12) + HideHudComponentThisFrame(21) + HideHudAndRadarThisFrame() Citizen.Wait(3) local vehicles = GetGamePool('CVehicle') for i=1, #vehicles do @@ -106,7 +109,10 @@ if ESX.GetConfig().Multichar then end TriggerEvent('skinchanger:loadSkin', skin) end + DoScreenFadeIn(400) + while IsScreenFadedOut() do Citizen.Wait(100) end end) + elseif Characters[index] and Characters[index].skin then if Characters[Spawned] and Characters[Spawned].model then RequestModel(Characters[index].model) @@ -119,15 +125,15 @@ if ESX.GetConfig().Multichar then end TriggerEvent('skinchanger:loadSkin', Characters[index].skin) end - FreezeEntityPosition(PlayerPedId(), true) Spawned = index - SendNUIMessage({ - action = "openui", - character = Characters[index] - }) local playerPed = PlayerPedId() + FreezeEntityPosition(PlayerPedId(), true) SetPedAoBlobRendering(playerPed, true) SetEntityAlpha(playerPed, 255) + SendNUIMessage({ + action = "openui", + character = Characters[Spawned] + }) end RegisterNetEvent('esx_multicharacter:SetupUI') @@ -141,7 +147,6 @@ if ESX.GetConfig().Multichar then SendNUIMessage({ action = "closeui" }) - exports.spawnmanager:forceRespawn() exports.spawnmanager:spawnPlayer({ x = Config.Spawn.x, y = Config.Spawn.y, @@ -168,8 +173,6 @@ if ESX.GetConfig().Multichar then local label = v.firstname..' '..v.lastname elements[#elements+1] = {label = label, value = v.id} end - DoScreenFadeIn(400) - Citizen.Wait(400) if #elements < Config.Slots then elements[#elements+1] = {label = _('create_char'), value = (#elements+1), new = true} end diff --git a/fxmanifest.lua b/fxmanifest.lua index e41f9719..57787aaa 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'adamant' game 'gta5' description 'https://github.com/thelindat/esx_multicharacter' -version '1.2.0' +version '1.2.1' dependencies { 'es_extended', diff --git a/readme.md b/readme.md index c6c5341f..7fa5bfea 100644 --- a/readme.md +++ b/readme.md @@ -9,8 +9,7 @@ - Modify your ESX config with `Config.Multichar = true` - Set your database name for `Config.Database` in server/main.lua - All owner and identifier columns should be set to `VARCHAR(60)` to ensure correct data entry -- Use the `varchar` command from the console to update your SQL tables -- Once you have used the command you should just remove it for sanity's sake + - The resource will attempt to set columns automatically ### Conflicts * The following resources should not be used with ESX Legacy and can result in errors @@ -19,14 +18,14 @@ - fivem-map-skater - fivem-map-hipster - default_spawnpoint - - cui_character (or other resources that modify spawn behaviour) ### Common issues #### Black screen / loading scripts - Download and run all requirements + - Use a fresh spawnmanager as many people alter the code - Ensure none of the conflicting resources are enabled #### mysql-async duplicate entry - - You have not increased the VARCHAR size of your tables (use the command) + - You have not increased the VARCHAR size of the table holding identifiers - usually `owner` or `identifier` #### The menu interface is esx_menu_default - you can use any version if you want a different appearance ![image](https://user-images.githubusercontent.com/65407488/119010385-592a8c80-b9d7-11eb-9aa1-eb7051004843.png) From e7090e6a7d4136032e5a5326d4f9fbbeb98aab8e Mon Sep 17 00:00:00 2001 From: Linden Date: Tue, 29 Jun 2021 19:24:56 +1000 Subject: [PATCH 008/132] fix(client): Enable and and right arrow keys while loop is active Due to hidePlayers now waiting until a skin has been set before disabling, these keys are now required. --- client/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/main.lua b/client/main.lua index f79c29b5..3d7aab44 100644 --- a/client/main.lua +++ b/client/main.lua @@ -44,7 +44,7 @@ if ESX.GetConfig().Multichar then hidePlayers = true MumbleSetVolumeOverride(PlayerId(), 0.0) Citizen.CreateThread(function() - local keys = {18, 27, 172, 173, 176, 177, 187, 188, 191, 201, 108, 109} + local keys = {18, 27, 172, 173, 174, 175, 176, 177, 187, 188, 191, 201, 108, 109} while hidePlayers do DisableAllControlActions(0) for i=1, #keys do From 5dcae7c4c5911aceb2621f688d98c971731aba64 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Fri, 9 Jul 2021 19:39:15 +1000 Subject: [PATCH 009/132] Update readme.md --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 7fa5bfea..7cfa0536 100644 --- a/readme.md +++ b/readme.md @@ -1,5 +1,5 @@ ### Requirements (ensure you are using the latest) -- [ESX Legacy](https://github.com/esx-framework/es_extended/tree/legacy) +- [ESX Legacy](https://github.com/esx-framework/esx-legacy) - [MySQL Async 3.3.2](https://github.com/brouznouf/fivem-mysql-async/releases/tag/3.3.2) - [ESX Identity](https://github.com/esx-framework/esx_identity) - [ESX Skin](https://github.com/esx-framework/esx_skin) @@ -13,7 +13,7 @@ ### Conflicts * The following resources should not be used with ESX Legacy and can result in errors - - **essentialsmode** + - essentialmode - basic-gamemode - fivem-map-skater - fivem-map-hipster From 861dfcda88217566f5b2e0186b8203eecd841d19 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Wed, 21 Jul 2021 13:30:44 +1000 Subject: [PATCH 010/132] Update main.lua --- server/main.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/main.lua b/server/main.lua index 4a52cac9..f13d9e82 100644 --- a/server/main.lua +++ b/server/main.lua @@ -1,5 +1,5 @@ if not ESX then - SetTimeout(3000, print('[^3WARNING^7] Unable to start Multicharacter - your version of ESX is not compatible ')) + SetTimeout(3000, function() print('[^3WARNING^7] Unable to start Multicharacter - your version of ESX is not compatible ') end) elseif ESX.GetConfig().Multichar == true then local IdentifierTables, Fetch = {}, -1 @@ -121,5 +121,5 @@ elseif ESX.GetConfig().Multichar == true then end, true) else - SetTimeout(3000, print('[^3WARNING^7] Multicharacter is disabled - please check your ESX configuration')) + SetTimeout(3000, function() print('[^3WARNING^7] Multicharacter is disabled - please check your ESX configuration') end) end From 5f142f6d1f78d2db6f79c379549761664790668a Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Mon, 26 Jul 2021 20:42:00 +1000 Subject: [PATCH 011/132] chore: Update screenshot in readme --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 7cfa0536..35360673 100644 --- a/readme.md +++ b/readme.md @@ -28,7 +28,7 @@ - You have not increased the VARCHAR size of the table holding identifiers - usually `owner` or `identifier` #### The menu interface is esx_menu_default - you can use any version if you want a different appearance -![image](https://user-images.githubusercontent.com/65407488/119010385-592a8c80-b9d7-11eb-9aa1-eb7051004843.png) +![image](https://user-images.githubusercontent.com/65407488/126976325-17cc3241-bb9e-451f-a6ed-610a8ef52fa5.png) ### Relogging - Do not enable this setting if you do not intend to properly set up relog support From 657dcc772828e76fc10e59da764a26756b7c5134 Mon Sep 17 00:00:00 2001 From: Linden Date: Mon, 26 Jul 2021 20:46:07 +1000 Subject: [PATCH 012/132] tweak(client): Modify camera behaviour and positioning --- client/main.lua | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/client/main.lua b/client/main.lua index 3d7aab44..122e5543 100644 --- a/client/main.lua +++ b/client/main.lua @@ -25,12 +25,17 @@ if ESX.GetConfig().Multichar then ESX.PlayerLoaded = false ESX.PlayerData = {} Spawned = false - cam = CreateCamWithParams("DEFAULT_SCRIPTED_CAMERA", Config.Spawn.x, Config.Spawn.y+1.6, Config.Spawn.z+1.3, 0.0, 0.0, 180.0, 100.00, false, 0) - SetEntityCoords(PlayerPedId(), Config.Spawn.x, Config.Spawn.y, Config.Spawn.z, true, false, false, false) - SetEntityHeading(PlayerPedId(), Config.Spawn.w) + cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true) + local playerPed = PlayerPedId() + SetEntityCoords(playerPed, Config.Spawn.x, Config.Spawn.y, Config.Spawn.z, true, false, false, false) + SetEntityHeading(playerPed, Config.Spawn.w) DoScreenFadeOut(0) SetCamActive(cam, true) RenderScriptCams(true, false, 1, true, true) + + SetCamCoord(cam, Config.Spawn.x, Config.Spawn.y + 1.6, Config.Spawn.z + 1.3) + PointCamAtCoord(cam, Config.Spawn.x, Config.Spawn.y, Config.Spawn.z + 1.3) + ESX.UI.HUD.SetDisplay(0.0) StartLoop() ShutdownLoadingScreen() From 9480853f6a88c2408616f69066986ac37df8a156 Mon Sep 17 00:00:00 2001 From: Linden Date: Mon, 26 Jul 2021 20:48:29 +1000 Subject: [PATCH 013/132] improvement: New players now select skin before teleporting to spawn - This also resolves the bug with esx_skin's camera being zoomed in --- client/main.lua | 31 ++++++++++++------------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/client/main.lua b/client/main.lua index 122e5543..84f6b52e 100644 --- a/client/main.lua +++ b/client/main.lua @@ -259,19 +259,7 @@ if ESX.GetConfig().Multichar then RegisterNetEvent('esx:playerLoaded') AddEventHandler('esx:playerLoaded', function(playerData, isNew, skin) - DoScreenFadeOut(100) local spawn = playerData.coords - local playerPed = PlayerPedId() - FreezeEntityPosition(playerPed, true) - SetEntityCoords(playerPed, spawn.x, spawn.y, spawn.z-1.3, true, false, false, false) - SetEntityHeading(playerPed, spawn.heading) - Citizen.Wait(300) - SetCamActive(cam, false) - RenderScriptCams(0, 0) - DestroyAllCams(true) - DoScreenFadeIn(400) - Citizen.Wait(400) - if isNew or not skin or #skin == 1 then local sex = skin.sex or 0 if sex == 0 then model = `mp_m_freemode_01` else model = `mp_f_freemode_01` end @@ -291,16 +279,21 @@ if ESX.GetConfig().Multichar then TriggerEvent('esx_skin:openSaveableMenu', function() finished = true end, function() finished = true end) - SetEntityHeading(playerPed, spawn.heading) end) while not finished do Citizen.Wait(200) end - else - local playerPed = PlayerPedId() - SetEntityHeading(playerPed, spawn.heading) - TriggerEvent('skinchanger:loadSkin', skin or Characters[Spawned].skin) - playerPed = PlayerPedId() - SetEntityVisible(playerPed, true, 0) end + DoScreenFadeOut(100) + if not isNew then TriggerEvent('skinchanger:loadSkin', skin or Characters[Spawned].skin) end + Citizen.Wait(300) + local playerPed = PlayerPedId() + FreezeEntityPosition(playerPed, true) + SetEntityCoords(playerPed, spawn.x, spawn.y, spawn.z-1.3, true, false, false, false) + SetEntityHeading(playerPed, spawn.heading) + SetCamActive(cam, false) + RenderScriptCams(false, false, 0, true, true) + cam = nil + DoScreenFadeIn(400) + Citizen.Wait(400) TriggerServerEvent('esx:onPlayerSpawn') TriggerEvent('esx:onPlayerSpawn') TriggerEvent('playerSpawned') From 83bae12c0f56fd48346fd4d7378e192934727fd8 Mon Sep 17 00:00:00 2001 From: Linden Date: Mon, 26 Jul 2021 20:59:11 +1000 Subject: [PATCH 014/132] fix: Ensure screenfades last long enough to hide transitions; set local variable for finish (new characters) --- client/main.lua | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/client/main.lua b/client/main.lua index 84f6b52e..9cb30868 100644 --- a/client/main.lua +++ b/client/main.lua @@ -115,7 +115,7 @@ if ESX.GetConfig().Multichar then TriggerEvent('skinchanger:loadSkin', skin) end DoScreenFadeIn(400) - while IsScreenFadedOut() do Citizen.Wait(100) end + repeat Citizen.Wait(200) until not IsScreenFadedOut() end) elseif Characters[index] and Characters[index].skin then @@ -261,6 +261,7 @@ if ESX.GetConfig().Multichar then AddEventHandler('esx:playerLoaded', function(playerData, isNew, skin) local spawn = playerData.coords if isNew or not skin or #skin == 1 then + local finished = false local sex = skin.sex or 0 if sex == 0 then model = `mp_m_freemode_01` else model = `mp_f_freemode_01` end RequestModel(model) @@ -280,20 +281,21 @@ if ESX.GetConfig().Multichar then finished = true end, function() finished = true end) end) - while not finished do Citizen.Wait(200) end + repeat Citizen.Wait(200) until finished end DoScreenFadeOut(100) - if not isNew then TriggerEvent('skinchanger:loadSkin', skin or Characters[Spawned].skin) end - Citizen.Wait(300) + repeat Citizen.Wait(200) until IsScreenFadedOut() + SetCamActive(cam, false) + RenderScriptCams(false, false, 0, true, true) + cam = nil local playerPed = PlayerPedId() FreezeEntityPosition(playerPed, true) SetEntityCoords(playerPed, spawn.x, spawn.y, spawn.z-1.3, true, false, false, false) SetEntityHeading(playerPed, spawn.heading) - SetCamActive(cam, false) - RenderScriptCams(false, false, 0, true, true) - cam = nil - DoScreenFadeIn(400) + if not isNew then TriggerEvent('skinchanger:loadSkin', skin or Characters[Spawned].skin) end Citizen.Wait(400) + DoScreenFadeIn(400) + repeat Citizen.Wait(200) until not IsScreenFadedOut() TriggerServerEvent('esx:onPlayerSpawn') TriggerEvent('esx:onPlayerSpawn') TriggerEvent('playerSpawned') From 9dbe1c5cbe70d9f39bd4e2960ad67e9e7d2ab61e Mon Sep 17 00:00:00 2001 From: Linden Date: Mon, 26 Jul 2021 20:59:58 +1000 Subject: [PATCH 015/132] fix: Ensure character is deleted on the server before refreshing client --- server/main.lua | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/server/main.lua b/server/main.lua index f13d9e82..ea74dafa 100644 --- a/server/main.lua +++ b/server/main.lua @@ -44,12 +44,20 @@ elseif ESX.GetConfig().Multichar == true then local DeleteCharacter = function(playerId, charid) local identifier = Config.Prefix..charid..':'..ESX.GetIdentifier(playerId) + local counter = 0 for k, v in pairs(IdentifierTables) do MySQL.Async.execute("DELETE FROM "..v.table.." WHERE "..v.column.." = ?", { identifier - }) + }, function() + counter = counter + 1 + if counter == #IdentifierTables then + print(('[^2INFO^7] Player [%s] %s has deleted a character (%s)'):format(GetPlayerName(playerId), playerId, identifier)) + Citizen.Wait(100) + SetupCharacters(playerId) + end + end) + Citizen.Wait(5) end - print(('[^2INFO^7] Player [%s] %s has deleted a character (%s)'):format(GetPlayerName(playerId), playerId, identifier)) end MySQL.ready(function() @@ -106,7 +114,6 @@ elseif ESX.GetConfig().Multichar == true then local src = source if type(charid) == "number" and string.len(charid) <= 2 then DeleteCharacter(src, charid) - SetupCharacters(src) end end) From 7bf936713533945d0943f6c4001e7215b08c859e Mon Sep 17 00:00:00 2001 From: Linden Date: Mon, 26 Jul 2021 21:10:59 +1000 Subject: [PATCH 016/132] tweak: Move fadeout check until after the spawnmanager export --- client/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/main.lua b/client/main.lua index 9cb30868..7c7eff0a 100644 --- a/client/main.lua +++ b/client/main.lua @@ -115,8 +115,8 @@ if ESX.GetConfig().Multichar then TriggerEvent('skinchanger:loadSkin', skin) end DoScreenFadeIn(400) - repeat Citizen.Wait(200) until not IsScreenFadedOut() end) + repeat Citizen.Wait(200) until not IsScreenFadedOut() elseif Characters[index] and Characters[index].skin then if Characters[Spawned] and Characters[Spawned].model then From b5b5f56a2b224f71efdc7d54c25544b04b806e24 Mon Sep 17 00:00:00 2001 From: Linden Date: Mon, 26 Jul 2021 21:21:57 +1000 Subject: [PATCH 017/132] Improvement: Set the camera position offset from the entity - Modifying the spawn location would previously require adjusting the camera parameters. - This, along with the previous camera change, ensures the camera is always facing the ped --- client/main.lua | 4 ++-- config.lua | 3 ++- fxmanifest.lua | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/client/main.lua b/client/main.lua index 7c7eff0a..242d159d 100644 --- a/client/main.lua +++ b/client/main.lua @@ -29,11 +29,11 @@ if ESX.GetConfig().Multichar then local playerPed = PlayerPedId() SetEntityCoords(playerPed, Config.Spawn.x, Config.Spawn.y, Config.Spawn.z, true, false, false, false) SetEntityHeading(playerPed, Config.Spawn.w) + local offset = GetOffsetFromEntityInWorldCoords(playerPed, 0, 1.7, 0.4) DoScreenFadeOut(0) SetCamActive(cam, true) RenderScriptCams(true, false, 1, true, true) - - SetCamCoord(cam, Config.Spawn.x, Config.Spawn.y + 1.6, Config.Spawn.z + 1.3) + SetCamCoord(cam, offset.x, offset.y, offset.z) PointCamAtCoord(cam, Config.Spawn.x, Config.Spawn.y, Config.Spawn.z + 1.3) ESX.UI.HUD.SetDisplay(0.0) diff --git a/config.lua b/config.lua index a444f660..0dff5211 100644 --- a/config.lua +++ b/config.lua @@ -2,7 +2,8 @@ Config = {} Config.Locale = 'en' Config.Slots = 4 -Config.Spawn = vector4(-113.7, 565.3, 195.2, 0) +Config.Spawn = vector4(-113.7, 565.3, 195.2, 0) -- Sets the location for character selection +-- To set the spawn location for new characters, modify the default value in the `users` SQL table -------------------- -- Do not use unless you are prepared to adjust your resources to correctly reset data diff --git a/fxmanifest.lua b/fxmanifest.lua index 57787aaa..617f933c 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'adamant' game 'gta5' description 'https://github.com/thelindat/esx_multicharacter' -version '1.2.1' +version '1.2.2' dependencies { 'es_extended', From 0ec17f081ec652b4218cf9dddbd420f352e37f39 Mon Sep 17 00:00:00 2001 From: Linden Date: Mon, 2 Aug 2021 22:13:36 +1000 Subject: [PATCH 018/132] fix: Close UI when setting up characters; spawn fallback position - If playerData.coords don't exist then there's an issue with that character - Instead of erroring out, spawn them at the character selection area todo: setup default spawn location instead of relying on database --- client/main.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/client/main.lua b/client/main.lua index 242d159d..87dccc3e 100644 --- a/client/main.lua +++ b/client/main.lua @@ -35,7 +35,7 @@ if ESX.GetConfig().Multichar then RenderScriptCams(true, false, 1, true, true) SetCamCoord(cam, offset.x, offset.y, offset.z) PointCamAtCoord(cam, Config.Spawn.x, Config.Spawn.y, Config.Spawn.z + 1.3) - + ESX.UI.Menu.CloseAll() ESX.UI.HUD.SetDisplay(0.0) StartLoop() ShutdownLoadingScreen() @@ -147,6 +147,7 @@ if ESX.GetConfig().Multichar then Characters = data local elements = {} local Character = next(Characters) + exports.spawnmanager:forceRespawn() if Character == nil then SendNUIMessage({ @@ -259,7 +260,7 @@ if ESX.GetConfig().Multichar then RegisterNetEvent('esx:playerLoaded') AddEventHandler('esx:playerLoaded', function(playerData, isNew, skin) - local spawn = playerData.coords + local spawn = playerData.coords or Config.Spawn if isNew or not skin or #skin == 1 then local finished = false local sex = skin.sex or 0 From 248b6e0b92664c40c8a2156770d1a8e688e4b2ad Mon Sep 17 00:00:00 2001 From: Demetrio <15928886+d3rp-jsx@users.noreply.github.com> Date: Mon, 9 Aug 2021 16:54:32 +0200 Subject: [PATCH 019/132] improvement: configurable character deletation (#35) Co-authored-by: d3rp-jsx <15928886+derp-jsx@users.noreply.github.com> --- client/main.lua | 2 +- config.lua | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/client/main.lua b/client/main.lua index 87dccc3e..28e33a4d 100644 --- a/client/main.lua +++ b/client/main.lua @@ -190,7 +190,7 @@ if ESX.GetConfig().Multichar then local elements = {} if not data.current.new then elements[1] = {label = _('char_play'), action = 'play', value = data.current.value} - elements[2] = {label = _('char_delete'), action = 'delete', value = data.current.value} + if Config.CanDelete then elements[2] = {label = _('char_delete'), action = 'delete', value = data.current.value} end ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'choosechar', { title = _('select_char'), align = 'top-left', diff --git a/config.lua b/config.lua index 0dff5211..f1874abf 100644 --- a/config.lua +++ b/config.lua @@ -5,6 +5,8 @@ Config.Slots = 4 Config.Spawn = vector4(-113.7, 565.3, 195.2, 0) -- Sets the location for character selection -- To set the spawn location for new characters, modify the default value in the `users` SQL table +Config.CanDelete = false -- Choose whether or not a user can self-delete its own characters + -------------------- -- Do not use unless you are prepared to adjust your resources to correctly reset data -- Information: https://github.com/thelindat/esx_multicharacter#relogging From 52250d0d495cba7cc569786a1d874faf85e40d7e Mon Sep 17 00:00:00 2001 From: Demetrio <15928886+d3rp-jsx@users.noreply.github.com> Date: Tue, 10 Aug 2021 19:31:30 +0200 Subject: [PATCH 020/132] Dynamic slots (#36) * Removed slots configuration * feature: dynamic slots * fixes + improvements * edited core functionality * added commands for slots management * added commands english locale Co-authored-by: d3rp-jsx <15928886+derp-jsx@users.noreply.github.com> --- client/main.lua | 7 +++--- config.lua | 2 +- esx_multicharacter.sql | 7 ++++++ locales/en.lua | 7 ++++++ server/main.lua | 48 ++++++++++++++++++++++++++++++++++++++++-- 5 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 esx_multicharacter.sql diff --git a/client/main.lua b/client/main.lua index 28e33a4d..15f6b391 100644 --- a/client/main.lua +++ b/client/main.lua @@ -142,9 +142,10 @@ if ESX.GetConfig().Multichar then end RegisterNetEvent('esx_multicharacter:SetupUI') - AddEventHandler('esx_multicharacter:SetupUI', function(data) + AddEventHandler('esx_multicharacter:SetupUI', function(data, slots) DoScreenFadeOut(0) Characters = data + local slots = slots local elements = {} local Character = next(Characters) exports.spawnmanager:forceRespawn() @@ -179,7 +180,7 @@ if ESX.GetConfig().Multichar then local label = v.firstname..' '..v.lastname elements[#elements+1] = {label = label, value = v.id} end - if #elements < Config.Slots then + if #elements < slots then elements[#elements+1] = {label = _('create_char'), value = (#elements+1), new = true} end ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'selectchar', { @@ -228,7 +229,7 @@ if ESX.GetConfig().Multichar then else ESX.UI.Menu.CloseAll() local GetSlot = function() - for i=1, Config.Slots do + for i=1, slots do if not Characters[i] then return i end diff --git a/config.lua b/config.lua index f1874abf..bda8e554 100644 --- a/config.lua +++ b/config.lua @@ -1,7 +1,7 @@ Config = {} Config.Locale = 'en' -Config.Slots = 4 +Config.Slots = 1 Config.Spawn = vector4(-113.7, 565.3, 195.2, 0) -- Sets the location for character selection -- To set the spawn location for new characters, modify the default value in the `users` SQL table diff --git a/esx_multicharacter.sql b/esx_multicharacter.sql new file mode 100644 index 00000000..9495bb5a --- /dev/null +++ b/esx_multicharacter.sql @@ -0,0 +1,7 @@ +CREATE TABLE `multicharacter_slots` ( + `identifier` VARCHAR(60) NOT NULL DEFAULT '' COLLATE 'utf8mb4_unicode_ci', + `slots` INT(11) NOT NULL DEFAULT '1' +) +COLLATE='utf8mb4_unicode_ci' +ENGINE=InnoDB +; diff --git a/locales/en.lua b/locales/en.lua index f814d78a..e61481b0 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -8,4 +8,11 @@ Locales['en'] = { ['char_delete'] = "Delete this character", ['cancel'] = "Cancel", ['confirm'] = "Confirm", + ['command_setslots'] = "Set multicharacter slots number of a player", + ['command_remslots'] = "Remove multicharacter slots number of a player", + ['command_identifier'] = "Player identifier", + ['command_slots'] = "# of slots", + ['slotsadd'] = "You added %s slots to %s", + ['slotsedit'] = "You set %s slots to %s", + ['slotsrem'] = "You removed slots to %s", } diff --git a/server/main.lua b/server/main.lua index ea74dafa..d8abff13 100644 --- a/server/main.lua +++ b/server/main.lua @@ -12,9 +12,15 @@ elseif ESX.GetConfig().Multichar == true then local SetupCharacters = function(playerId) while Fetch == -1 do Citizen.Wait(500) end local identifier = Config.Prefix..'%:'..ESX.GetIdentifier(playerId) + local slots = MySQL.Sync.fetchScalar("SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?", { + ESX.GetIdentifier(playerId) + }) + if not slots then + slots = Config.Slots + end MySQL.Async.fetchAll(Fetch, { identifier, - Config.Slots + slots }, function(result) local characters = {} for i=1, #result, 1 do @@ -38,7 +44,7 @@ elseif ESX.GetConfig().Multichar == true then } if result[i].sex == 'm' then characters[id].sex = _('male') else characters[id].sex = _('female') end end - TriggerClientEvent('esx_multicharacter:SetupUI', playerId, characters) + TriggerClientEvent('esx_multicharacter:SetupUI', playerId, characters, slots) end) end @@ -123,6 +129,44 @@ elseif ESX.GetConfig().Multichar == true then TriggerEvent('esx:playerLogout', src) end) + ESX.RegisterCommand('setslots', 'admin', function(xPlayer, args, showError) + local slots = MySQL.Sync.fetchScalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { + args.identifier + }) + + if slots == nil then + MySQL.Async.execute('INSERT INTO `multicharacter_slots` (`identifier`, `slots`) VALUES (?, ?)', { + args.identifier, + args.slots + }) + xPlayer.triggerEvent('esx:showNotification', _U('slotsadd', args.slots, args.identifier)) + else + MySQL.Async.execute('UPDATE `multicharacter_slots` SET `slots` = ? WHERE `identifier` = ?', { + args.slots, + args.identifier + }) + xPlayer.triggerEvent('esx:showNotification', _U('slotsedit', args.slots, args.identifier)) + end + end, true, {help = _U('command_setslots'), validate = true, arguments = { + {name = 'identifier', help = _U('command_identifier'), type = 'string'}, + {name = 'slots', help = _U('command_slots'), type = 'number'} + }}) + + ESX.RegisterCommand('remslots', 'admin', function(xPlayer, args, showError) + local slots = MySQL.Sync.fetchScalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { + args.identifier + }) + + if slots ~= nil then + MySQL.Async.execute('DELETE FROM `multicharacter_slots` WHERE `identifier` = ?', { + args.identifier + }) + xPlayer.triggerEvent('esx:showNotification', _U('slotsrem', args.identifier)) + end + end, true, {help = _U('command_remslots'), validate = true, arguments = { + {name = 'identifier', help = _U('command_identifier'), type = 'string'} + }}) + RegisterCommand('forcelog', function(source, args, rawCommand) TriggerEvent('esx:playerLogout', source) end, true) From e65a4cb181ffa633dcb271adb9adf3b138fa898e Mon Sep 17 00:00:00 2001 From: Demetrio <15928886+d3rp-jsx@users.noreply.github.com> Date: Wed, 11 Aug 2021 01:33:40 +0200 Subject: [PATCH 021/132] Italian language support + Doc for dynamic slots and minor improvements (#37) * Added Italian language support + usability improvements * cleaner sql file Co-authored-by: d3rp-jsx <15928886+derp-jsx@users.noreply.github.com> --- config.lua | 5 +++++ esx_multicharacter.sql | 9 +++------ locales/it.lua | 18 ++++++++++++++++++ readme.md | 1 + 4 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 locales/it.lua diff --git a/config.lua b/config.lua index bda8e554..ca56aec7 100644 --- a/config.lua +++ b/config.lua @@ -1,7 +1,12 @@ Config = {} Config.Locale = 'en' +-------------------- +-- This is the default number of slots for EVERY player +-- If you want to manage extra slots for specific players you can do it by using '/setslots' and '/remslots' commands Config.Slots = 1 +-------------------- + Config.Spawn = vector4(-113.7, 565.3, 195.2, 0) -- Sets the location for character selection -- To set the spawn location for new characters, modify the default value in the `users` SQL table diff --git a/esx_multicharacter.sql b/esx_multicharacter.sql index 9495bb5a..86fb2b36 100644 --- a/esx_multicharacter.sql +++ b/esx_multicharacter.sql @@ -1,7 +1,4 @@ CREATE TABLE `multicharacter_slots` ( - `identifier` VARCHAR(60) NOT NULL DEFAULT '' COLLATE 'utf8mb4_unicode_ci', - `slots` INT(11) NOT NULL DEFAULT '1' -) -COLLATE='utf8mb4_unicode_ci' -ENGINE=InnoDB -; + `identifier` VARCHAR(60) NOT NULL, + `slots` INT NOT NULL +); diff --git a/locales/it.lua b/locales/it.lua new file mode 100644 index 00000000..6bae31fb --- /dev/null +++ b/locales/it.lua @@ -0,0 +1,18 @@ +Locales['it'] = { + ['male'] = "Maschio", + ['female'] = "Femmina", + ['delete_label'] = "Cancella %s %s?", + ['select_char'] = "Seleziona Personaggio", + ['create_char'] = "Crea un nuovo personaggio", + ['char_play'] = "Gioca questo personaggio", + ['char_delete'] = "Cancella questo personaggio", + ['cancel'] = "Annulla", + ['confirm'] = "Conferma", + ['command_setslots'] = "Imposta il numero di slot di personaggi di un player", + ['command_remslots'] = "Rimuovi il numero di slot di personaggi di un player", + ['command_identifier'] = "Identifier del giocatore", + ['command_slots'] = "# di slot", + ['slotsadd'] = "Hai aggiunto %s slot a %s", + ['slotsedit'] = "Hai impostato %s slot a %s", + ['slotsrem'] = "Hai rimosso gli slot a %s", +} diff --git a/readme.md b/readme.md index 35360673..ccd8dc76 100644 --- a/readme.md +++ b/readme.md @@ -8,6 +8,7 @@ ### Installation - Modify your ESX config with `Config.Multichar = true` - Set your database name for `Config.Database` in server/main.lua +- Run `esx_multicharacter.sql` into your database - All owner and identifier columns should be set to `VARCHAR(60)` to ensure correct data entry - The resource will attempt to set columns automatically From 5f5b0138f056d1c21a8418f45befa6a911db9dfe Mon Sep 17 00:00:00 2001 From: Demetrio <15928886+d3rp-jsx@users.noreply.github.com> Date: Fri, 20 Aug 2021 16:56:48 +0200 Subject: [PATCH 022/132] feat(chars): enable or disable a specific character of a player (#43) --- client/main.lua | 14 ++++++-- esx_multicharacter.sql | 3 ++ locales/en.lua | 7 ++++ locales/it.lua | 11 ++++-- server/commands.lua | 79 ++++++++++++++++++++++++++++++++++++++++++ server/main.lua | 47 ++----------------------- 6 files changed, 112 insertions(+), 49 deletions(-) create mode 100644 server/commands.lua diff --git a/client/main.lua b/client/main.lua index 15f6b391..e5705d2f 100644 --- a/client/main.lua +++ b/client/main.lua @@ -178,7 +178,11 @@ if ESX.GetConfig().Multichar then end if Spawned == false then SetupCharacter(Character) end local label = v.firstname..' '..v.lastname - elements[#elements+1] = {label = label, value = v.id} + if Characters[k].disabled == 1 then + elements[#elements+1] = {label = label, value = v.id} + else + elements[#elements+1] = {label = label, value = v.id} + end end if #elements < slots then elements[#elements+1] = {label = _('create_char'), value = (#elements+1), new = true} @@ -190,7 +194,11 @@ if ESX.GetConfig().Multichar then }, function(data, menu) local elements = {} if not data.current.new then - elements[1] = {label = _('char_play'), action = 'play', value = data.current.value} + if Characters[data.current.value].disabled == 0 then + elements[1] = {label = _('char_play'), action = 'play', value = data.current.value} + else + elements[1] = {label = _('char_disabled'), value = data.current.value} + end if Config.CanDelete then elements[2] = {label = _('char_delete'), action = 'delete', value = data.current.value} end ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'choosechar', { title = _('select_char'), @@ -203,7 +211,7 @@ if ESX.GetConfig().Multichar then action = "closeui" }) TriggerServerEvent('esx_multicharacter:CharacterChosen', data.current.value, false) - else + elseif data.current.action == 'delete' then local elements2 = {} elements2[1] = {label = _('cancel')} elements2[2] = {label = _('confirm'), value = data.current.value} diff --git a/esx_multicharacter.sql b/esx_multicharacter.sql index 86fb2b36..6aba96ad 100644 --- a/esx_multicharacter.sql +++ b/esx_multicharacter.sql @@ -2,3 +2,6 @@ CREATE TABLE `multicharacter_slots` ( `identifier` VARCHAR(60) NOT NULL, `slots` INT NOT NULL ); + +ALTER TABLE `users` + ADD `disabled` BIT NOT NULL DEFAULT 0; \ No newline at end of file diff --git a/locales/en.lua b/locales/en.lua index e61481b0..b71de307 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -5,14 +5,21 @@ Locales['en'] = { ['select_char'] = "Select Character", ['create_char'] = "Create new character", ['char_play'] = "Play this character", + ['char_disabled'] = "This character is disabled", ['char_delete'] = "Delete this character", ['cancel'] = "Cancel", ['confirm'] = "Confirm", ['command_setslots'] = "Set multicharacter slots number of a player", ['command_remslots'] = "Remove multicharacter slots number of a player", + ['command_enablechar'] = "Enable a given character of a player", + ['command_disablechar'] = "Disable a given character of a player", + ['command_charslot'] = "Slot number of the character", ['command_identifier'] = "Player identifier", ['command_slots'] = "# of slots", ['slotsadd'] = "You added %s slots to %s", ['slotsedit'] = "You set %s slots to %s", ['slotsrem'] = "You removed slots to %s", + ['charenabled'] = "You enabled character #%s of %s", + ['chardisabled'] = "You disabled character #%s of %s", + ['charnotfound'] = "Character #%s of %s doesn't exist", } diff --git a/locales/it.lua b/locales/it.lua index 6bae31fb..1f2333e5 100644 --- a/locales/it.lua +++ b/locales/it.lua @@ -5,14 +5,21 @@ Locales['it'] = { ['select_char'] = "Seleziona Personaggio", ['create_char'] = "Crea un nuovo personaggio", ['char_play'] = "Gioca questo personaggio", + ['char_disabled'] = "Questo personaggio è disabilitato", ['char_delete'] = "Cancella questo personaggio", ['cancel'] = "Annulla", ['confirm'] = "Conferma", - ['command_setslots'] = "Imposta il numero di slot di personaggi di un player", - ['command_remslots'] = "Rimuovi il numero di slot di personaggi di un player", + ['command_setslots'] = "Imposta il numero di slot di personaggi di un giocatore", + ['command_remslots'] = "Rimuovi il numero di slot di personaggi di un giocatore", + ['command_enablechar'] = "Abilita un personaggio di un giocatore", + ['command_disablechar'] = "Disabilita un personaggio di un giocatore", + ['command_charslot'] = "Numero dello slot del personaggio", ['command_identifier'] = "Identifier del giocatore", ['command_slots'] = "# di slot", ['slotsadd'] = "Hai aggiunto %s slot a %s", ['slotsedit'] = "Hai impostato %s slot a %s", ['slotsrem'] = "Hai rimosso gli slot a %s", + ['charenabled'] = "Hai abilitato il %s° personaggio di %s", + ['chardisabled'] = "Hai disabilitato il %s° personaggio di %s", + ['charnotfound'] = "Il personaggio %s di %s non esiste", } diff --git a/server/commands.lua b/server/commands.lua new file mode 100644 index 00000000..b4fbc2d2 --- /dev/null +++ b/server/commands.lua @@ -0,0 +1,79 @@ +ESX.RegisterCommand('setslots', 'admin', function(xPlayer, args, showError) + local slots = MySQL.Sync.fetchScalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { + args.identifier + }) + + if slots == nil then + MySQL.Async.execute('INSERT INTO `multicharacter_slots` (`identifier`, `slots`) VALUES (?, ?)', { + args.identifier, + args.slots + }) + xPlayer.triggerEvent('esx:showNotification', _U('slotsadd', args.slots, args.identifier)) + else + MySQL.Async.execute('UPDATE `multicharacter_slots` SET `slots` = ? WHERE `identifier` = ?', { + args.slots, + args.identifier + }) + xPlayer.triggerEvent('esx:showNotification', _U('slotsedit', args.slots, args.identifier)) + end +end, true, {help = _U('command_setslots'), validate = true, arguments = { + {name = 'identifier', help = _U('command_identifier'), type = 'string'}, + {name = 'slots', help = _U('command_slots'), type = 'number'} +}}) + +ESX.RegisterCommand('remslots', 'admin', function(xPlayer, args, showError) + local slots = MySQL.Sync.fetchScalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { + args.identifier + }) + + if slots ~= nil then + MySQL.Async.execute('DELETE FROM `multicharacter_slots` WHERE `identifier` = ?', { + args.identifier + }) + xPlayer.triggerEvent('esx:showNotification', _U('slotsrem', args.identifier)) + end +end, true, {help = _U('command_remslots'), validate = true, arguments = { + {name = 'identifier', help = _U('command_identifier'), type = 'string'} +}}) + +ESX.RegisterCommand('enablechar', 'admin', function(xPlayer, args, showError) + + local selectedCharacter = 'char'..args.charslot..':'..args.identifier; + + MySQL.Async.execute('UPDATE `users` SET `disabled` = 0 WHERE identifier = ?', { + selectedCharacter + }, function(result) + if result > 0 then + xPlayer.triggerEvent('esx:showNotification', _U('charenabled', args.charslot, args.identifier)) + else + xPlayer.triggerEvent('esx:showNotification', _U('charnotfound', args.charslot, args.identifier)) + end + end) + +end, true, {help = _U('command_enablechar'), validate = true, arguments = { + {name = 'identifier', help = _U('command_identifier'), type = 'string'}, + {name = 'charslot', help = _U('command_charslot'), type = 'number'} +}}) + +ESX.RegisterCommand('disablechar', 'admin', function(xPlayer, args, showError) + + local selectedCharacter = 'char'..args.charslot..':'..args.identifier; + + MySQL.Async.execute('UPDATE `users` SET `disabled` = 1 WHERE identifier = ?', { + selectedCharacter + }, function(result) + if result > 0 then + xPlayer.triggerEvent('esx:showNotification', _U('chardisabled', args.charslot, args.identifier)) + else + xPlayer.triggerEvent('esx:showNotification', _U('charnotfound', args.charslot, args.identifier)) + end + end) + +end, true, {help = _U('command_disablechar'), validate = true, arguments = { + {name = 'identifier', help = _U('command_identifier'), type = 'string'}, + {name = 'charslot', help = _U('command_charslot'), type = 'number'} +}}) + +RegisterCommand('forcelog', function(source, args, rawCommand) + TriggerEvent('esx:playerLogout', source) +end, true) \ No newline at end of file diff --git a/server/main.lua b/server/main.lua index d8abff13..09617693 100644 --- a/server/main.lua +++ b/server/main.lua @@ -40,7 +40,8 @@ elseif ESX.GetConfig().Multichar == true then firstname = result[i].firstname, lastname = result[i].lastname, dateofbirth = result[i].dateofbirth, - skin = json.decode(result[i].skin) + skin = json.decode(result[i].skin), + disabled = result[i].disabled, } if result[i].sex == 'm' then characters[id].sex = _('male') else characters[id].sex = _('female') end end @@ -83,7 +84,7 @@ elseif ESX.GetConfig().Multichar == true then print(('[^2INFO^7] Attempted to update ^5%s^7 columns to use VARCHAR(60)'):format(varsize)) end if not next(ESX.Jobs) then ESX.Jobs = GetJobs() end - Fetch = MySQL.Sync.store("SELECT `identifier`, `accounts`, `job`, `job_grade`, `firstname`, `lastname`, `dateofbirth`, `sex`, `skin` FROM `users` WHERE identifier LIKE ? LIMIT ?") + Fetch = MySQL.Sync.store("SELECT `identifier`, `accounts`, `job`, `job_grade`, `firstname`, `lastname`, `dateofbirth`, `sex`, `skin`, `disabled` FROM `users` WHERE identifier LIKE ? LIMIT ?") end end) end) @@ -129,48 +130,6 @@ elseif ESX.GetConfig().Multichar == true then TriggerEvent('esx:playerLogout', src) end) - ESX.RegisterCommand('setslots', 'admin', function(xPlayer, args, showError) - local slots = MySQL.Sync.fetchScalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { - args.identifier - }) - - if slots == nil then - MySQL.Async.execute('INSERT INTO `multicharacter_slots` (`identifier`, `slots`) VALUES (?, ?)', { - args.identifier, - args.slots - }) - xPlayer.triggerEvent('esx:showNotification', _U('slotsadd', args.slots, args.identifier)) - else - MySQL.Async.execute('UPDATE `multicharacter_slots` SET `slots` = ? WHERE `identifier` = ?', { - args.slots, - args.identifier - }) - xPlayer.triggerEvent('esx:showNotification', _U('slotsedit', args.slots, args.identifier)) - end - end, true, {help = _U('command_setslots'), validate = true, arguments = { - {name = 'identifier', help = _U('command_identifier'), type = 'string'}, - {name = 'slots', help = _U('command_slots'), type = 'number'} - }}) - - ESX.RegisterCommand('remslots', 'admin', function(xPlayer, args, showError) - local slots = MySQL.Sync.fetchScalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { - args.identifier - }) - - if slots ~= nil then - MySQL.Async.execute('DELETE FROM `multicharacter_slots` WHERE `identifier` = ?', { - args.identifier - }) - xPlayer.triggerEvent('esx:showNotification', _U('slotsrem', args.identifier)) - end - end, true, {help = _U('command_remslots'), validate = true, arguments = { - {name = 'identifier', help = _U('command_identifier'), type = 'string'} - }}) - - RegisterCommand('forcelog', function(source, args, rawCommand) - TriggerEvent('esx:playerLogout', source) - end, true) - else SetTimeout(3000, function() print('[^3WARNING^7] Multicharacter is disabled - please check your ESX configuration') end) end From 6925f91a1e52062fd7f72638203233a4be81c26c Mon Sep 17 00:00:00 2001 From: IceCubePiso <33593306+icecubepiso@users.noreply.github.com> Date: Fri, 20 Aug 2021 19:06:47 +0200 Subject: [PATCH 023/132] Update cs.lua (#44) --- locales/cs.lua | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/locales/cs.lua b/locales/cs.lua index a9734076..d309e309 100644 --- a/locales/cs.lua +++ b/locales/cs.lua @@ -3,9 +3,23 @@ Locales['cs'] = { ['female'] = "Žena", ['delete_label'] = "Vymazat %s %s?", ['select_char'] = "Zvolit Postavu", - ['create_char'] = "Vytvořit novou postavu", + ['create_char'] = "Vytvořit Novou Postavu", ['char_play'] = "Hrát za postavu", + ['char_disabled'] = "Tato postava je zakázána!", ['char_delete'] = "Vymazat postavu", ['cancel'] = "Zrušit", ['confirm'] = "Potvrdit", + ['command_setslots'] = "Nastavit slot pro hráče v multicharacteru", + ['command_remslots'] = "Odebrat slot pro hráče v multicharacteru", + ['command_enablechar'] = "Povolit zovlený slot hráči", + ['command_disablechar'] = "Zakázat zvolený slot pro hračé", + ['command_charslot'] = "Číslo slotu", + ['command_identifier'] = "Identifier hráče", + ['command_slots'] = "# ze slotu", + ['slotsadd'] = "Přidal slot %s hráči %s", + ['slotsedit'] = "Nastavil si slot %s hráči %s", + ['slotsrem'] = "Odebral si slot %s", + ['charenabled'] = "Povolol si postavu #%s z %s", + ['chardisabled'] = "Zakázal si postavu #%s z %s", + ['charnotfound'] = "Postava #%s z %s nebyla nalezena/neexistuje", } From 6427a58ac74ba4ee10ccac24660c821c5010601a Mon Sep 17 00:00:00 2001 From: cjosephdc <87730839+cjosephdc@users.noreply.github.com> Date: Wed, 25 Aug 2021 19:38:26 +0800 Subject: [PATCH 024/132] Fix for stuck players (#45) Fix the issue where players get stuck after selecting character --- client/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/main.lua b/client/main.lua index e5705d2f..558e7937 100644 --- a/client/main.lua +++ b/client/main.lua @@ -294,7 +294,7 @@ if ESX.GetConfig().Multichar then repeat Citizen.Wait(200) until finished end DoScreenFadeOut(100) - repeat Citizen.Wait(200) until IsScreenFadedOut() + SetCamActive(cam, false) RenderScriptCams(false, false, 0, true, true) cam = nil From d412efab05d416cdf1020f5d8a456622ba3e7fd2 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Wed, 1 Sep 2021 16:17:05 +1000 Subject: [PATCH 025/132] fix(client)? Maybe resolves issue with concealing players --- client/main.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/main.lua b/client/main.lua index 558e7937..cc3eb09f 100644 --- a/client/main.lua +++ b/client/main.lua @@ -63,7 +63,7 @@ if ESX.GetConfig().Multichar then HideHudComponentThisFrame(12) HideHudComponentThisFrame(21) HideHudAndRadarThisFrame() - Citizen.Wait(3) + Citizen.Wait(0) local vehicles = GetGamePool('CVehicle') for i=1, #vehicles do SetEntityLocallyInvisible(vehicles[i]) @@ -85,13 +85,13 @@ if ESX.GetConfig().Multichar then local player = players[i] if player ~= PlayerId() and not playerPool[player] then playerPool[player] = true - NetworkConcealPlayer(players[player], true, true) + NetworkConcealPlayer(player, true, true) end end Citizen.Wait(500) end - for i=1, #playerPool do - NetworkConcealPlayer(playerPool[i], false, false) + for k in pairs(playerPool) do + NetworkConcealPlayer(k, false, false) end end) end From 1984ef58a541566ef1de4ae5b0e064917d1c91f5 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Fri, 3 Sep 2021 19:46:30 +1000 Subject: [PATCH 026/132] Update readme.md --- readme.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/readme.md b/readme.md index ccd8dc76..dcca296f 100644 --- a/readme.md +++ b/readme.md @@ -1,8 +1,6 @@ ### Requirements (ensure you are using the latest) - [ESX Legacy](https://github.com/esx-framework/esx-legacy) - [MySQL Async 3.3.2](https://github.com/brouznouf/fivem-mysql-async/releases/tag/3.3.2) -- [ESX Identity](https://github.com/esx-framework/esx_identity) -- [ESX Skin](https://github.com/esx-framework/esx_skin) - [Spawnmanager](https://github.com/citizenfx/cfx-server-data/tree/master/resources/%5Bmanagers%5D/spawnmanager) ### Installation From a1cb26da5d96fe8a132a890bbca9dd7c75e9e36d Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 16 Oct 2021 06:37:34 +1100 Subject: [PATCH 027/132] feat(sql): Setup proper keys and collation - These fields should only be referenced, so index them for faster queries --- esx_multicharacter.sql | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/esx_multicharacter.sql b/esx_multicharacter.sql index 6aba96ad..23c894a5 100644 --- a/esx_multicharacter.sql +++ b/esx_multicharacter.sql @@ -1,7 +1,9 @@ CREATE TABLE `multicharacter_slots` ( - `identifier` VARCHAR(60) NOT NULL, - `slots` INT NOT NULL -); - -ALTER TABLE `users` - ADD `disabled` BIT NOT NULL DEFAULT 0; \ No newline at end of file + `identifier` VARCHAR(60) NOT NULL COLLATE 'utf8mb4_unicode_ci', + `slots` INT(11) NOT NULL, + PRIMARY KEY (`identifier`) USING BTREE, + INDEX `slots` (`slots`) USING BTREE +) +COLLATE='utf8mb4_unicode_ci' +ENGINE=InnoDB +; From 54245704c5571e13a6b2bb0e0b906e9f47acd349 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 16 Oct 2021 08:31:45 +1100 Subject: [PATCH 028/132] fix(sql): Add disabled user column back and change to TINYINT - Accidentaly removed it; change this to TINYINT for consistency --- esx_multicharacter.sql | 3 +++ 1 file changed, 3 insertions(+) diff --git a/esx_multicharacter.sql b/esx_multicharacter.sql index 23c894a5..71049ffa 100644 --- a/esx_multicharacter.sql +++ b/esx_multicharacter.sql @@ -7,3 +7,6 @@ CREATE TABLE `multicharacter_slots` ( COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB ; + +ALTER TABLE `users` + `disabled` TINYINT(1) NULL DEFAULT '0', From a4d7d17251f5d47bd9beb39ebb9aa994ceb21114 Mon Sep 17 00:00:00 2001 From: Demetrio <15928886+d3rp-jsx@users.noreply.github.com> Date: Fri, 15 Oct 2021 23:32:54 +0200 Subject: [PATCH 029/132] Minor fixes and compatibility improvements (#54) --- client/main.lua | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/client/main.lua b/client/main.lua index cc3eb09f..b6fa90d8 100644 --- a/client/main.lua +++ b/client/main.lua @@ -178,11 +178,7 @@ if ESX.GetConfig().Multichar then end if Spawned == false then SetupCharacter(Character) end local label = v.firstname..' '..v.lastname - if Characters[k].disabled == 1 then - elements[#elements+1] = {label = label, value = v.id} - else - elements[#elements+1] = {label = label, value = v.id} - end + elements[#elements+1] = {label = label, value = v.id} end if #elements < slots then elements[#elements+1] = {label = _('create_char'), value = (#elements+1), new = true} @@ -194,10 +190,10 @@ if ESX.GetConfig().Multichar then }, function(data, menu) local elements = {} if not data.current.new then - if Characters[data.current.value].disabled == 0 then - elements[1] = {label = _('char_play'), action = 'play', value = data.current.value} - else + if Characters[data.current.value].disabled then elements[1] = {label = _('char_disabled'), value = data.current.value} + else + elements[1] = {label = _('char_play'), action = 'play', value = data.current.value} end if Config.CanDelete then elements[2] = {label = _('char_delete'), action = 'delete', value = data.current.value} end ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'choosechar', { From ef87a916acab03330c5fa3231cf2919e61ba5de0 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 16 Oct 2021 08:34:14 +1100 Subject: [PATCH 030/132] fix(client): Entity coords should no longer set you into the ground --- client/main.lua | 41 ++++++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/client/main.lua b/client/main.lua index b6fa90d8..db5fc7ec 100644 --- a/client/main.lua +++ b/client/main.lua @@ -16,15 +16,14 @@ if ESX.GetConfig().Multichar then end end) - - local canRelog, cam, Spawned = true + local canRelog, cam, spawned = true, nil, nil local Characters = {} RegisterNetEvent('esx_multicharacter:SetupCharacters') AddEventHandler('esx_multicharacter:SetupCharacters', function() ESX.PlayerLoaded = false ESX.PlayerData = {} - Spawned = false + spawned = false cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true) local playerPed = PlayerPedId() SetEntityCoords(playerPed, Config.Spawn.x, Config.Spawn.y, Config.Spawn.z, true, false, false, false) @@ -97,7 +96,7 @@ if ESX.GetConfig().Multichar then end SetupCharacter = function(index) - if Spawned == false then + if spawned == false then exports.spawnmanager:spawnPlayer({ x = Config.Spawn.x, y = Config.Spawn.y, @@ -117,9 +116,9 @@ if ESX.GetConfig().Multichar then DoScreenFadeIn(400) end) repeat Citizen.Wait(200) until not IsScreenFadedOut() - + elseif Characters[index] and Characters[index].skin then - if Characters[Spawned] and Characters[Spawned].model then + if Characters[spawned] and Characters[spawned].model then RequestModel(Characters[index].model) while not HasModelLoaded(Characters[index].model) do RequestModel(Characters[index].model) @@ -130,14 +129,14 @@ if ESX.GetConfig().Multichar then end TriggerEvent('skinchanger:loadSkin', Characters[index].skin) end - Spawned = index + spawned = index local playerPed = PlayerPedId() FreezeEntityPosition(PlayerPedId(), true) SetPedAoBlobRendering(playerPed, true) SetEntityAlpha(playerPed, 255) SendNUIMessage({ action = "openui", - character = Characters[Spawned] + character = Characters[spawned] }) end @@ -145,7 +144,7 @@ if ESX.GetConfig().Multichar then AddEventHandler('esx_multicharacter:SetupUI', function(data, slots) DoScreenFadeOut(0) Characters = data - local slots = slots + slots = slots local elements = {} local Character = next(Characters) exports.spawnmanager:forceRespawn() @@ -176,9 +175,13 @@ if ESX.GetConfig().Multichar then if not v.model and v.skin then if v.skin.model then v.model = v.skin.model elseif v.skin.sex == 1 then v.model = `mp_f_freemode_01` else v.model = `mp_m_freemode_01` end end - if Spawned == false then SetupCharacter(Character) end + if spawned == false then SetupCharacter(Character) end local label = v.firstname..' '..v.lastname - elements[#elements+1] = {label = label, value = v.id} + if Characters[k].disabled then + elements[#elements+1] = {label = label, value = v.id} + else + elements[#elements+1] = {label = label, value = v.id} + end end if #elements < slots then elements[#elements+1] = {label = _('create_char'), value = (#elements+1), new = true} @@ -190,10 +193,10 @@ if ESX.GetConfig().Multichar then }, function(data, menu) local elements = {} if not data.current.new then - if Characters[data.current.value].disabled then - elements[1] = {label = _('char_disabled'), value = data.current.value} + if not Characters[data.current.value].disabled then + elements[1] = {label = _('char_play'), action = 'play', value = data.current.value} else - elements[1] = {label = _('char_play'), action = 'play', value = data.current.value} + elements[1] = {label = _('char_disabled'), value = data.current.value} end if Config.CanDelete then elements[2] = {label = _('char_delete'), action = 'delete', value = data.current.value} end ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'choosechar', { @@ -218,7 +221,7 @@ if ESX.GetConfig().Multichar then }, function(data, menu) if data.current.value then TriggerServerEvent('esx_multicharacter:DeleteCharacter', data.current.value) - Spawned = false + spawned = false ESX.UI.Menu.CloseAll() else menu.close() @@ -290,15 +293,15 @@ if ESX.GetConfig().Multichar then repeat Citizen.Wait(200) until finished end DoScreenFadeOut(100) - + SetCamActive(cam, false) RenderScriptCams(false, false, 0, true, true) cam = nil local playerPed = PlayerPedId() FreezeEntityPosition(playerPed, true) - SetEntityCoords(playerPed, spawn.x, spawn.y, spawn.z-1.3, true, false, false, false) + SetEntityCoordsNoOffset(playerPed, spawn.x, spawn.y, spawn.z, false, false, false, true) SetEntityHeading(playerPed, spawn.heading) - if not isNew then TriggerEvent('skinchanger:loadSkin', skin or Characters[Spawned].skin) end + if not isNew then TriggerEvent('skinchanger:loadSkin', skin or Characters[spawned].skin) end Citizen.Wait(400) DoScreenFadeIn(400) repeat Citizen.Wait(200) until not IsScreenFadedOut() @@ -312,7 +315,7 @@ if ESX.GetConfig().Multichar then RegisterNetEvent('esx:onPlayerLogout') AddEventHandler('esx:onPlayerLogout', function() DoScreenFadeOut(0) - Spawned = false + spawned = false TriggerEvent("esx_multicharacter:SetupCharacters") TriggerEvent('esx_skin:resetFirstSpawn') end) From ae41811d42fd316bf181dc8a9d76f1dd530cf0bb Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 16 Oct 2021 08:34:34 +1100 Subject: [PATCH 031/132] Delete functions.lua --- server/functions.lua | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 server/functions.lua diff --git a/server/functions.lua b/server/functions.lua deleted file mode 100644 index a1312e0a..00000000 --- a/server/functions.lua +++ /dev/null @@ -1,8 +0,0 @@ -GetJobs = function() - local jobs = {} - while next(jobs) == nil do - Citizen.Wait(250) - jobs = exports['es_extended']:getSharedObject().Jobs - end - return jobs -end \ No newline at end of file From 2164f3db72d97bf82c1d9a9565e02a857640218e Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 16 Oct 2021 08:34:55 +1100 Subject: [PATCH 032/132] style(commands): Indentation --- server/commands.lua | 108 ++++++++++++++++++++++---------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/server/commands.lua b/server/commands.lua index b4fbc2d2..6c0ff047 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -1,79 +1,79 @@ ESX.RegisterCommand('setslots', 'admin', function(xPlayer, args, showError) - local slots = MySQL.Sync.fetchScalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { - args.identifier - }) + local slots = MySQL.Sync.fetchScalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { + args.identifier + }) - if slots == nil then - MySQL.Async.execute('INSERT INTO `multicharacter_slots` (`identifier`, `slots`) VALUES (?, ?)', { - args.identifier, - args.slots - }) - xPlayer.triggerEvent('esx:showNotification', _U('slotsadd', args.slots, args.identifier)) - else - MySQL.Async.execute('UPDATE `multicharacter_slots` SET `slots` = ? WHERE `identifier` = ?', { - args.slots, - args.identifier - }) - xPlayer.triggerEvent('esx:showNotification', _U('slotsedit', args.slots, args.identifier)) - end + if slots == nil then + MySQL.Async.execute('INSERT INTO `multicharacter_slots` (`identifier`, `slots`) VALUES (?, ?)', { + args.identifier, + args.slots + }) + xPlayer.triggerEvent('esx:showNotification', _U('slotsadd', args.slots, args.identifier)) + else + MySQL.Async.execute('UPDATE `multicharacter_slots` SET `slots` = ? WHERE `identifier` = ?', { + args.slots, + args.identifier + }) + xPlayer.triggerEvent('esx:showNotification', _U('slotsedit', args.slots, args.identifier)) + end end, true, {help = _U('command_setslots'), validate = true, arguments = { - {name = 'identifier', help = _U('command_identifier'), type = 'string'}, - {name = 'slots', help = _U('command_slots'), type = 'number'} + {name = 'identifier', help = _U('command_identifier'), type = 'string'}, + {name = 'slots', help = _U('command_slots'), type = 'number'} }}) ESX.RegisterCommand('remslots', 'admin', function(xPlayer, args, showError) - local slots = MySQL.Sync.fetchScalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { - args.identifier - }) + local slots = MySQL.Sync.fetchScalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { + args.identifier + }) - if slots ~= nil then - MySQL.Async.execute('DELETE FROM `multicharacter_slots` WHERE `identifier` = ?', { - args.identifier - }) - xPlayer.triggerEvent('esx:showNotification', _U('slotsrem', args.identifier)) - end + if slots ~= nil then + MySQL.Async.execute('DELETE FROM `multicharacter_slots` WHERE `identifier` = ?', { + args.identifier + }) + xPlayer.triggerEvent('esx:showNotification', _U('slotsrem', args.identifier)) + end end, true, {help = _U('command_remslots'), validate = true, arguments = { - {name = 'identifier', help = _U('command_identifier'), type = 'string'} + {name = 'identifier', help = _U('command_identifier'), type = 'string'} }}) ESX.RegisterCommand('enablechar', 'admin', function(xPlayer, args, showError) - local selectedCharacter = 'char'..args.charslot..':'..args.identifier; + local selectedCharacter = 'char'..args.charslot..':'..args.identifier; - MySQL.Async.execute('UPDATE `users` SET `disabled` = 0 WHERE identifier = ?', { - selectedCharacter - }, function(result) - if result > 0 then - xPlayer.triggerEvent('esx:showNotification', _U('charenabled', args.charslot, args.identifier)) - else - xPlayer.triggerEvent('esx:showNotification', _U('charnotfound', args.charslot, args.identifier)) - end - end) + MySQL.Async.execute('UPDATE `users` SET `disabled` = 0 WHERE identifier = ?', { + selectedCharacter + }, function(result) + if result > 0 then + xPlayer.triggerEvent('esx:showNotification', _U('charenabled', args.charslot, args.identifier)) + else + xPlayer.triggerEvent('esx:showNotification', _U('charnotfound', args.charslot, args.identifier)) + end + end) end, true, {help = _U('command_enablechar'), validate = true, arguments = { - {name = 'identifier', help = _U('command_identifier'), type = 'string'}, - {name = 'charslot', help = _U('command_charslot'), type = 'number'} + {name = 'identifier', help = _U('command_identifier'), type = 'string'}, + {name = 'charslot', help = _U('command_charslot'), type = 'number'} }}) ESX.RegisterCommand('disablechar', 'admin', function(xPlayer, args, showError) - local selectedCharacter = 'char'..args.charslot..':'..args.identifier; + local selectedCharacter = 'char'..args.charslot..':'..args.identifier; - MySQL.Async.execute('UPDATE `users` SET `disabled` = 1 WHERE identifier = ?', { - selectedCharacter - }, function(result) - if result > 0 then - xPlayer.triggerEvent('esx:showNotification', _U('chardisabled', args.charslot, args.identifier)) - else - xPlayer.triggerEvent('esx:showNotification', _U('charnotfound', args.charslot, args.identifier)) - end - end) + MySQL.Async.execute('UPDATE `users` SET `disabled` = 1 WHERE identifier = ?', { + selectedCharacter + }, function(result) + if result > 0 then + xPlayer.triggerEvent('esx:showNotification', _U('chardisabled', args.charslot, args.identifier)) + else + xPlayer.triggerEvent('esx:showNotification', _U('charnotfound', args.charslot, args.identifier)) + end + end) end, true, {help = _U('command_disablechar'), validate = true, arguments = { - {name = 'identifier', help = _U('command_identifier'), type = 'string'}, - {name = 'charslot', help = _U('command_charslot'), type = 'number'} + {name = 'identifier', help = _U('command_identifier'), type = 'string'}, + {name = 'charslot', help = _U('command_charslot'), type = 'number'} }}) RegisterCommand('forcelog', function(source, args, rawCommand) - TriggerEvent('esx:playerLogout', source) -end, true) \ No newline at end of file + TriggerEvent('esx:playerLogout', source) +end, true) From 95e9f2bbe881922c487bcf58a69f5298a2d14ad0 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 16 Oct 2021 08:43:51 +1100 Subject: [PATCH 033/132] feat(server): Parse mysql_connection_string for database --- server/main.lua | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/server/main.lua b/server/main.lua index 09617693..d167a5fe 100644 --- a/server/main.lua +++ b/server/main.lua @@ -1,13 +1,32 @@ +local function DATABASE() + local connectionString = GetConvar('mysql_connection_string', ''); + if connectionString == '' then + error(connectionString..'\n^1Unable to start Multicharacter - unable to determine database from mysql_connection_string^0', 0) + elseif string.match(connectionString, 'mysql://') then + connectionString = string.sub(connectionString, string.find(connectionString, "/[^/]*$")+1) + return connectionString + else + connectionString = {string.strsplit(';', connectionString)} + for i=1, #connectionString do + local v = connectionString[i] + if v:match('database') then + return v:sub(10, #v) + end + end + end +end + if not ESX then - SetTimeout(3000, function() print('[^3WARNING^7] Unable to start Multicharacter - your version of ESX is not compatible ') end) + error('\n^1WARNING: Unable to start Multicharacter - you must be using ESX Legacy^0') elseif ESX.GetConfig().Multichar == true then - local IdentifierTables, Fetch = {}, -1 - - -- enter the name of your database here - Config.Database = 'es_extended' - + DATABASE = DATABASE() + local DB_TABLES = {} + local FETCH = nil + local PREFIX = 'char' -- enter a prefix to prepend to all user identifiers (keep it short) - Config.Prefix = 'char' + -- if you modify this, you will need to modify es_extended due to an oversight! + -- https://github.com/esx-framework/esx-legacy/blob/main/%5Besx%5D/es_extended/server/classes/player.lua#L17 + -- if Config.Multichar then self.license = 'license'..identifier:sub(identifier:find(':')) else self.license = 'license:'..identifier end local SetupCharacters = function(playerId) while Fetch == -1 do Citizen.Wait(500) end From f46277e2620d5dccdc348f431c1c9256cf3fcee4 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 16 Oct 2021 09:03:31 +1100 Subject: [PATCH 034/132] feat(server): Improve GetJobs function - If using an ESX version with the getter, use it instead for better performance - General refactor and ensure compatibility with oxmysql --- server/main.lua | 53 +++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/server/main.lua b/server/main.lua index d167a5fe..70fdff55 100644 --- a/server/main.lua +++ b/server/main.lua @@ -29,18 +29,15 @@ elseif ESX.GetConfig().Multichar == true then -- if Config.Multichar then self.license = 'license'..identifier:sub(identifier:find(':')) else self.license = 'license:'..identifier end local SetupCharacters = function(playerId) - while Fetch == -1 do Citizen.Wait(500) end - local identifier = Config.Prefix..'%:'..ESX.GetIdentifier(playerId) - local slots = MySQL.Sync.fetchScalar("SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?", { - ESX.GetIdentifier(playerId) - }) - if not slots then - slots = Config.Slots - end - MySQL.Async.fetchAll(Fetch, { - identifier, - slots - }, function(result) + repeat Citizen.Wait(200) until FETCH + local identifier = ESX.GetIdentifier(playerId) + local slots = MySQL.Sync.fetchScalar("SELECT slots FROM multicharacter_slots WHERE identifier = ?", { + identifier + }) or Config.Slots + + identifier = PREFIX..'%:'..identifier + + MySQL.Async.fetchAll(FETCH, {identifier, slots}, function(result) local characters = {} for i=1, #result, 1 do local job, grade = result[i].job or 'unemployed', tostring(result[i].job_grade) @@ -49,7 +46,7 @@ elseif ESX.GetConfig().Multichar == true then job = ESX.Jobs[job].label end local accounts = json.decode(result[i].accounts) - local id = tonumber(string.sub(result[i].identifier, #Config.Prefix+1, string.find(result[i].identifier, ':')-1)) + local id = tonumber(string.sub(result[i].identifier, #PREFIX+1, string.find(result[i].identifier, ':')-1)) characters[id] = { id = id, bank = accounts.bank, @@ -69,14 +66,14 @@ elseif ESX.GetConfig().Multichar == true then end local DeleteCharacter = function(playerId, charid) - local identifier = Config.Prefix..charid..':'..ESX.GetIdentifier(playerId) + local identifier = ('%s%s:%s'):format(PREFIX, charid, ESX.GetIdentifier(playerId)) local counter = 0 - for k, v in pairs(IdentifierTables) do + for k, v in pairs(DB_TABLES) do MySQL.Async.execute("DELETE FROM "..v.table.." WHERE "..v.column.." = ?", { identifier }, function() counter = counter + 1 - if counter == #IdentifierTables then + if counter == #DB_TABLES then print(('[^2INFO^7] Player [%s] %s has deleted a character (%s)'):format(GetPlayerName(playerId), playerId, identifier)) Citizen.Wait(100) SetupCharacters(playerId) @@ -87,14 +84,14 @@ elseif ESX.GetConfig().Multichar == true then end MySQL.ready(function() - MySQL.Async.fetchAll('SELECT `TABLE_NAME`, `COLUMN_NAME`, `CHARACTER_MAXIMUM_LENGTH` FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND (COLUMN_NAME = ? OR COLUMN_NAME = ?) ', { - Config.Database, 'identifier', 'owner' + MySQL.Async.fetchAll('SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND (COLUMN_NAME = ? OR COLUMN_NAME = ?) ', { + DATABASE, 'identifier', 'owner' }, function(result) if result then local varchar, varsize = {}, 0 for k, v in pairs(result) do if v.CHARACTER_MAXIMUM_LENGTH and v.CHARACTER_MAXIMUM_LENGTH >= 40 and v.CHARACTER_MAXIMUM_LENGTH < 60 then varchar[v.TABLE_NAME] = v.COLUMN_NAME varsize = varsize+1 end - table.insert(IdentifierTables, {table = v.TABLE_NAME, column = v.COLUMN_NAME}) + table.insert(DB_TABLES, {table = v.TABLE_NAME, column = v.COLUMN_NAME}) end if next(varchar) then for k, v in pairs(varchar) do @@ -102,8 +99,16 @@ elseif ESX.GetConfig().Multichar == true then end print(('[^2INFO^7] Attempted to update ^5%s^7 columns to use VARCHAR(60)'):format(varsize)) end - if not next(ESX.Jobs) then ESX.Jobs = GetJobs() end - Fetch = MySQL.Sync.store("SELECT `identifier`, `accounts`, `job`, `job_grade`, `firstname`, `lastname`, `dateofbirth`, `sex`, `skin`, `disabled` FROM `users` WHERE identifier LIKE ? LIMIT ?") + ESX.Jobs = {} + local function GetJobs() + if ESX.GetJobs then return ESX.GetJobs() + else return exports['es_extended']:getSharedObject().Jobs end + end + repeat + ESX.Jobs = GetJobs() + Citizen.Wait(50) + until next(ESX.Jobs) + FETCH = MySQL.Sync.store("SELECT identifier, accounts, job, job_grade, firstname, lastname, dateofbirth, sex, skin, disabled FROM users WHERE identifier LIKE ? LIMIT ?") end end) end) @@ -121,13 +126,13 @@ elseif ESX.GetConfig().Multichar == true then if isNew then awaitingRegistration[src] = charid else - TriggerEvent('esx:onPlayerJoined', src, Config.Prefix..charid) + TriggerEvent('esx:onPlayerJoined', src, PREFIX..charid) end end end) AddEventHandler('esx_identity:completedRegistration', function(playerId, data) - TriggerEvent('esx:onPlayerJoined', playerId, Config.Prefix..awaitingRegistration[playerId], data) + TriggerEvent('esx:onPlayerJoined', playerId, PREFIX..awaitingRegistration[playerId], data) awaitingRegistration[playerId] = nil end) @@ -150,5 +155,5 @@ elseif ESX.GetConfig().Multichar == true then end) else - SetTimeout(3000, function() print('[^3WARNING^7] Multicharacter is disabled - please check your ESX configuration') end) + assert(nil, '^3WARNING: Multicharacter is disabled - please check your ESX configuration^0') end From d594c5db82aa53090119140502dc48acb0a3a43a Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 16 Oct 2021 09:04:38 +1100 Subject: [PATCH 035/132] chore(manifest): Update versions --- fxmanifest.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index 617f933c..92bd87ad 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -1,7 +1,8 @@ -fx_version 'adamant' +fx_version 'cerulean' game 'gta5' description 'https://github.com/thelindat/esx_multicharacter' -version '1.2.2' +version '1.3' +lua54 'yes' dependencies { 'es_extended', @@ -19,7 +20,7 @@ shared_scripts { server_scripts { '@es_extended/imports.lua', '@mysql-async/lib/MySQL.lua', - 'server/*.lua' + 'server/*.lua', } client_scripts { From 749dfd0ec3391b580b451485480224ce862989b2 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 16 Oct 2021 09:05:13 +1100 Subject: [PATCH 036/132] chore(config): Change defaults --- config.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.lua b/config.lua index ca56aec7..f3d9d763 100644 --- a/config.lua +++ b/config.lua @@ -4,13 +4,13 @@ Config.Locale = 'en' -------------------- -- This is the default number of slots for EVERY player -- If you want to manage extra slots for specific players you can do it by using '/setslots' and '/remslots' commands -Config.Slots = 1 +Config.Slots = 4 -------------------- Config.Spawn = vector4(-113.7, 565.3, 195.2, 0) -- Sets the location for character selection -- To set the spawn location for new characters, modify the default value in the `users` SQL table -Config.CanDelete = false -- Choose whether or not a user can self-delete its own characters +Config.CanDelete = true -- Choose whether or not a user can self-delete its own characters -------------------- -- Do not use unless you are prepared to adjust your resources to correctly reset data From 7995739cecd6a3cc68cbec4e6438b87c2317afc9 Mon Sep 17 00:00:00 2001 From: DokaDoka Date: Sat, 16 Oct 2021 10:06:33 +1100 Subject: [PATCH 037/132] fix(sql): fix disabled user column query --- esx_multicharacter.sql | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/esx_multicharacter.sql b/esx_multicharacter.sql index 71049ffa..b3a76af7 100644 --- a/esx_multicharacter.sql +++ b/esx_multicharacter.sql @@ -8,5 +8,6 @@ COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB ; -ALTER TABLE `users` - `disabled` TINYINT(1) NULL DEFAULT '0', +ALTER TABLE `users` ADD COLUMN + `disabled` TINYINT(1) NULL DEFAULT '0' +; From 565c5d0e35b2749479b40722d1abe004aff36554 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Mon, 18 Oct 2021 07:33:01 +1100 Subject: [PATCH 038/132] Update readme.md --- readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index dcca296f..f7f30478 100644 --- a/readme.md +++ b/readme.md @@ -1,8 +1,9 @@ ### Requirements (ensure you are using the latest) - [ESX Legacy](https://github.com/esx-framework/esx-legacy) -- [MySQL Async 3.3.2](https://github.com/brouznouf/fivem-mysql-async/releases/tag/3.3.2) - [Spawnmanager](https://github.com/citizenfx/cfx-server-data/tree/master/resources/%5Bmanagers%5D/spawnmanager) +- [OxMySQL](https://github.com/overextended/oxmysql/) or [MySQL Async 3.3.2](https://github.com/brouznouf/fivem-mysql-async/releases/tag/3.3.2) + ### Installation - Modify your ESX config with `Config.Multichar = true` - Set your database name for `Config.Database` in server/main.lua From ebae4354cec182d21475bd6bf4d5031f55cbe93a Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 23 Oct 2021 11:58:18 +1100 Subject: [PATCH 039/132] fix(server): Correctly resolve database name for URI connection strings URI-connection strings would incorrectly parse the database name when using additional options as part of the string (i.e. "ESXLegacy?charset=utf8mb4"). Correctly check for these options and match the string accordingly. Also just better pattern matching in general. --- server/main.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/server/main.lua b/server/main.lua index 70fdff55..b6eec4d5 100644 --- a/server/main.lua +++ b/server/main.lua @@ -2,9 +2,12 @@ local function DATABASE() local connectionString = GetConvar('mysql_connection_string', ''); if connectionString == '' then error(connectionString..'\n^1Unable to start Multicharacter - unable to determine database from mysql_connection_string^0', 0) - elseif string.match(connectionString, 'mysql://') then - connectionString = string.sub(connectionString, string.find(connectionString, "/[^/]*$")+1) - return connectionString + elseif connectionString:find('mysql://') then + if connectionString:find('?*$') then + return connectionString:match('[^/][%w]*[?$]'):sub(0, -2) + else + return connectionString:match('[^/][%w]*$') + end else connectionString = {string.strsplit(';', connectionString)} for i=1, #connectionString do From 870e1887b0e8d77d1aac23eef29809ef374ecf01 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 23 Oct 2021 11:58:59 +1100 Subject: [PATCH 040/132] Update fxmanifest.lua --- fxmanifest.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index 92bd87ad..7f98c72d 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'cerulean' game 'gta5' description 'https://github.com/thelindat/esx_multicharacter' -version '1.3' +version '1.3.1' lua54 'yes' dependencies { From 8255fa2014715e7c7c0edfc2a2eecfdba86c1225 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Mon, 25 Oct 2021 15:47:57 +1100 Subject: [PATCH 041/132] feat(deferrals): Prevent connection when identifier is in use Only recently came to my attention that this was a concern. Since ESX and identity only check a raw identifier vs a player identifier (which contains a prefix) it doesn't prevent multiple logins. --- server/main.lua | 51 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/server/main.lua b/server/main.lua index b6eec4d5..4c482dd1 100644 --- a/server/main.lua +++ b/server/main.lua @@ -31,9 +31,25 @@ elseif ESX.GetConfig().Multichar == true then -- https://github.com/esx-framework/esx-legacy/blob/main/%5Besx%5D/es_extended/server/classes/player.lua#L17 -- if Config.Multichar then self.license = 'license'..identifier:sub(identifier:find(':')) else self.license = 'license:'..identifier end - local SetupCharacters = function(playerId) + local function GetIdentifier(playerId) + local identifier = 'license:' + for _, v in pairs(GetPlayerIdentifiers(playerId)) do + if string.match(v, identifier) then + identifier = string.gsub(v, identifier, '') + return identifier + end + end + end + + if next(ESX.Players) then + for k, v in pairs(ESX.Players) do + ESX.Players[k] = GetIdentifier(v.source) + end + else ESX.Players = {} end + + local function SetupCharacters(playerId) repeat Citizen.Wait(200) until FETCH - local identifier = ESX.GetIdentifier(playerId) + local identifier = GetIdentifier(playerId) local slots = MySQL.Sync.fetchScalar("SELECT slots FROM multicharacter_slots WHERE identifier = ?", { identifier }) or Config.Slots @@ -68,16 +84,29 @@ elseif ESX.GetConfig().Multichar == true then end) end - local DeleteCharacter = function(playerId, charid) - local identifier = ('%s%s:%s'):format(PREFIX, charid, ESX.GetIdentifier(playerId)) + AddEventHandler('playerConnecting', function(playerName, setKickReason, deferrals) + deferrals.defer() + local identifier = GetIdentifier(source) + Citizen.Wait(100) + if ESX.Players[identifier] then + deferrals.done('A player is already connected to the server with this identifier.') + else + ESX.Players[identifier] = true + deferrals.done() + end + end) + + local function DeleteCharacter(playerId, charid) + local identifier = GetIdentifier(playerId) + local character = ('%s%s:%s'):format(PREFIX, charid, identifier) local counter = 0 - for k, v in pairs(DB_TABLES) do + for _, v in pairs(DB_TABLES) do MySQL.Async.execute("DELETE FROM "..v.table.." WHERE "..v.column.." = ?", { - identifier + character }, function() counter = counter + 1 if counter == #DB_TABLES then - print(('[^2INFO^7] Player [%s] %s has deleted a character (%s)'):format(GetPlayerName(playerId), playerId, identifier)) + print(('[^2INFO^7] Player [%s] %s has deleted a character (%s)'):format(GetPlayerName(playerId), playerId, character)) Citizen.Wait(100) SetupCharacters(playerId) end @@ -124,12 +153,12 @@ elseif ESX.GetConfig().Multichar == true then local awaitingRegistration = {} RegisterServerEvent("esx_multicharacter:CharacterChosen") AddEventHandler('esx_multicharacter:CharacterChosen', function(charid, isNew) - local src = source if type(charid) == 'number' and string.len(charid) <= 2 and type(isNew) == 'boolean' then if isNew then - awaitingRegistration[src] = charid + awaitingRegistration[source] = charid else - TriggerEvent('esx:onPlayerJoined', src, PREFIX..charid) + TriggerEvent('esx:onPlayerJoined', source, PREFIX..charid) + ESX.Players[GetIdentifier(source)] = source end end end) @@ -137,10 +166,12 @@ elseif ESX.GetConfig().Multichar == true then AddEventHandler('esx_identity:completedRegistration', function(playerId, data) TriggerEvent('esx:onPlayerJoined', playerId, PREFIX..awaitingRegistration[playerId], data) awaitingRegistration[playerId] = nil + ESX.Players[GetIdentifier(source)] = playerId end) AddEventHandler('playerDropped', function(reason) awaitingRegistration[source] = nil + ESX.Players[GetIdentifier(source)] = nil end) RegisterServerEvent("esx_multicharacter:DeleteCharacter") From 4f3ce99e94eb9b73fdcf70b3bbad7ac8e8b91f93 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Tue, 26 Oct 2021 00:19:49 +1100 Subject: [PATCH 042/132] refactor(config): Remove redundant values from being stored on server --- client/main.lua | 4 +- config.lua | 227 +++++++++++++++++++++++++----------------------- 2 files changed, 118 insertions(+), 113 deletions(-) diff --git a/client/main.lua b/client/main.lua index db5fc7ec..9aa1a919 100644 --- a/client/main.lua +++ b/client/main.lua @@ -7,7 +7,7 @@ if ESX.GetConfig().Multichar then if NetworkIsPlayerActive(PlayerId()) then exports.spawnmanager:setAutoSpawn(false) DoScreenFadeOut(0) - while not GetResourceState('esx_menu_default') == 'started' do + while not GetResourceState('esx_menu_default') == 'started' do Citizen.Wait(0) end TriggerEvent("esx_multicharacter:SetupCharacters") @@ -139,7 +139,7 @@ if ESX.GetConfig().Multichar then character = Characters[spawned] }) end - + RegisterNetEvent('esx_multicharacter:SetupUI') AddEventHandler('esx_multicharacter:SetupUI', function(data, slots) DoScreenFadeOut(0) diff --git a/config.lua b/config.lua index f3d9d763..460c7e44 100644 --- a/config.lua +++ b/config.lua @@ -1,117 +1,122 @@ Config = {} Config.Locale = 'en' --------------------- --- This is the default number of slots for EVERY player --- If you want to manage extra slots for specific players you can do it by using '/setslots' and '/remslots' commands -Config.Slots = 4 --------------------- +if IsDuplicityVersion() then + -- This is the default number of slots for EVERY player + -- If you want to manage extra slots for specific players you can do it by using '/setslots' and '/remslots' commands + Config.Slots = 4 + -------------------- +else + -- Sets the location for the character selection scene + -- To set the spawn location for new characters, modify the default value in the `users` SQL table + Config.Spawn = vector4(-113.7, 565.3, 195.2, 0) + -------------------- -Config.Spawn = vector4(-113.7, 565.3, 195.2, 0) -- Sets the location for character selection --- To set the spawn location for new characters, modify the default value in the `users` SQL table + -- Allows players to delete their characters + Config.CanDelete = true + -------------------- -Config.CanDelete = true -- Choose whether or not a user can self-delete its own characters + -- Do not use unless you are prepared to adjust your resources to correctly reset data + -- Information: https://github.com/thelindat/esx_multicharacter#relogging + Config.Relog = false + -------------------- --------------------- --- Do not use unless you are prepared to adjust your resources to correctly reset data --- Information: https://github.com/thelindat/esx_multicharacter#relogging -Config.Relog = false --------------------- - -Config.Default = { - mom = 21, - dad = 0, - face_md_weight = 50, - skin_md_weight = 50, - nose_1 = 0, - nose_2 = 0, - nose_3 = 0, - nose_4 = 0, - nose_5 = 0, - nose_6 = 0, - cheeks_1 = 0, - cheeks_2 = 0, - cheeks_3 = 0, - lip_thickness = 0, - jaw_1 = 0, - jaw_2 = 0, - chin_1 = 0, - chin_2 = 0, - chin_13 = 0, - chin_4 = 0, - neck_thickness = 0, - hair_1 = 0, - hair_2 = 0, - hair_color_1 = 0, - hair_color_2 = 0, - tshirt_1 = 0, - tshirt_2 = 0, - torso_1 = 0, - torso_2 = 0, - decals_1 = 0, - decals_2 = 0, - arms = 0, - arms_2 = 0, - pants_1 = 0, - pants_2 = 0, - shoes_1 = 0, - shoes_2 = 0, - mask_1 = 0, - mask_2 = 0, - bproof_1 = 0, - bproof_2 = 0, - chain_1 = 0, - chain_2 = 0, - helmet_1 = -1, - helmet_2 = 0, - glasses_1 = 0, - glasses_2 = 0, - watches_1 = -1, - watches_2 = 0, - bracelets_1 = -1, - bracelets_2 = 0, - bags_1 = 0, - bags_2 = 0, - eye_color = 0, - eye_squint = 0, - eyebrows_2 = 0, - eyebrows_1 = 0, - eyebrows_3 = 0, - eyebrows_4 = 0, - eyebrows_5 = 0, - eyebrows_6 = 0, - makeup_1 = 0, - makeup_2 = 0, - makeup_3 = 0, - makeup_4 = 0, - lipstick_1 = 0, - lipstick_2 = 0, - lipstick_3 = 0, - lipstick_4 = 0, - ears_1 = -1, - ears_2 = 0, - chest_1 = 0, - chest_2 = 0, - chest_3 = 0, - bodyb_1 = -1, - bodyb_2 = 0, - bodyb_3 = -1, - bodyb_4 = 0, - age_1 = 0, - age_2 = 0, - blemishes_1 = 0, - blemishes_2 = 0, - blush_1 = 0, - blush_2 = 0, - blush_3 = 0, - complexion_1 = 0, - complexion_2 = 0, - sun_1 = 0, - sun_2 = 0, - moles_1 = 0, - moles_2 = 0, - beard_1 = 0, - beard_2 = 0, - beard_3 = 0, - beard_4 = 0 -} + -- Default appearance for new characters + Config.Default = { + mom = 21, + dad = 0, + face_md_weight = 50, + skin_md_weight = 50, + nose_1 = 0, + nose_2 = 0, + nose_3 = 0, + nose_4 = 0, + nose_5 = 0, + nose_6 = 0, + cheeks_1 = 0, + cheeks_2 = 0, + cheeks_3 = 0, + lip_thickness = 0, + jaw_1 = 0, + jaw_2 = 0, + chin_1 = 0, + chin_2 = 0, + chin_13 = 0, + chin_4 = 0, + neck_thickness = 0, + hair_1 = 0, + hair_2 = 0, + hair_color_1 = 0, + hair_color_2 = 0, + tshirt_1 = 0, + tshirt_2 = 0, + torso_1 = 0, + torso_2 = 0, + decals_1 = 0, + decals_2 = 0, + arms = 0, + arms_2 = 0, + pants_1 = 0, + pants_2 = 0, + shoes_1 = 0, + shoes_2 = 0, + mask_1 = 0, + mask_2 = 0, + bproof_1 = 0, + bproof_2 = 0, + chain_1 = 0, + chain_2 = 0, + helmet_1 = -1, + helmet_2 = 0, + glasses_1 = 0, + glasses_2 = 0, + watches_1 = -1, + watches_2 = 0, + bracelets_1 = -1, + bracelets_2 = 0, + bags_1 = 0, + bags_2 = 0, + eye_color = 0, + eye_squint = 0, + eyebrows_2 = 0, + eyebrows_1 = 0, + eyebrows_3 = 0, + eyebrows_4 = 0, + eyebrows_5 = 0, + eyebrows_6 = 0, + makeup_1 = 0, + makeup_2 = 0, + makeup_3 = 0, + makeup_4 = 0, + lipstick_1 = 0, + lipstick_2 = 0, + lipstick_3 = 0, + lipstick_4 = 0, + ears_1 = -1, + ears_2 = 0, + chest_1 = 0, + chest_2 = 0, + chest_3 = 0, + bodyb_1 = -1, + bodyb_2 = 0, + bodyb_3 = -1, + bodyb_4 = 0, + age_1 = 0, + age_2 = 0, + blemishes_1 = 0, + blemishes_2 = 0, + blush_1 = 0, + blush_2 = 0, + blush_3 = 0, + complexion_1 = 0, + complexion_2 = 0, + sun_1 = 0, + sun_2 = 0, + moles_1 = 0, + moles_2 = 0, + beard_1 = 0, + beard_2 = 0, + beard_3 = 0, + beard_4 = 0 + } +end \ No newline at end of file From c9749c0b4079d8c32a03c7641a665fc06dc04a0c Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Tue, 26 Oct 2021 00:20:59 +1100 Subject: [PATCH 043/132] refactor(server): Remove redundant local values and check result size --- server/main.lua | 76 +++++++++++++++++++++++++------------------------ 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/server/main.lua b/server/main.lua index 4c482dd1..e6179a71 100644 --- a/server/main.lua +++ b/server/main.lua @@ -31,9 +31,9 @@ elseif ESX.GetConfig().Multichar == true then -- https://github.com/esx-framework/esx-legacy/blob/main/%5Besx%5D/es_extended/server/classes/player.lua#L17 -- if Config.Multichar then self.license = 'license'..identifier:sub(identifier:find(':')) else self.license = 'license:'..identifier end - local function GetIdentifier(playerId) + local function GetIdentifier(source) local identifier = 'license:' - for _, v in pairs(GetPlayerIdentifiers(playerId)) do + for _, v in pairs(GetPlayerIdentifiers(source)) do if string.match(v, identifier) then identifier = string.gsub(v, identifier, '') return identifier @@ -47,40 +47,44 @@ elseif ESX.GetConfig().Multichar == true then end else ESX.Players = {} end - local function SetupCharacters(playerId) - repeat Citizen.Wait(200) until FETCH - local identifier = GetIdentifier(playerId) + local function SetupCharacters(source) + while not FETCH do Citizen.Wait(100) end + local identifier = GetIdentifier(source) local slots = MySQL.Sync.fetchScalar("SELECT slots FROM multicharacter_slots WHERE identifier = ?", { identifier }) or Config.Slots - - identifier = PREFIX..'%:'..identifier + identifier = ('%s:%s'):format(PREFIX, identifier) MySQL.Async.fetchAll(FETCH, {identifier, slots}, function(result) - local characters = {} - for i=1, #result, 1 do - local job, grade = result[i].job or 'unemployed', tostring(result[i].job_grade) - if ESX.Jobs[job] and ESX.Jobs[job].grades[grade] then - if job ~= 'unemployed' then grade = ESX.Jobs[job].grades[grade].label else grade = '' end - job = ESX.Jobs[job].label + local characters + if result then + local characterCount = #result + characters = table.create(0, characterCount) + for i=1, characterCount, 1 do + local i = result[i] + local job, grade = i.job or 'unemployed', tostring(i.job_grade) + if ESX.Jobs[job] and ESX.Jobs[job].grades[grade] then + if job ~= 'unemployed' then grade = ESX.Jobs[job].grades[grade].label else grade = '' end + job = ESX.Jobs[job].label + end + local accounts = json.decode(i.accounts) + local id = tonumber(string.sub(i.identifier, #PREFIX+1, string.find(i.identifier, ':')-1)) + characters[id] = { + id = id, + bank = accounts.bank, + money = accounts.money, + job = job, + job_grade = grade, + firstname = i.firstname, + lastname = i.lastname, + dateofbirth = i.dateofbirth, + skin = json.decode(i.skin), + disabled = i.disabled, + sex = i.sex == 'm' and _('male') or _('female') + } end - local accounts = json.decode(result[i].accounts) - local id = tonumber(string.sub(result[i].identifier, #PREFIX+1, string.find(result[i].identifier, ':')-1)) - characters[id] = { - id = id, - bank = accounts.bank, - money = accounts.money, - job = job, - job_grade = grade, - firstname = result[i].firstname, - lastname = result[i].lastname, - dateofbirth = result[i].dateofbirth, - skin = json.decode(result[i].skin), - disabled = result[i].disabled, - } - if result[i].sex == 'm' then characters[id].sex = _('male') else characters[id].sex = _('female') end end - TriggerClientEvent('esx_multicharacter:SetupUI', playerId, characters, slots) + TriggerClientEvent('esx_multicharacter:SetupUI', source, characters, slots) end) end @@ -163,10 +167,10 @@ elseif ESX.GetConfig().Multichar == true then end end) - AddEventHandler('esx_identity:completedRegistration', function(playerId, data) - TriggerEvent('esx:onPlayerJoined', playerId, PREFIX..awaitingRegistration[playerId], data) - awaitingRegistration[playerId] = nil - ESX.Players[GetIdentifier(source)] = playerId + AddEventHandler('esx_identity:completedRegistration', function(source, data) + TriggerEvent('esx:onPlayerJoined', source, PREFIX..awaitingRegistration[source], data) + awaitingRegistration[source] = nil + ESX.Players[GetIdentifier(source)] = source end) AddEventHandler('playerDropped', function(reason) @@ -176,16 +180,14 @@ elseif ESX.GetConfig().Multichar == true then RegisterServerEvent("esx_multicharacter:DeleteCharacter") AddEventHandler('esx_multicharacter:DeleteCharacter', function(charid) - local src = source if type(charid) == "number" and string.len(charid) <= 2 then - DeleteCharacter(src, charid) + DeleteCharacter(source, charid) end end) RegisterServerEvent("esx_multicharacter:relog") AddEventHandler('esx_multicharacter:relog', function() - local src = source - TriggerEvent('esx:playerLogout', src) + TriggerEvent('esx:playerLogout', source) end) else From e3c7e5ce5c2dc1de56d5102dc01f33698a001293 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Tue, 26 Oct 2021 00:53:06 +1100 Subject: [PATCH 044/132] feat(server): Utilise transactions to reduce server load --- fxmanifest.lua | 2 +- server/main.lua | 50 ++++++++++++++++++++++++++++++------------------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index 7f98c72d..992b8ce1 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'cerulean' game 'gta5' description 'https://github.com/thelindat/esx_multicharacter' -version '1.3.1' +version '1.4' lua54 'yes' dependencies { diff --git a/server/main.lua b/server/main.lua index e6179a71..f4137076 100644 --- a/server/main.lua +++ b/server/main.lua @@ -53,7 +53,7 @@ elseif ESX.GetConfig().Multichar == true then local slots = MySQL.Sync.fetchScalar("SELECT slots FROM multicharacter_slots WHERE identifier = ?", { identifier }) or Config.Slots - identifier = ('%s:%s'):format(PREFIX, identifier) + identifier = PREFIX..'%:'..identifier MySQL.Async.fetchAll(FETCH, {identifier, slots}, function(result) local characters @@ -100,23 +100,25 @@ elseif ESX.GetConfig().Multichar == true then end end) - local function DeleteCharacter(playerId, charid) - local identifier = GetIdentifier(playerId) - local character = ('%s%s:%s'):format(PREFIX, charid, identifier) - local counter = 0 - for _, v in pairs(DB_TABLES) do - MySQL.Async.execute("DELETE FROM "..v.table.." WHERE "..v.column.." = ?", { - character - }, function() - counter = counter + 1 - if counter == #DB_TABLES then - print(('[^2INFO^7] Player [%s] %s has deleted a character (%s)'):format(GetPlayerName(playerId), playerId, character)) - Citizen.Wait(100) - SetupCharacters(playerId) - end - end) - Citizen.Wait(5) + local function DeleteCharacter(source, charid) + local identifier = ('%s%s:%s'):format(PREFIX, charid, GetIdentifier(source)) + local query = "DELETE FROM ?? WHERE ?? = ?" + local tableCount = #DB_TABLES + local queries = table.create(tableCount, 0) + + for i=1, tableCount do + local v = DB_TABLES[i] + queries[i] = {query = query, values = {v.table, v.column, identifier}} end + + MySQL.Async.transaction(queries, function(result) + if result then + print(('[^2INFO^7] Player [%s] %s has deleted a character (%s)'):format(GetPlayerName(source), source, identifier)) + SetupCharacters(source) + else + print(result) + end + end) end MySQL.ready(function() @@ -130,10 +132,20 @@ elseif ESX.GetConfig().Multichar == true then table.insert(DB_TABLES, {table = v.TABLE_NAME, column = v.COLUMN_NAME}) end if next(varchar) then + local query = "ALTER TABLE ?? MODIFY COLUMN ?? VARCHAR(60)" + local queries = table.create(varsize, 0) + for k, v in pairs(varchar) do - MySQL.Sync.execute("ALTER TABLE "..k.." MODIFY COLUMN "..v.." VARCHAR(60)") + queries[#queries+1] = {query = query, values = {k, v}} end - print(('[^2INFO^7] Attempted to update ^5%s^7 columns to use VARCHAR(60)'):format(varsize)) + + MySQL.Async.transaction(queries, function(result) + if result then + print(('[^2INFO^7] Updated ^5%s^7 columns to use VARCHAR(60)'):format(varsize)) + else + print(('[^2INFO^7] Unable to update ^5%s^7 columns to use VARCHAR(60)'):format(varsize)) + end + end) end ESX.Jobs = {} local function GetJobs() From 3fe1f438df6ccd2d2473fc532e0759324909327a Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Tue, 26 Oct 2021 02:24:06 +1100 Subject: [PATCH 045/132] chore(server): Update error messages and manifest --- fxmanifest.lua | 2 +- server/main.lua | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index 992b8ce1..f39c2340 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'cerulean' game 'gta5' description 'https://github.com/thelindat/esx_multicharacter' -version '1.4' +version '1.4.0' lua54 'yes' dependencies { diff --git a/server/main.lua b/server/main.lua index f4137076..7c3dc1ea 100644 --- a/server/main.lua +++ b/server/main.lua @@ -20,7 +20,7 @@ local function DATABASE() end if not ESX then - error('\n^1WARNING: Unable to start Multicharacter - you must be using ESX Legacy^0') + error('\n^1Unable to start Multicharacter - you must be using ESX Legacy^0') elseif ESX.GetConfig().Multichar == true then DATABASE = DATABASE() local DB_TABLES = {} @@ -114,9 +114,10 @@ elseif ESX.GetConfig().Multichar == true then MySQL.Async.transaction(queries, function(result) if result then print(('[^2INFO^7] Player [%s] %s has deleted a character (%s)'):format(GetPlayerName(source), source, identifier)) + Citizen.Wait(50) SetupCharacters(source) else - print(result) + error('\n^1Transaction failed while trying to delete '..identifier..'^0') end end) end @@ -204,4 +205,4 @@ elseif ESX.GetConfig().Multichar == true then else assert(nil, '^3WARNING: Multicharacter is disabled - please check your ESX configuration^0') -end +end \ No newline at end of file From a9960ef3f5716aa442df84b2b2732cfd3f554977 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Fri, 29 Oct 2021 11:09:30 +1100 Subject: [PATCH 046/132] refactor: move server settings to config Added support for sv_lan to allow use with FxDK. Added support for ESX forks with Config.Identifier --- config.lua | 11 +++++++++++ server/main.lua | 12 +++++------- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/config.lua b/config.lua index 460c7e44..b5af0abc 100644 --- a/config.lua +++ b/config.lua @@ -6,6 +6,17 @@ if IsDuplicityVersion() then -- If you want to manage extra slots for specific players you can do it by using '/setslots' and '/remslots' commands Config.Slots = 4 -------------------- + + -- Text to prepend to each character (char#:identifier) - keep it short + -- if you modify this, you will need to modify es_extended due to an oversight! + -- https://github.com/esx-framework/esx-legacy/blob/main/%5Besx%5D/es_extended/server/classes/player.lua#L17 + -- if Config.Multichar then self.license = 'license'..identifier:sub(identifier:find(':')) else self.license = 'license:'..identifier end + Config.Prefix = 'char' + -------------------- + + -- Default identifier to store for characters - this should always match es_extended (recommended: license) + Config.Identifier = 'license' + else -- Sets the location for the character selection scene -- To set the spawn location for new characters, modify the default value in the `users` SQL table diff --git a/server/main.lua b/server/main.lua index 7c3dc1ea..27f29eb9 100644 --- a/server/main.lua +++ b/server/main.lua @@ -25,14 +25,12 @@ elseif ESX.GetConfig().Multichar == true then DATABASE = DATABASE() local DB_TABLES = {} local FETCH = nil - local PREFIX = 'char' - -- enter a prefix to prepend to all user identifiers (keep it short) - -- if you modify this, you will need to modify es_extended due to an oversight! - -- https://github.com/esx-framework/esx-legacy/blob/main/%5Besx%5D/es_extended/server/classes/player.lua#L17 - -- if Config.Multichar then self.license = 'license'..identifier:sub(identifier:find(':')) else self.license = 'license:'..identifier end + local SLOTS = Config.Slots or 4 + local PREFIX = Config.Prefix or 'char' + local PRIMARY_IDENTIFIER = ESX.GetConfig().Identifier or GetConvar('sv_lan', '') == 'true' and 'ip' or Config.Identifier local function GetIdentifier(source) - local identifier = 'license:' + local identifier = PRIMARY_IDENTIFIER..':' for _, v in pairs(GetPlayerIdentifiers(source)) do if string.match(v, identifier) then identifier = string.gsub(v, identifier, '') @@ -52,7 +50,7 @@ elseif ESX.GetConfig().Multichar == true then local identifier = GetIdentifier(source) local slots = MySQL.Sync.fetchScalar("SELECT slots FROM multicharacter_slots WHERE identifier = ?", { identifier - }) or Config.Slots + }) or SLOTS identifier = PREFIX..'%:'..identifier MySQL.Async.fetchAll(FETCH, {identifier, slots}, function(result) From 8402cf423659a6b92182354265a062c3b002950d Mon Sep 17 00:00:00 2001 From: Olvidate <82069828+Olvidate@users.noreply.github.com> Date: Mon, 8 Nov 2021 18:55:42 -0300 Subject: [PATCH 047/132] fix(server): fixed error with identifiers Fixed error when you don't have a identifier, Steam open for example. --- server/main.lua | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/server/main.lua b/server/main.lua index 27f29eb9..eb88b6bc 100644 --- a/server/main.lua +++ b/server/main.lua @@ -90,11 +90,15 @@ elseif ESX.GetConfig().Multichar == true then deferrals.defer() local identifier = GetIdentifier(source) Citizen.Wait(100) - if ESX.Players[identifier] then - deferrals.done('A player is already connected to the server with this identifier.') + if identifier then + if ESX.Players[identifier] then + deferrals.done('A player is already connected to the server with this identifier.') + else + ESX.Players[identifier] = true + deferrals.done() + end else - ESX.Players[identifier] = true - deferrals.done() + deferrals.done("You don't have identifier") end end) @@ -203,4 +207,4 @@ elseif ESX.GetConfig().Multichar == true then else assert(nil, '^3WARNING: Multicharacter is disabled - please check your ESX configuration^0') -end \ No newline at end of file +end From e19f99fdcab8ea3c6af700efb5dcb8b497f90396 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Tue, 9 Nov 2021 14:12:04 +1100 Subject: [PATCH 048/132] refactor(server): update deferral messages --- server/main.lua | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/server/main.lua b/server/main.lua index eb88b6bc..d966d528 100644 --- a/server/main.lua +++ b/server/main.lua @@ -41,14 +41,16 @@ elseif ESX.GetConfig().Multichar == true then if next(ESX.Players) then for k, v in pairs(ESX.Players) do - ESX.Players[k] = GetIdentifier(v.source) + ESX.Players[GetIdentifier(v.source)] = true end else ESX.Players = {} end local function SetupCharacters(source) while not FETCH do Citizen.Wait(100) end local identifier = GetIdentifier(source) - local slots = MySQL.Sync.fetchScalar("SELECT slots FROM multicharacter_slots WHERE identifier = ?", { + ESX.Players[identifier] = true + + local slots = MySQL.Sync.fetchScalar("SELECT slots FROM multicharacter_slots WHERE identifier = ?", { identifier }) or SLOTS identifier = PREFIX..'%:'..identifier @@ -92,13 +94,12 @@ elseif ESX.GetConfig().Multichar == true then Citizen.Wait(100) if identifier then if ESX.Players[identifier] then - deferrals.done('A player is already connected to the server with this identifier.') + deferrals.done(('A player is already connected to the server with this identifier.\nYour identifier: %s:%s'):format(PRIMARY_IDENTIFIER, identifier) else - ESX.Players[identifier] = true deferrals.done() end else - deferrals.done("You don't have identifier") + deferrals.done(('Unable to retrieve player identifier.\nIdentifier type: %s'):format(PRIMARY_IDENTIFIER) end end) @@ -177,7 +178,7 @@ elseif ESX.GetConfig().Multichar == true then awaitingRegistration[source] = charid else TriggerEvent('esx:onPlayerJoined', source, PREFIX..charid) - ESX.Players[GetIdentifier(source)] = source + ESX.Players[GetIdentifier(source)] = true end end end) @@ -185,7 +186,7 @@ elseif ESX.GetConfig().Multichar == true then AddEventHandler('esx_identity:completedRegistration', function(source, data) TriggerEvent('esx:onPlayerJoined', source, PREFIX..awaitingRegistration[source], data) awaitingRegistration[source] = nil - ESX.Players[GetIdentifier(source)] = source + ESX.Players[GetIdentifier(source)] = true end) AddEventHandler('playerDropped', function(reason) From 2635ce9fbb3138b75d0c6c14ca59c76f54d2f07e Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Thu, 11 Nov 2021 06:28:56 +1100 Subject: [PATCH 049/132] fix(server): added missing symbols --- config.lua | 2 +- server/main.lua | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/config.lua b/config.lua index b5af0abc..e7290c3f 100644 --- a/config.lua +++ b/config.lua @@ -29,7 +29,7 @@ else -- Do not use unless you are prepared to adjust your resources to correctly reset data -- Information: https://github.com/thelindat/esx_multicharacter#relogging - Config.Relog = false + Config.Relog = true -------------------- -- Default appearance for new characters diff --git a/server/main.lua b/server/main.lua index d966d528..f411692a 100644 --- a/server/main.lua +++ b/server/main.lua @@ -49,7 +49,7 @@ elseif ESX.GetConfig().Multichar == true then while not FETCH do Citizen.Wait(100) end local identifier = GetIdentifier(source) ESX.Players[identifier] = true - + local slots = MySQL.Sync.fetchScalar("SELECT slots FROM multicharacter_slots WHERE identifier = ?", { identifier }) or SLOTS @@ -94,12 +94,12 @@ elseif ESX.GetConfig().Multichar == true then Citizen.Wait(100) if identifier then if ESX.Players[identifier] then - deferrals.done(('A player is already connected to the server with this identifier.\nYour identifier: %s:%s'):format(PRIMARY_IDENTIFIER, identifier) + deferrals.done(('A player is already connected to the server with this identifier.\nYour identifier: %s:%s'):format(PRIMARY_IDENTIFIER, identifier)) else deferrals.done() end else - deferrals.done(('Unable to retrieve player identifier.\nIdentifier type: %s'):format(PRIMARY_IDENTIFIER) + deferrals.done(('Unable to retrieve player identifier.\nIdentifier type: %s'):format(PRIMARY_IDENTIFIER)) end end) From 6c7408b02edaaee7b76e1683253c39ca711ae21e Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Fri, 12 Nov 2021 18:49:13 +1100 Subject: [PATCH 050/132] Update fxmanifest.lua --- fxmanifest.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index f39c2340..503a7fb8 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'cerulean' game 'gta5' description 'https://github.com/thelindat/esx_multicharacter' -version '1.4.0' +version '1.4.1' lua54 'yes' dependencies { From 6a7d0ad56a56c35445464016f80adb2afb90d0b9 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sun, 21 Nov 2021 17:24:09 +1100 Subject: [PATCH 051/132] update readme --- config.lua | 4 +--- readme.md | 11 +++++++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/config.lua b/config.lua index e7290c3f..503c9cfb 100644 --- a/config.lua +++ b/config.lua @@ -8,9 +8,7 @@ if IsDuplicityVersion() then -------------------- -- Text to prepend to each character (char#:identifier) - keep it short - -- if you modify this, you will need to modify es_extended due to an oversight! - -- https://github.com/esx-framework/esx-legacy/blob/main/%5Besx%5D/es_extended/server/classes/player.lua#L17 - -- if Config.Multichar then self.license = 'license'..identifier:sub(identifier:find(':')) else self.license = 'license:'..identifier end + -- if you change the length, you will need to modify es_extended (refer to the readme) Config.Prefix = 'char' -------------------- diff --git a/readme.md b/readme.md index f7f30478..e4520790 100644 --- a/readme.md +++ b/readme.md @@ -11,6 +11,15 @@ - All owner and identifier columns should be set to `VARCHAR(60)` to ensure correct data entry - The resource will attempt to set columns automatically +### Changing character prefix +- Each character is created a modified identifier (char#:identifier) +- Due to an oversight, ESX Legacy only supports a prefix with a length of 4 +- If you change the length, refer to https://github.com/esx-framework/esx-legacy/blob/main/%5Besx%5D/es_extended/server/classes/player.lua#L17 +- Modify this line to the following +```lua +if Config.Multichar then self.license = 'license:'..identifier:sub(identifier:find(':'), identifier:len()) else self.license = 'license:'..identifier end +``` + ### Conflicts * The following resources should not be used with ESX Legacy and can result in errors - essentialmode @@ -24,8 +33,6 @@ - Download and run all requirements - Use a fresh spawnmanager as many people alter the code - Ensure none of the conflicting resources are enabled -#### mysql-async duplicate entry - - You have not increased the VARCHAR size of the table holding identifiers - usually `owner` or `identifier` #### The menu interface is esx_menu_default - you can use any version if you want a different appearance ![image](https://user-images.githubusercontent.com/65407488/126976325-17cc3241-bb9e-451f-a6ed-610a8ef52fa5.png) From 150ec165fcd92c5815d952fdf9d67ffdbf9ee625 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sun, 21 Nov 2021 17:26:29 +1100 Subject: [PATCH 052/132] fix(server): clone and wipe the playerlist when restarting the resource Since we're looping through the table, we end up trying to index new values as they are added. --- server/main.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/server/main.lua b/server/main.lua index f411692a..5becd5c1 100644 --- a/server/main.lua +++ b/server/main.lua @@ -40,7 +40,9 @@ elseif ESX.GetConfig().Multichar == true then end if next(ESX.Players) then - for k, v in pairs(ESX.Players) do + local players = table.clone(ESX.Players) + table.wipe(ESX.Players) + for _, v in pairs(players) do ESX.Players[GetIdentifier(v.source)] = true end else ESX.Players = {} end @@ -48,9 +50,9 @@ elseif ESX.GetConfig().Multichar == true then local function SetupCharacters(source) while not FETCH do Citizen.Wait(100) end local identifier = GetIdentifier(source) - ESX.Players[identifier] = true + ESX.Players[identifier] = true - local slots = MySQL.Sync.fetchScalar("SELECT slots FROM multicharacter_slots WHERE identifier = ?", { + local slots = MySQL.Sync.fetchScalar("SELECT slots FROM multicharacter_slots WHERE identifier = ?", { identifier }) or SLOTS identifier = PREFIX..'%:'..identifier From 874eeef86c10e9fcb188d8520f871879a1ff58bb Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Thu, 2 Dec 2021 01:47:35 +1100 Subject: [PATCH 053/132] fix(server): connection string parser --- fxmanifest.lua | 2 +- server/main.lua | 40 ++++++++++++++++++---------------------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/fxmanifest.lua b/fxmanifest.lua index 503a7fb8..f93b5e33 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'cerulean' game 'gta5' description 'https://github.com/thelindat/esx_multicharacter' -version '1.4.1' +version '1.4.2' lua54 'yes' dependencies { diff --git a/server/main.lua b/server/main.lua index 5becd5c1..cb4ad80d 100644 --- a/server/main.lua +++ b/server/main.lua @@ -1,28 +1,24 @@ -local function DATABASE() - local connectionString = GetConvar('mysql_connection_string', ''); - if connectionString == '' then - error(connectionString..'\n^1Unable to start Multicharacter - unable to determine database from mysql_connection_string^0', 0) - elseif connectionString:find('mysql://') then - if connectionString:find('?*$') then - return connectionString:match('[^/][%w]*[?$]'):sub(0, -2) - else - return connectionString:match('[^/][%w]*$') - end - else - connectionString = {string.strsplit(';', connectionString)} - for i=1, #connectionString do - local v = connectionString[i] - if v:match('database') then - return v:sub(10, #v) - end - end - end -end - if not ESX then error('\n^1Unable to start Multicharacter - you must be using ESX Legacy^0') elseif ESX.GetConfig().Multichar == true then - DATABASE = DATABASE() + local DATABASE do + local connectionString = GetConvar('mysql_connection_string', ''); + if connectionString == '' then + error(connectionString..'\n^1Unable to start Multicharacter - unable to determine database from mysql_connection_string^0', 0) + elseif connectionString:find('mysql://') then + connectionString = connectionString:sub(9, -1) + DATABASE = connectionString:sub(connectionString:find('/')+1, -1):gsub('[%?]+[%w%p]*$', '') + else + connectionString = {string.strsplit(';', connectionString)} + for i=1, #connectionString do + local v = connectionString[i] + if v:match('database') then + DATABASE = v:sub(10, #v) + end + end + end + end + local DB_TABLES = {} local FETCH = nil local SLOTS = Config.Slots or 4 From d6a56057d8535127065450bddc5c199d57e8457c Mon Sep 17 00:00:00 2001 From: Night Owls Roleplay <85649796+nightowlsrp@users.noreply.github.com> Date: Mon, 13 Dec 2021 22:08:43 -0800 Subject: [PATCH 054/132] removed margin-right to just use "right" value Removed margin-right as "right" handles this usage just fine and margin messes with the actual container. --- html/css/main.css | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/html/css/main.css b/html/css/main.css index 60090d94..15fb9bc5 100644 --- a/html/css/main.css +++ b/html/css/main.css @@ -25,10 +25,9 @@ body { display:none; position: absolute; top: 50%; - right: 0; + right: 25; transform: translate(0, -50%); background: rgba(0,0,0,0.7); - margin-right: 1.5rem; } .header { From 72450dfcd67dd4db09829cb1ce78bb0542dc314d Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 12 Feb 2022 05:58:45 +1100 Subject: [PATCH 055/132] refactor: swap to oxmysql ESX officially uses oxmysql with new syntax, so follow suite. --- client/main.lua | 8 ++-- config.lua | 8 ++-- esx_multicharacter.sql | 10 ++--- fxmanifest.lua | 2 +- readme.md | 46 ++++++---------------- server/commands.lua | 14 +++---- server/main.lua | 87 +++++++++++++++++++++--------------------- 7 files changed, 74 insertions(+), 101 deletions(-) diff --git a/client/main.lua b/client/main.lua index 9aa1a919..cb10ca8f 100644 --- a/client/main.lua +++ b/client/main.lua @@ -51,7 +51,7 @@ if ESX.GetConfig().Multichar then local keys = {18, 27, 172, 173, 174, 175, 176, 177, 187, 188, 191, 201, 108, 109} while hidePlayers do DisableAllControlActions(0) - for i=1, #keys do + for i = 1, #keys do EnableControlAction(0, keys[i], true) end SetEntityVisible(PlayerPedId(), 0, 0) @@ -64,7 +64,7 @@ if ESX.GetConfig().Multichar then HideHudAndRadarThisFrame() Citizen.Wait(0) local vehicles = GetGamePool('CVehicle') - for i=1, #vehicles do + for i = 1, #vehicles do SetEntityLocallyInvisible(vehicles[i]) end end @@ -80,7 +80,7 @@ if ESX.GetConfig().Multichar then local playerPool = {} while hidePlayers do local players = GetActivePlayers() - for i=1, #players do + for i = 1, #players do local player = players[i] if player ~= PlayerId() and not playerPool[player] then playerPool[player] = true @@ -236,7 +236,7 @@ if ESX.GetConfig().Multichar then else ESX.UI.Menu.CloseAll() local GetSlot = function() - for i=1, slots do + for i = 1, slots do if not Characters[i] then return i end diff --git a/config.lua b/config.lua index 503c9cfb..fe18b776 100644 --- a/config.lua +++ b/config.lua @@ -1,6 +1,9 @@ Config = {} Config.Locale = 'en' +-- Allows players to delete their characters +Config.CanDelete = true + if IsDuplicityVersion() then -- This is the default number of slots for EVERY player -- If you want to manage extra slots for specific players you can do it by using '/setslots' and '/remslots' commands @@ -8,7 +11,6 @@ if IsDuplicityVersion() then -------------------- -- Text to prepend to each character (char#:identifier) - keep it short - -- if you change the length, you will need to modify es_extended (refer to the readme) Config.Prefix = 'char' -------------------- @@ -21,10 +23,6 @@ else Config.Spawn = vector4(-113.7, 565.3, 195.2, 0) -------------------- - -- Allows players to delete their characters - Config.CanDelete = true - -------------------- - -- Do not use unless you are prepared to adjust your resources to correctly reset data -- Information: https://github.com/thelindat/esx_multicharacter#relogging Config.Relog = true diff --git a/esx_multicharacter.sql b/esx_multicharacter.sql index b3a76af7..f19f7610 100644 --- a/esx_multicharacter.sql +++ b/esx_multicharacter.sql @@ -1,13 +1,9 @@ CREATE TABLE `multicharacter_slots` ( - `identifier` VARCHAR(60) NOT NULL COLLATE 'utf8mb4_unicode_ci', + `identifier` VARCHAR(60) NOT NULL, `slots` INT(11) NOT NULL, PRIMARY KEY (`identifier`) USING BTREE, INDEX `slots` (`slots`) USING BTREE -) -COLLATE='utf8mb4_unicode_ci' -ENGINE=InnoDB -; +) ENGINE=InnoDB; ALTER TABLE `users` ADD COLUMN - `disabled` TINYINT(1) NULL DEFAULT '0' -; + `disabled` TINYINT(1) NULL DEFAULT '0'; diff --git a/fxmanifest.lua b/fxmanifest.lua index f93b5e33..0b928219 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -19,7 +19,7 @@ shared_scripts { server_scripts { '@es_extended/imports.lua', - '@mysql-async/lib/MySQL.lua', + '@oxmysql/lib/MySQL.lua', 'server/*.lua', } diff --git a/readme.md b/readme.md index e4520790..fa8c8748 100644 --- a/readme.md +++ b/readme.md @@ -1,24 +1,6 @@ ### Requirements (ensure you are using the latest) - [ESX Legacy](https://github.com/esx-framework/esx-legacy) -- [Spawnmanager](https://github.com/citizenfx/cfx-server-data/tree/master/resources/%5Bmanagers%5D/spawnmanager) - -- [OxMySQL](https://github.com/overextended/oxmysql/) or [MySQL Async 3.3.2](https://github.com/brouznouf/fivem-mysql-async/releases/tag/3.3.2) - -### Installation -- Modify your ESX config with `Config.Multichar = true` -- Set your database name for `Config.Database` in server/main.lua -- Run `esx_multicharacter.sql` into your database -- All owner and identifier columns should be set to `VARCHAR(60)` to ensure correct data entry - - The resource will attempt to set columns automatically - -### Changing character prefix -- Each character is created a modified identifier (char#:identifier) -- Due to an oversight, ESX Legacy only supports a prefix with a length of 4 -- If you change the length, refer to https://github.com/esx-framework/esx-legacy/blob/main/%5Besx%5D/es_extended/server/classes/player.lua#L17 -- Modify this line to the following -```lua -if Config.Multichar then self.license = 'license:'..identifier:sub(identifier:find(':'), identifier:len()) else self.license = 'license:'..identifier end -``` +- [OxMySQL](https://github.com/overextended/oxmysql/releases) ### Conflicts * The following resources should not be used with ESX Legacy and can result in errors @@ -28,13 +10,15 @@ if Config.Multichar then self.license = 'license:'..identifier:sub(identifier:fi - fivem-map-hipster - default_spawnpoint -### Common issues -#### Black screen / loading scripts - - Download and run all requirements - - Use a fresh spawnmanager as many people alter the code - - Ensure none of the conflicting resources are enabled +### Installation +- Modify your ESX config with `Config.Multichar = true` +- Set your database name for `Config.Database` in server/main.lua +- Run `esx_multicharacter.sql` into your database +- All owner and identifier columns should be set to `VARCHAR(60)` to ensure correct data entry + - The resource will attempt to set columns automatically -#### The menu interface is esx_menu_default - you can use any version if you want a different appearance + +#### The menu is esx_menu_default - you can use any version if you want a different appearance ![image](https://user-images.githubusercontent.com/65407488/126976325-17cc3241-bb9e-451f-a6ed-610a8ef52fa5.png) ### Relogging @@ -43,22 +27,16 @@ if Config.Multichar then self.license = 'license:'..identifier:sub(identifier:fi - Add the following events to resources that require support for relogging, or - Add them to [@esx/imports.lua](https://github.com/esx-framework/es_extended/blob/legacy/imports.lua) (and use the imports in your resources) ```lua -RegisterNetEvent('esx:playerLoaded') -AddEventHandler('esx:playerLoaded', function(xPlayer) +RegisterNetEvent('esx:playerLoaded', function(xPlayer) ESX.PlayerData = xPlayer ESX.PlayerLoaded = true end) -RegisterNetEvent('esx:onPlayerLogout') -AddEventHandler('esx:onPlayerLogout', function() +RegisterNetEvent('esx:onPlayerLogout', function() ESX.PlayerLoaded = false ESX.PlayerData = {} end) ``` -- Any threads using ESX.PlayerData in a loop should check if ESX.PlayerLoaded is true - - This ensures the resource does not error after relogging, or while on character selection - - Setup correctly you can break your loops and trigger them again after loading - - Refer to my [boilerplate](https://github.com/thelindat/esx_legacy_boilerplate) for more information and usage examples ### Notes - This resource is not compatible with ExtendedMode or previous versions of ESX @@ -76,7 +54,7 @@ end) ## Notice -Copyright© 2021 Linden and KASH +Copyright © 2021 Linden and KASH This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/server/commands.lua b/server/commands.lua index 6c0ff047..3cfa98d5 100644 --- a/server/commands.lua +++ b/server/commands.lua @@ -1,16 +1,16 @@ ESX.RegisterCommand('setslots', 'admin', function(xPlayer, args, showError) - local slots = MySQL.Sync.fetchScalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { + local slots = MySQL.scalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { args.identifier }) if slots == nil then - MySQL.Async.execute('INSERT INTO `multicharacter_slots` (`identifier`, `slots`) VALUES (?, ?)', { + MySQL.update('INSERT INTO `multicharacter_slots` (`identifier`, `slots`) VALUES (?, ?)', { args.identifier, args.slots }) xPlayer.triggerEvent('esx:showNotification', _U('slotsadd', args.slots, args.identifier)) else - MySQL.Async.execute('UPDATE `multicharacter_slots` SET `slots` = ? WHERE `identifier` = ?', { + MySQL.update('UPDATE `multicharacter_slots` SET `slots` = ? WHERE `identifier` = ?', { args.slots, args.identifier }) @@ -22,12 +22,12 @@ end, true, {help = _U('command_setslots'), validate = true, arguments = { }}) ESX.RegisterCommand('remslots', 'admin', function(xPlayer, args, showError) - local slots = MySQL.Sync.fetchScalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { + local slots = MySQL.scalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { args.identifier }) if slots ~= nil then - MySQL.Async.execute('DELETE FROM `multicharacter_slots` WHERE `identifier` = ?', { + MySQL.update('DELETE FROM `multicharacter_slots` WHERE `identifier` = ?', { args.identifier }) xPlayer.triggerEvent('esx:showNotification', _U('slotsrem', args.identifier)) @@ -40,7 +40,7 @@ ESX.RegisterCommand('enablechar', 'admin', function(xPlayer, args, showError) local selectedCharacter = 'char'..args.charslot..':'..args.identifier; - MySQL.Async.execute('UPDATE `users` SET `disabled` = 0 WHERE identifier = ?', { + MySQL.update('UPDATE `users` SET `disabled` = 0 WHERE identifier = ?', { selectedCharacter }, function(result) if result > 0 then @@ -59,7 +59,7 @@ ESX.RegisterCommand('disablechar', 'admin', function(xPlayer, args, showError) local selectedCharacter = 'char'..args.charslot..':'..args.identifier; - MySQL.Async.execute('UPDATE `users` SET `disabled` = 1 WHERE identifier = ?', { + MySQL.update('UPDATE `users` SET `disabled` = 1 WHERE identifier = ?', { selectedCharacter }, function(result) if result > 0 then diff --git a/server/main.lua b/server/main.lua index cb4ad80d..a0c13e15 100644 --- a/server/main.lua +++ b/server/main.lua @@ -10,7 +10,7 @@ elseif ESX.GetConfig().Multichar == true then DATABASE = connectionString:sub(connectionString:find('/')+1, -1):gsub('[%?]+[%w%p]*$', '') else connectionString = {string.strsplit(';', connectionString)} - for i=1, #connectionString do + for i = 1, #connectionString do local v = connectionString[i] if v:match('database') then DATABASE = v:sub(10, #v) @@ -48,48 +48,51 @@ elseif ESX.GetConfig().Multichar == true then local identifier = GetIdentifier(source) ESX.Players[identifier] = true - local slots = MySQL.Sync.fetchScalar("SELECT slots FROM multicharacter_slots WHERE identifier = ?", { - identifier - }) or SLOTS + local slots = MySQL.scalar('SELECT slots FROM multicharacter_slots WHERE identifier = ?', { identifier }) or SLOTS identifier = PREFIX..'%:'..identifier - MySQL.Async.fetchAll(FETCH, {identifier, slots}, function(result) - local characters - if result then - local characterCount = #result - characters = table.create(0, characterCount) - for i=1, characterCount, 1 do - local i = result[i] - local job, grade = i.job or 'unemployed', tostring(i.job_grade) - if ESX.Jobs[job] and ESX.Jobs[job].grades[grade] then - if job ~= 'unemployed' then grade = ESX.Jobs[job].grades[grade].label else grade = '' end - job = ESX.Jobs[job].label - end - local accounts = json.decode(i.accounts) - local id = tonumber(string.sub(i.identifier, #PREFIX+1, string.find(i.identifier, ':')-1)) - characters[id] = { - id = id, - bank = accounts.bank, - money = accounts.money, - job = job, - job_grade = grade, - firstname = i.firstname, - lastname = i.lastname, - dateofbirth = i.dateofbirth, - skin = json.decode(i.skin), - disabled = i.disabled, - sex = i.sex == 'm' and _('male') or _('female') - } + local result = MySQL.query.await(FETCH, {identifier, slots}) + local characters + + if result then + local characterCount = #result + characters = table.create(0, characterCount) + + for i = 1, characterCount, 1 do + local v = result[i] + local job, grade = v.job or 'unemployed', tostring(v.job_grade) + + if ESX.Jobs[job] and ESX.Jobs[job].grades[grade] then + if job ~= 'unemployed' then grade = ESX.Jobs[job].grades[grade].label else grade = '' end + job = ESX.Jobs[job].label end + + local accounts = json.decode(v.accounts) + local id = tonumber(string.sub(v.identifier, #PREFIX+1, string.find(v.identifier, ':')-1)) + + characters[id] = { + id = id, + bank = accounts.bank, + money = accounts.money, + job = job, + job_grade = grade, + firstname = v.firstname, + lastname = v.lastname, + dateofbirth = v.dateofbirth, + skin = v.skin and json.decode(v.skin) or {}, + disabled = v.disabled, + sex = v.sex == 'm' and _('male') or _('female') + } end - TriggerClientEvent('esx_multicharacter:SetupUI', source, characters, slots) - end) + end + + TriggerClientEvent('esx_multicharacter:SetupUI', source, characters, slots) end AddEventHandler('playerConnecting', function(playerName, setKickReason, deferrals) deferrals.defer() local identifier = GetIdentifier(source) - Citizen.Wait(100) + if identifier then if ESX.Players[identifier] then deferrals.done(('A player is already connected to the server with this identifier.\nYour identifier: %s:%s'):format(PRIMARY_IDENTIFIER, identifier)) @@ -112,7 +115,7 @@ elseif ESX.GetConfig().Multichar == true then queries[i] = {query = query, values = {v.table, v.column, identifier}} end - MySQL.Async.transaction(queries, function(result) + MySQL.transaction(queries, function(result) if result then print(('[^2INFO^7] Player [%s] %s has deleted a character (%s)'):format(GetPlayerName(source), source, identifier)) Citizen.Wait(50) @@ -163,14 +166,14 @@ elseif ESX.GetConfig().Multichar == true then end) end) - RegisterServerEvent("esx_multicharacter:SetupCharacters") + RegisterNetEvent('esx_multicharacter:SetupCharacters', function() AddEventHandler('esx_multicharacter:SetupCharacters', function() SetupCharacters(source) end) local awaitingRegistration = {} - RegisterServerEvent("esx_multicharacter:CharacterChosen") - AddEventHandler('esx_multicharacter:CharacterChosen', function(charid, isNew) + + RegisterNetEvent('esx_multicharacter:CharacterChosen', function(charid, isNew) if type(charid) == 'number' and string.len(charid) <= 2 and type(isNew) == 'boolean' then if isNew then awaitingRegistration[source] = charid @@ -192,15 +195,13 @@ elseif ESX.GetConfig().Multichar == true then ESX.Players[GetIdentifier(source)] = nil end) - RegisterServerEvent("esx_multicharacter:DeleteCharacter") - AddEventHandler('esx_multicharacter:DeleteCharacter', function(charid) - if type(charid) == "number" and string.len(charid) <= 2 then + RegisterNetEvent('esx_multicharacter:DeleteCharacter', function(charid) + if Config.CanDelete and type(charid) == 'number' and string.len(charid) <= 2 then DeleteCharacter(source, charid) end end) - RegisterServerEvent("esx_multicharacter:relog") - AddEventHandler('esx_multicharacter:relog', function() + RegisterNetEvent('esx_multicharacter:relog', function() TriggerEvent('esx:playerLogout', source) end) From b7c521c8e7856fb8e1ce08c8f006c461bdfb014e Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Sat, 12 Feb 2022 06:03:23 +1100 Subject: [PATCH 056/132] feat(server): database optimisations Limited testing, but works in a fairly clean ESX environment. Sets up foreign keys in the database to allow for easy and optimised character deletion. Foreign keys will only be set where owner and identifier columns exist, the field cannot be NULL and uses VARCHAR. --- server/main.lua | 119 +++++++++++++++++++++++++++++++----------------- 1 file changed, 77 insertions(+), 42 deletions(-) diff --git a/server/main.lua b/server/main.lua index a0c13e15..5b672bc7 100644 --- a/server/main.lua +++ b/server/main.lua @@ -19,7 +19,7 @@ elseif ESX.GetConfig().Multichar == true then end end - local DB_TABLES = {} + local DB_TABLES = {users = 'identifier'} local FETCH = nil local SLOTS = Config.Slots or 4 local PREFIX = Config.Prefix or 'char' @@ -106,13 +106,13 @@ elseif ESX.GetConfig().Multichar == true then local function DeleteCharacter(source, charid) local identifier = ('%s%s:%s'):format(PREFIX, charid, GetIdentifier(source)) - local query = "DELETE FROM ?? WHERE ?? = ?" - local tableCount = #DB_TABLES - local queries = table.create(tableCount, 0) + local query = 'DELETE FROM %s WHERE %s = ?' + local queries = {} + local count = 0 - for i=1, tableCount do - local v = DB_TABLES[i] - queries[i] = {query = query, values = {v.table, v.column, identifier}} + for table, column in pairs(DB_TABLES) do + count += 1 + queries[count] = {query = query:format(table, column), values = {identifier}} end MySQL.transaction(queries, function(result) @@ -127,47 +127,82 @@ elseif ESX.GetConfig().Multichar == true then end MySQL.ready(function() - MySQL.Async.fetchAll('SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = ? AND (COLUMN_NAME = ? OR COLUMN_NAME = ?) ', { - DATABASE, 'identifier', 'owner' - }, function(result) - if result then - local varchar, varsize = {}, 0 - for k, v in pairs(result) do - if v.CHARACTER_MAXIMUM_LENGTH and v.CHARACTER_MAXIMUM_LENGTH >= 40 and v.CHARACTER_MAXIMUM_LENGTH < 60 then varchar[v.TABLE_NAME] = v.COLUMN_NAME varsize = varsize+1 end - table.insert(DB_TABLES, {table = v.TABLE_NAME, column = v.COLUMN_NAME}) - end - if next(varchar) then - local query = "ALTER TABLE ?? MODIFY COLUMN ?? VARCHAR(60)" - local queries = table.create(varsize, 0) + local length = 42 + #PREFIX + local DB_COLUMNS = MySQL.query.await(('SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "%s" AND DATA_TYPE = "varchar" AND COLUMN_NAME IN (?)'):format(DATABASE, length), { + {'identifier', 'owner'} + }) - for k, v in pairs(varchar) do - queries[#queries+1] = {query = query, values = {k, v}} - end + if DB_COLUMNS then + local FK = MySQL.query.await(('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = "FOREIGN KEY" AND TABLE_SCHEMA = "%s"'):format(DATABASE)) + local FOREIGN_KEY = {} - MySQL.Async.transaction(queries, function(result) - if result then - print(('[^2INFO^7] Updated ^5%s^7 columns to use VARCHAR(60)'):format(varsize)) - else - print(('[^2INFO^7] Unable to update ^5%s^7 columns to use VARCHAR(60)'):format(varsize)) - end - end) - end - ESX.Jobs = {} - local function GetJobs() - if ESX.GetJobs then return ESX.GetJobs() - else return exports['es_extended']:getSharedObject().Jobs end - end - repeat - ESX.Jobs = GetJobs() - Citizen.Wait(50) - until next(ESX.Jobs) - FETCH = MySQL.Sync.store("SELECT identifier, accounts, job, job_grade, firstname, lastname, dateofbirth, sex, skin, disabled FROM users WHERE identifier LIKE ? LIMIT ?") + for i = 1, #FK do + FOREIGN_KEY[FK[i].TABLE_NAME] = true end - end) + + local columns = {} + local count = 0 + + for i = 1, #DB_COLUMNS do + local v = DB_COLUMNS[i] + + if v?.CHARACTER_MAXIMUM_LENGTH ~= length then + count += 1 + columns[v.TABLE_NAME] = v.COLUMN_NAME + end + end + + if next(columns) then + local query = 'ALTER TABLE `%s` MODIFY COLUMN `%s` VARCHAR(%s)' + local queries = table.create(count, 0) + + for k, v in pairs(columns) do + queries[#queries+1] = {query = query:format(k, v, length)} + end + + if MySQL.transaction.await(queries) then + print(('[^2INFO^7] Updated ^5%s^7 columns to use VARCHAR(%s)'):format(count, length)) + else + print(('[^2INFO^7] Unable to update ^5%s^7 columns to use VARCHAR(%s)'):format(count, length)) + end + end + + for i = 1, #DB_COLUMNS do + local v = DB_COLUMNS[i] + + if not FOREIGN_KEY[v.TABLE_NAME] then + DB_TABLES[v.TABLE_NAME] = v.COLUMN_NAME + + if v.TABLE_NAME ~= 'users' and v.IS_NULLABLE == 'NO' then + MySQL.update(([[ALTER TABLE `%s` + ADD CONSTRAINT `FK_%s_users` FOREIGN KEY (`%s`) REFERENCES `users` (`identifier`) ON UPDATE CASCADE ON DELETE CASCADE]]):format(v.TABLE_NAME, v.TABLE_NAME, v.COLUMN_NAME), function(result) + if result then + print(('[^2INFO^7] Updated ^5"%s.%s"^7 to use FOREIGN_KEY referencing ^5"users.identifier"^7'):format(v.TABLE_NAME, v.COLUMN_NAME)) + end + end) + end + end + end + + ESX.Jobs = {} + + local function GetJobs() + if ESX.GetJobs then + return ESX.GetJobs() + end + return exports.es_extended:getSharedObject().Jobs + end + + repeat + ESX.Jobs = GetJobs() + Citizen.Wait(50) + until next(ESX.Jobs) + + FETCH = 'SELECT identifier, accounts, job, job_grade, firstname, lastname, dateofbirth, sex, skin, disabled FROM users WHERE identifier LIKE ? LIMIT ?' + end end) RegisterNetEvent('esx_multicharacter:SetupCharacters', function() - AddEventHandler('esx_multicharacter:SetupCharacters', function() SetupCharacters(source) end) From fca8927b384713d0cdd8327a2a60f53ba324bd43 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Mon, 14 Feb 2022 20:18:59 +1100 Subject: [PATCH 057/132] revert(server): foreign keys Can result in some errors. Still keeping the other optimisations from previous commit (namely adjusting all identifier fields to the correct varchar length). --- server/main.lua | 26 +------------------------- 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/server/main.lua b/server/main.lua index 5b672bc7..6b3fd4f8 100644 --- a/server/main.lua +++ b/server/main.lua @@ -128,18 +128,11 @@ elseif ESX.GetConfig().Multichar == true then MySQL.ready(function() local length = 42 + #PREFIX - local DB_COLUMNS = MySQL.query.await(('SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "%s" AND DATA_TYPE = "varchar" AND COLUMN_NAME IN (?)'):format(DATABASE, length), { + local DB_COLUMNS = MySQL.query.await(('SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "%s" AND DATA_TYPE = "varchar" AND COLUMN_NAME IN (?)'):format(DATABASE, length), { {'identifier', 'owner'} }) if DB_COLUMNS then - local FK = MySQL.query.await(('SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = "FOREIGN KEY" AND TABLE_SCHEMA = "%s"'):format(DATABASE)) - local FOREIGN_KEY = {} - - for i = 1, #FK do - FOREIGN_KEY[FK[i].TABLE_NAME] = true - end - local columns = {} local count = 0 @@ -167,23 +160,6 @@ elseif ESX.GetConfig().Multichar == true then end end - for i = 1, #DB_COLUMNS do - local v = DB_COLUMNS[i] - - if not FOREIGN_KEY[v.TABLE_NAME] then - DB_TABLES[v.TABLE_NAME] = v.COLUMN_NAME - - if v.TABLE_NAME ~= 'users' and v.IS_NULLABLE == 'NO' then - MySQL.update(([[ALTER TABLE `%s` - ADD CONSTRAINT `FK_%s_users` FOREIGN KEY (`%s`) REFERENCES `users` (`identifier`) ON UPDATE CASCADE ON DELETE CASCADE]]):format(v.TABLE_NAME, v.TABLE_NAME, v.COLUMN_NAME), function(result) - if result then - print(('[^2INFO^7] Updated ^5"%s.%s"^7 to use FOREIGN_KEY referencing ^5"users.identifier"^7'):format(v.TABLE_NAME, v.COLUMN_NAME)) - end - end) - end - end - end - ESX.Jobs = {} local function GetJobs() From 67d28ee2682591a44fac7e27786483e4d8e9bece Mon Sep 17 00:00:00 2001 From: CoachYT1 <69034647+CoachYT1@users.noreply.github.com> Date: Mon, 21 Feb 2022 09:17:49 +0100 Subject: [PATCH 058/132] Update readme.md --- readme.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/readme.md b/readme.md index fa8c8748..6e2393c9 100644 --- a/readme.md +++ b/readme.md @@ -12,7 +12,6 @@ ### Installation - Modify your ESX config with `Config.Multichar = true` -- Set your database name for `Config.Database` in server/main.lua - Run `esx_multicharacter.sql` into your database - All owner and identifier columns should be set to `VARCHAR(60)` to ensure correct data entry - The resource will attempt to set columns automatically @@ -25,7 +24,7 @@ - Do not enable this setting if you do not intend to properly set up relog support - Requires the latest update for ESX Status (prevents multiple status ticks from running) - Add the following events to resources that require support for relogging, or -- Add them to [@esx/imports.lua](https://github.com/esx-framework/es_extended/blob/legacy/imports.lua) (and use the imports in your resources) +- Add them to [@es_extended/imports.lua](https://github.com/esx-framework/esx-legacy/blob/main/[esx]/es_extended/imports.lua) (and use the imports in your resources) ```lua RegisterNetEvent('esx:playerLoaded', function(xPlayer) ESX.PlayerData = xPlayer From 57615812bf0f4b1ae40b99e0ab86e39b09267862 Mon Sep 17 00:00:00 2001 From: JonarSonaer Date: Sun, 6 Mar 2022 18:51:18 +0100 Subject: [PATCH 059/132] Updated Swedish Translations --- [esx]/es_extended/locales/sv.lua | 497 +++++++++++++++++++------------ 1 file changed, 309 insertions(+), 188 deletions(-) diff --git a/[esx]/es_extended/locales/sv.lua b/[esx]/es_extended/locales/sv.lua index 8de56f35..16233213 100644 --- a/[esx]/es_extended/locales/sv.lua +++ b/[esx]/es_extended/locales/sv.lua @@ -1,207 +1,328 @@ Locales['sv'] = { -- Inventory - ['inventory'] = 'mitt förråd %s / %s', - ['use'] = 'använd', - ['give'] = 'ge', - ['remove'] = 'kasta', - ['return'] = 'gå tillbaka', - ['give_to'] = 'ge till', - ['amount'] = 'antal', - ['giveammo'] = 'ge ammunition', - ['amountammo'] = 'mängd ammunition', - ['noammo'] = 'du har inte tillräckligt med ammunition!', - ['gave_item'] = 'du gav ~y~%sx~s~ ~b~%s~s~ till ~y~%s~s~', - ['received_item'] = 'du tog emot ~y~%sx~s~ ~b~%s~s~ från ~b~%s~s~', - ['gave_weapon'] = 'du gav ~b~%s~s~ till ~y~%s~s~', - ['gave_weapon_ammo'] = 'du gav ~o~%sx %s~s~ för ~b~%s~s~ till ~y~%s~s~', - ['gave_weapon_withammo'] = 'du gav ~b~%s~s~ med ~o~%sx %s~s~ till ~y~%s~s~', + ['inventory'] = 'Förråd ( Vikt %s / %s )', + ['use'] = 'Använd', + ['give'] = 'Ge', + ['remove'] = 'Kasta', + ['return'] = 'Gå tillbaka', + ['give_to'] = 'Ge till', + ['amount'] = 'Antal', + ['giveammo'] = 'Ge ammunition', + ['amountammo'] = 'Mängd ammunition', + ['noammo'] = 'Inte tillräckligt med ammunition!', + ['gave_item'] = 'Ge ~y~%sx~s~ ~b~%s~s~ till ~y~%s~s~', + ['received_item'] = 'Fick ~y~%sx~s~ ~b~%s~s~ från ~b~%s~s~', + ['gave_weapon'] = 'Ge ~b~%s~s~ till ~y~%s~s~', + ['gave_weapon_ammo'] = 'Ge ~o~%sx %s~s~ för ~b~%s~s~ till ~y~%s~s~', + ['gave_weapon_withammo'] = 'Ge ~b~%s~s~ med ~o~%sx %s~s~ till ~y~%s~s~', ['gave_weapon_hasalready'] = '~y~%s~s~ har redan en ~y~%s~s~', ['gave_weapon_noweapon'] = '~y~%s~s~ har inte det vapnet', - ['received_weapon'] = 'du tog emot ~b~%s~s~ från ~b~%s~s~', - ['received_weapon_ammo'] = 'du tog emot ~o~%sx %s~s~ för ~b~%s~s~ från ~b~%s~s~', - ['received_weapon_withammo'] = 'du tog emot ~b~%s~s~ med ~o~%sx %s~s~ från ~b~%s~s~', - ['received_weapon_hasalready'] = '~b~%s~s~ försökte ge dig en ~y~%s~s~, men det vapnet har du redan', - ['received_weapon_noweapon'] = '~b~%s~s~ försökte ge dig ammunition för ett ~y~%s~s~, men du har inget sådant vapen', - ['gave_account_money'] = 'du gav ~g~%s SEK~s~ (%s) till ~y~%s~s~', - ['received_account_money'] = 'du tog emot ~g~%s SEK~s~ (%s) från ~b~%s~s~', - ['amount_invalid'] = 'ogiltig mängd', - ['players_nearby'] = 'det finns inga spelare nära', - ['ex_inv_lim'] = 'åtgärd inte möjligt, översteg förråd gräns för ~y~%s~s~', - ['imp_invalid_quantity'] = 'åtgärd omöjlig, ogiltig mängd', - ['imp_invalid_amount'] = 'åtgärd omöjlig, ogiltig belopp', - ['threw_standard'] = 'du kastade ~y~%sx~s~ ~b~%s~s~', - ['threw_account'] = 'du kastade ~g~%s SEK~s~ ~b~%s~s~', - ['threw_weapon'] = 'du kastade ~b~%s~s~', - ['threw_weapon_ammo'] = 'du kastade ~b~%s~s~ med ~o~%sx %s~s~', - ['threw_weapon_already'] = 'du har redan ett sådant vapen på dig', - ['threw_cannot_pickup'] = 'du kan inte plocka upp det på grund av att det kommer ej få plats i ditt förråd!', - ['threw_pickup_prompt'] = 'tryck ~y~E~s~ för att plocka upp', + ['received_weapon'] = 'Mottog ~b~%s~s~ från ~b~%s~s~', + ['received_weapon_ammo'] = 'Fick ~o~%sx %s~s~ för din ~b~%s~s~ från ~b~%s~s~', + ['received_weapon_withammo'] = 'Mottog ~b~%s~s~ med ~o~%sx %s~s~ från ~b~%s~s~', + ['received_weapon_hasalready'] = '~b~%s~s~ har försökt ge dig en ~y~%s~s~, men du har redan det här vapnet', + ['received_weapon_noweapon'] = '~b~%s~s~ har försökt ge dig ammunition för en ~y~%s~s~, men du har inte det här vapnet', + ['gave_account_money'] = 'Ge ~g~$%s~s~ (%s) till ~y~%s~s~', + ['received_account_money'] = 'Mottog ~g~$%s~s~ (%s) från ~b~%s~s~', + ['amount_invalid'] = 'Ogiltig mängd', + ['players_nearby'] = 'Inga spelare i närheten', + ['ex_inv_lim'] = 'Kan inte utföra åtgärden, överstiger maxvikten ~y~%s~s~', + ['imp_invalid_quantity'] = 'Det går inte att utföra åtgärden, mängden är ogiltig', + ['imp_invalid_amount'] = 'Det går inte att utföra åtgärden, mängden är ogiltigt', + ['threw_standard'] = 'Kastade ~y~%sx~s~ ~b~%s~s~', + ['threw_account'] = 'Kastade ~g~$%s~s~ ~b~%s~s~', + ['threw_weapon'] = 'Kastade ~b~%s~s~', + ['threw_weapon_ammo'] = 'Kastade ~b~%s~s~ med ~o~%sx %s~s~', + ['threw_weapon_already'] = 'Du har redan det här vapnet', + ['threw_cannot_pickup'] = 'Förrådet är fullt, kan inte plocka upp!', + ['threw_pickup_prompt'] = 'Tryck ~y~E~s~ för att plocka upp', -- Key mapping - ['keymap_showinventory'] = 'öppna inventory', + ['keymap_showinventory'] = 'Visa förrådet', -- Salary related - ['received_salary'] = 'du har mottagit din lön på ~g~%s SEK~s~', - ['received_help'] = 'du har mottagit bidrag på ~g~%s SEK~s~', + ['received_salary'] = 'Du har fått lön: ~g~$%s~s~', + ['received_help'] = 'Du har fått bidrag: ~g~$%s~s~', ['company_nomoney'] = 'företaget du är anställt hos har inte råd att betala ut din lön', - ['received_paycheck'] = 'mottagit lön', - ['bank'] = 'bank', - ['account_bank'] = 'bank', - ['account_black_money'] = 'svarta pengar', - ['account_money'] = 'kontakter', + ['received_paycheck'] = 'Mottagit lön', + ['bank'] = 'Bank', + ['account_bank'] = 'Bank', + ['account_black_money'] = 'Svarta pengar', + ['account_money'] = 'Kontanter', - ['act_imp'] = 'åtgärd omöjlig', - ['in_vehicle'] = 'du kan inte ge saker till en som sitter i ett fordon!', + ['act_imp'] = 'Kan inte utföra åtgärd', + ['in_vehicle'] = 'Kan inte utföra åtgärd, spelaren är i ett fordon', -- Commands - ['command_car'] = 'spawna ett fordon', - ['command_car_car'] = 'namn på fordon eller hash', - ['command_cardel'] = 'radera fordon i närheten', - ['command_cardel_radius'] = 'valfri, radera alla fordon inom den angivna radien', - ['command_clear'] = 'töm chatten', - ['command_clearall'] = 'töm chatten för alla spelare', - ['command_clearinventory'] = 'töm en spelares inventory', - ['command_clearloadout'] = 'töm en spelares loadout', - ['command_giveaccountmoney'] = 'ge pengar för ett konto', - ['command_giveaccountmoney_account'] = 'giltigt kontonamn', - ['command_giveaccountmoney_amount'] = 'mängd att ge', - ['command_giveaccountmoney_invalid'] = 'kontonamnet är ej giltigt', - ['command_giveitem'] = 'ge ett item till en spelare', - ['command_giveitem_item'] = 'itemnamn', - ['command_giveitem_count'] = 'mängd av itemet', - ['command_giveweapon'] = 'ge ett vapen till en spelare', - ['command_giveweapon_weapon'] = 'vapennamn', - ['command_giveweapon_ammo'] = 'hur mycket ammo att ge', - ['command_giveweapon_hasalready'] = 'spelaren har redan ett sådant vapen', - ['command_giveweaponcomponent'] = 'ge vapen komponent', - ['command_giveweaponcomponent_component'] = 'vapenkomponent', - ['command_giveweaponcomponent_invalid'] = 'det vapenkomponentet är ej giltigt', - ['command_giveweaponcomponent_hasalready'] = 'spelaren har redan det vapenkomponent', - ['command_giveweaponcomponent_missingweapon'] = 'spelaren har ej det vapnet', - ['command_save'] = 'spara en spelare i databas', - ['command_saveall'] = 'spara alla spelare i databas', - ['command_setaccountmoney'] = 'bestäm ny balans på ett spelarkonto', - ['command_setaccountmoney_amount'] = 'ny balans', - ['command_setcoords'] = 'teleportera till koordinater', - ['command_setcoords_x'] = 'x axel', - ['command_setcoords_y'] = 'y axel', - ['command_setcoords_z'] = 'z axel', - ['command_setjob'] = 'välj jobb för en spelare', - ['command_setjob_job'] = 'jobbnamn', - ['command_setjob_grade'] = 'jobbnivå', - ['command_setjob_invalid'] = 'jobbet, nivån eller båda är ej giltiga', - ['command_setgroup'] = 'välj grupp åt en spelare', - ['command_setgroup_group'] = 'gruppnamn', - ['commanderror_argumentmismatch'] = 'argumentstorlek mismatch (gav %s, ville ha %s)', - ['commanderror_argumentmismatch_number'] = 'argument #%s typ mismatch (gav string, ville ha number)', - ['commanderror_invaliditem'] = 'ej giltigt item', - ['commanderror_invalidweapon'] = 'ej giltigt vapen', - ['commanderror_console'] = 'detta kommando kan ej executas i konsol', - ['commanderror_invalidcommand'] = '/%s är inte ett giltigt kommando!', - ['commanderror_invalidplayerid'] = 'det finns ingen spelare som matchar det angivna server id', - ['commandgeneric_playerid'] = 'spelarid', + ['command_car'] = 'Spawna ett fordon', + ['command_car_car'] = 'Fordonsmodell eller hash', + ['command_cardel'] = 'Ta bort fordon i närheten', + ['command_cardel_radius'] = 'Tar bort alla fordon inom angiven radie', + ['command_clear'] = 'Rensa chatttext', + ['command_clearall'] = 'Rensa chatttext för alla spelare', + ['command_clearinventory'] = 'Ta bort alla föremål från spelarens förråd', + ['command_clearloadout'] = 'Ta bort alla vapen från spelarens förråd', + ['command_giveaccountmoney'] = 'Ge pengar till ett specifikt konto', + ['command_giveaccountmoney_account'] = 'Konto att lägga till i', + ['command_giveaccountmoney_amount'] = 'Belopp att lägga till', + ['command_giveaccountmoney_invalid'] = 'Kontonamn ogiltigt', + ['command_giveitem'] = 'Ge spelaren ett föremål', + ['command_giveitem_item'] = 'Föremålsnamn', + ['command_giveitem_count'] = 'Mängd', + ['command_giveweapon'] = 'Ge spelaren ett vapen', + ['command_giveweapon_weapon'] = 'Vapennamn', + ['command_giveweapon_ammo'] = 'Ammunitionsmängd', + ['command_giveweapon_hasalready'] = 'Spelaren har redan det här vapnet', + ['command_giveweaponcomponent'] = 'Ge en vapenkomponent till spelaren', + ['command_giveweaponcomponent_component'] = 'Vapenkomponentnamn', + ['command_giveweaponcomponent_invalid'] = 'Ogiltig vapenkomponent', + ['command_giveweaponcomponent_hasalready'] = 'Spelaren har redan denna vapenkomponent', + ['command_giveweaponcomponent_missingweapon'] = 'Spelaren har inte det här vapnet', + ['command_save'] = 'Tvångspara en spelares data', + ['command_saveall'] = 'Tvångspara allas spelardata', + ['command_setaccountmoney'] = 'Ställ in pengarna på ett angivet konto', + ['command_setaccountmoney_amount'] = 'Ny Summa', + ['command_setcoords'] = 'Teleportera till specificerade koordinater', + ['command_setcoords_x'] = 'X-värde', + ['command_setcoords_y'] = 'Y-värde', + ['command_setcoords_z'] = 'Z-värde', + ['command_setjob'] = 'Ställ in en spelares jobb', + ['command_setjob_job'] = 'Jobbnamn', + ['command_setjob_grade'] = 'Jobbnivå', + ['command_setjob_invalid'] = 'jobbet, nivån eller båda är ogiltiga', + ['command_setgroup'] = 'Ställ in en spelares behörighetsgrupp', + ['command_setgroup_group'] = 'Gruppens namn', + ['commanderror_argumentmismatch'] = 'Ogiltigt antal argument (godkänt %s, önskat %s)', + ['commanderror_argumentmismatch_number'] = 'Ogiltigt argument #%s datatyp (godkänd sträng, önskat nummer)', + ['commanderror_invaliditem'] = 'Ogiltig artikel', + ['commanderror_invalidweapon'] = 'Ogiltigt vapen', + ['commanderror_console'] = 'Kommandot kan inte köras från konsolen', + ['commanderror_invalidcommand'] = 'Ogiltigt kommando - /%s', + ['commanderror_invalidplayerid'] = 'Angiven spelare är inte online', + ['commandgeneric_playerid'] = 'Spelarens server-id', -- Locale settings ['locale_digit_grouping_symbol'] = ' ', ['locale_currency'] = '%s SEK', -- Weapons - ['weapon_knife'] = 'kniv', - ['weapon_nightstick'] = 'batong', - ['weapon_hammer'] = 'hammare', - ['weapon_bat'] = 'slagträ', - ['weapon_golfclub'] = 'golf club', - ['weapon_crowbar'] = 'kofot', - ['weapon_pistol'] = 'pistol', - ['weapon_combatpistol'] = 'combat pistol', - ['weapon_appistol'] = 'ap pistol', - ['weapon_pistol50'] = 'pistol .50', - ['weapon_microsmg'] = 'micro smg', - ['weapon_smg'] = 'smg', - ['weapon_assaultsmg'] = 'assault smg', - ['weapon_assaultrifle'] = 'assault rifle', - ['weapon_carbinerifle'] = 'carbine rifle', - ['weapon_advancedrifle'] = 'advanced rifle', - ['weapon_mg'] = 'mg', - ['weapon_combatmg'] = 'combat mg', - ['weapon_pumpshotgun'] = 'pump shotgun', - ['weapon_sawnoffshotgun'] = 'sawed off shotgun', - ['weapon_assaultshotgun'] = 'assault shotgun', - ['weapon_bullpupshotgun'] = 'bullpup shotgun', - ['weapon_stungun'] = 'elchockpistol', - ['weapon_sniperrifle'] = 'prickskyttegevär', - ['weapon_heavysniper'] = 'tung prickskytt', - ['weapon_grenadelauncher'] = 'granatkastare', - ['weapon_rpg'] = 'raketgevär', - ['weapon_minigun'] = 'minigun', - ['weapon_grenade'] = 'granat', - ['weapon_stickybomb'] = 'klibbig bomb', - ['weapon_smokegrenade'] = 'rökgranat', - ['weapon_bzgas'] = 'bz gas', - ['weapon_molotov'] = 'molotov cocktail', - ['weapon_fireextinguisher'] = 'brandsläckare', - ['weapon_petrolcan'] = 'bensindunk', - ['weapon_ball'] = 'boll', - ['weapon_snspistol'] = 'sns pistol', - ['weapon_bottle'] = 'flaska', - ['weapon_gusenberg'] = 'gusenberg sweeper', - ['weapon_specialcarbine'] = 'special carbine', - ['weapon_heavypistol'] = 'heavy pistol', - ['weapon_bullpuprifle'] = 'bullpup rifle', - ['weapon_dagger'] = 'dolk', - ['weapon_vintagepistol'] = 'vintage pistol', - ['weapon_firework'] = 'fyrverkeriraket', - ['weapon_musket'] = 'musköt', - ['weapon_heavyshotgun'] = 'heavy shotgun', - ['weapon_marksmanrifle'] = 'marksman rifle', - ['weapon_hominglauncher'] = 'homing launcher', - ['weapon_proxmine'] = 'proximity mine', - ['weapon_snowball'] = 'snöboll', - ['weapon_flaregun'] = 'signalpistol', - ['weapon_combatpdw'] = 'combat pdw', - ['weapon_marksmanpistol'] = 'marksman pistol', - ['weapon_knuckle'] = 'knogjärn', - ['weapon_hatchet'] = 'yxa', - ['weapon_railgun'] = 'railgun', - ['weapon_machete'] = 'machete', - ['weapon_machinepistol'] = 'machine pistol', - ['weapon_switchblade'] = 'switchblade', - ['weapon_revolver'] = 'heavy revolver', - ['weapon_dbshotgun'] = 'double barrel shotgun', - ['weapon_compactrifle'] = 'compact rifle', - ['weapon_autoshotgun'] = 'auto shotgun', - ['weapon_battleaxe'] = 'stridsyxa', - ['weapon_compactlauncher'] = 'compact launcher', - ['weapon_minismg'] = 'mini smg', - ['weapon_pipebomb'] = 'pipe bomb', - ['weapon_poolcue'] = 'biljardkö', - ['weapon_wrench'] = 'skiftnyckel', - ['weapon_flashlight'] = 'ficklampa', - ['gadget_parachute'] = 'fallskärm', - ['weapon_flare'] = 'blossa', - ['weapon_doubleaction'] = 'double-Action Revolver', + + -- Melee + ['weapon_dagger'] = 'Dolk', + ['weapon_bat'] = 'Slagträ', + ['weapon_battleaxe'] = 'Stridsyxa', + ['weapon_bottle'] = 'Flaska', + ['weapon_crowbar'] = 'Kofot', + ['weapon_flashlight'] = 'Ficklampa', + ['weapon_golfclub'] = 'Golfklubba', + ['weapon_hammer'] = 'Hammare', + ['weapon_hatchet'] = 'Yxa', + ['weapon_knife'] = 'Kniv', + ['weapon_knuckle'] = 'Knogjärn', + ['weapon_machete'] = 'Machete', + ['weapon_nightstick'] = 'Batong', + ['weapon_wrench'] = 'Rörtång', + ['weapon_poolcue'] = 'Biljardkö', + ['weapon_stone_hatchet'] = 'Stenyxa', + ['weapon_switchblade'] = 'Fällkniv', + + -- Handguns + ['weapon_appistol'] = 'AP Pistol', + ['weapon_ceramicpistol'] = 'Ceramic Pistol', + ['weapon_combatpistol'] = 'Combat Pistol', + ['weapon_doubleaction'] = 'Double-Action Revolver', + ['weapon_navyrevolver'] = 'Navy Revolver', + ['weapon_flaregun'] = 'Flaregun', + ['weapon_gadgetpistol'] = 'Gadget Pistol', + ['weapon_heavypistol'] = 'Heavy Pistol', + ['weapon_revolver'] = 'Heavy Revolver', + ['weapon_revolver_mk2'] = 'Heavy Revolver MK2', + ['weapon_marksmanpistol'] = 'Marksman Pistol', + ['weapon_pistol'] = 'Pistol', + ['weapon_pistol_mk2'] = 'Pistol MK2', + ['weapon_pistol50'] = 'Pistol .50', + ['weapon_snspistol'] = 'SNS Pistol', + ['weapon_snspistol_mk2'] = 'SNS Pistol MK2', + ['weapon_stungun'] = 'Taser', + ['weapon_raypistol'] = 'Up-N-Atomizer', + ['weapon_vintagepistol'] = 'Vintage Pistol', + + -- Shotguns + ['weapon_assaultshotgun'] = 'Assault Shotgun', + ['weapon_autoshotgun'] = 'Auto Shotgun', + ['weapon_bullpupshotgun'] = 'Bullpup Shotgun', + ['weapon_combatshotgun'] = 'Combat Shotgun', + ['weapon_dbshotgun'] = 'Double Barrel Shotgun', + ['weapon_heavyshotgun'] = 'Heavy Shotgun', + ['weapon_musket'] = 'Musket', + ['weapon_pumpshotgun'] = 'Pump Shotgun', + ['weapon_pumpshotgun_mk2'] = 'Pump Shotgun MK2', + ['weapon_sawnoffshotgun'] = 'Sawed Off Shotgun', + + -- SMG & LMG + ['weapon_assaultsmg'] = 'Assault SMG', + ['weapon_combatmg'] = 'Combat MG', + ['weapon_combatmg_mk2'] = 'Combat MG MK2', + ['weapon_combatpdw'] = 'Combat PDW', + ['weapon_gusenberg'] = 'Gusenberg Sweeper', + ['weapon_machinepistol'] = 'Machine Pistol', + ['weapon_mg'] = 'MG', + ['weapon_microsmg'] = 'Micro SMG', + ['weapon_minismg'] = 'Mini SMG', + ['weapon_smg'] = 'SMG', + ['weapon_smg_mk2'] = 'SMG MK2', + ['weapon_raycarbine'] = 'Unholy Hellbringer', + + -- Rifles + ['weapon_advancedrifle'] = 'Advanced Rifle', + ['weapon_assaultrifle'] = 'Assault Rifle', + ['weapon_assaultrifle_mk2'] = 'Assault Rifle MK2', + ['weapon_bullpuprifle'] = 'Bullpup Rifle', + ['weapon_bullpuprifle_mk2'] = 'Bullpup Rifle MK2', + ['weapon_carbinerifle'] = 'Carbine Rifle', + ['weapon_carbinerifle_mk2'] = 'Carbine Rifle MK2', + ['weapon_compactrifle'] = 'Compact Rifle', + ['weapon_militaryrifle'] = 'Military Rifle', + ['weapon_specialcarbine'] = 'Special Carbine', + ['weapon_specialcarbine_mk2'] = 'Special Carbine MK2', + + -- Sniper + ['weapon_heavysniper'] = 'Heavy Sniper', + ['weapon_heavysniper_mk2'] = 'Heavy Sniper MK2', + ['weapon_marksmanrifle'] = 'Marksman Rifle', + ['weapon_marksmanrifle_mk2'] = 'Marksman Rifle MK2', + ['weapon_sniperrifle'] = 'Sniper Rifle', + + -- Heavy / Launchers + ['weapon_compactlauncher'] = 'Compact Launcher', + ['weapon_firework'] = 'Firework Launcher', + ['weapon_grenadelauncher'] = 'Grenade Launcher', + ['weapon_hominglauncher'] = 'Homing Launcher', + ['weapon_minigun'] = 'Minigun', + ['weapon_railgun'] = 'Railgun', + ['weapon_rpg'] = 'Rocket Launcher', + ['weapon_rayminigun'] = 'Widowmaker', + + -- Thrown + ['weapon_ball'] = 'Baseball', + ['weapon_bzgas'] = 'BZ Gas', + ['weapon_flare'] = 'Flare', + ['weapon_grenade'] = 'Grenade', + ['weapon_petrolcan'] = 'Jerrycan', + ['weapon_hazardcan'] = 'Hazardous Jerrycan', + ['weapon_molotov'] = 'Molotov Cocktail', + ['weapon_proxmine'] = 'Proximity Mine', + ['weapon_pipebomb'] = 'Pipe Bomb', + ['weapon_snowball'] = 'Snowball', + ['weapon_stickybomb'] = 'Sticky Bomb', + ['weapon_smokegrenade'] = 'Tear Gas', + + -- Special + ['weapon_fireextinguisher'] = 'Fire Extinguisher', + ['weapon_digiscanner'] = 'Digital Scanner', + ['weapon_garbagebag'] = 'Garbage Bag', + ['weapon_handcuffs'] = 'Handcuffs', + ['gadget_nightvision'] = 'Night Vision', + ['gadget_parachute'] = 'parachute', -- Weapon Components - ['component_clip_default'] = 'standard magg', - ['component_clip_extended'] = 'förlängd magg', - ['component_clip_drum'] = 'trummagasin', - ['component_clip_box'] = 'lådmagasin', - ['component_flashlight'] = 'ficklampa', - ['component_scope'] = 'sikte', - ['component_scope_advanced'] = 'advancerat sikte', - ['component_suppressor'] = 'ljuddämpare', - ['component_grip'] = 'handtag', - ['component_luxary_finish'] = 'lyxvapen behandling', + ['component_knuckle_base'] = 'base Model', + ['component_knuckle_pimp'] = 'the Pimp', + ['component_knuckle_ballas'] = 'the Ballas', + ['component_knuckle_dollar'] = 'the Hustler', + ['component_knuckle_diamond'] = 'the Rock', + ['component_knuckle_hate'] = 'the Hater', + ['component_knuckle_love'] = 'the Lover', + ['component_knuckle_player'] = 'the Player', + ['component_knuckle_king'] = 'the King', + ['component_knuckle_vagos'] = 'the Vagos', + + ['component_luxary_finish'] = 'luxary Weapon Finish', + + ['component_handle_default'] = 'default Handle', + ['component_handle_vip'] = 'vIP Handle', + ['component_handle_bodyguard'] = 'bodyguard Handle', + + ['component_vip_finish'] = 'vIP Finish', + ['component_bodyguard_finish'] = 'bodyguard Finish', + + ['component_camo_finish'] = 'digital Camo', + ['component_camo_finish2'] = 'brushstroke Camo', + ['component_camo_finish3'] = 'woodland Camo', + ['component_camo_finish4'] = 'skull Camo', + ['component_camo_finish5'] = 'sessanta Nove Camo', + ['component_camo_finish6'] = 'perseus Camo', + ['component_camo_finish7'] = 'leopard Camo', + ['component_camo_finish8'] = 'zebra Camo', + ['component_camo_finish9'] = 'geometric Camo', + ['component_camo_finish10'] = 'boom Camo', + ['component_camo_finish11'] = 'patriotic Camo', + + ['component_camo_slide_finish'] = 'digital Slide Camo', + ['component_camo_slide_finish2'] = 'brushstroke Slide Camo', + ['component_camo_slide_finish3'] = 'woodland Slide Camo', + ['component_camo_slide_finish4'] = 'skull Slide Camo', + ['component_camo_slide_finish5'] = 'sessanta Nove Slide Camo', + ['component_camo_slide_finish6'] = 'perseus Slide Camo', + ['component_camo_slide_finish7'] = 'leopard Slide Camo', + ['component_camo_slide_finish8'] = 'zebra Slide Camo', + ['component_camo_slide_finish9'] = 'geometric Slide Camo', + ['component_camo_slide_finish10'] = 'boom Slide Camo', + ['component_camo_slide_finish11'] = 'patriotic Slide Camo', + + ['component_clip_default'] = 'default Magazine', + ['component_clip_extended'] = 'extended Magazine', + ['component_clip_drum'] = 'drum Magazine', + ['component_clip_box'] = 'box Magazine', + + ['component_scope_holo'] = 'holographic Scope', + ['component_scope_small'] = 'small Scope', + ['component_scope_medium'] = 'medium Scope', + ['component_scope_large'] = 'large Scope', + ['component_scope'] = 'mounted Scope', + ['component_scope_advanced'] = 'advanced Scope', + ['component_ironsights'] = 'ironsights', + + ['component_suppressor'] = 'suppressor', + ['component_compensator'] = 'compensator', + + ['component_muzzle_flat'] = 'flat Muzzle Brake', + ['component_muzzle_tactical'] = 'tactical Muzzle Brake', + ['component_muzzle_fat'] = 'fat-End Muzzle Brake', + ['component_muzzle_precision'] = 'precision Muzzle Brake', + ['component_muzzle_heavy'] = 'heavy Duty Muzzle Brake', + ['component_muzzle_slanted'] = 'slanted Muzzle Brake', + ['component_muzzle_split'] = 'split-End Muzzle Brake', + ['component_muzzle_squared'] = 'squared Muzzle Brake', + + ['component_flashlight'] = 'flashlight', + ['component_grip'] = 'grip', + + ['component_barrel_default'] = 'default Barrel', + ['component_barrel_heavy'] = 'heavy Barrel', + + ['component_ammo_tracer'] = 'tracer Ammo', + ['component_ammo_incendiary'] = 'incendiary Ammo', + ['component_ammo_hollowpoint'] = 'hollowpoint Ammo', + ['component_ammo_fmj'] = 'fMJ Ammo', + ['component_ammo_armor'] = 'armor Piercing Ammo', + ['component_ammo_explosive'] = 'armor Piercing Incendiary Ammo', + + ['component_shells_default'] = 'default Shells', + ['component_shells_incendiary'] = 'dragons Breath Shells', + ['component_shells_armor'] = 'steel Buckshot Shells', + ['component_shells_hollowpoint'] = 'flechette Shells', + ['component_shells_explosive'] = 'explosive Slug Shells', -- Weapon Ammo ['ammo_rounds'] = 'ammunition', ['ammo_shells'] = 'hagel', ['ammo_charge'] = 'laddning', - ['ammo_petrol'] = 'liter bensin', - ['ammo_firework'] = 'fyrverkeri', - ['ammo_rockets'] = 'raket', - ['ammo_grenadelauncher'] = 'granat(er)', - ['ammo_grenade'] = 'granat(er)', + ['ammo_petrol'] = 'bensin', + ['ammo_firework'] = 'fyrverkeri(er)', + ['ammo_rockets'] = 'raket(er)', + ['ammo_grenadelauncher'] = 'grenat(er)', + ['ammo_grenade'] = 'grenat(er)', ['ammo_stickybomb'] = 'bomb(er)', ['ammo_pipebomb'] = 'bomb(er)', ['ammo_smokebomb'] = 'bomb(er)', @@ -214,12 +335,12 @@ Locales['sv'] = { ['ammo_flaregun'] = 'lysraket(er)', -- Weapon Tints - ['tint_default'] = 'standardutseende', - ['tint_green'] = 'grönskinn', - ['tint_gold'] = 'guldskinn', - ['tint_pink'] = 'råsaskinn', - ['tint_army'] = 'arméskinn', - ['tint_lspd'] = 'blåskinn', - ['tint_orange'] = 'orangeskinn', - ['tint_platinum'] = 'platinaskinn', -} + ['tint_default'] = 'Standard färg', + ['tint_green'] = 'Grön färg', + ['tint_gold'] = 'Guld färg', + ['tint_pink'] = 'Rosa färg', + ['tint_army'] = 'Armé färg', + ['tint_lspd'] = 'Blå färg', + ['tint_orange'] = 'Orange färg', + ['tint_platinum'] = 'Platina färg', +} \ No newline at end of file From 29890d1c056e999acee6ff24f7a6abeb66d900df Mon Sep 17 00:00:00 2001 From: JonarSonaer Date: Sun, 6 Mar 2022 19:00:17 +0100 Subject: [PATCH 060/132] Added Swedish Translations --- [esx]/esx_identity/locales/sv.lua | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 [esx]/esx_identity/locales/sv.lua diff --git a/[esx]/esx_identity/locales/sv.lua b/[esx]/esx_identity/locales/sv.lua new file mode 100644 index 00000000..ee3a62cb --- /dev/null +++ b/[esx]/esx_identity/locales/sv.lua @@ -0,0 +1,33 @@ +Locales['sv'] = { + ['show_active_character'] = 'Visa aktiva karaktär', + ['active_character'] = 'Aktiv karaktär: ~b~%s~s~', + ['error_active_character'] = "Det gick inte att hämta din data.", + ['delete_character'] = 'Ta bort nuvarande karaktär och skapa en ny.', + ['deleted_character'] = 'Karaktär raderad.', + ['error_delete_character'] = "Det gick inte att ta bort din karaktär.", + ['thank_you_for_registering'] = "Registrering lyckades, Ha så kul!", + ['registration_error'] = "Det uppstod ett problem när du registrerade din karaktär, se till att informationen är korrekt.", + ['debug_xPlayer_get_first_name'] = "Returnerar ditt förnamn", + ['debug_xPlayer_get_last_name'] = "Returnerar ditt efternamn", + ['debug_xPlayer_get_full_name'] = "Returnerar ditt fullständiga namn", + ['debug_xPlayer_get_sex'] = "Returnerar ditt kön", + ['debug_xPlayer_get_dob'] = "Returnerar ditt födelsedatum", + ['debug_xPlayer_get_height'] = "Returnerar din längd", + ['error_debug_xPlayer_get_first_name'] = "Det uppstod ett problem när du fick ditt förnamn.", + ['error_debug_xPlayer_get_last_name'] = "Det uppstod ett problem när du fick ditt efternamn.", + ['error_debug_xPlayer_get_full_name'] = "Det uppstod ett problem när du fick ditt fullständiga namn.", + ['error_debug_xPlayer_get_sex'] = "Det uppstod ett problem när du skaffade ditt kön.", + ['error_debug_xPlayer_get_dob'] = "Det uppstod ett problem när du skaffade ditt födelsedatum.", + ['error_debug_xPlayer_get_height'] = "Det uppstod ett problem när du fick din längd.", + ['return_debug_xPlayer_get_first_name'] = "Förnamn: ~b~%s", + ['return_debug_xPlayer_get_last_name'] = "Efternamn: ~b~%s", + ['return_debug_xPlayer_get_full_name'] = "Fullständiga namn: ~b~%s", + ['return_debug_xPlayer_get_sex'] = "Kön: ~b~%s", + ['return_debug_xPlayer_get_dob'] = "Födelsedatum: ~b~%s", + ['return_debug_xPlayer_get_height'] = "Längd: ~b~%s Centimeter", + ['data_incorrect'] = 'Uppgifterna har angetts felaktigt. Var god försök igen.', + ['invalid_format'] = 'Data är felaktigt formaterade. Var god försök igen.', + ['no_identifier'] = 'Det uppstod ett fel när din karaktär skulle laddas!\nError code: identifier-missing\n\nOrsaken till detta fel är inte känd, din identifierare kunde inte hittas. Kom tillbaka senare eller rapportera det här problemet till en administratör.', + ['missing_identity'] = 'Det uppstod ett fel när din karaktär skulle laddas!\nError code: identity-missing\n\nDet verkar som om din identitet saknas, försök ansluta igen.', + ['deleted_identity'] = 'Din karaktär har tagits bort. Logga in igen för att skapa en ny karaktär.' +} From 5217edbc8a660bebcf8fde04ac691a56772be23f Mon Sep 17 00:00:00 2001 From: JonarSonaer Date: Sun, 6 Mar 2022 19:04:56 +0100 Subject: [PATCH 061/132] Updated Swedish Translations + Tweak (ESX skin) Tweak (ESX skin) : Change Rotation Keys and menu postiton (SV) --- [esx]/esx_skin/locales/sv.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/[esx]/esx_skin/locales/sv.lua b/[esx]/esx_skin/locales/sv.lua index 02ddd5f0..b728903a 100644 --- a/[esx]/esx_skin/locales/sv.lua +++ b/[esx]/esx_skin/locales/sv.lua @@ -1,6 +1,6 @@ Locales['sv'] = { - ['skin_menu'] = 'skin meny', - ['use_rotate_view'] = 'använd ~INPUT_VEH_FLY_ROLL_LEFT_ONLY~ och ~INPUT_VEH_FLY_ROLL_RIGHT_ONLY~ för att rotera.', - ['skin'] = 'ändra skin', - ['saveskin'] = 'spara skin till fil', + ['skin_menu'] = 'Skin meny', + ['use_rotate_view'] = 'Använd ~INPUT_FRONTEND_LS~ och ~INPUT_CHARACTER_WHEEL~ för att rotera vyn.', + ['skin'] = 'Ändra skin', + ['saveskin'] = 'Spara skin till en fil', } From 7d96089b983853ae54c12c07f37027799600aeb2 Mon Sep 17 00:00:00 2001 From: JonarSonaer Date: Sun, 6 Mar 2022 19:51:27 +0100 Subject: [PATCH 062/132] Updated Swedish Translations --- [esx]/skinchanger/locales/sv.lua | 172 ++++++++++++++++++------------- 1 file changed, 98 insertions(+), 74 deletions(-) diff --git a/[esx]/skinchanger/locales/sv.lua b/[esx]/skinchanger/locales/sv.lua index 9ca5aab3..651e47d2 100644 --- a/[esx]/skinchanger/locales/sv.lua +++ b/[esx]/skinchanger/locales/sv.lua @@ -1,76 +1,100 @@ Locales['sv'] = { - ['sex'] = 'kön', - ['face'] = 'ansikte', - ['skin'] = 'hud', - ['wrinkles'] = 'rynkor', - ['wrinkle_thickness'] = 'rynk tjocklek', - ['beard_type'] = 'skäggtyp', - ['beard_size'] = 'skäggstorlek', - ['beard_color_1'] = 'skägg färg 1', - ['beard_color_2'] = 'skägg färg 2', - ['hair_1'] = 'hår 1', - ['hair_2'] = 'hår 2', - ['hair_color_1'] = 'hårfärg 1', - ['hair_color_2'] = 'hårfärg 2', - ['eye_color'] = 'eye color', - ['eyebrow_type'] = 'ögonbryn typ', - ['eyebrow_size'] = 'ögonbryn storlek', - ['eyebrow_color_1'] = 'ögonbryn färg 1', - ['eyebrow_color_2'] = 'ögonbryn färg 2', - ['makeup_type'] = 'smink typ', - ['makeup_thickness'] = 'smink tjocklek', - ['makeup_color_1'] = 'smink färg 1', - ['makeup_color_2'] = 'smink färg 2', - ['lipstick_type'] = 'läppstiftstyp', - ['lipstick_thickness'] = 'läppstjocklek', - ['lipstick_color_1'] = 'läppstift färg 1', - ['lipstick_color_2'] = 'läppstift färg 2', - ['ear_accessories'] = 'öron tillbehör', - ['ear_accessories_color'] = 'öron tillbehörs färg', - ['tshirt_1'] = 't-shirt 1', - ['tshirt_2'] = 't-shirt 2', - ['torso_1'] = 'kropp 1', - ['torso_2'] = 'kropp 2', - ['decals_1'] = 'dekaler 1', - ['decals_2'] = 'dekaler 2', - ['arms'] = 'armar', - ['arms_2'] = 'armar 2', - ['pants_1'] = 'byxor 1', - ['pants_2'] = 'byxor 2', - ['shoes_1'] = 'skor 1', - ['shoes_2'] = 'skor 2', - ['mask_1'] = 'mask 1', - ['mask_2'] = 'mask 2', - ['bproof_1'] = 'skottsäker väst 1', - ['bproof_2'] = 'skottsäker väst 2', - ['chain_1'] = 'kedja 1', + ['sex'] = 'Kön', + ['mom'] = 'Mammas ansikte', + ['dad'] = 'Pappas ansikte', + ['resemblance'] = 'Likhet', + ['skin_tone'] = 'Hudton', + ['nose_1'] = 'Näsvidd', + ['nose_2'] = 'Nästoppshöjd', + ['nose_3'] = 'Nästoppslängd', + ['nose_4'] = 'Näsbenshöjd', + ['nose_5'] = 'Nästoppssänkning', + ['nose_6'] = 'Näsbensvridning', + ['cheeks_1'] = 'Kindbens höjd', + ['cheeks_2'] = 'Kindbens bredd', + ['cheeks_3'] = 'Kinder bredd', + ['lip_fullness'] = 'Läppfullhet', + ['jaw_bone_width'] = 'Käkbensbredd', + ['jaw_bone_length'] = 'Käkbenslängd', + ['chin_height'] = 'Hakhöjd', + ['chin_length'] = 'Haklängd', + ['chin_width'] = 'Hakbredd', + ['chin_hole'] = 'Hakhålsstorlek', + ['neck_thickness'] = 'Halstjocklek', + ['wrinkles'] = 'Rynkor', + ['wrinkle_thickness'] = 'Rynktjocklek', + ['beard_type'] = 'Skägg typ', + ['beard_size'] = 'Skäggstorlek', + ['beard_color_1'] = 'Skäggfärg 1', + ['beard_color_2'] = 'Skäggfärg 2', + ['hair_1'] = 'Hår 1', + ['hair_2'] = 'Hår 2', + ['hair_color_1'] = 'Hårfärg 1', + ['hair_color_2'] = 'Hårfärg 1', + ['eye_color'] = 'Ögonfärg', + ['eye_squint'] = 'Ögonkisning', + ['eyebrow_type'] = 'Ögonbrynstyp', + ['eyebrow_size'] = 'Storlek på ögonbrynen', + ['eyebrow_color_1'] = 'Ögonbrynsfärg 1', + ['eyebrow_color_2'] = 'Ögonbrynsfärg 2', + ['eyebrow_depth'] = 'Ögonbryns djup', + ['eyebrow_height'] = 'Ögonbrynshöjd', + ['makeup_type'] = 'Typ av smink', + ['makeup_thickness'] = 'Sminktjocklek', + ['makeup_color_1'] = 'Sminkfärg 1', + ['makeup_color_2'] = 'Sminkfärg 2', + ['lipstick_type'] = 'Läppstiftstyp', + ['lipstick_thickness'] = 'Läppstift tjocklek', + ['lipstick_color_1'] = 'Läppstiftsfärg 1', + ['lipstick_color_2'] = 'Läppstiftsfärg 2', + ['ear_accessories'] = 'Örontillbehör', + ['ear_accessories_color'] = 'Örontillbehör färg', + ['tshirt_1'] = 'T-Shirt 1', + ['tshirt_2'] = 'T-Shirt 2', + ['torso_1'] = 'Kropp 1', + ['torso_2'] = 'Kropp 2', + ['decals_1'] = 'Dekaler 1', + ['decals_2'] = 'Dekaler 2', + ['arms'] = 'Armar', + ['arms_2'] = 'Armar 2', + ['pants_1'] = 'Byxor 1', + ['pants_2'] = 'Byxor 2', + ['shoes_1'] = 'Skor 1', + ['shoes_2'] = 'Skor 2', + ['mask_1'] = 'Mask 1', + ['mask_2'] = 'Mask 2', + ['bproof_1'] = 'Skottsäker väst 1', + ['bproof_2'] = 'Skottsäker väst 2', + ['chain_1'] = 'Kedja 1', ['chain_2'] = 'kedja 2', - ['helmet_1'] = 'hjälm 1', - ['helmet_2'] = 'hjälm 2', - ['watches_1'] = 'watches 1', - ['watches_2'] = 'watches 2', - ['bracelets_1'] = 'bracelets 1', - ['bracelets_2'] = 'bracelets 2', - ['glasses_1'] = 'glasögon 1', - ['glasses_2'] = 'glasögon 2', - ['bag'] = 'väska', - ['bag_color'] = 'väska färg', - ['blemishes'] = 'blemishes', - ['blemishes_size']= 'blemishes thickness', - ['ageing'] = 'ageing', - ['ageing_1'] = 'ageing thickness', - ['blush'] = 'blush', - ['blush_1'] = 'blush thickness', - ['blush_color'] = 'blush color', - ['complexion'] = 'complexion', - ['complexion_1'] = 'complexion thickness', - ['sun'] = 'sun', - ['sun_1'] = 'sun thickness', - ['freckles'] = 'freckles', - ['freckles_1'] = 'freckles thickness', - ['chest_hair'] = 'chest hair', - ['chest_hair_1'] = 'chest hair thickness', - ['chest_color'] = 'chest hair color', - ['bodyb'] = 'body blemishes', - ['bodyb_size'] = 'body blemishes thickness', -} + ['helmet_1'] = 'Hjälm 1', + ['helmet_2'] = 'Hjälm 2', + ['watches_1'] = 'Klockor 1', + ['watches_2'] = 'Klockor 2', + ['bracelets_1'] = 'Armband 1', + ['bracelets_2'] = 'Armband 2', + ['glasses_1'] = 'Glasögon 1', + ['glasses_2'] = 'Glasögon 2', + ['bag'] = 'Väska', + ['bag_color'] = 'Väsk färg', + ['blemishes'] = 'Fläckar', + ['blemishes_size'] = 'Fläckar tjocklek', + ['ageing'] = 'Åldrande', + ['ageing_1'] = 'Åldrande tjocklek', + ['blush'] = 'Rouge', + ['blush_1'] = 'Rouge tjocklek', + ['blush_color'] = 'Rouge färg', + ['complexion'] = 'Hy', + ['complexion_1'] = 'Hy tjocklek', + ['sun'] = 'Sol', + ['sun_1'] = 'Soltjocklek', + ['freckles'] = 'Fräknar', + ['freckles_1'] = 'Fräknar tjocklek', + ['chest_hair'] = 'Brösthår', + ['chest_hair_1'] = 'Brösthårets tjocklek', + ['chest_color'] = 'Hårfärg på bröstet', + ['bodyb'] = 'Kroppsfläckar', + ['bodyb_size'] = 'Kroppsfläckar tjocklek', + ['bodyb_extra'] = 'Fläckar kroppseffekt', + ['bodyb_extra_thickness'] = 'Fläckar kroppseffekt tjocklek', +} \ No newline at end of file From c07f36ea69a7bc1d92e05680a6d553b98ec7d8b9 Mon Sep 17 00:00:00 2001 From: JonarSonaer Date: Sun, 6 Mar 2022 19:56:09 +0100 Subject: [PATCH 063/132] Updated Swedish Translations --- [esx_addons]/instance/locales/sv.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/[esx_addons]/instance/locales/sv.lua b/[esx_addons]/instance/locales/sv.lua index ae466b65..a3b8ca6b 100644 --- a/[esx_addons]/instance/locales/sv.lua +++ b/[esx_addons]/instance/locales/sv.lua @@ -1,8 +1,8 @@ Locales['sv'] = { - ['left_instance'] = 'du har lämnat byggnaden', - ['invite_expired'] = 'din inbjudan har nekas', - ['press_to_enter'] = 'tryck ~INPUT_CONTEXT~ för att gå in i byggnaden', - ['entered_instance'] = 'du är inne i byggnaden', + ['left_instance'] = 'Du har lämnat byggnaden', + ['invite_expired'] = 'Inbjudan har löpt ut', + ['press_to_enter'] = 'Tryck ~INPUT_CONTEXT~ för att gå in i byggnaden', + ['entered_instance'] = 'Du gick in i byggnaden', ['entered_into'] = '%s gick in i byggnaden', ['left_out'] = '%s har lämnat byggnaden', -} \ No newline at end of file +} From 8b190dbade8bb0dc7d1b24de1fd04819f1fb34a4 Mon Sep 17 00:00:00 2001 From: JonarSonaer Date: Sun, 6 Mar 2022 19:59:27 +0100 Subject: [PATCH 064/132] Updated Swedish Translations --- [esx_addons]/esx_whitelist/locales/sv.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/[esx_addons]/esx_whitelist/locales/sv.lua b/[esx_addons]/esx_whitelist/locales/sv.lua index 6270ffb0..13b888cb 100644 --- a/[esx_addons]/esx_whitelist/locales/sv.lua +++ b/[esx_addons]/esx_whitelist/locales/sv.lua @@ -1,8 +1,8 @@ Locales['sv'] = { - ['whitelist_check'] = 'making sure you\'re whitelisted on this server . . .', - ['not_whitelisted'] = 'du är inte whitelistad på denna server!', - ['whitelist_empty'] = 'whitelisten har ännu inte laddats in, eller så är ingen whitelitad!', - ['license_missing'] = 'din licens kunde ej hittas', - ['help_whitelist_add'] = 'lägg till någon till whitelisten', - ['help_whitelist_load'] = 'ladda om whitelist', + ['whitelist_check'] = 'Ser till att du är vitlistad på den här servern. . .', + ['not_whitelisted'] = 'Du är inte vitlistad på den här servern', + ['whitelist_empty'] = 'Vitlistan har inte laddats ännu, eller alternativt har ingen blivit vitlistad!', + ['license_missing'] = 'Din licens kunde inte hittas', + ['help_whitelist_add'] = 'Lägg till någon på vitlistan', + ['help_whitelist_load'] = 'Ladda om vitlistan', } From 41c8872b57fbd9ea792720e97a3ff15e3027804d Mon Sep 17 00:00:00 2001 From: JonarSonaer Date: Sun, 6 Mar 2022 20:02:31 +0100 Subject: [PATCH 065/132] Updated Swedish Translations --- [esx_addons]/esx_weaponshop/locales/sv.lua | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/[esx_addons]/esx_weaponshop/locales/sv.lua b/[esx_addons]/esx_weaponshop/locales/sv.lua index 57da682d..4ca921b9 100644 --- a/[esx_addons]/esx_weaponshop/locales/sv.lua +++ b/[esx_addons]/esx_weaponshop/locales/sv.lua @@ -1,13 +1,13 @@ Locales ['sv'] = { - ['buy_license'] = 'vill du köpa ett vapenlicens?', + ['buy_license'] = 'Köpa vapenlicens?', ['yes'] = '%s', - ['no'] = 'nej tack', - ['weapon_bought'] = 'köpt för %s SEK', - ['not_enough_black'] = 'du har inte tillräckligt med svarta pengar', - ['not_enough'] = 'du har inte råd för detta', - ['already_owned'] = 'du äger redan detta vapen!', - ['shop_menu_title'] = 'vapenaffär', - ['shop_menu_prompt'] = 'tryck ~INPUT_CONTEXT~ för att komma åt ~y~vapenaffären~s~.', + ['no'] = 'Nej', + ['weapon_bought'] = 'Köpt för %s SEK', + ['not_enough_black'] = 'Du har inte tillräckligt med svarta pengar', + ['not_enough'] = 'Du har inte tillräckligt med pengar', + ['already_owned'] = 'Du äger redan det här vapnet!', + ['shop_menu_title'] = 'Vapenaffär', + ['shop_menu_prompt'] = 'Tryck ~INPUT_CONTEXT~ för att komma åt ~y~vapenaffären~s~.', ['shop_menu_item'] = '%s SEK', - ['map_blip'] = 'vapenaffär', + ['map_blip'] = 'Vapenaffär', } From 3c02fc7c779b9ea5d74c0cfdecf23759e8d752fb Mon Sep 17 00:00:00 2001 From: JonarSonaer Date: Sun, 6 Mar 2022 20:03:19 +0100 Subject: [PATCH 066/132] Updated Swedish Translations --- [esx_addons]/esx_voice/locales/sv.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/[esx_addons]/esx_voice/locales/sv.lua b/[esx_addons]/esx_voice/locales/sv.lua index c5c716e9..67a85af5 100644 --- a/[esx_addons]/esx_voice/locales/sv.lua +++ b/[esx_addons]/esx_voice/locales/sv.lua @@ -1,6 +1,6 @@ Locales ['sv'] = { ['voice'] = '~y~Röst: ~s~%s', - ['normal'] = 'prata', - ['shout'] = 'skrik', - ['whisper'] = 'viska', + ['normal'] = 'Prata', + ['shout'] = 'Skrik', + ['whisper'] = 'Viska', } From d4841f0dbed13ba4300c060cb148a21a91d4b09b Mon Sep 17 00:00:00 2001 From: JonarSonaer Date: Sun, 6 Mar 2022 21:53:57 +0100 Subject: [PATCH 067/132] Updated Swedish Translations --- [esx_addons]/esx_accessories/locales/sv.lua | 34 ++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/[esx_addons]/esx_accessories/locales/sv.lua b/[esx_addons]/esx_accessories/locales/sv.lua index 7d033564..8286624a 100644 --- a/[esx_addons]/esx_accessories/locales/sv.lua +++ b/[esx_addons]/esx_accessories/locales/sv.lua @@ -1,19 +1,19 @@ Locales ['sv'] = { - ['valid_purchase'] = 'bekräfta köp?', - ['yes'] = 'ja (%s SEK)', - ['no'] = 'nej', - ['helmet'] = 'hjälm / hat', - ['glasses'] = 'glasögon', - ['mask'] = 'ansiktsmask', - ['ears'] = 'örontillbehör', + ['valid_purchase'] = 'Bekräfta köp?', + ['yes'] = 'Ja (%s SEK)', + ['no'] = 'Nej', + ['helmet'] = 'Hjälm / hatt', + ['glasses'] = 'Glasögon', + ['mask'] = 'Mask', + ['ears'] = 'Öron tillbehör', ['shop'] = '%s affär', - ['set_unset'] = 'ta på / av', - ['not_enough_money'] = 'du har inte råd!', - ['press_access'] = 'tryck ~INPUT_CONTEXT~ för att öppna menyn.', - ['accessories_blip'] = 'extrautröstning', - ['no_ears'] = 'du har inga öron tillbehör', - ['no_glasses'] = 'du har inga glasögon', - ['no_helmet'] = 'du har ingen hjälm', - ['no_mask'] = 'du har inte någon mask', - ['you_paid'] = 'du har betalat ~g~%s SEK~s~', -} + ['set_unset'] = 'Ta på / av', + ['not_enough_money'] = 'Du har inte tillräckligt med pengar', + ['press_access'] = 'Tryck ~INPUT_CONTEXT~ för att komma åt menyn', + ['accessories_blip'] = 'Tillbehör', + ['no_ears'] = 'Du har inga örontillbehör', + ['no_glasses'] = 'Du har inga glasögon', + ['no_helmet'] = 'Du har ingen hjälm', + ['no_mask'] = 'Du har ingen mask', + ['you_paid'] = 'Du betalade ~g~%s SEK~s~', +} \ No newline at end of file From 4ca2be7d87d06828a5888392c887c0df9457dddf Mon Sep 17 00:00:00 2001 From: JonarSonaer Date: Sun, 6 Mar 2022 22:15:27 +0100 Subject: [PATCH 068/132] Updated Swedish Translations --- [esx_addons]/esx_ambulancejob/locales/sv.lua | 140 +++++++++---------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/[esx_addons]/esx_ambulancejob/locales/sv.lua b/[esx_addons]/esx_ambulancejob/locales/sv.lua index 45eb082a..92e86e67 100644 --- a/[esx_addons]/esx_ambulancejob/locales/sv.lua +++ b/[esx_addons]/esx_ambulancejob/locales/sv.lua @@ -1,85 +1,85 @@ Locales['sv'] = { -- Cloakroom - ['cloakroom'] = 'omklädnignsrum', - ['ems_clothes_civil'] = 'civilkläder', - ['ems_clothes_ems'] = 'ambulanskläder', + ['cloakroom'] = 'Omklädnignsrum', + ['ems_clothes_civil'] = 'Civil klädsel', + ['ems_clothes_ems'] = 'Ambulanskläder', -- Vehicles - ['ambulance'] = 'ambulans', - ['helicopter_prompt'] = 'tryck ~INPUT_CONTEXT~ för att komma åt ~y~helikoptergaraget~s~.', - ['garage_prompt'] = 'tryck ~INPUT_CONTEXT~ för att komma åt ~y~garaget~s~.', - ['garage_title'] = 'garage', - ['garage_stored'] = 'inställt', - ['garage_notstored'] = 'uttaget', - ['garage_storing'] = 'vi håller på att ställa in ditt fordon, se till att ingen är i närheten.', - ['garage_has_stored'] = 'fordonet har ställts in i garaget', - ['garage_has_notstored'] = 'inget ägt fordon finns i närheten', - ['garage_notavailable'] = 'ditt fordon är inte inställt i ditt garage.', - ['garage_blocked'] = 'det finns ingen tillgänglig plats att ställa ut fordonet på!', - ['garage_empty'] = 'du har inga fordon i ditt garage.', - ['garage_released'] = 'ditt fordon har tagits ut från garaget.', - ['garage_store_nearby'] = 'det finns inget fordon i närheten.', - ['garage_storeditem'] = 'öppna garage', - ['garage_storeitem'] = 'ställ in fordon', - ['garage_buyitem'] = 'fordonshandel', + ['ambulance'] = 'Ambulans', + ['helicopter_prompt'] = 'Tryck ~INPUT_CONTEXT~ för att komma åt ~y~Helikoptergaraget~s~.', + ['garage_prompt'] = 'Tryck ~INPUT_CONTEXT~ för att komma åt ~y~Garaget~s~.', + ['garage_title'] = 'Garage', + ['garage_stored'] = 'Inställt', + ['garage_notstored'] = 'Uttaget', + ['garage_storing'] = 'Vi håller på att ställa in ditt fordon, se till att ingen är i närheten.', + ['garage_has_stored'] = 'Fordonet har ställts in i garaget', + ['garage_has_notstored'] = 'Inget ägt fordon finns i närheten', + ['garage_notavailable'] = 'Ditt fordon förvaras inte i garaget.', + ['garage_blocked'] = 'Det finns ingen tillgänglig plats att ställa ut fordonet på!', + ['garage_empty'] = 'Du har inga fordon i ditt garage.', + ['garage_released'] = 'Ditt fordon har tagits ut från garaget.', + ['garage_store_nearby'] = 'Det finns inga fordon i närheten.', + ['garage_storeditem'] = 'Öppna garaget', + ['garage_storeitem'] = 'Förvara fordon i garaget', + ['garage_buyitem'] = 'Fordonsbutik', ['shop_item'] = '%s SEK', - ['vehicleshop_title'] = 'fordonshandel', - ['vehicleshop_confirm'] = 'vill du köpa detta fordon?', - ['vehicleshop_bought'] = 'du köpte ~y~%s~s~ för ~g~%s SEK~s~', - ['vehicleshop_money'] = 'du har inte råd med detta fordon', - ['vehicleshop_awaiting_model'] = 'fordonet ~g~LADDAS NED OCH LADDAS IN~s~ var god vänta', - ['confirm_no'] = 'nej', - ['confirm_yes'] = 'ja', + ['vehicleshop_title'] = 'Fordonsbutik', + ['vehicleshop_confirm'] = 'Vill du köpa detta fordon?', + ['vehicleshop_bought'] = 'Du har köpt ~y~%s~s~ för ~g~%s SEK~s~', + ['vehicleshop_money'] = 'Du har inte råd med det fordonet', + ['vehicleshop_awaiting_model'] = 'Fordonet ~g~LADDAS NED OCH LADDAS IN~s~ var god vänta', + ['confirm_no'] = 'Nej', + ['confirm_yes'] = 'Ja', -- Action Menu - ['revive_inprogress'] = 'en återupplivning har börjats', - ['revive_complete'] = 'du har återupplivat ~y~%s~s~, bra jobbat!', - ['revive_complete_award'] = 'du har återupplivat ~y~%s~s~ och tjänat ~g~%s SEK~s~ för dina tjänster, bra jobbat!', - ['revive_fail_offline'] = 'den spelaren har lämnat servern', - ['heal_inprogress'] = 'du behandlar patienten!', - ['heal_complete'] = 'du har behandlat ~y~%s~s~', - ['no_players'] = 'det finns inga spelare i närheten!', - ['player_not_unconscious'] = 'spelaren är inte medvetslös!', - ['player_not_conscious'] = 'spelaren är inte vid medvetande!', + ['revive_inprogress'] = 'En återupplivning pågår', + ['revive_complete'] = 'Du har återupplivat ~y~%s~s~, bra jobbat!', + ['revive_complete_award'] = 'Du har återupplivat ~y~%s~s~ och tjänat ~g~%s SEK~s~', + ['revive_fail_offline'] = 'Den spelaren är inte längre online', + ['heal_inprogress'] = 'Du behandlar patienten!', + ['heal_complete'] = 'Du har behandlat ~y~%s~s~', + ['no_players'] = 'Inga spelare i närheten', + ['player_not_unconscious'] = 'Den spelaren är inte medvetslös!', + ['player_not_conscious'] = 'Den spelaren är inte vid medvetande!', -- Boss Menu - ['boss_actions'] = 'chefsmeny', + ['boss_actions'] = 'Chefsmeny', -- Misc ['invalid_amount'] = '~r~Ogiltig mängd', - ['actions_prompt'] = 'tryck ~INPUT_CONTEXT~ för att öppna menyn.', - ['deposit_amount'] = 'mängd att sätta in', - ['money_withdraw'] = 'mängd att ta ut', - ['fast_travel'] = 'tryck på ~INPUT_CONTEXT~ för att snabbresa.', - ['open_pharmacy'] = 'tryck på ~INPUT_CONTEXT~ för att öppna apoteket.', - ['pharmacy_menu_title'] = 'apotek', - ['pharmacy_take'] = 'ta %s', - ['medikit'] = 'akutväska', - ['bandage'] = 'bandage', - ['max_item'] = 'du har redan tillräckligt mycket på dig.', + ['actions_prompt'] = 'Tryck ~INPUT_CONTEXT~ för att öppna menyn.', + ['deposit_amount'] = 'Mängd att sätta in', + ['money_withdraw'] = 'Mängd att ta ut', + ['fast_travel'] = 'Tryck på ~INPUT_CONTEXT~ för att snabbresa.', + ['open_pharmacy'] = 'Tryck på ~INPUT_CONTEXT~ för att öppna apoteket.', + ['pharmacy_menu_title'] = 'Apotek', + ['pharmacy_take'] = 'Ta %s', + ['medikit'] = 'Akutväska', + ['bandage'] = 'Bandage', + ['max_item'] = 'Du bär redan tillräckligt.', -- F6 Menu - ['ems_menu'] = 'ambulansmeny', - ['ems_menu_title'] = 'ambulansmeny', - ['ems_menu_revive'] = 'återuppliva spelare', - ['ems_menu_putincar'] = 'sätt i fordon', - ['ems_menu_small'] = 'behandla mindre skador', - ['ems_menu_big'] = 'behandla svåra skador', - ['ems_menu_search'] = 'patienten hittades inte', + ['ems_menu'] = 'Ambulansmeny', + ['ems_menu_title'] = 'Ambulansmeny', + ['ems_menu_revive'] = 'Återuppliva spelare', + ['ems_menu_putincar'] = 'Sätt i fordonet', + ['ems_menu_small'] = 'Behandla mindre skador', + ['ems_menu_big'] = 'Behandla allvarliga skador', + ['ems_menu_search'] = 'Patienten hittades inte', -- Phone - ['alert_ambulance'] = 'ambulanssamtal', + ['alert_ambulance'] = 'Ambulanssamtal', -- Death - ['respawn_available_in'] = 'respawn tillgänglig om ~b~%s:%s~s~', - ['respawn_bleedout_in'] = 'du kommer att förblöda om ~b~%s:%s~s~\n', - ['respawn_bleedout_prompt'] = 'håll [~b~E~s~] för att respawna', - ['respawn_bleedout_fine'] = 'håll [~b~E~s~] för att respawna, kostar ~g~%s SEK~s~', - ['respawn_bleedout_fine_msg'] = 'du betalade ~r~%s SEK~s~ för att respawna.', - ['distress_send'] = 'tryck ~b~[G]~s~ för att skicka nödsignal', - ['distress_sent'] = 'nödsignal har skickats till samtliga enheter!', + ['respawn_available_in'] = 'Respawn tillgänglig om ~b~%s:%s~s~', + ['respawn_bleedout_in'] = 'Du kommer att förblöda om ~b~%s:%s~s~\n', + ['respawn_bleedout_prompt'] = 'Håll [~b~E~s~] för att återuppstå', + ['respawn_bleedout_fine'] = 'Håll [~b~E~s~] för att återuppstå, kostar ~g~%s SEK~s~', + ['respawn_bleedout_fine_msg'] = 'Du betalade ~r~%s SEK~s~ för att återuppstå.', + ['distress_send'] = 'Tryck ~b~[G]~s~ för att skicka nödsignal', + ['distress_sent'] = 'Nödsignal har skickats till tillgängliga enheter!', -- Revive - ['revive_help'] = 'återuppliva en spelare', + ['revive_help'] = 'Återuppliva en spelare', -- Item - ['used_medikit'] = 'du har använt ~y~1x~s~ ~b~Akutväska~s~', - ['used_bandage'] = 'du har använt ~y~1x~s~ ~b~Bandage~s~', - ['not_enough_medikit'] = 'du har ingen ~b~Akutväska~s~.', - ['not_enough_bandage'] = 'du har inget ~b~Bandage~s~.', - ['healed'] = 'dina skador har blivit behandlade.', + ['used_medikit'] = 'Du har använt ~y~1x~s~ ~b~Akutväska~s~', + ['used_bandage'] = 'Du har använt ~y~1x~s~ ~b~Bandage~s~', + ['not_enough_medikit'] = 'Du har inte ~b~Akutväska~s~.', + ['not_enough_bandage'] = 'Du har inte ~b~Bandage~s~.', + ['healed'] = 'Du har blivit behandlad.', -- Blips - ['blip_hospital'] = 'sjukhus', - ['blip_dead'] = 'medvetslös människa', + ['blip_hospital'] = 'Sjukhus', + ['blip_dead'] = 'Medvetslös spelare', } From 45f024f0a6820ed069f2c4f52dd99016535fe751 Mon Sep 17 00:00:00 2001 From: JonarSonaer Date: Sun, 6 Mar 2022 22:17:19 +0100 Subject: [PATCH 069/132] Updated Swedish Translations --- [esx_addons]/esx_atm/locales/sv.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/[esx_addons]/esx_atm/locales/sv.lua b/[esx_addons]/esx_atm/locales/sv.lua index 9567b45a..00dd5de5 100644 --- a/[esx_addons]/esx_atm/locales/sv.lua +++ b/[esx_addons]/esx_atm/locales/sv.lua @@ -1,7 +1,7 @@ Locales['sv'] = { ['invalid_amount'] = '~r~Det är en ogiltig summa pengar~s~', - ['deposit_money'] = 'du satte in ~g~$%s~s~', - ['withdraw_money'] = 'du har tagit ut ~g~$%s~s~', - ['press_e_atm'] = 'tryck ~INPUT_PICKUP~ för att komma åt denna ~g~ATM~s~', - ['atm_blip'] = 'bankomat', + ['deposit_money'] = 'Du har satt in ~g~$%s~s~', + ['withdraw_money'] = 'Du har tagit ut ~g~$%s~s~', + ['press_e_atm'] = 'Tryck ~INPUT_PICKUP~ för att komma åt denna ~g~Bankomat~s~', + ['atm_blip'] = 'Bankomat', } From e22de02b0c92cc736815a5e991a4cc277fbe5485 Mon Sep 17 00:00:00 2001 From: JonarSonaer Date: Sun, 6 Mar 2022 22:20:31 +0100 Subject: [PATCH 070/132] Updated Swedish Translations --- [esx_addons]/esx_bankerjob/locales/sv.lua | 32 +++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/[esx_addons]/esx_bankerjob/locales/sv.lua b/[esx_addons]/esx_bankerjob/locales/sv.lua index eaef4ade..e56f5808 100644 --- a/[esx_addons]/esx_bankerjob/locales/sv.lua +++ b/[esx_addons]/esx_bankerjob/locales/sv.lua @@ -1,18 +1,18 @@ Locales['sv'] = { - ['actions'] = 'handling', - ['amount'] = 'belopp', - ['balance'] = 'balans', - ['bank'] = 'bank', - ['bill_amount'] = 'räkning belopp', - ['billing'] = 'räkning', - ['customer'] = 'kund', - ['customers'] = 'kunder', - ['deposit'] = 'insättning', - ['invalid_amount'] = 'ogiltig belopp', - ['no_player_nearby'] = 'det hittades inga spelare i närheten.', - ['press_input_context_to_open_menu'] = 'tryck ~INPUT_CONTEXT~ för att öppna ~g~bankmenyn~s~.', - ['withdraw'] = 'ta ut', - ['boss_actions'] = 'chef handlingar', - ['phone_receive'] = 'bank meddelande mottaget', - ['phone_label'] = 'bank', + ['actions'] = 'Handlingar', + ['amount'] = 'Belopp', + ['balance'] = 'Saldo', + ['bank'] = 'Bank', + ['bill_amount'] = 'Räkningsbelopp', + ['billing'] = 'Fakturering', + ['customer'] = 'Kund', + ['customers'] = 'Kunder', + ['deposit'] = 'Insättning', + ['invalid_amount'] = 'Ogiltig belopp', + ['no_player_nearby'] = 'Ingen spelare i närheten', + ['press_input_context_to_open_menu'] = 'Tryck ~INPUT_CONTEXT~ för att öppna ~g~Bankmenyn~s~.', + ['withdraw'] = 'Ta ut', + ['boss_actions'] = 'Chef handlingar', + ['phone_receive'] = 'Bank meddelande mottaget', + ['phone_label'] = 'Bank', } From 09ce85123d693ddfe54c1bb764b95864418b12b7 Mon Sep 17 00:00:00 2001 From: Dolu <47056777+dolutattoo@users.noreply.github.com> Date: Sat, 12 Mar 2022 03:44:30 +0100 Subject: [PATCH 071/132] fix(server): await player slots --- server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/main.lua b/server/main.lua index 6b3fd4f8..266c560c 100644 --- a/server/main.lua +++ b/server/main.lua @@ -48,7 +48,7 @@ elseif ESX.GetConfig().Multichar == true then local identifier = GetIdentifier(source) ESX.Players[identifier] = true - local slots = MySQL.scalar('SELECT slots FROM multicharacter_slots WHERE identifier = ?', { identifier }) or SLOTS + local slots = MySQL.scalar.await('SELECT slots FROM multicharacter_slots WHERE identifier = ?', { identifier }) or SLOTS identifier = PREFIX..'%:'..identifier local result = MySQL.query.await(FETCH, {identifier, slots}) From be158cbfbcf5e39c4c4e77b894a9ae981658d6ec Mon Sep 17 00:00:00 2001 From: Dr Bad <58116609+Dr-Bad@users.noreply.github.com> Date: Wed, 16 Mar 2022 22:48:33 +0330 Subject: [PATCH 072/132] Fix: add missing esx_dmvschool sql --- [SQL]/legacy.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/[SQL]/legacy.sql b/[SQL]/legacy.sql index ae6c1840..3a0319a0 100644 --- a/[SQL]/legacy.sql +++ b/[SQL]/legacy.sql @@ -317,6 +317,10 @@ CREATE TABLE `licenses` ( -- INSERT INTO `licenses` (`type`, `label`) VALUES +('dmv', 'Code de la route'), +('drive', 'Permis de conduire'), +('drive_bike', 'Permis moto'), +('drive_truck', 'Permis camion'), ('weed_processing', 'Weed Processing License'); -- -------------------------------------------------------- From bd6972ac0a9a43e4b12c368615f589d169e07490 Mon Sep 17 00:00:00 2001 From: Dr Bad <58116609+Dr-Bad@users.noreply.github.com> Date: Wed, 16 Mar 2022 22:52:43 +0330 Subject: [PATCH 073/132] fr => en --- [SQL]/legacy.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/[SQL]/legacy.sql b/[SQL]/legacy.sql index 3a0319a0..ad8a92b1 100644 --- a/[SQL]/legacy.sql +++ b/[SQL]/legacy.sql @@ -317,10 +317,10 @@ CREATE TABLE `licenses` ( -- INSERT INTO `licenses` (`type`, `label`) VALUES -('dmv', 'Code de la route'), -('drive', 'Permis de conduire'), -('drive_bike', 'Permis moto'), -('drive_truck', 'Permis camion'), +('dmv', 'Driving Permit'), +('drive', 'Drivers License'), +('drive_bike', 'Motorcycle License'), +('drive_truck', 'Commercial Drivers License'), ('weed_processing', 'Weed Processing License'); -- -------------------------------------------------------- From ac7459d05a08ea2c4bb9313bfb7bfe978c513249 Mon Sep 17 00:00:00 2001 From: Tinky <48660658+Tinky124@users.noreply.github.com> Date: Sun, 20 Mar 2022 20:02:23 +0100 Subject: [PATCH 074/132] Protection, fixed giving weapons components, tints --- [esx]/es_extended/server/main.lua | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/[esx]/es_extended/server/main.lua b/[esx]/es_extended/server/main.lua index 37584df5..f9ee2366 100644 --- a/[esx]/es_extended/server/main.lua +++ b/[esx]/es_extended/server/main.lua @@ -360,6 +360,11 @@ if not Config.OxInventory then local playerId = source local sourceXPlayer = ESX.GetPlayerFromId(playerId) local targetXPlayer = ESX.GetPlayerFromId(target) + local distance = #(GetEntityCoords(GetPlayerPed(playerId)) - GetEntityCoords(GetPlayerPed(target))) + if not sourceXPlayer then return end + if not targetXPlayer then print("Cheating: " .. GetPlayerName(playerId)) return end + if distance > 4.0 then print("Cheating: " .. GetPlayerName(playerId)) return end + if type == 'item_standard' then local sourceItem = sourceXPlayer.getInventoryItem(itemName) @@ -390,12 +395,20 @@ if not Config.OxInventory then elseif type == 'item_weapon' then if sourceXPlayer.hasWeapon(itemName) then local weaponLabel = ESX.GetWeaponLabel(itemName) - if not targetXPlayer.hasWeapon(itemName) then local _, weapon = sourceXPlayer.getWeapon(itemName) local _, weaponObject = ESX.GetWeapon(itemName) itemCount = weapon.ammo - + local weaponComponents = ESX.Table.Clone(weapon.components) + local weaponTint = weapon.tintIndex + if weaponTint then + targetXPlayer.setWeaponTint(itemName, weaponTint) + end + if weaponComponents then + for k, v in pairs(weaponComponents) do + targetXPlayer.addWeaponComponent(itemName, v) + end + end sourceXPlayer.removeWeapon(itemName) targetXPlayer.addWeapon(itemName, itemCount) From d659a73d182a5febd1e0cfc2b184f2c203693da5 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Tue, 22 Mar 2022 21:35:15 +0000 Subject: [PATCH 075/132] Delete esx_multicharacter --- [esx_addons]/esx_multicharacter | 1 - 1 file changed, 1 deletion(-) delete mode 160000 [esx_addons]/esx_multicharacter diff --git a/[esx_addons]/esx_multicharacter b/[esx_addons]/esx_multicharacter deleted file mode 160000 index 02352a8e..00000000 --- a/[esx_addons]/esx_multicharacter +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 02352a8e18176cb9f369ba608aab66ccf0311fe0 From e6dd5a5f2c11765609582a197c20b3035fc3c264 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Tue, 22 Mar 2022 22:08:02 +0000 Subject: [PATCH 076/132] Feat: Add Official Multicharacter Added ESX_Mulicharacter bumped version to 1.6.5 Fixed es_extended/version.json --- [SQL]/legacy.sql | 14 + [esx]/es_extended/config.lua | 2 +- [esx]/es_extended/fxmanifest.lua | 2 +- [esx]/es_extended/version.json | 4 +- [esx]/esx_identity/fxmanifest.lua | 2 +- [esx]/esx_menu_default/fxmanifest.lua | 2 +- [esx]/esx_menu_dialog/fxmanifest.lua | 2 +- [esx]/esx_menu_list/fxmanifest.lua | 2 +- [esx]/esx_multicharacter/LICENSE.md | 674 ++++++++++++++++++ [esx]/esx_multicharacter/client/main.lua | 335 +++++++++ [esx]/esx_multicharacter/config.lua | 129 ++++ .../esx_multicharacter/esx_multicharacter.sql | 9 + [esx]/esx_multicharacter/fxmanifest.lua | 39 + [esx]/esx_multicharacter/html/css/main.css | 70 ++ [esx]/esx_multicharacter/html/js/app.js | 35 + [esx]/esx_multicharacter/html/locales/cs.js | 8 + [esx]/esx_multicharacter/html/locales/de.js | 8 + [esx]/esx_multicharacter/html/locales/en.js | 8 + [esx]/esx_multicharacter/html/locales/fr.js | 8 + [esx]/esx_multicharacter/html/locales/pl.js | 8 + [esx]/esx_multicharacter/html/locales/pt.js | 8 + [esx]/esx_multicharacter/html/locales/tr.js | 8 + [esx]/esx_multicharacter/html/ui.html | 24 + [esx]/esx_multicharacter/locales/cs.lua | 25 + [esx]/esx_multicharacter/locales/de.lua | 11 + [esx]/esx_multicharacter/locales/en.lua | 25 + [esx]/esx_multicharacter/locales/it.lua | 25 + [esx]/esx_multicharacter/locales/pt.lua | 11 + [esx]/esx_multicharacter/locales/tr.lua | 11 + [esx]/esx_multicharacter/readme.md | 59 ++ [esx]/esx_multicharacter/server/commands.lua | 79 ++ [esx]/esx_multicharacter/server/main.lua | 221 ++++++ [esx]/esx_skin/fxmanifest.lua | 2 +- [esx_addons]/esx_accessories/fxmanifest.lua | 2 +- [esx_addons]/esx_addonaccount/fxmanifest.lua | 2 +- .../esx_addoninventory/fxmanifest.lua | 2 +- [esx_addons]/esx_ambulancejob/fxmanifest.lua | 4 +- [esx_addons]/esx_animations/fxmanifest.lua | 2 +- [esx_addons]/esx_atm/fxmanifest.lua | 2 +- [esx_addons]/esx_bankerjob/fxmanifest.lua | 2 +- [esx_addons]/esx_barbershop/fxmanifest.lua | 2 +- [esx_addons]/esx_basicneeds/fxmanifest.lua | 2 +- [esx_addons]/esx_billing/fxmanifest.lua | 2 +- [esx_addons]/esx_boat/fxmanifest.lua | 2 +- [esx_addons]/esx_clotheshop/fxmanifest.lua | 2 +- [esx_addons]/esx_cruisecontrol/fxmanifest.lua | 2 +- [esx_addons]/esx_datastore/fxmanifest.lua | 2 +- [esx_addons]/esx_dmvschool/fxmanifest.lua | 2 +- [esx_addons]/esx_drugs/fxmanifest.lua | 2 +- [esx_addons]/esx_garage/fxmanifest.lua | 2 +- [esx_addons]/esx_holdup/fxmanifest.lua | 2 +- [esx_addons]/esx_joblisting/fxmanifest.lua | 2 +- [esx_addons]/esx_jobs/fxmanifest.lua | 2 +- [esx_addons]/esx_license/fxmanifest.lua | 2 +- [esx_addons]/esx_lscustom/fxmanifest.lua | 2 +- [esx_addons]/esx_mechanicjob/fxmanifest.lua | 2 +- [esx_addons]/esx_optionalneeds/fxmanifest.lua | 2 +- [esx_addons]/esx_phone/fxmanifest.lua | 2 +- [esx_addons]/esx_policejob/fxmanifest.lua | 2 +- [esx_addons]/esx_property/fxmanifest.lua | 2 +- .../esx_realestateagentjob/fxmanifest.lua | 2 +- [esx_addons]/esx_rpchat/fxmanifest.lua | 2 +- [esx_addons]/esx_service/fxmanifest.lua | 2 +- [esx_addons]/esx_shops/fxmanifest.lua | 2 +- [esx_addons]/esx_sit/fxmanifest.lua | 2 +- [esx_addons]/esx_society/fxmanifest.lua | 2 +- [esx_addons]/esx_status/fxmanifest.lua | 2 +- [esx_addons]/esx_taxijob/fxmanifest.lua | 2 +- [esx_addons]/esx_vehicleshop/fxmanifest.lua | 2 +- [esx_addons]/esx_voice/fxmanifest.lua | 2 +- [esx_addons]/esx_weaponshop/fxmanifest.lua | 2 +- [esx_addons]/esx_whitelist/fxmanifest.lua | 2 +- [esx_addons]/instance/fxmanifest.lua | 2 +- 73 files changed, 1902 insertions(+), 50 deletions(-) create mode 100644 [esx]/esx_multicharacter/LICENSE.md create mode 100644 [esx]/esx_multicharacter/client/main.lua create mode 100644 [esx]/esx_multicharacter/config.lua create mode 100644 [esx]/esx_multicharacter/esx_multicharacter.sql create mode 100644 [esx]/esx_multicharacter/fxmanifest.lua create mode 100644 [esx]/esx_multicharacter/html/css/main.css create mode 100644 [esx]/esx_multicharacter/html/js/app.js create mode 100644 [esx]/esx_multicharacter/html/locales/cs.js create mode 100644 [esx]/esx_multicharacter/html/locales/de.js create mode 100644 [esx]/esx_multicharacter/html/locales/en.js create mode 100644 [esx]/esx_multicharacter/html/locales/fr.js create mode 100644 [esx]/esx_multicharacter/html/locales/pl.js create mode 100644 [esx]/esx_multicharacter/html/locales/pt.js create mode 100644 [esx]/esx_multicharacter/html/locales/tr.js create mode 100644 [esx]/esx_multicharacter/html/ui.html create mode 100644 [esx]/esx_multicharacter/locales/cs.lua create mode 100644 [esx]/esx_multicharacter/locales/de.lua create mode 100644 [esx]/esx_multicharacter/locales/en.lua create mode 100644 [esx]/esx_multicharacter/locales/it.lua create mode 100644 [esx]/esx_multicharacter/locales/pt.lua create mode 100644 [esx]/esx_multicharacter/locales/tr.lua create mode 100644 [esx]/esx_multicharacter/readme.md create mode 100644 [esx]/esx_multicharacter/server/commands.lua create mode 100644 [esx]/esx_multicharacter/server/main.lua diff --git a/[SQL]/legacy.sql b/[SQL]/legacy.sql index ae6c1840..f59c0ee1 100644 --- a/[SQL]/legacy.sql +++ b/[SQL]/legacy.sql @@ -112,6 +112,19 @@ CREATE TABLE `cardealer_vehicles` ( -- -------------------------------------------------------- +-- +-- Table structure for table `multicharacter_slots` +-- + +CREATE TABLE `multicharacter_slots` ( + `identifier` VARCHAR(60) NOT NULL, + `slots` INT(11) NOT NULL, + PRIMARY KEY (`identifier`) USING BTREE, + INDEX `slots` (`slots`) USING BTREE +) ENGINE=InnoDB; + +-- -------------------------------------------------------- + -- -- Table structure for table `datastore` -- @@ -501,6 +514,7 @@ CREATE TABLE `users` ( `status` longtext DEFAULT NULL, `is_dead` tinyint(1) DEFAULT 0, `id` int(11) NOT NULL, + `disabled` TINYINT(1) NULL DEFAULT '0', `last_property` varchar(255) DEFAULT NULL ) ENGINE=InnoDB; diff --git a/[esx]/es_extended/config.lua b/[esx]/es_extended/config.lua index 6d9f4203..d18705bd 100644 --- a/[esx]/es_extended/config.lua +++ b/[esx]/es_extended/config.lua @@ -18,5 +18,5 @@ Config.EnableDefaultInventory = true -- Display the default Inventory ( F2 ) Config.EnableWantedLevel = false -- Use Normal GTA wanted Level? Config.EnablePVP = true -- Allow Player to player combat -Config.Multichar = false -- Enable support for esx_multicharacter +Config.Multichar = true -- Enable support for esx_multicharacter Config.Identity = true -- Select a characters identity data before they have loaded in (this happens by default with multichar) diff --git a/[esx]/es_extended/fxmanifest.lua b/[esx]/es_extended/fxmanifest.lua index d25a3e5e..5fdb4c7b 100644 --- a/[esx]/es_extended/fxmanifest.lua +++ b/[esx]/es_extended/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ES Extended' -version '1.6.0' +version '1.6.5' shared_scripts { 'locale.lua', diff --git a/[esx]/es_extended/version.json b/[esx]/es_extended/version.json index 9f3db69d..147774cd 100644 --- a/[esx]/es_extended/version.json +++ b/[esx]/es_extended/version.json @@ -1,5 +1,5 @@ { "version": "legacy", - "commit" : "1.4.2", - "changelog": "\n- Updated `Car` Command. Fixed some vulnerabilities. Fix SQL. Updated Commands." + "commit" : "1.6.5", + "changelog": "\n- Added Official Multicharacter" } diff --git a/[esx]/esx_identity/fxmanifest.lua b/[esx]/esx_identity/fxmanifest.lua index 1c4e4baf..79254f5e 100644 --- a/[esx]/esx_identity/fxmanifest.lua +++ b/[esx]/esx_identity/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Identity' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx]/esx_menu_default/fxmanifest.lua b/[esx]/esx_menu_default/fxmanifest.lua index 64a36d7f..7139cca2 100644 --- a/[esx]/esx_menu_default/fxmanifest.lua +++ b/[esx]/esx_menu_default/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Menu Default' -version '1.6.0' +version '1.6.5' client_scripts { '@es_extended/imports.lua', diff --git a/[esx]/esx_menu_dialog/fxmanifest.lua b/[esx]/esx_menu_dialog/fxmanifest.lua index 1959b086..3a84362b 100644 --- a/[esx]/esx_menu_dialog/fxmanifest.lua +++ b/[esx]/esx_menu_dialog/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Menu Dialog' -version '1.6.0' +version '1.6.5' client_scripts { '@es_extended/imports.lua', diff --git a/[esx]/esx_menu_list/fxmanifest.lua b/[esx]/esx_menu_list/fxmanifest.lua index b980e57e..f267511a 100644 --- a/[esx]/esx_menu_list/fxmanifest.lua +++ b/[esx]/esx_menu_list/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Menu List' -version '1.6.0' +version '1.6.5' client_scripts { '@es_extended/imports.lua', diff --git a/[esx]/esx_multicharacter/LICENSE.md b/[esx]/esx_multicharacter/LICENSE.md new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/[esx]/esx_multicharacter/LICENSE.md @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/[esx]/esx_multicharacter/client/main.lua b/[esx]/esx_multicharacter/client/main.lua new file mode 100644 index 00000000..cb10ca8f --- /dev/null +++ b/[esx]/esx_multicharacter/client/main.lua @@ -0,0 +1,335 @@ +ESX = exports['es_extended']:getSharedObject() +if ESX.GetConfig().Multichar then + + Citizen.CreateThread(function() + while not ESX.PlayerLoaded do + Citizen.Wait(0) + if NetworkIsPlayerActive(PlayerId()) then + exports.spawnmanager:setAutoSpawn(false) + DoScreenFadeOut(0) + while not GetResourceState('esx_menu_default') == 'started' do + Citizen.Wait(0) + end + TriggerEvent("esx_multicharacter:SetupCharacters") + break + end + end + end) + + local canRelog, cam, spawned = true, nil, nil + local Characters = {} + + RegisterNetEvent('esx_multicharacter:SetupCharacters') + AddEventHandler('esx_multicharacter:SetupCharacters', function() + ESX.PlayerLoaded = false + ESX.PlayerData = {} + spawned = false + cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true) + local playerPed = PlayerPedId() + SetEntityCoords(playerPed, Config.Spawn.x, Config.Spawn.y, Config.Spawn.z, true, false, false, false) + SetEntityHeading(playerPed, Config.Spawn.w) + local offset = GetOffsetFromEntityInWorldCoords(playerPed, 0, 1.7, 0.4) + DoScreenFadeOut(0) + SetCamActive(cam, true) + RenderScriptCams(true, false, 1, true, true) + SetCamCoord(cam, offset.x, offset.y, offset.z) + PointCamAtCoord(cam, Config.Spawn.x, Config.Spawn.y, Config.Spawn.z + 1.3) + ESX.UI.Menu.CloseAll() + ESX.UI.HUD.SetDisplay(0.0) + StartLoop() + ShutdownLoadingScreen() + ShutdownLoadingScreenNui() + TriggerEvent('esx:loadingScreenOff') + Citizen.Wait(200) + TriggerServerEvent("esx_multicharacter:SetupCharacters") + end) + + StartLoop = function() + hidePlayers = true + MumbleSetVolumeOverride(PlayerId(), 0.0) + Citizen.CreateThread(function() + local keys = {18, 27, 172, 173, 174, 175, 176, 177, 187, 188, 191, 201, 108, 109} + while hidePlayers do + DisableAllControlActions(0) + for i = 1, #keys do + EnableControlAction(0, keys[i], true) + end + SetEntityVisible(PlayerPedId(), 0, 0) + SetLocalPlayerVisibleLocally(1) + SetPlayerInvincible(PlayerId(), 1) + ThefeedHideThisFrame() + HideHudComponentThisFrame(11) + HideHudComponentThisFrame(12) + HideHudComponentThisFrame(21) + HideHudAndRadarThisFrame() + Citizen.Wait(0) + local vehicles = GetGamePool('CVehicle') + for i = 1, #vehicles do + SetEntityLocallyInvisible(vehicles[i]) + end + end + local playerId, playerPed = PlayerId(), PlayerPedId() + MumbleSetVolumeOverride(playerId, -1.0) + SetEntityVisible(playerPed, 1, 0) + SetPlayerInvincible(playerId, 0) + FreezeEntityPosition(playerPed, false) + Citizen.Wait(10000) + canRelog = true + end) + Citizen.CreateThread(function() + local playerPool = {} + while hidePlayers do + local players = GetActivePlayers() + for i = 1, #players do + local player = players[i] + if player ~= PlayerId() and not playerPool[player] then + playerPool[player] = true + NetworkConcealPlayer(player, true, true) + end + end + Citizen.Wait(500) + end + for k in pairs(playerPool) do + NetworkConcealPlayer(k, false, false) + end + end) + end + + SetupCharacter = function(index) + if spawned == false then + exports.spawnmanager:spawnPlayer({ + x = Config.Spawn.x, + y = Config.Spawn.y, + z = Config.Spawn.z, + heading = Config.Spawn.w, + model = Characters[index].model or `mp_m_freemode_01`, + skipFade = true + }, function() + canRelog = false + if Characters[index] then + local skin = Characters[index].skin or Config.Default + if not Characters[index].model then + if Characters[index].sex == _('female') then skin.sex = 1 else skin.sex = 0 end + end + TriggerEvent('skinchanger:loadSkin', skin) + end + DoScreenFadeIn(400) + end) + repeat Citizen.Wait(200) until not IsScreenFadedOut() + + elseif Characters[index] and Characters[index].skin then + if Characters[spawned] and Characters[spawned].model then + RequestModel(Characters[index].model) + while not HasModelLoaded(Characters[index].model) do + RequestModel(Characters[index].model) + Citizen.Wait(0) + end + SetPlayerModel(PlayerId(), Characters[index].model) + SetModelAsNoLongerNeeded(Characters[index].model) + end + TriggerEvent('skinchanger:loadSkin', Characters[index].skin) + end + spawned = index + local playerPed = PlayerPedId() + FreezeEntityPosition(PlayerPedId(), true) + SetPedAoBlobRendering(playerPed, true) + SetEntityAlpha(playerPed, 255) + SendNUIMessage({ + action = "openui", + character = Characters[spawned] + }) + end + + RegisterNetEvent('esx_multicharacter:SetupUI') + AddEventHandler('esx_multicharacter:SetupUI', function(data, slots) + DoScreenFadeOut(0) + Characters = data + slots = slots + local elements = {} + local Character = next(Characters) + exports.spawnmanager:forceRespawn() + + if Character == nil then + SendNUIMessage({ + action = "closeui" + }) + exports.spawnmanager:spawnPlayer({ + x = Config.Spawn.x, + y = Config.Spawn.y, + z = Config.Spawn.z, + heading = Config.Spawn.w, + model = `mp_m_freemode_01`, + skipFade = true + }, function() + canRelog = false + DoScreenFadeIn(400) + Citizen.Wait(400) + local playerPed = PlayerPedId() + SetPedAoBlobRendering(playerPed, false) + SetEntityAlpha(playerPed, 0) + TriggerServerEvent('esx_multicharacter:CharacterChosen', 1, true) + TriggerEvent('esx_identity:showRegisterIdentity') + end) + else + for k,v in pairs(Characters) do + if not v.model and v.skin then + if v.skin.model then v.model = v.skin.model elseif v.skin.sex == 1 then v.model = `mp_f_freemode_01` else v.model = `mp_m_freemode_01` end + end + if spawned == false then SetupCharacter(Character) end + local label = v.firstname..' '..v.lastname + if Characters[k].disabled then + elements[#elements+1] = {label = label, value = v.id} + else + elements[#elements+1] = {label = label, value = v.id} + end + end + if #elements < slots then + elements[#elements+1] = {label = _('create_char'), value = (#elements+1), new = true} + end + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'selectchar', { + title = _('select_char'), + align = 'top-left', + elements = elements + }, function(data, menu) + local elements = {} + if not data.current.new then + if not Characters[data.current.value].disabled then + elements[1] = {label = _('char_play'), action = 'play', value = data.current.value} + else + elements[1] = {label = _('char_disabled'), value = data.current.value} + end + if Config.CanDelete then elements[2] = {label = _('char_delete'), action = 'delete', value = data.current.value} end + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'choosechar', { + title = _('select_char'), + align = 'top-left', + elements = elements + }, function(data, menu) + if data.current.action == 'play' then + ESX.UI.Menu.CloseAll() + SendNUIMessage({ + action = "closeui" + }) + TriggerServerEvent('esx_multicharacter:CharacterChosen', data.current.value, false) + elseif data.current.action == 'delete' then + local elements2 = {} + elements2[1] = {label = _('cancel')} + elements2[2] = {label = _('confirm'), value = data.current.value} + ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'deletechar', { + title = _('delete_label', Characters[data.current.value].firstname, Characters[data.current.value].lastname), + align = 'center', + elements = elements2 + }, function(data, menu) + if data.current.value then + TriggerServerEvent('esx_multicharacter:DeleteCharacter', data.current.value) + spawned = false + ESX.UI.Menu.CloseAll() + else + menu.close() + end + end, function(data, menu) + menu.close() + end) + end + end, function(data, menu) + menu.close() + end) + else + ESX.UI.Menu.CloseAll() + local GetSlot = function() + for i = 1, slots do + if not Characters[i] then + return i + end + end + end + local slot = GetSlot() + TriggerServerEvent('esx_multicharacter:CharacterChosen', slot, true) + TriggerEvent('esx_identity:showRegisterIdentity') + end + end, function(data, menu) + menu.refresh() + end, function(data, menu) + if data.current.new then + local playerPed = PlayerPedId() + SetPedAoBlobRendering(playerPed, false) + SetEntityAlpha(playerPed, 0) + SendNUIMessage({ + action = "closeui" + }) + else + SetupCharacter(data.current.value) + local playerPed = PlayerPedId() + SetPedAoBlobRendering(playerPed, true) + ResetEntityAlpha(playerPed) + end + end) + end + end) + + RegisterNetEvent('esx:playerLoaded') + AddEventHandler('esx:playerLoaded', function(playerData, isNew, skin) + local spawn = playerData.coords or Config.Spawn + if isNew or not skin or #skin == 1 then + local finished = false + local sex = skin.sex or 0 + if sex == 0 then model = `mp_m_freemode_01` else model = `mp_f_freemode_01` end + RequestModel(model) + while not HasModelLoaded(model) do + RequestModel(model) + Citizen.Wait(0) + end + SetPlayerModel(PlayerId(), model) + SetModelAsNoLongerNeeded(model) + skin = Config.Default + skin.sex = sex + TriggerEvent('skinchanger:loadSkin', skin, function() + playerPed = PlayerPedId() + SetPedAoBlobRendering(playerPed, true) + ResetEntityAlpha(playerPed) + TriggerEvent('esx_skin:openSaveableMenu', function() + finished = true end, function() finished = true + end) + end) + repeat Citizen.Wait(200) until finished + end + DoScreenFadeOut(100) + + SetCamActive(cam, false) + RenderScriptCams(false, false, 0, true, true) + cam = nil + local playerPed = PlayerPedId() + FreezeEntityPosition(playerPed, true) + SetEntityCoordsNoOffset(playerPed, spawn.x, spawn.y, spawn.z, false, false, false, true) + SetEntityHeading(playerPed, spawn.heading) + if not isNew then TriggerEvent('skinchanger:loadSkin', skin or Characters[spawned].skin) end + Citizen.Wait(400) + DoScreenFadeIn(400) + repeat Citizen.Wait(200) until not IsScreenFadedOut() + TriggerServerEvent('esx:onPlayerSpawn') + TriggerEvent('esx:onPlayerSpawn') + TriggerEvent('playerSpawned') + TriggerEvent('esx:restoreLoadout') + Characters, hidePlayers = {}, false + end) + + RegisterNetEvent('esx:onPlayerLogout') + AddEventHandler('esx:onPlayerLogout', function() + DoScreenFadeOut(0) + spawned = false + TriggerEvent("esx_multicharacter:SetupCharacters") + TriggerEvent('esx_skin:resetFirstSpawn') + end) + + if Config.Relog then + RegisterCommand('relog', function(source, args, rawCommand) + if canRelog == true then + canRelog = false + TriggerServerEvent('esx_multicharacter:relog') + ESX.SetTimeout(10000, function() + canRelog = true + end) + end + end) + end + +end diff --git a/[esx]/esx_multicharacter/config.lua b/[esx]/esx_multicharacter/config.lua new file mode 100644 index 00000000..fe18b776 --- /dev/null +++ b/[esx]/esx_multicharacter/config.lua @@ -0,0 +1,129 @@ +Config = {} +Config.Locale = 'en' + +-- Allows players to delete their characters +Config.CanDelete = true + +if IsDuplicityVersion() then + -- This is the default number of slots for EVERY player + -- If you want to manage extra slots for specific players you can do it by using '/setslots' and '/remslots' commands + Config.Slots = 4 + -------------------- + + -- Text to prepend to each character (char#:identifier) - keep it short + Config.Prefix = 'char' + -------------------- + + -- Default identifier to store for characters - this should always match es_extended (recommended: license) + Config.Identifier = 'license' + +else + -- Sets the location for the character selection scene + -- To set the spawn location for new characters, modify the default value in the `users` SQL table + Config.Spawn = vector4(-113.7, 565.3, 195.2, 0) + -------------------- + + -- Do not use unless you are prepared to adjust your resources to correctly reset data + -- Information: https://github.com/thelindat/esx_multicharacter#relogging + Config.Relog = true + -------------------- + + -- Default appearance for new characters + Config.Default = { + mom = 21, + dad = 0, + face_md_weight = 50, + skin_md_weight = 50, + nose_1 = 0, + nose_2 = 0, + nose_3 = 0, + nose_4 = 0, + nose_5 = 0, + nose_6 = 0, + cheeks_1 = 0, + cheeks_2 = 0, + cheeks_3 = 0, + lip_thickness = 0, + jaw_1 = 0, + jaw_2 = 0, + chin_1 = 0, + chin_2 = 0, + chin_13 = 0, + chin_4 = 0, + neck_thickness = 0, + hair_1 = 0, + hair_2 = 0, + hair_color_1 = 0, + hair_color_2 = 0, + tshirt_1 = 0, + tshirt_2 = 0, + torso_1 = 0, + torso_2 = 0, + decals_1 = 0, + decals_2 = 0, + arms = 0, + arms_2 = 0, + pants_1 = 0, + pants_2 = 0, + shoes_1 = 0, + shoes_2 = 0, + mask_1 = 0, + mask_2 = 0, + bproof_1 = 0, + bproof_2 = 0, + chain_1 = 0, + chain_2 = 0, + helmet_1 = -1, + helmet_2 = 0, + glasses_1 = 0, + glasses_2 = 0, + watches_1 = -1, + watches_2 = 0, + bracelets_1 = -1, + bracelets_2 = 0, + bags_1 = 0, + bags_2 = 0, + eye_color = 0, + eye_squint = 0, + eyebrows_2 = 0, + eyebrows_1 = 0, + eyebrows_3 = 0, + eyebrows_4 = 0, + eyebrows_5 = 0, + eyebrows_6 = 0, + makeup_1 = 0, + makeup_2 = 0, + makeup_3 = 0, + makeup_4 = 0, + lipstick_1 = 0, + lipstick_2 = 0, + lipstick_3 = 0, + lipstick_4 = 0, + ears_1 = -1, + ears_2 = 0, + chest_1 = 0, + chest_2 = 0, + chest_3 = 0, + bodyb_1 = -1, + bodyb_2 = 0, + bodyb_3 = -1, + bodyb_4 = 0, + age_1 = 0, + age_2 = 0, + blemishes_1 = 0, + blemishes_2 = 0, + blush_1 = 0, + blush_2 = 0, + blush_3 = 0, + complexion_1 = 0, + complexion_2 = 0, + sun_1 = 0, + sun_2 = 0, + moles_1 = 0, + moles_2 = 0, + beard_1 = 0, + beard_2 = 0, + beard_3 = 0, + beard_4 = 0 + } +end \ No newline at end of file diff --git a/[esx]/esx_multicharacter/esx_multicharacter.sql b/[esx]/esx_multicharacter/esx_multicharacter.sql new file mode 100644 index 00000000..f19f7610 --- /dev/null +++ b/[esx]/esx_multicharacter/esx_multicharacter.sql @@ -0,0 +1,9 @@ +CREATE TABLE `multicharacter_slots` ( + `identifier` VARCHAR(60) NOT NULL, + `slots` INT(11) NOT NULL, + PRIMARY KEY (`identifier`) USING BTREE, + INDEX `slots` (`slots`) USING BTREE +) ENGINE=InnoDB; + +ALTER TABLE `users` ADD COLUMN + `disabled` TINYINT(1) NULL DEFAULT '0'; diff --git a/[esx]/esx_multicharacter/fxmanifest.lua b/[esx]/esx_multicharacter/fxmanifest.lua new file mode 100644 index 00000000..435f6ba3 --- /dev/null +++ b/[esx]/esx_multicharacter/fxmanifest.lua @@ -0,0 +1,39 @@ +fx_version 'cerulean' +game 'gta5' +description 'Official Multicharacter System For ESX Legacy' +version '1.6.5' +lua54 'yes' + +dependencies { + 'es_extended', + 'esx_menu_default', + 'esx_identity', + 'esx_skin' +} + +shared_scripts { + '@es_extended/locale.lua', + 'locales/*.lua', + 'config.lua' +} + +server_scripts { + '@es_extended/imports.lua', + '@oxmysql/lib/MySQL.lua', + 'server/*.lua', +} + +client_scripts { + 'client/*.lua' +} + +ui_page { + 'html/ui.html', +} + +files { + 'html/ui.html', + 'html/css/main.css', + 'html/js/app.js', + 'html/locales/*.js', +} diff --git a/[esx]/esx_multicharacter/html/css/main.css b/[esx]/esx_multicharacter/html/css/main.css new file mode 100644 index 00000000..15fb9bc5 --- /dev/null +++ b/[esx]/esx_multicharacter/html/css/main.css @@ -0,0 +1,70 @@ +@import url('https://fonts.googleapis.com/css2?family=Raleway:wght@300;600&display=swap'); +* { + margin: 0; + padding: 0; + user-select: none; + color: rgb(255, 255, 255); + font-weight: 300; + font-size: 1.6vh; + font-family: Calibri, "Helvetica", san-serif; +} + +html { + overflow: hidden; +} + +p { + margin: 0 !important; +} + +body { + background: transparent; +} + +.main-container { + display:none; + position: absolute; + top: 50%; + right: 25; + transform: translate(0, -50%); + background: rgba(0,0,0,0.7); +} + +.header { + position: absolute; + top: 5%; + left: 50%; + transform: translate(-50%); + font-size: 1.1rem; +} + +.footer { + position: absolute; + bottom: 5%; + left: 50%; + transform: translate(-50%); + font-size: 1.1rem; +} + +.character-box { + display: flex; + right: 0; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + line-height: 1.4rem; + height: calc(100vh - 6rem); + width: 20rem; + padding: 1rem; + border: 1px rgba(12,12,12,200) solid; + box-shadow: 0px 0px 4px 1px rgba(12,12,12,20); +} + +h1 { + font-family: 'Raleway', sans-serif; + padding-top: 2rem; + display: block; + font-size: 1.3rem; + font-weight: 600; +} diff --git a/[esx]/esx_multicharacter/html/js/app.js b/[esx]/esx_multicharacter/html/js/app.js new file mode 100644 index 00000000..22b5c92c --- /dev/null +++ b/[esx]/esx_multicharacter/html/js/app.js @@ -0,0 +1,35 @@ +var money = Intl.NumberFormat('en-US', { + style: 'currency', + currency: 'USD', + minimumFractionDigits: 0 +}); + +(() => { + Kashacter = {}; + + Kashacter.ShowUI = function(data) { + $('body').css({"display":"block"}); + $('.main-container').css({"display":"block"}); + $('[data-charid=1]').html('

' + `${translate.name} ` + '

' + data.firstname +' '+ data.lastname +'

' + `${translate.job} ` + '

'+ data.job +' '+ data.job_grade +'

' + `${translate.money} ` + '

'+ money.format(data.money) +'

' + `${translate.bank} ` + '

'+ money.format(data.bank) +'

' + `${translate.dob} ` + '

'+ data.dateofbirth +'

' + `${translate.gender} ` + '

'+ data.sex +'

').attr("data-ischar", "true"); + }; + + Kashacter.CloseUI = function() { + $('body').css({"display":"none"}); + $('.main-container').css({"display":"none"}); + $('[data-charid=1]').html('

'); + }; + + window.onload = function(e) { + window.addEventListener('message', function(event) { + switch(event.data.action) { + case 'openui': + Kashacter.ShowUI(event.data.character); + break; + case 'closeui': + Kashacter.CloseUI(); + break; + } + }) + } + +})(); diff --git a/[esx]/esx_multicharacter/html/locales/cs.js b/[esx]/esx_multicharacter/html/locales/cs.js new file mode 100644 index 00000000..cc84dedc --- /dev/null +++ b/[esx]/esx_multicharacter/html/locales/cs.js @@ -0,0 +1,8 @@ +const translate = new Object(); + +translate.name = "Jméno"; +translate.job = "Práce"; +translate.bank = "Banka"; +translate.money = "Peníze"; +translate.gender = "Pohlaví"; +translate.dob = "Datum narození"; diff --git a/[esx]/esx_multicharacter/html/locales/de.js b/[esx]/esx_multicharacter/html/locales/de.js new file mode 100644 index 00000000..efd17188 --- /dev/null +++ b/[esx]/esx_multicharacter/html/locales/de.js @@ -0,0 +1,8 @@ +const translate = new Object(); + +translate.name = "Name"; +translate.job = "Beruf"; +translate.bank = "Bankguthaben"; +translate.money = "Bargeld"; +translate.gender = "Geschlecht"; +translate.dob = "Geburtsdatum"; diff --git a/[esx]/esx_multicharacter/html/locales/en.js b/[esx]/esx_multicharacter/html/locales/en.js new file mode 100644 index 00000000..125dd3f0 --- /dev/null +++ b/[esx]/esx_multicharacter/html/locales/en.js @@ -0,0 +1,8 @@ +const translate = new Object(); + +translate.name = "Name"; +translate.job = "Job"; +translate.bank = "Bank"; +translate.money = "Cash"; +translate.gender = "Gender"; +translate.dob = "Date of birth"; diff --git a/[esx]/esx_multicharacter/html/locales/fr.js b/[esx]/esx_multicharacter/html/locales/fr.js new file mode 100644 index 00000000..597a217d --- /dev/null +++ b/[esx]/esx_multicharacter/html/locales/fr.js @@ -0,0 +1,8 @@ +const translate = new Object(); + +translate.name = "Nom"; +translate.job = "Métier"; +translate.bank = "Banque"; +translate.money = "Argent"; +translate.gender = "Sexe"; +translate.dob = "Date de naissance"; diff --git a/[esx]/esx_multicharacter/html/locales/pl.js b/[esx]/esx_multicharacter/html/locales/pl.js new file mode 100644 index 00000000..07b27356 --- /dev/null +++ b/[esx]/esx_multicharacter/html/locales/pl.js @@ -0,0 +1,8 @@ +const translate = new Object(); + +translate.name = "imię"; +translate.job = "Zajęcie"; +translate.bank = "Bank"; +translate.money = "Gotówka"; +translate.gender = "Seks"; +translate.dob = "Data urodzenia"; diff --git a/[esx]/esx_multicharacter/html/locales/pt.js b/[esx]/esx_multicharacter/html/locales/pt.js new file mode 100644 index 00000000..c8eca4f8 --- /dev/null +++ b/[esx]/esx_multicharacter/html/locales/pt.js @@ -0,0 +1,8 @@ +const translate = new Object(); + +translate.name = "Nome"; +translate.job = "Trabalho"; +translate.bank = "Banco"; +translate.money = "Dinheiro"; +translate.gender = "Género"; +translate.dob = "Data de Nascimento"; diff --git a/[esx]/esx_multicharacter/html/locales/tr.js b/[esx]/esx_multicharacter/html/locales/tr.js new file mode 100644 index 00000000..ab820732 --- /dev/null +++ b/[esx]/esx_multicharacter/html/locales/tr.js @@ -0,0 +1,8 @@ +const translate = new Object(); + +translate.name = "İsim"; +translate.job = "Meslek"; +translate.bank = "Banka"; +translate.money = "Nakit"; +translate.gender = "Cinsiyet"; +translate.dob = "Doğum Tarihi"; diff --git a/[esx]/esx_multicharacter/html/ui.html b/[esx]/esx_multicharacter/html/ui.html new file mode 100644 index 00000000..7b59ac89 --- /dev/null +++ b/[esx]/esx_multicharacter/html/ui.html @@ -0,0 +1,24 @@ + + + + + + + + + + +
+
ESX Legacy
+
+

+
+
+ +
+ + + + + + \ No newline at end of file diff --git a/[esx]/esx_multicharacter/locales/cs.lua b/[esx]/esx_multicharacter/locales/cs.lua new file mode 100644 index 00000000..d309e309 --- /dev/null +++ b/[esx]/esx_multicharacter/locales/cs.lua @@ -0,0 +1,25 @@ +Locales['cs'] = { + ['male'] = "Muž", + ['female'] = "Žena", + ['delete_label'] = "Vymazat %s %s?", + ['select_char'] = "Zvolit Postavu", + ['create_char'] = "Vytvořit Novou Postavu", + ['char_play'] = "Hrát za postavu", + ['char_disabled'] = "Tato postava je zakázána!", + ['char_delete'] = "Vymazat postavu", + ['cancel'] = "Zrušit", + ['confirm'] = "Potvrdit", + ['command_setslots'] = "Nastavit slot pro hráče v multicharacteru", + ['command_remslots'] = "Odebrat slot pro hráče v multicharacteru", + ['command_enablechar'] = "Povolit zovlený slot hráči", + ['command_disablechar'] = "Zakázat zvolený slot pro hračé", + ['command_charslot'] = "Číslo slotu", + ['command_identifier'] = "Identifier hráče", + ['command_slots'] = "# ze slotu", + ['slotsadd'] = "Přidal slot %s hráči %s", + ['slotsedit'] = "Nastavil si slot %s hráči %s", + ['slotsrem'] = "Odebral si slot %s", + ['charenabled'] = "Povolol si postavu #%s z %s", + ['chardisabled'] = "Zakázal si postavu #%s z %s", + ['charnotfound'] = "Postava #%s z %s nebyla nalezena/neexistuje", +} diff --git a/[esx]/esx_multicharacter/locales/de.lua b/[esx]/esx_multicharacter/locales/de.lua new file mode 100644 index 00000000..654971af --- /dev/null +++ b/[esx]/esx_multicharacter/locales/de.lua @@ -0,0 +1,11 @@ +Locales['de'] = { + ['male'] = "Männlich", + ['female'] = "Weiblich", + ['delete_label'] = "Lösche %s %s?", + ['select_char'] = "Charakter auswählen", + ['create_char'] = "Neuen Charakter erstellen", + ['char_play'] = "Diesen Charakter spielen", + ['char_delete'] = "Diesen Charakter löschen", + ['cancel'] = "Abbrechen", + ['confirm'] = "Bestätigen", +} diff --git a/[esx]/esx_multicharacter/locales/en.lua b/[esx]/esx_multicharacter/locales/en.lua new file mode 100644 index 00000000..b71de307 --- /dev/null +++ b/[esx]/esx_multicharacter/locales/en.lua @@ -0,0 +1,25 @@ +Locales['en'] = { + ['male'] = "Male", + ['female'] = "Female", + ['delete_label'] = "Delete %s %s?", + ['select_char'] = "Select Character", + ['create_char'] = "Create new character", + ['char_play'] = "Play this character", + ['char_disabled'] = "This character is disabled", + ['char_delete'] = "Delete this character", + ['cancel'] = "Cancel", + ['confirm'] = "Confirm", + ['command_setslots'] = "Set multicharacter slots number of a player", + ['command_remslots'] = "Remove multicharacter slots number of a player", + ['command_enablechar'] = "Enable a given character of a player", + ['command_disablechar'] = "Disable a given character of a player", + ['command_charslot'] = "Slot number of the character", + ['command_identifier'] = "Player identifier", + ['command_slots'] = "# of slots", + ['slotsadd'] = "You added %s slots to %s", + ['slotsedit'] = "You set %s slots to %s", + ['slotsrem'] = "You removed slots to %s", + ['charenabled'] = "You enabled character #%s of %s", + ['chardisabled'] = "You disabled character #%s of %s", + ['charnotfound'] = "Character #%s of %s doesn't exist", +} diff --git a/[esx]/esx_multicharacter/locales/it.lua b/[esx]/esx_multicharacter/locales/it.lua new file mode 100644 index 00000000..1f2333e5 --- /dev/null +++ b/[esx]/esx_multicharacter/locales/it.lua @@ -0,0 +1,25 @@ +Locales['it'] = { + ['male'] = "Maschio", + ['female'] = "Femmina", + ['delete_label'] = "Cancella %s %s?", + ['select_char'] = "Seleziona Personaggio", + ['create_char'] = "Crea un nuovo personaggio", + ['char_play'] = "Gioca questo personaggio", + ['char_disabled'] = "Questo personaggio è disabilitato", + ['char_delete'] = "Cancella questo personaggio", + ['cancel'] = "Annulla", + ['confirm'] = "Conferma", + ['command_setslots'] = "Imposta il numero di slot di personaggi di un giocatore", + ['command_remslots'] = "Rimuovi il numero di slot di personaggi di un giocatore", + ['command_enablechar'] = "Abilita un personaggio di un giocatore", + ['command_disablechar'] = "Disabilita un personaggio di un giocatore", + ['command_charslot'] = "Numero dello slot del personaggio", + ['command_identifier'] = "Identifier del giocatore", + ['command_slots'] = "# di slot", + ['slotsadd'] = "Hai aggiunto %s slot a %s", + ['slotsedit'] = "Hai impostato %s slot a %s", + ['slotsrem'] = "Hai rimosso gli slot a %s", + ['charenabled'] = "Hai abilitato il %s° personaggio di %s", + ['chardisabled'] = "Hai disabilitato il %s° personaggio di %s", + ['charnotfound'] = "Il personaggio %s di %s non esiste", +} diff --git a/[esx]/esx_multicharacter/locales/pt.lua b/[esx]/esx_multicharacter/locales/pt.lua new file mode 100644 index 00000000..04b828a3 --- /dev/null +++ b/[esx]/esx_multicharacter/locales/pt.lua @@ -0,0 +1,11 @@ +Locales['pt'] = { + ['male'] = "Masculino", + ['female'] = "Feminino", + ['delete_label'] = "Eliminar %s %s?", + ['select_char'] = "Selecionar personagem", + ['create_char'] = "Criar novo personagem", + ['char_play'] = "Selecionar", + ['char_delete'] = "Eliminar personagem", + ['cancel'] = "Cancelar", + ['confirm'] = "Confirmar", +} diff --git a/[esx]/esx_multicharacter/locales/tr.lua b/[esx]/esx_multicharacter/locales/tr.lua new file mode 100644 index 00000000..8a3aa060 --- /dev/null +++ b/[esx]/esx_multicharacter/locales/tr.lua @@ -0,0 +1,11 @@ +Locales['tr'] = { + ['male'] = "Erkek", + ['female'] = "Kadın", + ['delete_label'] = "Sil %s %s?", + ['select_char'] = "Karakter Seç", + ['create_char'] = "Yeni Karakter Oluştur", + ['char_play'] = "Bu Karakterle Oyna", + ['char_delete'] = "Bu Karakteri Sil", + ['cancel'] = "İptal", + ['confirm'] = "Onayla", +} diff --git a/[esx]/esx_multicharacter/readme.md b/[esx]/esx_multicharacter/readme.md new file mode 100644 index 00000000..f5879edc --- /dev/null +++ b/[esx]/esx_multicharacter/readme.md @@ -0,0 +1,59 @@ + +# Preview + +![image](https://user-images.githubusercontent.com/65407488/126976325-17cc3241-bb9e-451f-a6ed-610a8ef52fa5.png) + +## Installation + +- Modify your ESX config with `Config.Multichar = true` +- All owner and identifier columns should be set to `VARCHAR(60)` to ensure correct data entry + - The resource will attempt to set columns automatically + +### Relogging + +- Do not enable this setting if you do not intend to properly set up relog support +- Requires the latest update for ESX Status (prevents multiple status ticks from running) +- Add the following events to resources that require support for relogging, or +- Add them to [@es_extended/imports.lua](https://github.com/esx-framework/esx-legacy/blob/main/[esx]/es_extended/imports.lua) (and use the imports in your resources) + +```lua +RegisterNetEvent('esx:playerLoaded', function(xPlayer) + ESX.PlayerData = xPlayer + ESX.PlayerLoaded = true +end) + +RegisterNetEvent('esx:onPlayerLogout', function() + ESX.PlayerLoaded = false + ESX.PlayerData = {} +end) +``` + +### Notes + +- Characters are stored in the users table as `char#:license` - if you need to use a different identifier then you need to modify ESX itself +- Character deletion does not require manual entries for the tables to remove +- As characters are stored with unique identifiers, there is no excessive queries being executed + +### Kashacters + +- This project is forked from the [kashacters multicharacter resource](https://github.com/FiveEYZ/esx_kashacter) +- Most of the code has been entirely rewritten +- KASH has given permission for this resource to use his code and the addition of a license +- The license obviously does not apply to previous versions and KASH has stated his resource is free to be used however + +## Notice + +Copyright © 2022 [Linden](https://github.com/thelindat/), ESX-Framework (fournier Brice & Jérémie N'gadi) and KASH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . diff --git a/[esx]/esx_multicharacter/server/commands.lua b/[esx]/esx_multicharacter/server/commands.lua new file mode 100644 index 00000000..3cfa98d5 --- /dev/null +++ b/[esx]/esx_multicharacter/server/commands.lua @@ -0,0 +1,79 @@ +ESX.RegisterCommand('setslots', 'admin', function(xPlayer, args, showError) + local slots = MySQL.scalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { + args.identifier + }) + + if slots == nil then + MySQL.update('INSERT INTO `multicharacter_slots` (`identifier`, `slots`) VALUES (?, ?)', { + args.identifier, + args.slots + }) + xPlayer.triggerEvent('esx:showNotification', _U('slotsadd', args.slots, args.identifier)) + else + MySQL.update('UPDATE `multicharacter_slots` SET `slots` = ? WHERE `identifier` = ?', { + args.slots, + args.identifier + }) + xPlayer.triggerEvent('esx:showNotification', _U('slotsedit', args.slots, args.identifier)) + end +end, true, {help = _U('command_setslots'), validate = true, arguments = { + {name = 'identifier', help = _U('command_identifier'), type = 'string'}, + {name = 'slots', help = _U('command_slots'), type = 'number'} +}}) + +ESX.RegisterCommand('remslots', 'admin', function(xPlayer, args, showError) + local slots = MySQL.scalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { + args.identifier + }) + + if slots ~= nil then + MySQL.update('DELETE FROM `multicharacter_slots` WHERE `identifier` = ?', { + args.identifier + }) + xPlayer.triggerEvent('esx:showNotification', _U('slotsrem', args.identifier)) + end +end, true, {help = _U('command_remslots'), validate = true, arguments = { + {name = 'identifier', help = _U('command_identifier'), type = 'string'} +}}) + +ESX.RegisterCommand('enablechar', 'admin', function(xPlayer, args, showError) + + local selectedCharacter = 'char'..args.charslot..':'..args.identifier; + + MySQL.update('UPDATE `users` SET `disabled` = 0 WHERE identifier = ?', { + selectedCharacter + }, function(result) + if result > 0 then + xPlayer.triggerEvent('esx:showNotification', _U('charenabled', args.charslot, args.identifier)) + else + xPlayer.triggerEvent('esx:showNotification', _U('charnotfound', args.charslot, args.identifier)) + end + end) + +end, true, {help = _U('command_enablechar'), validate = true, arguments = { + {name = 'identifier', help = _U('command_identifier'), type = 'string'}, + {name = 'charslot', help = _U('command_charslot'), type = 'number'} +}}) + +ESX.RegisterCommand('disablechar', 'admin', function(xPlayer, args, showError) + + local selectedCharacter = 'char'..args.charslot..':'..args.identifier; + + MySQL.update('UPDATE `users` SET `disabled` = 1 WHERE identifier = ?', { + selectedCharacter + }, function(result) + if result > 0 then + xPlayer.triggerEvent('esx:showNotification', _U('chardisabled', args.charslot, args.identifier)) + else + xPlayer.triggerEvent('esx:showNotification', _U('charnotfound', args.charslot, args.identifier)) + end + end) + +end, true, {help = _U('command_disablechar'), validate = true, arguments = { + {name = 'identifier', help = _U('command_identifier'), type = 'string'}, + {name = 'charslot', help = _U('command_charslot'), type = 'number'} +}}) + +RegisterCommand('forcelog', function(source, args, rawCommand) + TriggerEvent('esx:playerLogout', source) +end, true) diff --git a/[esx]/esx_multicharacter/server/main.lua b/[esx]/esx_multicharacter/server/main.lua new file mode 100644 index 00000000..266c560c --- /dev/null +++ b/[esx]/esx_multicharacter/server/main.lua @@ -0,0 +1,221 @@ +if not ESX then + error('\n^1Unable to start Multicharacter - you must be using ESX Legacy^0') +elseif ESX.GetConfig().Multichar == true then + local DATABASE do + local connectionString = GetConvar('mysql_connection_string', ''); + if connectionString == '' then + error(connectionString..'\n^1Unable to start Multicharacter - unable to determine database from mysql_connection_string^0', 0) + elseif connectionString:find('mysql://') then + connectionString = connectionString:sub(9, -1) + DATABASE = connectionString:sub(connectionString:find('/')+1, -1):gsub('[%?]+[%w%p]*$', '') + else + connectionString = {string.strsplit(';', connectionString)} + for i = 1, #connectionString do + local v = connectionString[i] + if v:match('database') then + DATABASE = v:sub(10, #v) + end + end + end + end + + local DB_TABLES = {users = 'identifier'} + local FETCH = nil + local SLOTS = Config.Slots or 4 + local PREFIX = Config.Prefix or 'char' + local PRIMARY_IDENTIFIER = ESX.GetConfig().Identifier or GetConvar('sv_lan', '') == 'true' and 'ip' or Config.Identifier + + local function GetIdentifier(source) + local identifier = PRIMARY_IDENTIFIER..':' + for _, v in pairs(GetPlayerIdentifiers(source)) do + if string.match(v, identifier) then + identifier = string.gsub(v, identifier, '') + return identifier + end + end + end + + if next(ESX.Players) then + local players = table.clone(ESX.Players) + table.wipe(ESX.Players) + for _, v in pairs(players) do + ESX.Players[GetIdentifier(v.source)] = true + end + else ESX.Players = {} end + + local function SetupCharacters(source) + while not FETCH do Citizen.Wait(100) end + local identifier = GetIdentifier(source) + ESX.Players[identifier] = true + + local slots = MySQL.scalar.await('SELECT slots FROM multicharacter_slots WHERE identifier = ?', { identifier }) or SLOTS + identifier = PREFIX..'%:'..identifier + + local result = MySQL.query.await(FETCH, {identifier, slots}) + local characters + + if result then + local characterCount = #result + characters = table.create(0, characterCount) + + for i = 1, characterCount, 1 do + local v = result[i] + local job, grade = v.job or 'unemployed', tostring(v.job_grade) + + if ESX.Jobs[job] and ESX.Jobs[job].grades[grade] then + if job ~= 'unemployed' then grade = ESX.Jobs[job].grades[grade].label else grade = '' end + job = ESX.Jobs[job].label + end + + local accounts = json.decode(v.accounts) + local id = tonumber(string.sub(v.identifier, #PREFIX+1, string.find(v.identifier, ':')-1)) + + characters[id] = { + id = id, + bank = accounts.bank, + money = accounts.money, + job = job, + job_grade = grade, + firstname = v.firstname, + lastname = v.lastname, + dateofbirth = v.dateofbirth, + skin = v.skin and json.decode(v.skin) or {}, + disabled = v.disabled, + sex = v.sex == 'm' and _('male') or _('female') + } + end + end + + TriggerClientEvent('esx_multicharacter:SetupUI', source, characters, slots) + end + + AddEventHandler('playerConnecting', function(playerName, setKickReason, deferrals) + deferrals.defer() + local identifier = GetIdentifier(source) + + if identifier then + if ESX.Players[identifier] then + deferrals.done(('A player is already connected to the server with this identifier.\nYour identifier: %s:%s'):format(PRIMARY_IDENTIFIER, identifier)) + else + deferrals.done() + end + else + deferrals.done(('Unable to retrieve player identifier.\nIdentifier type: %s'):format(PRIMARY_IDENTIFIER)) + end + end) + + local function DeleteCharacter(source, charid) + local identifier = ('%s%s:%s'):format(PREFIX, charid, GetIdentifier(source)) + local query = 'DELETE FROM %s WHERE %s = ?' + local queries = {} + local count = 0 + + for table, column in pairs(DB_TABLES) do + count += 1 + queries[count] = {query = query:format(table, column), values = {identifier}} + end + + MySQL.transaction(queries, function(result) + if result then + print(('[^2INFO^7] Player [%s] %s has deleted a character (%s)'):format(GetPlayerName(source), source, identifier)) + Citizen.Wait(50) + SetupCharacters(source) + else + error('\n^1Transaction failed while trying to delete '..identifier..'^0') + end + end) + end + + MySQL.ready(function() + local length = 42 + #PREFIX + local DB_COLUMNS = MySQL.query.await(('SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "%s" AND DATA_TYPE = "varchar" AND COLUMN_NAME IN (?)'):format(DATABASE, length), { + {'identifier', 'owner'} + }) + + if DB_COLUMNS then + local columns = {} + local count = 0 + + for i = 1, #DB_COLUMNS do + local v = DB_COLUMNS[i] + + if v?.CHARACTER_MAXIMUM_LENGTH ~= length then + count += 1 + columns[v.TABLE_NAME] = v.COLUMN_NAME + end + end + + if next(columns) then + local query = 'ALTER TABLE `%s` MODIFY COLUMN `%s` VARCHAR(%s)' + local queries = table.create(count, 0) + + for k, v in pairs(columns) do + queries[#queries+1] = {query = query:format(k, v, length)} + end + + if MySQL.transaction.await(queries) then + print(('[^2INFO^7] Updated ^5%s^7 columns to use VARCHAR(%s)'):format(count, length)) + else + print(('[^2INFO^7] Unable to update ^5%s^7 columns to use VARCHAR(%s)'):format(count, length)) + end + end + + ESX.Jobs = {} + + local function GetJobs() + if ESX.GetJobs then + return ESX.GetJobs() + end + return exports.es_extended:getSharedObject().Jobs + end + + repeat + ESX.Jobs = GetJobs() + Citizen.Wait(50) + until next(ESX.Jobs) + + FETCH = 'SELECT identifier, accounts, job, job_grade, firstname, lastname, dateofbirth, sex, skin, disabled FROM users WHERE identifier LIKE ? LIMIT ?' + end + end) + + RegisterNetEvent('esx_multicharacter:SetupCharacters', function() + SetupCharacters(source) + end) + + local awaitingRegistration = {} + + RegisterNetEvent('esx_multicharacter:CharacterChosen', function(charid, isNew) + if type(charid) == 'number' and string.len(charid) <= 2 and type(isNew) == 'boolean' then + if isNew then + awaitingRegistration[source] = charid + else + TriggerEvent('esx:onPlayerJoined', source, PREFIX..charid) + ESX.Players[GetIdentifier(source)] = true + end + end + end) + + AddEventHandler('esx_identity:completedRegistration', function(source, data) + TriggerEvent('esx:onPlayerJoined', source, PREFIX..awaitingRegistration[source], data) + awaitingRegistration[source] = nil + ESX.Players[GetIdentifier(source)] = true + end) + + AddEventHandler('playerDropped', function(reason) + awaitingRegistration[source] = nil + ESX.Players[GetIdentifier(source)] = nil + end) + + RegisterNetEvent('esx_multicharacter:DeleteCharacter', function(charid) + if Config.CanDelete and type(charid) == 'number' and string.len(charid) <= 2 then + DeleteCharacter(source, charid) + end + end) + + RegisterNetEvent('esx_multicharacter:relog', function() + TriggerEvent('esx:playerLogout', source) + end) + +else + assert(nil, '^3WARNING: Multicharacter is disabled - please check your ESX configuration^0') +end diff --git a/[esx]/esx_skin/fxmanifest.lua b/[esx]/esx_skin/fxmanifest.lua index 0feb09d3..31b095d2 100644 --- a/[esx]/esx_skin/fxmanifest.lua +++ b/[esx]/esx_skin/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Skin' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_accessories/fxmanifest.lua b/[esx_addons]/esx_accessories/fxmanifest.lua index 6acdf67a..d2fb53da 100644 --- a/[esx_addons]/esx_accessories/fxmanifest.lua +++ b/[esx_addons]/esx_accessories/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Accessories' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_addonaccount/fxmanifest.lua b/[esx_addons]/esx_addonaccount/fxmanifest.lua index 8fd979bd..7aacd820 100644 --- a/[esx_addons]/esx_addonaccount/fxmanifest.lua +++ b/[esx_addons]/esx_addonaccount/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Addon Account' -version '1.6.0' +version '1.6.5' server_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_addoninventory/fxmanifest.lua b/[esx_addons]/esx_addoninventory/fxmanifest.lua index c8f0c790..404b109d 100644 --- a/[esx_addons]/esx_addoninventory/fxmanifest.lua +++ b/[esx_addons]/esx_addoninventory/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Addon Inventory' -version '1.6.0' +version '1.6.5' server_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_ambulancejob/fxmanifest.lua b/[esx_addons]/esx_ambulancejob/fxmanifest.lua index 5ff50452..80444c35 100644 --- a/[esx_addons]/esx_ambulancejob/fxmanifest.lua +++ b/[esx_addons]/esx_ambulancejob/fxmanifest.lua @@ -4,9 +4,9 @@ game 'gta5' description 'ESX Ambulance Job' -version '1.6.0' +version '1.6.5' -shared_script '@es_extended/imports.lua' +c server_scripts { '@oxmysql/lib/MySQL.lua', diff --git a/[esx_addons]/esx_animations/fxmanifest.lua b/[esx_addons]/esx_animations/fxmanifest.lua index 1897459b..70fd794c 100644 --- a/[esx_addons]/esx_animations/fxmanifest.lua +++ b/[esx_addons]/esx_animations/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Animations' -version '1.6.0' +version '1.6.5' client_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_atm/fxmanifest.lua b/[esx_addons]/esx_atm/fxmanifest.lua index a464c619..9d6f4325 100644 --- a/[esx_addons]/esx_atm/fxmanifest.lua +++ b/[esx_addons]/esx_atm/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Atm' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_bankerjob/fxmanifest.lua b/[esx_addons]/esx_bankerjob/fxmanifest.lua index d60a7ca0..d4259110 100644 --- a/[esx_addons]/esx_bankerjob/fxmanifest.lua +++ b/[esx_addons]/esx_bankerjob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Banker job' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_barbershop/fxmanifest.lua b/[esx_addons]/esx_barbershop/fxmanifest.lua index a83ae43e..3859ec00 100644 --- a/[esx_addons]/esx_barbershop/fxmanifest.lua +++ b/[esx_addons]/esx_barbershop/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Barber Shop' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_basicneeds/fxmanifest.lua b/[esx_addons]/esx_basicneeds/fxmanifest.lua index 2088dd2d..6e5cf251 100644 --- a/[esx_addons]/esx_basicneeds/fxmanifest.lua +++ b/[esx_addons]/esx_basicneeds/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Basic Needs' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_billing/fxmanifest.lua b/[esx_addons]/esx_billing/fxmanifest.lua index 56ef67ca..dbfbfdfc 100644 --- a/[esx_addons]/esx_billing/fxmanifest.lua +++ b/[esx_addons]/esx_billing/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Billing' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_boat/fxmanifest.lua b/[esx_addons]/esx_boat/fxmanifest.lua index 3a8c8fca..0cb962ea 100644 --- a/[esx_addons]/esx_boat/fxmanifest.lua +++ b/[esx_addons]/esx_boat/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Boat' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_clotheshop/fxmanifest.lua b/[esx_addons]/esx_clotheshop/fxmanifest.lua index a8dd1b89..41e7a38b 100644 --- a/[esx_addons]/esx_clotheshop/fxmanifest.lua +++ b/[esx_addons]/esx_clotheshop/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Clothes Shop' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_cruisecontrol/fxmanifest.lua b/[esx_addons]/esx_cruisecontrol/fxmanifest.lua index e92aa300..c6fa2dee 100644 --- a/[esx_addons]/esx_cruisecontrol/fxmanifest.lua +++ b/[esx_addons]/esx_cruisecontrol/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'CruiseControl System for ESX' -version '1.6.0' +version '1.6.5' dependencies { 'es_extended' diff --git a/[esx_addons]/esx_datastore/fxmanifest.lua b/[esx_addons]/esx_datastore/fxmanifest.lua index 4f948458..aa84426e 100644 --- a/[esx_addons]/esx_datastore/fxmanifest.lua +++ b/[esx_addons]/esx_datastore/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Data Store' -version '1.6.0' +version '1.6.5' server_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_dmvschool/fxmanifest.lua b/[esx_addons]/esx_dmvschool/fxmanifest.lua index 433a2fb3..726b5d16 100644 --- a/[esx_addons]/esx_dmvschool/fxmanifest.lua +++ b/[esx_addons]/esx_dmvschool/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX DMV School' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_drugs/fxmanifest.lua b/[esx_addons]/esx_drugs/fxmanifest.lua index 45e910b1..45782bd6 100644 --- a/[esx_addons]/esx_drugs/fxmanifest.lua +++ b/[esx_addons]/esx_drugs/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Drugs' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_garage/fxmanifest.lua b/[esx_addons]/esx_garage/fxmanifest.lua index 02614ad7..28a0dc29 100644 --- a/[esx_addons]/esx_garage/fxmanifest.lua +++ b/[esx_addons]/esx_garage/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Garage' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_holdup/fxmanifest.lua b/[esx_addons]/esx_holdup/fxmanifest.lua index 1aec4396..52619849 100644 --- a/[esx_addons]/esx_holdup/fxmanifest.lua +++ b/[esx_addons]/esx_holdup/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Holdup' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_joblisting/fxmanifest.lua b/[esx_addons]/esx_joblisting/fxmanifest.lua index a910652f..c5e4bd50 100644 --- a/[esx_addons]/esx_joblisting/fxmanifest.lua +++ b/[esx_addons]/esx_joblisting/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Job Listing' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_jobs/fxmanifest.lua b/[esx_addons]/esx_jobs/fxmanifest.lua index 8beb059a..25d637af 100644 --- a/[esx_addons]/esx_jobs/fxmanifest.lua +++ b/[esx_addons]/esx_jobs/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Jobs' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_license/fxmanifest.lua b/[esx_addons]/esx_license/fxmanifest.lua index 8d907995..9bef90a7 100644 --- a/[esx_addons]/esx_license/fxmanifest.lua +++ b/[esx_addons]/esx_license/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX License' -version '1.6.0' +version '1.6.5' server_scripts { '@async/async.lua', diff --git a/[esx_addons]/esx_lscustom/fxmanifest.lua b/[esx_addons]/esx_lscustom/fxmanifest.lua index d6ec6779..19efd417 100644 --- a/[esx_addons]/esx_lscustom/fxmanifest.lua +++ b/[esx_addons]/esx_lscustom/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX LS Customs' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_mechanicjob/fxmanifest.lua b/[esx_addons]/esx_mechanicjob/fxmanifest.lua index 4d24aeee..dfc4140a 100644 --- a/[esx_addons]/esx_mechanicjob/fxmanifest.lua +++ b/[esx_addons]/esx_mechanicjob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Mechanic Job' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_optionalneeds/fxmanifest.lua b/[esx_addons]/esx_optionalneeds/fxmanifest.lua index f5793a9a..2e788e88 100644 --- a/[esx_addons]/esx_optionalneeds/fxmanifest.lua +++ b/[esx_addons]/esx_optionalneeds/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Optional Needs' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_phone/fxmanifest.lua b/[esx_addons]/esx_phone/fxmanifest.lua index 96733393..c7f52a52 100644 --- a/[esx_addons]/esx_phone/fxmanifest.lua +++ b/[esx_addons]/esx_phone/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Phone' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_policejob/fxmanifest.lua b/[esx_addons]/esx_policejob/fxmanifest.lua index 60c00cf7..6dd5ac08 100644 --- a/[esx_addons]/esx_policejob/fxmanifest.lua +++ b/[esx_addons]/esx_policejob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Police Job' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_property/fxmanifest.lua b/[esx_addons]/esx_property/fxmanifest.lua index dddedcc2..0ef6d6e9 100644 --- a/[esx_addons]/esx_property/fxmanifest.lua +++ b/[esx_addons]/esx_property/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Property' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_realestateagentjob/fxmanifest.lua b/[esx_addons]/esx_realestateagentjob/fxmanifest.lua index 5201b2c8..1dbccfd7 100644 --- a/[esx_addons]/esx_realestateagentjob/fxmanifest.lua +++ b/[esx_addons]/esx_realestateagentjob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Real Estate Job' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_rpchat/fxmanifest.lua b/[esx_addons]/esx_rpchat/fxmanifest.lua index 4d8ae670..06774b5d 100644 --- a/[esx_addons]/esx_rpchat/fxmanifest.lua +++ b/[esx_addons]/esx_rpchat/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX RP Chat' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_service/fxmanifest.lua b/[esx_addons]/esx_service/fxmanifest.lua index d271c37c..9f49bd78 100644 --- a/[esx_addons]/esx_service/fxmanifest.lua +++ b/[esx_addons]/esx_service/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Service' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_shops/fxmanifest.lua b/[esx_addons]/esx_shops/fxmanifest.lua index 9aebaf69..fdf23909 100644 --- a/[esx_addons]/esx_shops/fxmanifest.lua +++ b/[esx_addons]/esx_shops/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Shops' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_sit/fxmanifest.lua b/[esx_addons]/esx_sit/fxmanifest.lua index 630b2898..2e971618 100644 --- a/[esx_addons]/esx_sit/fxmanifest.lua +++ b/[esx_addons]/esx_sit/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Sit' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_society/fxmanifest.lua b/[esx_addons]/esx_society/fxmanifest.lua index 43769fd6..79fe1448 100644 --- a/[esx_addons]/esx_society/fxmanifest.lua +++ b/[esx_addons]/esx_society/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Society' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_status/fxmanifest.lua b/[esx_addons]/esx_status/fxmanifest.lua index d4ebd2c7..68bd5b3f 100644 --- a/[esx_addons]/esx_status/fxmanifest.lua +++ b/[esx_addons]/esx_status/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Status' -version '1.6.0' +version '1.6.5' lua54 'yes' diff --git a/[esx_addons]/esx_taxijob/fxmanifest.lua b/[esx_addons]/esx_taxijob/fxmanifest.lua index b2e67b5f..54e4ea72 100644 --- a/[esx_addons]/esx_taxijob/fxmanifest.lua +++ b/[esx_addons]/esx_taxijob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Taxi Job' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_vehicleshop/fxmanifest.lua b/[esx_addons]/esx_vehicleshop/fxmanifest.lua index f87595e3..82c483c0 100644 --- a/[esx_addons]/esx_vehicleshop/fxmanifest.lua +++ b/[esx_addons]/esx_vehicleshop/fxmanifest.lua @@ -6,7 +6,7 @@ lua54 'yes' description 'ESX Vehicle Shop' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_voice/fxmanifest.lua b/[esx_addons]/esx_voice/fxmanifest.lua index a8e2697a..9ffc0aeb 100644 --- a/[esx_addons]/esx_voice/fxmanifest.lua +++ b/[esx_addons]/esx_voice/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Voice Controller' -version '1.6.0' +version '1.6.5' client_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_weaponshop/fxmanifest.lua b/[esx_addons]/esx_weaponshop/fxmanifest.lua index 65e74b5e..64296bf3 100644 --- a/[esx_addons]/esx_weaponshop/fxmanifest.lua +++ b/[esx_addons]/esx_weaponshop/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Weapon Shop' -version '1.6.0' +version '1.6.5' shared_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_whitelist/fxmanifest.lua b/[esx_addons]/esx_whitelist/fxmanifest.lua index 8c6515e6..6319d5d9 100644 --- a/[esx_addons]/esx_whitelist/fxmanifest.lua +++ b/[esx_addons]/esx_whitelist/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Whitelist' -version '1.6.0' +version '1.6.5' server_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/instance/fxmanifest.lua b/[esx_addons]/instance/fxmanifest.lua index 57aa044e..f5a4b905 100644 --- a/[esx_addons]/instance/fxmanifest.lua +++ b/[esx_addons]/instance/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'Instance' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' From cfd232d89ea6bbb24eb359000d82137c628f3e13 Mon Sep 17 00:00:00 2001 From: FantomasIsBad <102142635+FantomasIsBad@users.noreply.github.com> Date: Wed, 23 Mar 2022 12:19:54 +0100 Subject: [PATCH 077/132] Fix fxmanifest in esx_ambulancejob --- [esx_addons]/esx_ambulancejob/fxmanifest.lua | 34 ++++---------------- 1 file changed, 6 insertions(+), 28 deletions(-) diff --git a/[esx_addons]/esx_ambulancejob/fxmanifest.lua b/[esx_addons]/esx_ambulancejob/fxmanifest.lua index 80444c35..a38b160e 100644 --- a/[esx_addons]/esx_ambulancejob/fxmanifest.lua +++ b/[esx_addons]/esx_ambulancejob/fxmanifest.lua @@ -6,41 +6,19 @@ description 'ESX Ambulance Job' version '1.6.5' -c +shared_scripts { + '@es_extended/imports.lua' + '@es_extended/locale.lua', + 'locales/*.lua', + 'config.lua' +} server_scripts { '@oxmysql/lib/MySQL.lua', - '@es_extended/locale.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/fi.lua', - 'locales/fr.lua', - 'locales/es.lua', - 'locales/sv.lua', - 'locales/pl.lua', - 'locales/de.lua', - 'locales/cs.lua', - 'locales/nl.lua', - 'locales/tr.lua', - 'locales/hu.lua', - 'config.lua', 'server/main.lua' } client_scripts { - '@es_extended/locale.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/fi.lua', - 'locales/fr.lua', - 'locales/es.lua', - 'locales/sv.lua', - 'locales/pl.lua', - 'locales/cs.lua', - 'locales/nl.lua', - 'locales/tr.lua', - 'locales/hu.lua', - 'config.lua', 'client/main.lua', 'client/job.lua', 'client/vehicle.lua', From b9232a253303d595e551d769ce558fe570a4fca1 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Wed, 23 Mar 2022 16:04:38 +0000 Subject: [PATCH 078/132] Revert "Feat: Add Official Multicharacter" This reverts commit e6dd5a5f2c11765609582a197c20b3035fc3c264. --- [SQL]/legacy.sql | 14 - [esx]/es_extended/config.lua | 2 +- [esx]/es_extended/fxmanifest.lua | 2 +- [esx]/es_extended/version.json | 4 +- [esx]/esx_identity/fxmanifest.lua | 2 +- [esx]/esx_menu_default/fxmanifest.lua | 2 +- [esx]/esx_menu_dialog/fxmanifest.lua | 2 +- [esx]/esx_menu_list/fxmanifest.lua | 2 +- [esx]/esx_multicharacter/LICENSE.md | 674 ------------------ [esx]/esx_multicharacter/client/main.lua | 335 --------- [esx]/esx_multicharacter/config.lua | 129 ---- .../esx_multicharacter/esx_multicharacter.sql | 9 - [esx]/esx_multicharacter/fxmanifest.lua | 39 - [esx]/esx_multicharacter/html/css/main.css | 70 -- [esx]/esx_multicharacter/html/js/app.js | 35 - [esx]/esx_multicharacter/html/locales/cs.js | 8 - [esx]/esx_multicharacter/html/locales/de.js | 8 - [esx]/esx_multicharacter/html/locales/en.js | 8 - [esx]/esx_multicharacter/html/locales/fr.js | 8 - [esx]/esx_multicharacter/html/locales/pl.js | 8 - [esx]/esx_multicharacter/html/locales/pt.js | 8 - [esx]/esx_multicharacter/html/locales/tr.js | 8 - [esx]/esx_multicharacter/html/ui.html | 24 - [esx]/esx_multicharacter/locales/cs.lua | 25 - [esx]/esx_multicharacter/locales/de.lua | 11 - [esx]/esx_multicharacter/locales/en.lua | 25 - [esx]/esx_multicharacter/locales/it.lua | 25 - [esx]/esx_multicharacter/locales/pt.lua | 11 - [esx]/esx_multicharacter/locales/tr.lua | 11 - [esx]/esx_multicharacter/readme.md | 59 -- [esx]/esx_multicharacter/server/commands.lua | 79 -- [esx]/esx_multicharacter/server/main.lua | 221 ------ [esx]/esx_skin/fxmanifest.lua | 2 +- [esx_addons]/esx_accessories/fxmanifest.lua | 2 +- [esx_addons]/esx_addonaccount/fxmanifest.lua | 2 +- .../esx_addoninventory/fxmanifest.lua | 2 +- [esx_addons]/esx_ambulancejob/fxmanifest.lua | 4 +- [esx_addons]/esx_animations/fxmanifest.lua | 2 +- [esx_addons]/esx_atm/fxmanifest.lua | 2 +- [esx_addons]/esx_bankerjob/fxmanifest.lua | 2 +- [esx_addons]/esx_barbershop/fxmanifest.lua | 2 +- [esx_addons]/esx_basicneeds/fxmanifest.lua | 2 +- [esx_addons]/esx_billing/fxmanifest.lua | 2 +- [esx_addons]/esx_boat/fxmanifest.lua | 2 +- [esx_addons]/esx_clotheshop/fxmanifest.lua | 2 +- [esx_addons]/esx_cruisecontrol/fxmanifest.lua | 2 +- [esx_addons]/esx_datastore/fxmanifest.lua | 2 +- [esx_addons]/esx_dmvschool/fxmanifest.lua | 2 +- [esx_addons]/esx_drugs/fxmanifest.lua | 2 +- [esx_addons]/esx_garage/fxmanifest.lua | 2 +- [esx_addons]/esx_holdup/fxmanifest.lua | 2 +- [esx_addons]/esx_joblisting/fxmanifest.lua | 2 +- [esx_addons]/esx_jobs/fxmanifest.lua | 2 +- [esx_addons]/esx_license/fxmanifest.lua | 2 +- [esx_addons]/esx_lscustom/fxmanifest.lua | 2 +- [esx_addons]/esx_mechanicjob/fxmanifest.lua | 2 +- [esx_addons]/esx_optionalneeds/fxmanifest.lua | 2 +- [esx_addons]/esx_phone/fxmanifest.lua | 2 +- [esx_addons]/esx_policejob/fxmanifest.lua | 2 +- [esx_addons]/esx_property/fxmanifest.lua | 2 +- .../esx_realestateagentjob/fxmanifest.lua | 2 +- [esx_addons]/esx_rpchat/fxmanifest.lua | 2 +- [esx_addons]/esx_service/fxmanifest.lua | 2 +- [esx_addons]/esx_shops/fxmanifest.lua | 2 +- [esx_addons]/esx_sit/fxmanifest.lua | 2 +- [esx_addons]/esx_society/fxmanifest.lua | 2 +- [esx_addons]/esx_status/fxmanifest.lua | 2 +- [esx_addons]/esx_taxijob/fxmanifest.lua | 2 +- [esx_addons]/esx_vehicleshop/fxmanifest.lua | 2 +- [esx_addons]/esx_voice/fxmanifest.lua | 2 +- [esx_addons]/esx_weaponshop/fxmanifest.lua | 2 +- [esx_addons]/esx_whitelist/fxmanifest.lua | 2 +- [esx_addons]/instance/fxmanifest.lua | 2 +- 73 files changed, 50 insertions(+), 1902 deletions(-) delete mode 100644 [esx]/esx_multicharacter/LICENSE.md delete mode 100644 [esx]/esx_multicharacter/client/main.lua delete mode 100644 [esx]/esx_multicharacter/config.lua delete mode 100644 [esx]/esx_multicharacter/esx_multicharacter.sql delete mode 100644 [esx]/esx_multicharacter/fxmanifest.lua delete mode 100644 [esx]/esx_multicharacter/html/css/main.css delete mode 100644 [esx]/esx_multicharacter/html/js/app.js delete mode 100644 [esx]/esx_multicharacter/html/locales/cs.js delete mode 100644 [esx]/esx_multicharacter/html/locales/de.js delete mode 100644 [esx]/esx_multicharacter/html/locales/en.js delete mode 100644 [esx]/esx_multicharacter/html/locales/fr.js delete mode 100644 [esx]/esx_multicharacter/html/locales/pl.js delete mode 100644 [esx]/esx_multicharacter/html/locales/pt.js delete mode 100644 [esx]/esx_multicharacter/html/locales/tr.js delete mode 100644 [esx]/esx_multicharacter/html/ui.html delete mode 100644 [esx]/esx_multicharacter/locales/cs.lua delete mode 100644 [esx]/esx_multicharacter/locales/de.lua delete mode 100644 [esx]/esx_multicharacter/locales/en.lua delete mode 100644 [esx]/esx_multicharacter/locales/it.lua delete mode 100644 [esx]/esx_multicharacter/locales/pt.lua delete mode 100644 [esx]/esx_multicharacter/locales/tr.lua delete mode 100644 [esx]/esx_multicharacter/readme.md delete mode 100644 [esx]/esx_multicharacter/server/commands.lua delete mode 100644 [esx]/esx_multicharacter/server/main.lua diff --git a/[SQL]/legacy.sql b/[SQL]/legacy.sql index f59c0ee1..ae6c1840 100644 --- a/[SQL]/legacy.sql +++ b/[SQL]/legacy.sql @@ -112,19 +112,6 @@ CREATE TABLE `cardealer_vehicles` ( -- -------------------------------------------------------- --- --- Table structure for table `multicharacter_slots` --- - -CREATE TABLE `multicharacter_slots` ( - `identifier` VARCHAR(60) NOT NULL, - `slots` INT(11) NOT NULL, - PRIMARY KEY (`identifier`) USING BTREE, - INDEX `slots` (`slots`) USING BTREE -) ENGINE=InnoDB; - --- -------------------------------------------------------- - -- -- Table structure for table `datastore` -- @@ -514,7 +501,6 @@ CREATE TABLE `users` ( `status` longtext DEFAULT NULL, `is_dead` tinyint(1) DEFAULT 0, `id` int(11) NOT NULL, - `disabled` TINYINT(1) NULL DEFAULT '0', `last_property` varchar(255) DEFAULT NULL ) ENGINE=InnoDB; diff --git a/[esx]/es_extended/config.lua b/[esx]/es_extended/config.lua index d18705bd..6d9f4203 100644 --- a/[esx]/es_extended/config.lua +++ b/[esx]/es_extended/config.lua @@ -18,5 +18,5 @@ Config.EnableDefaultInventory = true -- Display the default Inventory ( F2 ) Config.EnableWantedLevel = false -- Use Normal GTA wanted Level? Config.EnablePVP = true -- Allow Player to player combat -Config.Multichar = true -- Enable support for esx_multicharacter +Config.Multichar = false -- Enable support for esx_multicharacter Config.Identity = true -- Select a characters identity data before they have loaded in (this happens by default with multichar) diff --git a/[esx]/es_extended/fxmanifest.lua b/[esx]/es_extended/fxmanifest.lua index 5fdb4c7b..d25a3e5e 100644 --- a/[esx]/es_extended/fxmanifest.lua +++ b/[esx]/es_extended/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ES Extended' -version '1.6.5' +version '1.6.0' shared_scripts { 'locale.lua', diff --git a/[esx]/es_extended/version.json b/[esx]/es_extended/version.json index 147774cd..9f3db69d 100644 --- a/[esx]/es_extended/version.json +++ b/[esx]/es_extended/version.json @@ -1,5 +1,5 @@ { "version": "legacy", - "commit" : "1.6.5", - "changelog": "\n- Added Official Multicharacter" + "commit" : "1.4.2", + "changelog": "\n- Updated `Car` Command. Fixed some vulnerabilities. Fix SQL. Updated Commands." } diff --git a/[esx]/esx_identity/fxmanifest.lua b/[esx]/esx_identity/fxmanifest.lua index 79254f5e..1c4e4baf 100644 --- a/[esx]/esx_identity/fxmanifest.lua +++ b/[esx]/esx_identity/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Identity' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx]/esx_menu_default/fxmanifest.lua b/[esx]/esx_menu_default/fxmanifest.lua index 7139cca2..64a36d7f 100644 --- a/[esx]/esx_menu_default/fxmanifest.lua +++ b/[esx]/esx_menu_default/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Menu Default' -version '1.6.5' +version '1.6.0' client_scripts { '@es_extended/imports.lua', diff --git a/[esx]/esx_menu_dialog/fxmanifest.lua b/[esx]/esx_menu_dialog/fxmanifest.lua index 3a84362b..1959b086 100644 --- a/[esx]/esx_menu_dialog/fxmanifest.lua +++ b/[esx]/esx_menu_dialog/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Menu Dialog' -version '1.6.5' +version '1.6.0' client_scripts { '@es_extended/imports.lua', diff --git a/[esx]/esx_menu_list/fxmanifest.lua b/[esx]/esx_menu_list/fxmanifest.lua index f267511a..b980e57e 100644 --- a/[esx]/esx_menu_list/fxmanifest.lua +++ b/[esx]/esx_menu_list/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Menu List' -version '1.6.5' +version '1.6.0' client_scripts { '@es_extended/imports.lua', diff --git a/[esx]/esx_multicharacter/LICENSE.md b/[esx]/esx_multicharacter/LICENSE.md deleted file mode 100644 index f288702d..00000000 --- a/[esx]/esx_multicharacter/LICENSE.md +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/[esx]/esx_multicharacter/client/main.lua b/[esx]/esx_multicharacter/client/main.lua deleted file mode 100644 index cb10ca8f..00000000 --- a/[esx]/esx_multicharacter/client/main.lua +++ /dev/null @@ -1,335 +0,0 @@ -ESX = exports['es_extended']:getSharedObject() -if ESX.GetConfig().Multichar then - - Citizen.CreateThread(function() - while not ESX.PlayerLoaded do - Citizen.Wait(0) - if NetworkIsPlayerActive(PlayerId()) then - exports.spawnmanager:setAutoSpawn(false) - DoScreenFadeOut(0) - while not GetResourceState('esx_menu_default') == 'started' do - Citizen.Wait(0) - end - TriggerEvent("esx_multicharacter:SetupCharacters") - break - end - end - end) - - local canRelog, cam, spawned = true, nil, nil - local Characters = {} - - RegisterNetEvent('esx_multicharacter:SetupCharacters') - AddEventHandler('esx_multicharacter:SetupCharacters', function() - ESX.PlayerLoaded = false - ESX.PlayerData = {} - spawned = false - cam = CreateCam("DEFAULT_SCRIPTED_CAMERA", true) - local playerPed = PlayerPedId() - SetEntityCoords(playerPed, Config.Spawn.x, Config.Spawn.y, Config.Spawn.z, true, false, false, false) - SetEntityHeading(playerPed, Config.Spawn.w) - local offset = GetOffsetFromEntityInWorldCoords(playerPed, 0, 1.7, 0.4) - DoScreenFadeOut(0) - SetCamActive(cam, true) - RenderScriptCams(true, false, 1, true, true) - SetCamCoord(cam, offset.x, offset.y, offset.z) - PointCamAtCoord(cam, Config.Spawn.x, Config.Spawn.y, Config.Spawn.z + 1.3) - ESX.UI.Menu.CloseAll() - ESX.UI.HUD.SetDisplay(0.0) - StartLoop() - ShutdownLoadingScreen() - ShutdownLoadingScreenNui() - TriggerEvent('esx:loadingScreenOff') - Citizen.Wait(200) - TriggerServerEvent("esx_multicharacter:SetupCharacters") - end) - - StartLoop = function() - hidePlayers = true - MumbleSetVolumeOverride(PlayerId(), 0.0) - Citizen.CreateThread(function() - local keys = {18, 27, 172, 173, 174, 175, 176, 177, 187, 188, 191, 201, 108, 109} - while hidePlayers do - DisableAllControlActions(0) - for i = 1, #keys do - EnableControlAction(0, keys[i], true) - end - SetEntityVisible(PlayerPedId(), 0, 0) - SetLocalPlayerVisibleLocally(1) - SetPlayerInvincible(PlayerId(), 1) - ThefeedHideThisFrame() - HideHudComponentThisFrame(11) - HideHudComponentThisFrame(12) - HideHudComponentThisFrame(21) - HideHudAndRadarThisFrame() - Citizen.Wait(0) - local vehicles = GetGamePool('CVehicle') - for i = 1, #vehicles do - SetEntityLocallyInvisible(vehicles[i]) - end - end - local playerId, playerPed = PlayerId(), PlayerPedId() - MumbleSetVolumeOverride(playerId, -1.0) - SetEntityVisible(playerPed, 1, 0) - SetPlayerInvincible(playerId, 0) - FreezeEntityPosition(playerPed, false) - Citizen.Wait(10000) - canRelog = true - end) - Citizen.CreateThread(function() - local playerPool = {} - while hidePlayers do - local players = GetActivePlayers() - for i = 1, #players do - local player = players[i] - if player ~= PlayerId() and not playerPool[player] then - playerPool[player] = true - NetworkConcealPlayer(player, true, true) - end - end - Citizen.Wait(500) - end - for k in pairs(playerPool) do - NetworkConcealPlayer(k, false, false) - end - end) - end - - SetupCharacter = function(index) - if spawned == false then - exports.spawnmanager:spawnPlayer({ - x = Config.Spawn.x, - y = Config.Spawn.y, - z = Config.Spawn.z, - heading = Config.Spawn.w, - model = Characters[index].model or `mp_m_freemode_01`, - skipFade = true - }, function() - canRelog = false - if Characters[index] then - local skin = Characters[index].skin or Config.Default - if not Characters[index].model then - if Characters[index].sex == _('female') then skin.sex = 1 else skin.sex = 0 end - end - TriggerEvent('skinchanger:loadSkin', skin) - end - DoScreenFadeIn(400) - end) - repeat Citizen.Wait(200) until not IsScreenFadedOut() - - elseif Characters[index] and Characters[index].skin then - if Characters[spawned] and Characters[spawned].model then - RequestModel(Characters[index].model) - while not HasModelLoaded(Characters[index].model) do - RequestModel(Characters[index].model) - Citizen.Wait(0) - end - SetPlayerModel(PlayerId(), Characters[index].model) - SetModelAsNoLongerNeeded(Characters[index].model) - end - TriggerEvent('skinchanger:loadSkin', Characters[index].skin) - end - spawned = index - local playerPed = PlayerPedId() - FreezeEntityPosition(PlayerPedId(), true) - SetPedAoBlobRendering(playerPed, true) - SetEntityAlpha(playerPed, 255) - SendNUIMessage({ - action = "openui", - character = Characters[spawned] - }) - end - - RegisterNetEvent('esx_multicharacter:SetupUI') - AddEventHandler('esx_multicharacter:SetupUI', function(data, slots) - DoScreenFadeOut(0) - Characters = data - slots = slots - local elements = {} - local Character = next(Characters) - exports.spawnmanager:forceRespawn() - - if Character == nil then - SendNUIMessage({ - action = "closeui" - }) - exports.spawnmanager:spawnPlayer({ - x = Config.Spawn.x, - y = Config.Spawn.y, - z = Config.Spawn.z, - heading = Config.Spawn.w, - model = `mp_m_freemode_01`, - skipFade = true - }, function() - canRelog = false - DoScreenFadeIn(400) - Citizen.Wait(400) - local playerPed = PlayerPedId() - SetPedAoBlobRendering(playerPed, false) - SetEntityAlpha(playerPed, 0) - TriggerServerEvent('esx_multicharacter:CharacterChosen', 1, true) - TriggerEvent('esx_identity:showRegisterIdentity') - end) - else - for k,v in pairs(Characters) do - if not v.model and v.skin then - if v.skin.model then v.model = v.skin.model elseif v.skin.sex == 1 then v.model = `mp_f_freemode_01` else v.model = `mp_m_freemode_01` end - end - if spawned == false then SetupCharacter(Character) end - local label = v.firstname..' '..v.lastname - if Characters[k].disabled then - elements[#elements+1] = {label = label, value = v.id} - else - elements[#elements+1] = {label = label, value = v.id} - end - end - if #elements < slots then - elements[#elements+1] = {label = _('create_char'), value = (#elements+1), new = true} - end - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'selectchar', { - title = _('select_char'), - align = 'top-left', - elements = elements - }, function(data, menu) - local elements = {} - if not data.current.new then - if not Characters[data.current.value].disabled then - elements[1] = {label = _('char_play'), action = 'play', value = data.current.value} - else - elements[1] = {label = _('char_disabled'), value = data.current.value} - end - if Config.CanDelete then elements[2] = {label = _('char_delete'), action = 'delete', value = data.current.value} end - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'choosechar', { - title = _('select_char'), - align = 'top-left', - elements = elements - }, function(data, menu) - if data.current.action == 'play' then - ESX.UI.Menu.CloseAll() - SendNUIMessage({ - action = "closeui" - }) - TriggerServerEvent('esx_multicharacter:CharacterChosen', data.current.value, false) - elseif data.current.action == 'delete' then - local elements2 = {} - elements2[1] = {label = _('cancel')} - elements2[2] = {label = _('confirm'), value = data.current.value} - ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'deletechar', { - title = _('delete_label', Characters[data.current.value].firstname, Characters[data.current.value].lastname), - align = 'center', - elements = elements2 - }, function(data, menu) - if data.current.value then - TriggerServerEvent('esx_multicharacter:DeleteCharacter', data.current.value) - spawned = false - ESX.UI.Menu.CloseAll() - else - menu.close() - end - end, function(data, menu) - menu.close() - end) - end - end, function(data, menu) - menu.close() - end) - else - ESX.UI.Menu.CloseAll() - local GetSlot = function() - for i = 1, slots do - if not Characters[i] then - return i - end - end - end - local slot = GetSlot() - TriggerServerEvent('esx_multicharacter:CharacterChosen', slot, true) - TriggerEvent('esx_identity:showRegisterIdentity') - end - end, function(data, menu) - menu.refresh() - end, function(data, menu) - if data.current.new then - local playerPed = PlayerPedId() - SetPedAoBlobRendering(playerPed, false) - SetEntityAlpha(playerPed, 0) - SendNUIMessage({ - action = "closeui" - }) - else - SetupCharacter(data.current.value) - local playerPed = PlayerPedId() - SetPedAoBlobRendering(playerPed, true) - ResetEntityAlpha(playerPed) - end - end) - end - end) - - RegisterNetEvent('esx:playerLoaded') - AddEventHandler('esx:playerLoaded', function(playerData, isNew, skin) - local spawn = playerData.coords or Config.Spawn - if isNew or not skin or #skin == 1 then - local finished = false - local sex = skin.sex or 0 - if sex == 0 then model = `mp_m_freemode_01` else model = `mp_f_freemode_01` end - RequestModel(model) - while not HasModelLoaded(model) do - RequestModel(model) - Citizen.Wait(0) - end - SetPlayerModel(PlayerId(), model) - SetModelAsNoLongerNeeded(model) - skin = Config.Default - skin.sex = sex - TriggerEvent('skinchanger:loadSkin', skin, function() - playerPed = PlayerPedId() - SetPedAoBlobRendering(playerPed, true) - ResetEntityAlpha(playerPed) - TriggerEvent('esx_skin:openSaveableMenu', function() - finished = true end, function() finished = true - end) - end) - repeat Citizen.Wait(200) until finished - end - DoScreenFadeOut(100) - - SetCamActive(cam, false) - RenderScriptCams(false, false, 0, true, true) - cam = nil - local playerPed = PlayerPedId() - FreezeEntityPosition(playerPed, true) - SetEntityCoordsNoOffset(playerPed, spawn.x, spawn.y, spawn.z, false, false, false, true) - SetEntityHeading(playerPed, spawn.heading) - if not isNew then TriggerEvent('skinchanger:loadSkin', skin or Characters[spawned].skin) end - Citizen.Wait(400) - DoScreenFadeIn(400) - repeat Citizen.Wait(200) until not IsScreenFadedOut() - TriggerServerEvent('esx:onPlayerSpawn') - TriggerEvent('esx:onPlayerSpawn') - TriggerEvent('playerSpawned') - TriggerEvent('esx:restoreLoadout') - Characters, hidePlayers = {}, false - end) - - RegisterNetEvent('esx:onPlayerLogout') - AddEventHandler('esx:onPlayerLogout', function() - DoScreenFadeOut(0) - spawned = false - TriggerEvent("esx_multicharacter:SetupCharacters") - TriggerEvent('esx_skin:resetFirstSpawn') - end) - - if Config.Relog then - RegisterCommand('relog', function(source, args, rawCommand) - if canRelog == true then - canRelog = false - TriggerServerEvent('esx_multicharacter:relog') - ESX.SetTimeout(10000, function() - canRelog = true - end) - end - end) - end - -end diff --git a/[esx]/esx_multicharacter/config.lua b/[esx]/esx_multicharacter/config.lua deleted file mode 100644 index fe18b776..00000000 --- a/[esx]/esx_multicharacter/config.lua +++ /dev/null @@ -1,129 +0,0 @@ -Config = {} -Config.Locale = 'en' - --- Allows players to delete their characters -Config.CanDelete = true - -if IsDuplicityVersion() then - -- This is the default number of slots for EVERY player - -- If you want to manage extra slots for specific players you can do it by using '/setslots' and '/remslots' commands - Config.Slots = 4 - -------------------- - - -- Text to prepend to each character (char#:identifier) - keep it short - Config.Prefix = 'char' - -------------------- - - -- Default identifier to store for characters - this should always match es_extended (recommended: license) - Config.Identifier = 'license' - -else - -- Sets the location for the character selection scene - -- To set the spawn location for new characters, modify the default value in the `users` SQL table - Config.Spawn = vector4(-113.7, 565.3, 195.2, 0) - -------------------- - - -- Do not use unless you are prepared to adjust your resources to correctly reset data - -- Information: https://github.com/thelindat/esx_multicharacter#relogging - Config.Relog = true - -------------------- - - -- Default appearance for new characters - Config.Default = { - mom = 21, - dad = 0, - face_md_weight = 50, - skin_md_weight = 50, - nose_1 = 0, - nose_2 = 0, - nose_3 = 0, - nose_4 = 0, - nose_5 = 0, - nose_6 = 0, - cheeks_1 = 0, - cheeks_2 = 0, - cheeks_3 = 0, - lip_thickness = 0, - jaw_1 = 0, - jaw_2 = 0, - chin_1 = 0, - chin_2 = 0, - chin_13 = 0, - chin_4 = 0, - neck_thickness = 0, - hair_1 = 0, - hair_2 = 0, - hair_color_1 = 0, - hair_color_2 = 0, - tshirt_1 = 0, - tshirt_2 = 0, - torso_1 = 0, - torso_2 = 0, - decals_1 = 0, - decals_2 = 0, - arms = 0, - arms_2 = 0, - pants_1 = 0, - pants_2 = 0, - shoes_1 = 0, - shoes_2 = 0, - mask_1 = 0, - mask_2 = 0, - bproof_1 = 0, - bproof_2 = 0, - chain_1 = 0, - chain_2 = 0, - helmet_1 = -1, - helmet_2 = 0, - glasses_1 = 0, - glasses_2 = 0, - watches_1 = -1, - watches_2 = 0, - bracelets_1 = -1, - bracelets_2 = 0, - bags_1 = 0, - bags_2 = 0, - eye_color = 0, - eye_squint = 0, - eyebrows_2 = 0, - eyebrows_1 = 0, - eyebrows_3 = 0, - eyebrows_4 = 0, - eyebrows_5 = 0, - eyebrows_6 = 0, - makeup_1 = 0, - makeup_2 = 0, - makeup_3 = 0, - makeup_4 = 0, - lipstick_1 = 0, - lipstick_2 = 0, - lipstick_3 = 0, - lipstick_4 = 0, - ears_1 = -1, - ears_2 = 0, - chest_1 = 0, - chest_2 = 0, - chest_3 = 0, - bodyb_1 = -1, - bodyb_2 = 0, - bodyb_3 = -1, - bodyb_4 = 0, - age_1 = 0, - age_2 = 0, - blemishes_1 = 0, - blemishes_2 = 0, - blush_1 = 0, - blush_2 = 0, - blush_3 = 0, - complexion_1 = 0, - complexion_2 = 0, - sun_1 = 0, - sun_2 = 0, - moles_1 = 0, - moles_2 = 0, - beard_1 = 0, - beard_2 = 0, - beard_3 = 0, - beard_4 = 0 - } -end \ No newline at end of file diff --git a/[esx]/esx_multicharacter/esx_multicharacter.sql b/[esx]/esx_multicharacter/esx_multicharacter.sql deleted file mode 100644 index f19f7610..00000000 --- a/[esx]/esx_multicharacter/esx_multicharacter.sql +++ /dev/null @@ -1,9 +0,0 @@ -CREATE TABLE `multicharacter_slots` ( - `identifier` VARCHAR(60) NOT NULL, - `slots` INT(11) NOT NULL, - PRIMARY KEY (`identifier`) USING BTREE, - INDEX `slots` (`slots`) USING BTREE -) ENGINE=InnoDB; - -ALTER TABLE `users` ADD COLUMN - `disabled` TINYINT(1) NULL DEFAULT '0'; diff --git a/[esx]/esx_multicharacter/fxmanifest.lua b/[esx]/esx_multicharacter/fxmanifest.lua deleted file mode 100644 index 435f6ba3..00000000 --- a/[esx]/esx_multicharacter/fxmanifest.lua +++ /dev/null @@ -1,39 +0,0 @@ -fx_version 'cerulean' -game 'gta5' -description 'Official Multicharacter System For ESX Legacy' -version '1.6.5' -lua54 'yes' - -dependencies { - 'es_extended', - 'esx_menu_default', - 'esx_identity', - 'esx_skin' -} - -shared_scripts { - '@es_extended/locale.lua', - 'locales/*.lua', - 'config.lua' -} - -server_scripts { - '@es_extended/imports.lua', - '@oxmysql/lib/MySQL.lua', - 'server/*.lua', -} - -client_scripts { - 'client/*.lua' -} - -ui_page { - 'html/ui.html', -} - -files { - 'html/ui.html', - 'html/css/main.css', - 'html/js/app.js', - 'html/locales/*.js', -} diff --git a/[esx]/esx_multicharacter/html/css/main.css b/[esx]/esx_multicharacter/html/css/main.css deleted file mode 100644 index 15fb9bc5..00000000 --- a/[esx]/esx_multicharacter/html/css/main.css +++ /dev/null @@ -1,70 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Raleway:wght@300;600&display=swap'); -* { - margin: 0; - padding: 0; - user-select: none; - color: rgb(255, 255, 255); - font-weight: 300; - font-size: 1.6vh; - font-family: Calibri, "Helvetica", san-serif; -} - -html { - overflow: hidden; -} - -p { - margin: 0 !important; -} - -body { - background: transparent; -} - -.main-container { - display:none; - position: absolute; - top: 50%; - right: 25; - transform: translate(0, -50%); - background: rgba(0,0,0,0.7); -} - -.header { - position: absolute; - top: 5%; - left: 50%; - transform: translate(-50%); - font-size: 1.1rem; -} - -.footer { - position: absolute; - bottom: 5%; - left: 50%; - transform: translate(-50%); - font-size: 1.1rem; -} - -.character-box { - display: flex; - right: 0; - flex-direction: column; - justify-content: center; - align-items: center; - text-align: center; - line-height: 1.4rem; - height: calc(100vh - 6rem); - width: 20rem; - padding: 1rem; - border: 1px rgba(12,12,12,200) solid; - box-shadow: 0px 0px 4px 1px rgba(12,12,12,20); -} - -h1 { - font-family: 'Raleway', sans-serif; - padding-top: 2rem; - display: block; - font-size: 1.3rem; - font-weight: 600; -} diff --git a/[esx]/esx_multicharacter/html/js/app.js b/[esx]/esx_multicharacter/html/js/app.js deleted file mode 100644 index 22b5c92c..00000000 --- a/[esx]/esx_multicharacter/html/js/app.js +++ /dev/null @@ -1,35 +0,0 @@ -var money = Intl.NumberFormat('en-US', { - style: 'currency', - currency: 'USD', - minimumFractionDigits: 0 -}); - -(() => { - Kashacter = {}; - - Kashacter.ShowUI = function(data) { - $('body').css({"display":"block"}); - $('.main-container').css({"display":"block"}); - $('[data-charid=1]').html('

' + `${translate.name} ` + '

' + data.firstname +' '+ data.lastname +'

' + `${translate.job} ` + '

'+ data.job +' '+ data.job_grade +'

' + `${translate.money} ` + '

'+ money.format(data.money) +'

' + `${translate.bank} ` + '

'+ money.format(data.bank) +'

' + `${translate.dob} ` + '

'+ data.dateofbirth +'

' + `${translate.gender} ` + '

'+ data.sex +'

').attr("data-ischar", "true"); - }; - - Kashacter.CloseUI = function() { - $('body').css({"display":"none"}); - $('.main-container').css({"display":"none"}); - $('[data-charid=1]').html('

'); - }; - - window.onload = function(e) { - window.addEventListener('message', function(event) { - switch(event.data.action) { - case 'openui': - Kashacter.ShowUI(event.data.character); - break; - case 'closeui': - Kashacter.CloseUI(); - break; - } - }) - } - -})(); diff --git a/[esx]/esx_multicharacter/html/locales/cs.js b/[esx]/esx_multicharacter/html/locales/cs.js deleted file mode 100644 index cc84dedc..00000000 --- a/[esx]/esx_multicharacter/html/locales/cs.js +++ /dev/null @@ -1,8 +0,0 @@ -const translate = new Object(); - -translate.name = "Jméno"; -translate.job = "Práce"; -translate.bank = "Banka"; -translate.money = "Peníze"; -translate.gender = "Pohlaví"; -translate.dob = "Datum narození"; diff --git a/[esx]/esx_multicharacter/html/locales/de.js b/[esx]/esx_multicharacter/html/locales/de.js deleted file mode 100644 index efd17188..00000000 --- a/[esx]/esx_multicharacter/html/locales/de.js +++ /dev/null @@ -1,8 +0,0 @@ -const translate = new Object(); - -translate.name = "Name"; -translate.job = "Beruf"; -translate.bank = "Bankguthaben"; -translate.money = "Bargeld"; -translate.gender = "Geschlecht"; -translate.dob = "Geburtsdatum"; diff --git a/[esx]/esx_multicharacter/html/locales/en.js b/[esx]/esx_multicharacter/html/locales/en.js deleted file mode 100644 index 125dd3f0..00000000 --- a/[esx]/esx_multicharacter/html/locales/en.js +++ /dev/null @@ -1,8 +0,0 @@ -const translate = new Object(); - -translate.name = "Name"; -translate.job = "Job"; -translate.bank = "Bank"; -translate.money = "Cash"; -translate.gender = "Gender"; -translate.dob = "Date of birth"; diff --git a/[esx]/esx_multicharacter/html/locales/fr.js b/[esx]/esx_multicharacter/html/locales/fr.js deleted file mode 100644 index 597a217d..00000000 --- a/[esx]/esx_multicharacter/html/locales/fr.js +++ /dev/null @@ -1,8 +0,0 @@ -const translate = new Object(); - -translate.name = "Nom"; -translate.job = "Métier"; -translate.bank = "Banque"; -translate.money = "Argent"; -translate.gender = "Sexe"; -translate.dob = "Date de naissance"; diff --git a/[esx]/esx_multicharacter/html/locales/pl.js b/[esx]/esx_multicharacter/html/locales/pl.js deleted file mode 100644 index 07b27356..00000000 --- a/[esx]/esx_multicharacter/html/locales/pl.js +++ /dev/null @@ -1,8 +0,0 @@ -const translate = new Object(); - -translate.name = "imię"; -translate.job = "Zajęcie"; -translate.bank = "Bank"; -translate.money = "Gotówka"; -translate.gender = "Seks"; -translate.dob = "Data urodzenia"; diff --git a/[esx]/esx_multicharacter/html/locales/pt.js b/[esx]/esx_multicharacter/html/locales/pt.js deleted file mode 100644 index c8eca4f8..00000000 --- a/[esx]/esx_multicharacter/html/locales/pt.js +++ /dev/null @@ -1,8 +0,0 @@ -const translate = new Object(); - -translate.name = "Nome"; -translate.job = "Trabalho"; -translate.bank = "Banco"; -translate.money = "Dinheiro"; -translate.gender = "Género"; -translate.dob = "Data de Nascimento"; diff --git a/[esx]/esx_multicharacter/html/locales/tr.js b/[esx]/esx_multicharacter/html/locales/tr.js deleted file mode 100644 index ab820732..00000000 --- a/[esx]/esx_multicharacter/html/locales/tr.js +++ /dev/null @@ -1,8 +0,0 @@ -const translate = new Object(); - -translate.name = "İsim"; -translate.job = "Meslek"; -translate.bank = "Banka"; -translate.money = "Nakit"; -translate.gender = "Cinsiyet"; -translate.dob = "Doğum Tarihi"; diff --git a/[esx]/esx_multicharacter/html/ui.html b/[esx]/esx_multicharacter/html/ui.html deleted file mode 100644 index 7b59ac89..00000000 --- a/[esx]/esx_multicharacter/html/ui.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - -
-
ESX Legacy
-
-

-
-
- -
- - - - - - \ No newline at end of file diff --git a/[esx]/esx_multicharacter/locales/cs.lua b/[esx]/esx_multicharacter/locales/cs.lua deleted file mode 100644 index d309e309..00000000 --- a/[esx]/esx_multicharacter/locales/cs.lua +++ /dev/null @@ -1,25 +0,0 @@ -Locales['cs'] = { - ['male'] = "Muž", - ['female'] = "Žena", - ['delete_label'] = "Vymazat %s %s?", - ['select_char'] = "Zvolit Postavu", - ['create_char'] = "Vytvořit Novou Postavu", - ['char_play'] = "Hrát za postavu", - ['char_disabled'] = "Tato postava je zakázána!", - ['char_delete'] = "Vymazat postavu", - ['cancel'] = "Zrušit", - ['confirm'] = "Potvrdit", - ['command_setslots'] = "Nastavit slot pro hráče v multicharacteru", - ['command_remslots'] = "Odebrat slot pro hráče v multicharacteru", - ['command_enablechar'] = "Povolit zovlený slot hráči", - ['command_disablechar'] = "Zakázat zvolený slot pro hračé", - ['command_charslot'] = "Číslo slotu", - ['command_identifier'] = "Identifier hráče", - ['command_slots'] = "# ze slotu", - ['slotsadd'] = "Přidal slot %s hráči %s", - ['slotsedit'] = "Nastavil si slot %s hráči %s", - ['slotsrem'] = "Odebral si slot %s", - ['charenabled'] = "Povolol si postavu #%s z %s", - ['chardisabled'] = "Zakázal si postavu #%s z %s", - ['charnotfound'] = "Postava #%s z %s nebyla nalezena/neexistuje", -} diff --git a/[esx]/esx_multicharacter/locales/de.lua b/[esx]/esx_multicharacter/locales/de.lua deleted file mode 100644 index 654971af..00000000 --- a/[esx]/esx_multicharacter/locales/de.lua +++ /dev/null @@ -1,11 +0,0 @@ -Locales['de'] = { - ['male'] = "Männlich", - ['female'] = "Weiblich", - ['delete_label'] = "Lösche %s %s?", - ['select_char'] = "Charakter auswählen", - ['create_char'] = "Neuen Charakter erstellen", - ['char_play'] = "Diesen Charakter spielen", - ['char_delete'] = "Diesen Charakter löschen", - ['cancel'] = "Abbrechen", - ['confirm'] = "Bestätigen", -} diff --git a/[esx]/esx_multicharacter/locales/en.lua b/[esx]/esx_multicharacter/locales/en.lua deleted file mode 100644 index b71de307..00000000 --- a/[esx]/esx_multicharacter/locales/en.lua +++ /dev/null @@ -1,25 +0,0 @@ -Locales['en'] = { - ['male'] = "Male", - ['female'] = "Female", - ['delete_label'] = "Delete %s %s?", - ['select_char'] = "Select Character", - ['create_char'] = "Create new character", - ['char_play'] = "Play this character", - ['char_disabled'] = "This character is disabled", - ['char_delete'] = "Delete this character", - ['cancel'] = "Cancel", - ['confirm'] = "Confirm", - ['command_setslots'] = "Set multicharacter slots number of a player", - ['command_remslots'] = "Remove multicharacter slots number of a player", - ['command_enablechar'] = "Enable a given character of a player", - ['command_disablechar'] = "Disable a given character of a player", - ['command_charslot'] = "Slot number of the character", - ['command_identifier'] = "Player identifier", - ['command_slots'] = "# of slots", - ['slotsadd'] = "You added %s slots to %s", - ['slotsedit'] = "You set %s slots to %s", - ['slotsrem'] = "You removed slots to %s", - ['charenabled'] = "You enabled character #%s of %s", - ['chardisabled'] = "You disabled character #%s of %s", - ['charnotfound'] = "Character #%s of %s doesn't exist", -} diff --git a/[esx]/esx_multicharacter/locales/it.lua b/[esx]/esx_multicharacter/locales/it.lua deleted file mode 100644 index 1f2333e5..00000000 --- a/[esx]/esx_multicharacter/locales/it.lua +++ /dev/null @@ -1,25 +0,0 @@ -Locales['it'] = { - ['male'] = "Maschio", - ['female'] = "Femmina", - ['delete_label'] = "Cancella %s %s?", - ['select_char'] = "Seleziona Personaggio", - ['create_char'] = "Crea un nuovo personaggio", - ['char_play'] = "Gioca questo personaggio", - ['char_disabled'] = "Questo personaggio è disabilitato", - ['char_delete'] = "Cancella questo personaggio", - ['cancel'] = "Annulla", - ['confirm'] = "Conferma", - ['command_setslots'] = "Imposta il numero di slot di personaggi di un giocatore", - ['command_remslots'] = "Rimuovi il numero di slot di personaggi di un giocatore", - ['command_enablechar'] = "Abilita un personaggio di un giocatore", - ['command_disablechar'] = "Disabilita un personaggio di un giocatore", - ['command_charslot'] = "Numero dello slot del personaggio", - ['command_identifier'] = "Identifier del giocatore", - ['command_slots'] = "# di slot", - ['slotsadd'] = "Hai aggiunto %s slot a %s", - ['slotsedit'] = "Hai impostato %s slot a %s", - ['slotsrem'] = "Hai rimosso gli slot a %s", - ['charenabled'] = "Hai abilitato il %s° personaggio di %s", - ['chardisabled'] = "Hai disabilitato il %s° personaggio di %s", - ['charnotfound'] = "Il personaggio %s di %s non esiste", -} diff --git a/[esx]/esx_multicharacter/locales/pt.lua b/[esx]/esx_multicharacter/locales/pt.lua deleted file mode 100644 index 04b828a3..00000000 --- a/[esx]/esx_multicharacter/locales/pt.lua +++ /dev/null @@ -1,11 +0,0 @@ -Locales['pt'] = { - ['male'] = "Masculino", - ['female'] = "Feminino", - ['delete_label'] = "Eliminar %s %s?", - ['select_char'] = "Selecionar personagem", - ['create_char'] = "Criar novo personagem", - ['char_play'] = "Selecionar", - ['char_delete'] = "Eliminar personagem", - ['cancel'] = "Cancelar", - ['confirm'] = "Confirmar", -} diff --git a/[esx]/esx_multicharacter/locales/tr.lua b/[esx]/esx_multicharacter/locales/tr.lua deleted file mode 100644 index 8a3aa060..00000000 --- a/[esx]/esx_multicharacter/locales/tr.lua +++ /dev/null @@ -1,11 +0,0 @@ -Locales['tr'] = { - ['male'] = "Erkek", - ['female'] = "Kadın", - ['delete_label'] = "Sil %s %s?", - ['select_char'] = "Karakter Seç", - ['create_char'] = "Yeni Karakter Oluştur", - ['char_play'] = "Bu Karakterle Oyna", - ['char_delete'] = "Bu Karakteri Sil", - ['cancel'] = "İptal", - ['confirm'] = "Onayla", -} diff --git a/[esx]/esx_multicharacter/readme.md b/[esx]/esx_multicharacter/readme.md deleted file mode 100644 index f5879edc..00000000 --- a/[esx]/esx_multicharacter/readme.md +++ /dev/null @@ -1,59 +0,0 @@ - -# Preview - -![image](https://user-images.githubusercontent.com/65407488/126976325-17cc3241-bb9e-451f-a6ed-610a8ef52fa5.png) - -## Installation - -- Modify your ESX config with `Config.Multichar = true` -- All owner and identifier columns should be set to `VARCHAR(60)` to ensure correct data entry - - The resource will attempt to set columns automatically - -### Relogging - -- Do not enable this setting if you do not intend to properly set up relog support -- Requires the latest update for ESX Status (prevents multiple status ticks from running) -- Add the following events to resources that require support for relogging, or -- Add them to [@es_extended/imports.lua](https://github.com/esx-framework/esx-legacy/blob/main/[esx]/es_extended/imports.lua) (and use the imports in your resources) - -```lua -RegisterNetEvent('esx:playerLoaded', function(xPlayer) - ESX.PlayerData = xPlayer - ESX.PlayerLoaded = true -end) - -RegisterNetEvent('esx:onPlayerLogout', function() - ESX.PlayerLoaded = false - ESX.PlayerData = {} -end) -``` - -### Notes - -- Characters are stored in the users table as `char#:license` - if you need to use a different identifier then you need to modify ESX itself -- Character deletion does not require manual entries for the tables to remove -- As characters are stored with unique identifiers, there is no excessive queries being executed - -### Kashacters - -- This project is forked from the [kashacters multicharacter resource](https://github.com/FiveEYZ/esx_kashacter) -- Most of the code has been entirely rewritten -- KASH has given permission for this resource to use his code and the addition of a license -- The license obviously does not apply to previous versions and KASH has stated his resource is free to be used however - -## Notice - -Copyright © 2022 [Linden](https://github.com/thelindat/), ESX-Framework (fournier Brice & Jérémie N'gadi) and KASH - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . diff --git a/[esx]/esx_multicharacter/server/commands.lua b/[esx]/esx_multicharacter/server/commands.lua deleted file mode 100644 index 3cfa98d5..00000000 --- a/[esx]/esx_multicharacter/server/commands.lua +++ /dev/null @@ -1,79 +0,0 @@ -ESX.RegisterCommand('setslots', 'admin', function(xPlayer, args, showError) - local slots = MySQL.scalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { - args.identifier - }) - - if slots == nil then - MySQL.update('INSERT INTO `multicharacter_slots` (`identifier`, `slots`) VALUES (?, ?)', { - args.identifier, - args.slots - }) - xPlayer.triggerEvent('esx:showNotification', _U('slotsadd', args.slots, args.identifier)) - else - MySQL.update('UPDATE `multicharacter_slots` SET `slots` = ? WHERE `identifier` = ?', { - args.slots, - args.identifier - }) - xPlayer.triggerEvent('esx:showNotification', _U('slotsedit', args.slots, args.identifier)) - end -end, true, {help = _U('command_setslots'), validate = true, arguments = { - {name = 'identifier', help = _U('command_identifier'), type = 'string'}, - {name = 'slots', help = _U('command_slots'), type = 'number'} -}}) - -ESX.RegisterCommand('remslots', 'admin', function(xPlayer, args, showError) - local slots = MySQL.scalar('SELECT `slots` FROM `multicharacter_slots` WHERE identifier = ?', { - args.identifier - }) - - if slots ~= nil then - MySQL.update('DELETE FROM `multicharacter_slots` WHERE `identifier` = ?', { - args.identifier - }) - xPlayer.triggerEvent('esx:showNotification', _U('slotsrem', args.identifier)) - end -end, true, {help = _U('command_remslots'), validate = true, arguments = { - {name = 'identifier', help = _U('command_identifier'), type = 'string'} -}}) - -ESX.RegisterCommand('enablechar', 'admin', function(xPlayer, args, showError) - - local selectedCharacter = 'char'..args.charslot..':'..args.identifier; - - MySQL.update('UPDATE `users` SET `disabled` = 0 WHERE identifier = ?', { - selectedCharacter - }, function(result) - if result > 0 then - xPlayer.triggerEvent('esx:showNotification', _U('charenabled', args.charslot, args.identifier)) - else - xPlayer.triggerEvent('esx:showNotification', _U('charnotfound', args.charslot, args.identifier)) - end - end) - -end, true, {help = _U('command_enablechar'), validate = true, arguments = { - {name = 'identifier', help = _U('command_identifier'), type = 'string'}, - {name = 'charslot', help = _U('command_charslot'), type = 'number'} -}}) - -ESX.RegisterCommand('disablechar', 'admin', function(xPlayer, args, showError) - - local selectedCharacter = 'char'..args.charslot..':'..args.identifier; - - MySQL.update('UPDATE `users` SET `disabled` = 1 WHERE identifier = ?', { - selectedCharacter - }, function(result) - if result > 0 then - xPlayer.triggerEvent('esx:showNotification', _U('chardisabled', args.charslot, args.identifier)) - else - xPlayer.triggerEvent('esx:showNotification', _U('charnotfound', args.charslot, args.identifier)) - end - end) - -end, true, {help = _U('command_disablechar'), validate = true, arguments = { - {name = 'identifier', help = _U('command_identifier'), type = 'string'}, - {name = 'charslot', help = _U('command_charslot'), type = 'number'} -}}) - -RegisterCommand('forcelog', function(source, args, rawCommand) - TriggerEvent('esx:playerLogout', source) -end, true) diff --git a/[esx]/esx_multicharacter/server/main.lua b/[esx]/esx_multicharacter/server/main.lua deleted file mode 100644 index 266c560c..00000000 --- a/[esx]/esx_multicharacter/server/main.lua +++ /dev/null @@ -1,221 +0,0 @@ -if not ESX then - error('\n^1Unable to start Multicharacter - you must be using ESX Legacy^0') -elseif ESX.GetConfig().Multichar == true then - local DATABASE do - local connectionString = GetConvar('mysql_connection_string', ''); - if connectionString == '' then - error(connectionString..'\n^1Unable to start Multicharacter - unable to determine database from mysql_connection_string^0', 0) - elseif connectionString:find('mysql://') then - connectionString = connectionString:sub(9, -1) - DATABASE = connectionString:sub(connectionString:find('/')+1, -1):gsub('[%?]+[%w%p]*$', '') - else - connectionString = {string.strsplit(';', connectionString)} - for i = 1, #connectionString do - local v = connectionString[i] - if v:match('database') then - DATABASE = v:sub(10, #v) - end - end - end - end - - local DB_TABLES = {users = 'identifier'} - local FETCH = nil - local SLOTS = Config.Slots or 4 - local PREFIX = Config.Prefix or 'char' - local PRIMARY_IDENTIFIER = ESX.GetConfig().Identifier or GetConvar('sv_lan', '') == 'true' and 'ip' or Config.Identifier - - local function GetIdentifier(source) - local identifier = PRIMARY_IDENTIFIER..':' - for _, v in pairs(GetPlayerIdentifiers(source)) do - if string.match(v, identifier) then - identifier = string.gsub(v, identifier, '') - return identifier - end - end - end - - if next(ESX.Players) then - local players = table.clone(ESX.Players) - table.wipe(ESX.Players) - for _, v in pairs(players) do - ESX.Players[GetIdentifier(v.source)] = true - end - else ESX.Players = {} end - - local function SetupCharacters(source) - while not FETCH do Citizen.Wait(100) end - local identifier = GetIdentifier(source) - ESX.Players[identifier] = true - - local slots = MySQL.scalar.await('SELECT slots FROM multicharacter_slots WHERE identifier = ?', { identifier }) or SLOTS - identifier = PREFIX..'%:'..identifier - - local result = MySQL.query.await(FETCH, {identifier, slots}) - local characters - - if result then - local characterCount = #result - characters = table.create(0, characterCount) - - for i = 1, characterCount, 1 do - local v = result[i] - local job, grade = v.job or 'unemployed', tostring(v.job_grade) - - if ESX.Jobs[job] and ESX.Jobs[job].grades[grade] then - if job ~= 'unemployed' then grade = ESX.Jobs[job].grades[grade].label else grade = '' end - job = ESX.Jobs[job].label - end - - local accounts = json.decode(v.accounts) - local id = tonumber(string.sub(v.identifier, #PREFIX+1, string.find(v.identifier, ':')-1)) - - characters[id] = { - id = id, - bank = accounts.bank, - money = accounts.money, - job = job, - job_grade = grade, - firstname = v.firstname, - lastname = v.lastname, - dateofbirth = v.dateofbirth, - skin = v.skin and json.decode(v.skin) or {}, - disabled = v.disabled, - sex = v.sex == 'm' and _('male') or _('female') - } - end - end - - TriggerClientEvent('esx_multicharacter:SetupUI', source, characters, slots) - end - - AddEventHandler('playerConnecting', function(playerName, setKickReason, deferrals) - deferrals.defer() - local identifier = GetIdentifier(source) - - if identifier then - if ESX.Players[identifier] then - deferrals.done(('A player is already connected to the server with this identifier.\nYour identifier: %s:%s'):format(PRIMARY_IDENTIFIER, identifier)) - else - deferrals.done() - end - else - deferrals.done(('Unable to retrieve player identifier.\nIdentifier type: %s'):format(PRIMARY_IDENTIFIER)) - end - end) - - local function DeleteCharacter(source, charid) - local identifier = ('%s%s:%s'):format(PREFIX, charid, GetIdentifier(source)) - local query = 'DELETE FROM %s WHERE %s = ?' - local queries = {} - local count = 0 - - for table, column in pairs(DB_TABLES) do - count += 1 - queries[count] = {query = query:format(table, column), values = {identifier}} - end - - MySQL.transaction(queries, function(result) - if result then - print(('[^2INFO^7] Player [%s] %s has deleted a character (%s)'):format(GetPlayerName(source), source, identifier)) - Citizen.Wait(50) - SetupCharacters(source) - else - error('\n^1Transaction failed while trying to delete '..identifier..'^0') - end - end) - end - - MySQL.ready(function() - local length = 42 + #PREFIX - local DB_COLUMNS = MySQL.query.await(('SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = "%s" AND DATA_TYPE = "varchar" AND COLUMN_NAME IN (?)'):format(DATABASE, length), { - {'identifier', 'owner'} - }) - - if DB_COLUMNS then - local columns = {} - local count = 0 - - for i = 1, #DB_COLUMNS do - local v = DB_COLUMNS[i] - - if v?.CHARACTER_MAXIMUM_LENGTH ~= length then - count += 1 - columns[v.TABLE_NAME] = v.COLUMN_NAME - end - end - - if next(columns) then - local query = 'ALTER TABLE `%s` MODIFY COLUMN `%s` VARCHAR(%s)' - local queries = table.create(count, 0) - - for k, v in pairs(columns) do - queries[#queries+1] = {query = query:format(k, v, length)} - end - - if MySQL.transaction.await(queries) then - print(('[^2INFO^7] Updated ^5%s^7 columns to use VARCHAR(%s)'):format(count, length)) - else - print(('[^2INFO^7] Unable to update ^5%s^7 columns to use VARCHAR(%s)'):format(count, length)) - end - end - - ESX.Jobs = {} - - local function GetJobs() - if ESX.GetJobs then - return ESX.GetJobs() - end - return exports.es_extended:getSharedObject().Jobs - end - - repeat - ESX.Jobs = GetJobs() - Citizen.Wait(50) - until next(ESX.Jobs) - - FETCH = 'SELECT identifier, accounts, job, job_grade, firstname, lastname, dateofbirth, sex, skin, disabled FROM users WHERE identifier LIKE ? LIMIT ?' - end - end) - - RegisterNetEvent('esx_multicharacter:SetupCharacters', function() - SetupCharacters(source) - end) - - local awaitingRegistration = {} - - RegisterNetEvent('esx_multicharacter:CharacterChosen', function(charid, isNew) - if type(charid) == 'number' and string.len(charid) <= 2 and type(isNew) == 'boolean' then - if isNew then - awaitingRegistration[source] = charid - else - TriggerEvent('esx:onPlayerJoined', source, PREFIX..charid) - ESX.Players[GetIdentifier(source)] = true - end - end - end) - - AddEventHandler('esx_identity:completedRegistration', function(source, data) - TriggerEvent('esx:onPlayerJoined', source, PREFIX..awaitingRegistration[source], data) - awaitingRegistration[source] = nil - ESX.Players[GetIdentifier(source)] = true - end) - - AddEventHandler('playerDropped', function(reason) - awaitingRegistration[source] = nil - ESX.Players[GetIdentifier(source)] = nil - end) - - RegisterNetEvent('esx_multicharacter:DeleteCharacter', function(charid) - if Config.CanDelete and type(charid) == 'number' and string.len(charid) <= 2 then - DeleteCharacter(source, charid) - end - end) - - RegisterNetEvent('esx_multicharacter:relog', function() - TriggerEvent('esx:playerLogout', source) - end) - -else - assert(nil, '^3WARNING: Multicharacter is disabled - please check your ESX configuration^0') -end diff --git a/[esx]/esx_skin/fxmanifest.lua b/[esx]/esx_skin/fxmanifest.lua index 31b095d2..0feb09d3 100644 --- a/[esx]/esx_skin/fxmanifest.lua +++ b/[esx]/esx_skin/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Skin' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_accessories/fxmanifest.lua b/[esx_addons]/esx_accessories/fxmanifest.lua index d2fb53da..6acdf67a 100644 --- a/[esx_addons]/esx_accessories/fxmanifest.lua +++ b/[esx_addons]/esx_accessories/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Accessories' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_addonaccount/fxmanifest.lua b/[esx_addons]/esx_addonaccount/fxmanifest.lua index 7aacd820..8fd979bd 100644 --- a/[esx_addons]/esx_addonaccount/fxmanifest.lua +++ b/[esx_addons]/esx_addonaccount/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Addon Account' -version '1.6.5' +version '1.6.0' server_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_addoninventory/fxmanifest.lua b/[esx_addons]/esx_addoninventory/fxmanifest.lua index 404b109d..c8f0c790 100644 --- a/[esx_addons]/esx_addoninventory/fxmanifest.lua +++ b/[esx_addons]/esx_addoninventory/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Addon Inventory' -version '1.6.5' +version '1.6.0' server_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_ambulancejob/fxmanifest.lua b/[esx_addons]/esx_ambulancejob/fxmanifest.lua index 80444c35..5ff50452 100644 --- a/[esx_addons]/esx_ambulancejob/fxmanifest.lua +++ b/[esx_addons]/esx_ambulancejob/fxmanifest.lua @@ -4,9 +4,9 @@ game 'gta5' description 'ESX Ambulance Job' -version '1.6.5' +version '1.6.0' -c +shared_script '@es_extended/imports.lua' server_scripts { '@oxmysql/lib/MySQL.lua', diff --git a/[esx_addons]/esx_animations/fxmanifest.lua b/[esx_addons]/esx_animations/fxmanifest.lua index 70fd794c..1897459b 100644 --- a/[esx_addons]/esx_animations/fxmanifest.lua +++ b/[esx_addons]/esx_animations/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Animations' -version '1.6.5' +version '1.6.0' client_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_atm/fxmanifest.lua b/[esx_addons]/esx_atm/fxmanifest.lua index 9d6f4325..a464c619 100644 --- a/[esx_addons]/esx_atm/fxmanifest.lua +++ b/[esx_addons]/esx_atm/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Atm' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_bankerjob/fxmanifest.lua b/[esx_addons]/esx_bankerjob/fxmanifest.lua index d4259110..d60a7ca0 100644 --- a/[esx_addons]/esx_bankerjob/fxmanifest.lua +++ b/[esx_addons]/esx_bankerjob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Banker job' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_barbershop/fxmanifest.lua b/[esx_addons]/esx_barbershop/fxmanifest.lua index 3859ec00..a83ae43e 100644 --- a/[esx_addons]/esx_barbershop/fxmanifest.lua +++ b/[esx_addons]/esx_barbershop/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Barber Shop' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_basicneeds/fxmanifest.lua b/[esx_addons]/esx_basicneeds/fxmanifest.lua index 6e5cf251..2088dd2d 100644 --- a/[esx_addons]/esx_basicneeds/fxmanifest.lua +++ b/[esx_addons]/esx_basicneeds/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Basic Needs' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_billing/fxmanifest.lua b/[esx_addons]/esx_billing/fxmanifest.lua index dbfbfdfc..56ef67ca 100644 --- a/[esx_addons]/esx_billing/fxmanifest.lua +++ b/[esx_addons]/esx_billing/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Billing' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_boat/fxmanifest.lua b/[esx_addons]/esx_boat/fxmanifest.lua index 0cb962ea..3a8c8fca 100644 --- a/[esx_addons]/esx_boat/fxmanifest.lua +++ b/[esx_addons]/esx_boat/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Boat' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_clotheshop/fxmanifest.lua b/[esx_addons]/esx_clotheshop/fxmanifest.lua index 41e7a38b..a8dd1b89 100644 --- a/[esx_addons]/esx_clotheshop/fxmanifest.lua +++ b/[esx_addons]/esx_clotheshop/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Clothes Shop' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_cruisecontrol/fxmanifest.lua b/[esx_addons]/esx_cruisecontrol/fxmanifest.lua index c6fa2dee..e92aa300 100644 --- a/[esx_addons]/esx_cruisecontrol/fxmanifest.lua +++ b/[esx_addons]/esx_cruisecontrol/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'CruiseControl System for ESX' -version '1.6.5' +version '1.6.0' dependencies { 'es_extended' diff --git a/[esx_addons]/esx_datastore/fxmanifest.lua b/[esx_addons]/esx_datastore/fxmanifest.lua index aa84426e..4f948458 100644 --- a/[esx_addons]/esx_datastore/fxmanifest.lua +++ b/[esx_addons]/esx_datastore/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Data Store' -version '1.6.5' +version '1.6.0' server_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_dmvschool/fxmanifest.lua b/[esx_addons]/esx_dmvschool/fxmanifest.lua index 726b5d16..433a2fb3 100644 --- a/[esx_addons]/esx_dmvschool/fxmanifest.lua +++ b/[esx_addons]/esx_dmvschool/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX DMV School' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_drugs/fxmanifest.lua b/[esx_addons]/esx_drugs/fxmanifest.lua index 45782bd6..45e910b1 100644 --- a/[esx_addons]/esx_drugs/fxmanifest.lua +++ b/[esx_addons]/esx_drugs/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Drugs' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_garage/fxmanifest.lua b/[esx_addons]/esx_garage/fxmanifest.lua index 28a0dc29..02614ad7 100644 --- a/[esx_addons]/esx_garage/fxmanifest.lua +++ b/[esx_addons]/esx_garage/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Garage' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_holdup/fxmanifest.lua b/[esx_addons]/esx_holdup/fxmanifest.lua index 52619849..1aec4396 100644 --- a/[esx_addons]/esx_holdup/fxmanifest.lua +++ b/[esx_addons]/esx_holdup/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Holdup' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_joblisting/fxmanifest.lua b/[esx_addons]/esx_joblisting/fxmanifest.lua index c5e4bd50..a910652f 100644 --- a/[esx_addons]/esx_joblisting/fxmanifest.lua +++ b/[esx_addons]/esx_joblisting/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Job Listing' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_jobs/fxmanifest.lua b/[esx_addons]/esx_jobs/fxmanifest.lua index 25d637af..8beb059a 100644 --- a/[esx_addons]/esx_jobs/fxmanifest.lua +++ b/[esx_addons]/esx_jobs/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Jobs' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_license/fxmanifest.lua b/[esx_addons]/esx_license/fxmanifest.lua index 9bef90a7..8d907995 100644 --- a/[esx_addons]/esx_license/fxmanifest.lua +++ b/[esx_addons]/esx_license/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX License' -version '1.6.5' +version '1.6.0' server_scripts { '@async/async.lua', diff --git a/[esx_addons]/esx_lscustom/fxmanifest.lua b/[esx_addons]/esx_lscustom/fxmanifest.lua index 19efd417..d6ec6779 100644 --- a/[esx_addons]/esx_lscustom/fxmanifest.lua +++ b/[esx_addons]/esx_lscustom/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX LS Customs' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_mechanicjob/fxmanifest.lua b/[esx_addons]/esx_mechanicjob/fxmanifest.lua index dfc4140a..4d24aeee 100644 --- a/[esx_addons]/esx_mechanicjob/fxmanifest.lua +++ b/[esx_addons]/esx_mechanicjob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Mechanic Job' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_optionalneeds/fxmanifest.lua b/[esx_addons]/esx_optionalneeds/fxmanifest.lua index 2e788e88..f5793a9a 100644 --- a/[esx_addons]/esx_optionalneeds/fxmanifest.lua +++ b/[esx_addons]/esx_optionalneeds/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Optional Needs' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_phone/fxmanifest.lua b/[esx_addons]/esx_phone/fxmanifest.lua index c7f52a52..96733393 100644 --- a/[esx_addons]/esx_phone/fxmanifest.lua +++ b/[esx_addons]/esx_phone/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Phone' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_policejob/fxmanifest.lua b/[esx_addons]/esx_policejob/fxmanifest.lua index 6dd5ac08..60c00cf7 100644 --- a/[esx_addons]/esx_policejob/fxmanifest.lua +++ b/[esx_addons]/esx_policejob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Police Job' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_property/fxmanifest.lua b/[esx_addons]/esx_property/fxmanifest.lua index 0ef6d6e9..dddedcc2 100644 --- a/[esx_addons]/esx_property/fxmanifest.lua +++ b/[esx_addons]/esx_property/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Property' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_realestateagentjob/fxmanifest.lua b/[esx_addons]/esx_realestateagentjob/fxmanifest.lua index 1dbccfd7..5201b2c8 100644 --- a/[esx_addons]/esx_realestateagentjob/fxmanifest.lua +++ b/[esx_addons]/esx_realestateagentjob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Real Estate Job' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_rpchat/fxmanifest.lua b/[esx_addons]/esx_rpchat/fxmanifest.lua index 06774b5d..4d8ae670 100644 --- a/[esx_addons]/esx_rpchat/fxmanifest.lua +++ b/[esx_addons]/esx_rpchat/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX RP Chat' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_service/fxmanifest.lua b/[esx_addons]/esx_service/fxmanifest.lua index 9f49bd78..d271c37c 100644 --- a/[esx_addons]/esx_service/fxmanifest.lua +++ b/[esx_addons]/esx_service/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Service' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_shops/fxmanifest.lua b/[esx_addons]/esx_shops/fxmanifest.lua index fdf23909..9aebaf69 100644 --- a/[esx_addons]/esx_shops/fxmanifest.lua +++ b/[esx_addons]/esx_shops/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Shops' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_sit/fxmanifest.lua b/[esx_addons]/esx_sit/fxmanifest.lua index 2e971618..630b2898 100644 --- a/[esx_addons]/esx_sit/fxmanifest.lua +++ b/[esx_addons]/esx_sit/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Sit' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_society/fxmanifest.lua b/[esx_addons]/esx_society/fxmanifest.lua index 79fe1448..43769fd6 100644 --- a/[esx_addons]/esx_society/fxmanifest.lua +++ b/[esx_addons]/esx_society/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Society' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_status/fxmanifest.lua b/[esx_addons]/esx_status/fxmanifest.lua index 68bd5b3f..d4ebd2c7 100644 --- a/[esx_addons]/esx_status/fxmanifest.lua +++ b/[esx_addons]/esx_status/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Status' -version '1.6.5' +version '1.6.0' lua54 'yes' diff --git a/[esx_addons]/esx_taxijob/fxmanifest.lua b/[esx_addons]/esx_taxijob/fxmanifest.lua index 54e4ea72..b2e67b5f 100644 --- a/[esx_addons]/esx_taxijob/fxmanifest.lua +++ b/[esx_addons]/esx_taxijob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Taxi Job' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_vehicleshop/fxmanifest.lua b/[esx_addons]/esx_vehicleshop/fxmanifest.lua index 82c483c0..f87595e3 100644 --- a/[esx_addons]/esx_vehicleshop/fxmanifest.lua +++ b/[esx_addons]/esx_vehicleshop/fxmanifest.lua @@ -6,7 +6,7 @@ lua54 'yes' description 'ESX Vehicle Shop' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_voice/fxmanifest.lua b/[esx_addons]/esx_voice/fxmanifest.lua index 9ffc0aeb..a8e2697a 100644 --- a/[esx_addons]/esx_voice/fxmanifest.lua +++ b/[esx_addons]/esx_voice/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Voice Controller' -version '1.6.5' +version '1.6.0' client_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_weaponshop/fxmanifest.lua b/[esx_addons]/esx_weaponshop/fxmanifest.lua index 64296bf3..65e74b5e 100644 --- a/[esx_addons]/esx_weaponshop/fxmanifest.lua +++ b/[esx_addons]/esx_weaponshop/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Weapon Shop' -version '1.6.5' +version '1.6.0' shared_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_whitelist/fxmanifest.lua b/[esx_addons]/esx_whitelist/fxmanifest.lua index 6319d5d9..8c6515e6 100644 --- a/[esx_addons]/esx_whitelist/fxmanifest.lua +++ b/[esx_addons]/esx_whitelist/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Whitelist' -version '1.6.5' +version '1.6.0' server_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/instance/fxmanifest.lua b/[esx_addons]/instance/fxmanifest.lua index f5a4b905..57aa044e 100644 --- a/[esx_addons]/instance/fxmanifest.lua +++ b/[esx_addons]/instance/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'Instance' -version '1.6.5' +version '1.6.0' shared_script '@es_extended/imports.lua' From d2c1c6ecd9926c3256e3a6fc2764243f8704b157 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Wed, 23 Mar 2022 16:04:42 +0000 Subject: [PATCH 079/132] Revert "Delete esx_multicharacter" This reverts commit d659a73d182a5febd1e0cfc2b184f2c203693da5. --- [esx_addons]/esx_multicharacter | 1 + 1 file changed, 1 insertion(+) create mode 160000 [esx_addons]/esx_multicharacter diff --git a/[esx_addons]/esx_multicharacter b/[esx_addons]/esx_multicharacter new file mode 160000 index 00000000..02352a8e --- /dev/null +++ b/[esx_addons]/esx_multicharacter @@ -0,0 +1 @@ +Subproject commit 02352a8e18176cb9f369ba608aab66ccf0311fe0 From 1be411b3d1504eab0bd62be2114176cd055c41fd Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Wed, 23 Mar 2022 20:34:16 +1100 Subject: [PATCH 080/132] chore: move esx_multicharacter files --- .../esx_multicharacter/LICENSE.md | 0 .../esx_multicharacter/client}/main.lua | 0 .../esx_multicharacter/config.lua | 0 .../esx_multicharacter/esx_multicharacter.sql | 0 .../esx_multicharacter/fxmanifest.lua | 0 .../esx_multicharacter/html}/css/main.css | 0 .../esx_multicharacter/html}/js/app.js | 0 .../esx_multicharacter/html}/locales/cs.js | 0 .../esx_multicharacter/html}/locales/de.js | 0 .../esx_multicharacter/html}/locales/en.js | 0 .../esx_multicharacter/html}/locales/fr.js | 0 .../esx_multicharacter/html}/locales/pl.js | 0 .../esx_multicharacter/html}/locales/pt.js | 0 .../esx_multicharacter/html}/locales/tr.js | 0 .../esx_multicharacter/html}/ui.html | 0 .../esx_multicharacter/locales}/cs.lua | 0 .../esx_multicharacter/locales}/de.lua | 0 .../esx_multicharacter/locales}/en.lua | 0 .../esx_multicharacter/locales}/it.lua | 0 .../esx_multicharacter/locales}/pt.lua | 0 .../esx_multicharacter/locales}/tr.lua | 0 .../esx_multicharacter/readme.md | 144 +++++++++--------- .../esx_multicharacter/server}/commands.lua | 0 .../esx_multicharacter/server}/main.lua | 0 24 files changed, 72 insertions(+), 72 deletions(-) rename LICENSE.md => [esx]/esx_multicharacter/LICENSE.md (100%) rename {client => [esx]/esx_multicharacter/client}/main.lua (100%) rename config.lua => [esx]/esx_multicharacter/config.lua (100%) rename esx_multicharacter.sql => [esx]/esx_multicharacter/esx_multicharacter.sql (100%) rename fxmanifest.lua => [esx]/esx_multicharacter/fxmanifest.lua (100%) rename {html => [esx]/esx_multicharacter/html}/css/main.css (100%) rename {html => [esx]/esx_multicharacter/html}/js/app.js (100%) rename {html => [esx]/esx_multicharacter/html}/locales/cs.js (100%) rename {html => [esx]/esx_multicharacter/html}/locales/de.js (100%) rename {html => [esx]/esx_multicharacter/html}/locales/en.js (100%) rename {html => [esx]/esx_multicharacter/html}/locales/fr.js (100%) rename {html => [esx]/esx_multicharacter/html}/locales/pl.js (100%) rename {html => [esx]/esx_multicharacter/html}/locales/pt.js (100%) rename {html => [esx]/esx_multicharacter/html}/locales/tr.js (100%) rename {html => [esx]/esx_multicharacter/html}/ui.html (100%) rename {locales => [esx]/esx_multicharacter/locales}/cs.lua (100%) rename {locales => [esx]/esx_multicharacter/locales}/de.lua (100%) rename {locales => [esx]/esx_multicharacter/locales}/en.lua (100%) rename {locales => [esx]/esx_multicharacter/locales}/it.lua (100%) rename {locales => [esx]/esx_multicharacter/locales}/pt.lua (100%) rename {locales => [esx]/esx_multicharacter/locales}/tr.lua (100%) rename readme.md => [esx]/esx_multicharacter/readme.md (97%) rename {server => [esx]/esx_multicharacter/server}/commands.lua (100%) rename {server => [esx]/esx_multicharacter/server}/main.lua (100%) diff --git a/LICENSE.md b/[esx]/esx_multicharacter/LICENSE.md similarity index 100% rename from LICENSE.md rename to [esx]/esx_multicharacter/LICENSE.md diff --git a/client/main.lua b/[esx]/esx_multicharacter/client/main.lua similarity index 100% rename from client/main.lua rename to [esx]/esx_multicharacter/client/main.lua diff --git a/config.lua b/[esx]/esx_multicharacter/config.lua similarity index 100% rename from config.lua rename to [esx]/esx_multicharacter/config.lua diff --git a/esx_multicharacter.sql b/[esx]/esx_multicharacter/esx_multicharacter.sql similarity index 100% rename from esx_multicharacter.sql rename to [esx]/esx_multicharacter/esx_multicharacter.sql diff --git a/fxmanifest.lua b/[esx]/esx_multicharacter/fxmanifest.lua similarity index 100% rename from fxmanifest.lua rename to [esx]/esx_multicharacter/fxmanifest.lua diff --git a/html/css/main.css b/[esx]/esx_multicharacter/html/css/main.css similarity index 100% rename from html/css/main.css rename to [esx]/esx_multicharacter/html/css/main.css diff --git a/html/js/app.js b/[esx]/esx_multicharacter/html/js/app.js similarity index 100% rename from html/js/app.js rename to [esx]/esx_multicharacter/html/js/app.js diff --git a/html/locales/cs.js b/[esx]/esx_multicharacter/html/locales/cs.js similarity index 100% rename from html/locales/cs.js rename to [esx]/esx_multicharacter/html/locales/cs.js diff --git a/html/locales/de.js b/[esx]/esx_multicharacter/html/locales/de.js similarity index 100% rename from html/locales/de.js rename to [esx]/esx_multicharacter/html/locales/de.js diff --git a/html/locales/en.js b/[esx]/esx_multicharacter/html/locales/en.js similarity index 100% rename from html/locales/en.js rename to [esx]/esx_multicharacter/html/locales/en.js diff --git a/html/locales/fr.js b/[esx]/esx_multicharacter/html/locales/fr.js similarity index 100% rename from html/locales/fr.js rename to [esx]/esx_multicharacter/html/locales/fr.js diff --git a/html/locales/pl.js b/[esx]/esx_multicharacter/html/locales/pl.js similarity index 100% rename from html/locales/pl.js rename to [esx]/esx_multicharacter/html/locales/pl.js diff --git a/html/locales/pt.js b/[esx]/esx_multicharacter/html/locales/pt.js similarity index 100% rename from html/locales/pt.js rename to [esx]/esx_multicharacter/html/locales/pt.js diff --git a/html/locales/tr.js b/[esx]/esx_multicharacter/html/locales/tr.js similarity index 100% rename from html/locales/tr.js rename to [esx]/esx_multicharacter/html/locales/tr.js diff --git a/html/ui.html b/[esx]/esx_multicharacter/html/ui.html similarity index 100% rename from html/ui.html rename to [esx]/esx_multicharacter/html/ui.html diff --git a/locales/cs.lua b/[esx]/esx_multicharacter/locales/cs.lua similarity index 100% rename from locales/cs.lua rename to [esx]/esx_multicharacter/locales/cs.lua diff --git a/locales/de.lua b/[esx]/esx_multicharacter/locales/de.lua similarity index 100% rename from locales/de.lua rename to [esx]/esx_multicharacter/locales/de.lua diff --git a/locales/en.lua b/[esx]/esx_multicharacter/locales/en.lua similarity index 100% rename from locales/en.lua rename to [esx]/esx_multicharacter/locales/en.lua diff --git a/locales/it.lua b/[esx]/esx_multicharacter/locales/it.lua similarity index 100% rename from locales/it.lua rename to [esx]/esx_multicharacter/locales/it.lua diff --git a/locales/pt.lua b/[esx]/esx_multicharacter/locales/pt.lua similarity index 100% rename from locales/pt.lua rename to [esx]/esx_multicharacter/locales/pt.lua diff --git a/locales/tr.lua b/[esx]/esx_multicharacter/locales/tr.lua similarity index 100% rename from locales/tr.lua rename to [esx]/esx_multicharacter/locales/tr.lua diff --git a/readme.md b/[esx]/esx_multicharacter/readme.md similarity index 97% rename from readme.md rename to [esx]/esx_multicharacter/readme.md index 6e2393c9..c25c77cd 100644 --- a/readme.md +++ b/[esx]/esx_multicharacter/readme.md @@ -1,72 +1,72 @@ -### Requirements (ensure you are using the latest) -- [ESX Legacy](https://github.com/esx-framework/esx-legacy) -- [OxMySQL](https://github.com/overextended/oxmysql/releases) - -### Conflicts -* The following resources should not be used with ESX Legacy and can result in errors - - essentialmode - - basic-gamemode - - fivem-map-skater - - fivem-map-hipster - - default_spawnpoint - -### Installation -- Modify your ESX config with `Config.Multichar = true` -- Run `esx_multicharacter.sql` into your database -- All owner and identifier columns should be set to `VARCHAR(60)` to ensure correct data entry - - The resource will attempt to set columns automatically - - -#### The menu is esx_menu_default - you can use any version if you want a different appearance -![image](https://user-images.githubusercontent.com/65407488/126976325-17cc3241-bb9e-451f-a6ed-610a8ef52fa5.png) - -### Relogging -- Do not enable this setting if you do not intend to properly set up relog support -- Requires the latest update for ESX Status (prevents multiple status ticks from running) -- Add the following events to resources that require support for relogging, or -- Add them to [@es_extended/imports.lua](https://github.com/esx-framework/esx-legacy/blob/main/[esx]/es_extended/imports.lua) (and use the imports in your resources) -```lua -RegisterNetEvent('esx:playerLoaded', function(xPlayer) - ESX.PlayerData = xPlayer - ESX.PlayerLoaded = true -end) - -RegisterNetEvent('esx:onPlayerLogout', function() - ESX.PlayerLoaded = false - ESX.PlayerData = {} -end) -``` - -### Notes -- This resource is not compatible with ExtendedMode or previous versions of ESX -- Legacy, skin, and identity must be updated to at least the minimum commits specified above -- Characters are stored in the users table as `char#:license` - if you need to use a different identifier then you need to modify ESX itself -- Character deletion does not require manual entries for the tables to remove -- As characters are stored with unique identifiers, there is no excessive queries being executed - -### Kashacters -- This project is forked from the [kashacters multicharacter resource](https://github.com/FiveEYZ/esx_kashacter) -- Most of the code has been entirely rewritten -- KASH has given permission for this resource to use his code and the addition of a license -- The license obviously does not apply to previous versions and KASH has stated his resource is free to be used however - - - -## Notice -Copyright © 2021 Linden and KASH - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see https://www.gnu.org/licenses. - - -### Thanks to KASH, XxFri3ndlyxX, and all those who have contributed +### Requirements (ensure you are using the latest) +- [ESX Legacy](https://github.com/esx-framework/esx-legacy) +- [OxMySQL](https://github.com/overextended/oxmysql/releases) + +### Conflicts +* The following resources should not be used with ESX Legacy and can result in errors + - essentialmode + - basic-gamemode + - fivem-map-skater + - fivem-map-hipster + - default_spawnpoint + +### Installation +- Modify your ESX config with `Config.Multichar = true` +- Run `esx_multicharacter.sql` into your database +- All owner and identifier columns should be set to `VARCHAR(60)` to ensure correct data entry + - The resource will attempt to set columns automatically + + +#### The menu is esx_menu_default - you can use any version if you want a different appearance +![image](https://user-images.githubusercontent.com/65407488/126976325-17cc3241-bb9e-451f-a6ed-610a8ef52fa5.png) + +### Relogging +- Do not enable this setting if you do not intend to properly set up relog support +- Requires the latest update for ESX Status (prevents multiple status ticks from running) +- Add the following events to resources that require support for relogging, or +- Add them to [@es_extended/imports.lua](https://github.com/esx-framework/esx-legacy/blob/main/[esx]/es_extended/imports.lua) (and use the imports in your resources) +```lua +RegisterNetEvent('esx:playerLoaded', function(xPlayer) + ESX.PlayerData = xPlayer + ESX.PlayerLoaded = true +end) + +RegisterNetEvent('esx:onPlayerLogout', function() + ESX.PlayerLoaded = false + ESX.PlayerData = {} +end) +``` + +### Notes +- This resource is not compatible with ExtendedMode or previous versions of ESX +- Legacy, skin, and identity must be updated to at least the minimum commits specified above +- Characters are stored in the users table as `char#:license` - if you need to use a different identifier then you need to modify ESX itself +- Character deletion does not require manual entries for the tables to remove +- As characters are stored with unique identifiers, there is no excessive queries being executed + +### Kashacters +- This project is forked from the [kashacters multicharacter resource](https://github.com/FiveEYZ/esx_kashacter) +- Most of the code has been entirely rewritten +- KASH has given permission for this resource to use his code and the addition of a license +- The license obviously does not apply to previous versions and KASH has stated his resource is free to be used however + + + +## Notice +Copyright © 2021 Linden and KASH + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see https://www.gnu.org/licenses. + + +### Thanks to KASH, XxFri3ndlyxX, and all those who have contributed diff --git a/server/commands.lua b/[esx]/esx_multicharacter/server/commands.lua similarity index 100% rename from server/commands.lua rename to [esx]/esx_multicharacter/server/commands.lua diff --git a/server/main.lua b/[esx]/esx_multicharacter/server/main.lua similarity index 100% rename from server/main.lua rename to [esx]/esx_multicharacter/server/main.lua From 8e82543933b48ec0bd2ebb3dd02eeca65726db2b Mon Sep 17 00:00:00 2001 From: Mycroft Date: Wed, 23 Mar 2022 16:22:46 +0000 Subject: [PATCH 081/132] Version Bump for 1.6.5 --- [SQL]/legacy.sql | 14 +++++ [esx]/es_extended/config.lua | 2 +- [esx]/es_extended/fxmanifest.lua | 2 +- [esx]/es_extended/version.json | 4 +- [esx]/esx_identity/fxmanifest.lua | 2 +- [esx]/esx_menu_default/fxmanifest.lua | 2 +- [esx]/esx_menu_dialog/fxmanifest.lua | 2 +- [esx]/esx_menu_list/fxmanifest.lua | 2 +- [esx]/esx_multicharacter/fxmanifest.lua | 4 +- [esx]/esx_multicharacter/readme.md | 51 +++++++------------ [esx]/esx_skin/fxmanifest.lua | 2 +- [esx_addons]/esx_accessories/fxmanifest.lua | 2 +- [esx_addons]/esx_addonaccount/fxmanifest.lua | 2 +- .../esx_addoninventory/fxmanifest.lua | 2 +- [esx_addons]/esx_ambulancejob/fxmanifest.lua | 2 +- [esx_addons]/esx_animations/fxmanifest.lua | 2 +- [esx_addons]/esx_atm/fxmanifest.lua | 2 +- [esx_addons]/esx_bankerjob/fxmanifest.lua | 2 +- [esx_addons]/esx_barbershop/fxmanifest.lua | 2 +- [esx_addons]/esx_basicneeds/fxmanifest.lua | 2 +- [esx_addons]/esx_billing/fxmanifest.lua | 2 +- [esx_addons]/esx_boat/fxmanifest.lua | 2 +- [esx_addons]/esx_clotheshop/fxmanifest.lua | 2 +- [esx_addons]/esx_cruisecontrol/fxmanifest.lua | 2 +- [esx_addons]/esx_datastore/fxmanifest.lua | 2 +- [esx_addons]/esx_dmvschool/fxmanifest.lua | 2 +- [esx_addons]/esx_drugs/fxmanifest.lua | 2 +- [esx_addons]/esx_garage/fxmanifest.lua | 2 +- [esx_addons]/esx_holdup/fxmanifest.lua | 2 +- [esx_addons]/esx_joblisting/fxmanifest.lua | 2 +- [esx_addons]/esx_jobs/fxmanifest.lua | 2 +- [esx_addons]/esx_license/fxmanifest.lua | 2 +- [esx_addons]/esx_lscustom/fxmanifest.lua | 2 +- [esx_addons]/esx_mechanicjob/fxmanifest.lua | 2 +- [esx_addons]/esx_optionalneeds/fxmanifest.lua | 2 +- [esx_addons]/esx_phone/fxmanifest.lua | 2 +- [esx_addons]/esx_policejob/fxmanifest.lua | 2 +- [esx_addons]/esx_property/fxmanifest.lua | 2 +- .../esx_realestateagentjob/fxmanifest.lua | 2 +- [esx_addons]/esx_rpchat/fxmanifest.lua | 2 +- [esx_addons]/esx_service/fxmanifest.lua | 2 +- [esx_addons]/esx_shops/fxmanifest.lua | 2 +- [esx_addons]/esx_sit/fxmanifest.lua | 2 +- [esx_addons]/esx_society/fxmanifest.lua | 2 +- [esx_addons]/esx_status/fxmanifest.lua | 2 +- [esx_addons]/esx_taxijob/fxmanifest.lua | 2 +- [esx_addons]/esx_vehicleshop/fxmanifest.lua | 2 +- [esx_addons]/esx_voice/fxmanifest.lua | 2 +- [esx_addons]/esx_weaponshop/fxmanifest.lua | 2 +- [esx_addons]/esx_whitelist/fxmanifest.lua | 2 +- [esx_addons]/instance/fxmanifest.lua | 2 +- 51 files changed, 84 insertions(+), 83 deletions(-) diff --git a/[SQL]/legacy.sql b/[SQL]/legacy.sql index ae6c1840..f59c0ee1 100644 --- a/[SQL]/legacy.sql +++ b/[SQL]/legacy.sql @@ -112,6 +112,19 @@ CREATE TABLE `cardealer_vehicles` ( -- -------------------------------------------------------- +-- +-- Table structure for table `multicharacter_slots` +-- + +CREATE TABLE `multicharacter_slots` ( + `identifier` VARCHAR(60) NOT NULL, + `slots` INT(11) NOT NULL, + PRIMARY KEY (`identifier`) USING BTREE, + INDEX `slots` (`slots`) USING BTREE +) ENGINE=InnoDB; + +-- -------------------------------------------------------- + -- -- Table structure for table `datastore` -- @@ -501,6 +514,7 @@ CREATE TABLE `users` ( `status` longtext DEFAULT NULL, `is_dead` tinyint(1) DEFAULT 0, `id` int(11) NOT NULL, + `disabled` TINYINT(1) NULL DEFAULT '0', `last_property` varchar(255) DEFAULT NULL ) ENGINE=InnoDB; diff --git a/[esx]/es_extended/config.lua b/[esx]/es_extended/config.lua index 6d9f4203..d18705bd 100644 --- a/[esx]/es_extended/config.lua +++ b/[esx]/es_extended/config.lua @@ -18,5 +18,5 @@ Config.EnableDefaultInventory = true -- Display the default Inventory ( F2 ) Config.EnableWantedLevel = false -- Use Normal GTA wanted Level? Config.EnablePVP = true -- Allow Player to player combat -Config.Multichar = false -- Enable support for esx_multicharacter +Config.Multichar = true -- Enable support for esx_multicharacter Config.Identity = true -- Select a characters identity data before they have loaded in (this happens by default with multichar) diff --git a/[esx]/es_extended/fxmanifest.lua b/[esx]/es_extended/fxmanifest.lua index d25a3e5e..5fdb4c7b 100644 --- a/[esx]/es_extended/fxmanifest.lua +++ b/[esx]/es_extended/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ES Extended' -version '1.6.0' +version '1.6.5' shared_scripts { 'locale.lua', diff --git a/[esx]/es_extended/version.json b/[esx]/es_extended/version.json index 9f3db69d..4408914d 100644 --- a/[esx]/es_extended/version.json +++ b/[esx]/es_extended/version.json @@ -1,5 +1,5 @@ { "version": "legacy", - "commit" : "1.4.2", - "changelog": "\n- Updated `Car` Command. Fixed some vulnerabilities. Fix SQL. Updated Commands." + "commit" : "1.6.5", + "changelog": "\n- Add ESX Mulitcharacter" } diff --git a/[esx]/esx_identity/fxmanifest.lua b/[esx]/esx_identity/fxmanifest.lua index 1c4e4baf..79254f5e 100644 --- a/[esx]/esx_identity/fxmanifest.lua +++ b/[esx]/esx_identity/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Identity' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx]/esx_menu_default/fxmanifest.lua b/[esx]/esx_menu_default/fxmanifest.lua index 64a36d7f..7139cca2 100644 --- a/[esx]/esx_menu_default/fxmanifest.lua +++ b/[esx]/esx_menu_default/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Menu Default' -version '1.6.0' +version '1.6.5' client_scripts { '@es_extended/imports.lua', diff --git a/[esx]/esx_menu_dialog/fxmanifest.lua b/[esx]/esx_menu_dialog/fxmanifest.lua index 1959b086..3a84362b 100644 --- a/[esx]/esx_menu_dialog/fxmanifest.lua +++ b/[esx]/esx_menu_dialog/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Menu Dialog' -version '1.6.0' +version '1.6.5' client_scripts { '@es_extended/imports.lua', diff --git a/[esx]/esx_menu_list/fxmanifest.lua b/[esx]/esx_menu_list/fxmanifest.lua index b980e57e..f267511a 100644 --- a/[esx]/esx_menu_list/fxmanifest.lua +++ b/[esx]/esx_menu_list/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Menu List' -version '1.6.0' +version '1.6.5' client_scripts { '@es_extended/imports.lua', diff --git a/[esx]/esx_multicharacter/fxmanifest.lua b/[esx]/esx_multicharacter/fxmanifest.lua index 0b928219..435f6ba3 100644 --- a/[esx]/esx_multicharacter/fxmanifest.lua +++ b/[esx]/esx_multicharacter/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'cerulean' game 'gta5' -description 'https://github.com/thelindat/esx_multicharacter' -version '1.4.2' +description 'Official Multicharacter System For ESX Legacy' +version '1.6.5' lua54 'yes' dependencies { diff --git a/[esx]/esx_multicharacter/readme.md b/[esx]/esx_multicharacter/readme.md index c25c77cd..f5879edc 100644 --- a/[esx]/esx_multicharacter/readme.md +++ b/[esx]/esx_multicharacter/readme.md @@ -1,59 +1,49 @@ -### Requirements (ensure you are using the latest) -- [ESX Legacy](https://github.com/esx-framework/esx-legacy) -- [OxMySQL](https://github.com/overextended/oxmysql/releases) -### Conflicts -* The following resources should not be used with ESX Legacy and can result in errors - - essentialmode - - basic-gamemode - - fivem-map-skater - - fivem-map-hipster - - default_spawnpoint +# Preview -### Installation -- Modify your ESX config with `Config.Multichar = true` -- Run `esx_multicharacter.sql` into your database -- All owner and identifier columns should be set to `VARCHAR(60)` to ensure correct data entry - - The resource will attempt to set columns automatically - - -#### The menu is esx_menu_default - you can use any version if you want a different appearance ![image](https://user-images.githubusercontent.com/65407488/126976325-17cc3241-bb9e-451f-a6ed-610a8ef52fa5.png) +## Installation + +- Modify your ESX config with `Config.Multichar = true` +- All owner and identifier columns should be set to `VARCHAR(60)` to ensure correct data entry + - The resource will attempt to set columns automatically + ### Relogging + - Do not enable this setting if you do not intend to properly set up relog support - Requires the latest update for ESX Status (prevents multiple status ticks from running) - Add the following events to resources that require support for relogging, or - Add them to [@es_extended/imports.lua](https://github.com/esx-framework/esx-legacy/blob/main/[esx]/es_extended/imports.lua) (and use the imports in your resources) + ```lua RegisterNetEvent('esx:playerLoaded', function(xPlayer) - ESX.PlayerData = xPlayer - ESX.PlayerLoaded = true + ESX.PlayerData = xPlayer + ESX.PlayerLoaded = true end) RegisterNetEvent('esx:onPlayerLogout', function() - ESX.PlayerLoaded = false - ESX.PlayerData = {} + ESX.PlayerLoaded = false + ESX.PlayerData = {} end) ``` ### Notes -- This resource is not compatible with ExtendedMode or previous versions of ESX -- Legacy, skin, and identity must be updated to at least the minimum commits specified above + - Characters are stored in the users table as `char#:license` - if you need to use a different identifier then you need to modify ESX itself - Character deletion does not require manual entries for the tables to remove - As characters are stored with unique identifiers, there is no excessive queries being executed - + ### Kashacters + - This project is forked from the [kashacters multicharacter resource](https://github.com/FiveEYZ/esx_kashacter) - Most of the code has been entirely rewritten - KASH has given permission for this resource to use his code and the addition of a license - The license obviously does not apply to previous versions and KASH has stated his resource is free to be used however - - ## Notice -Copyright © 2021 Linden and KASH + +Copyright © 2022 [Linden](https://github.com/thelindat/), ESX-Framework (fournier Brice & Jérémie N'gadi) and KASH This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -66,7 +56,4 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License -along with this program. If not, see https://www.gnu.org/licenses. - - -### Thanks to KASH, XxFri3ndlyxX, and all those who have contributed +along with this program. If not, see . diff --git a/[esx]/esx_skin/fxmanifest.lua b/[esx]/esx_skin/fxmanifest.lua index 0feb09d3..31b095d2 100644 --- a/[esx]/esx_skin/fxmanifest.lua +++ b/[esx]/esx_skin/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Skin' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_accessories/fxmanifest.lua b/[esx_addons]/esx_accessories/fxmanifest.lua index 6acdf67a..d2fb53da 100644 --- a/[esx_addons]/esx_accessories/fxmanifest.lua +++ b/[esx_addons]/esx_accessories/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Accessories' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_addonaccount/fxmanifest.lua b/[esx_addons]/esx_addonaccount/fxmanifest.lua index 8fd979bd..7aacd820 100644 --- a/[esx_addons]/esx_addonaccount/fxmanifest.lua +++ b/[esx_addons]/esx_addonaccount/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Addon Account' -version '1.6.0' +version '1.6.5' server_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_addoninventory/fxmanifest.lua b/[esx_addons]/esx_addoninventory/fxmanifest.lua index c8f0c790..404b109d 100644 --- a/[esx_addons]/esx_addoninventory/fxmanifest.lua +++ b/[esx_addons]/esx_addoninventory/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Addon Inventory' -version '1.6.0' +version '1.6.5' server_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_ambulancejob/fxmanifest.lua b/[esx_addons]/esx_ambulancejob/fxmanifest.lua index 5ff50452..763c2c97 100644 --- a/[esx_addons]/esx_ambulancejob/fxmanifest.lua +++ b/[esx_addons]/esx_ambulancejob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Ambulance Job' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_animations/fxmanifest.lua b/[esx_addons]/esx_animations/fxmanifest.lua index 1897459b..70fd794c 100644 --- a/[esx_addons]/esx_animations/fxmanifest.lua +++ b/[esx_addons]/esx_animations/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Animations' -version '1.6.0' +version '1.6.5' client_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_atm/fxmanifest.lua b/[esx_addons]/esx_atm/fxmanifest.lua index a464c619..9d6f4325 100644 --- a/[esx_addons]/esx_atm/fxmanifest.lua +++ b/[esx_addons]/esx_atm/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Atm' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_bankerjob/fxmanifest.lua b/[esx_addons]/esx_bankerjob/fxmanifest.lua index d60a7ca0..d4259110 100644 --- a/[esx_addons]/esx_bankerjob/fxmanifest.lua +++ b/[esx_addons]/esx_bankerjob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Banker job' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_barbershop/fxmanifest.lua b/[esx_addons]/esx_barbershop/fxmanifest.lua index a83ae43e..3859ec00 100644 --- a/[esx_addons]/esx_barbershop/fxmanifest.lua +++ b/[esx_addons]/esx_barbershop/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Barber Shop' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_basicneeds/fxmanifest.lua b/[esx_addons]/esx_basicneeds/fxmanifest.lua index 2088dd2d..6e5cf251 100644 --- a/[esx_addons]/esx_basicneeds/fxmanifest.lua +++ b/[esx_addons]/esx_basicneeds/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Basic Needs' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_billing/fxmanifest.lua b/[esx_addons]/esx_billing/fxmanifest.lua index 56ef67ca..dbfbfdfc 100644 --- a/[esx_addons]/esx_billing/fxmanifest.lua +++ b/[esx_addons]/esx_billing/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Billing' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_boat/fxmanifest.lua b/[esx_addons]/esx_boat/fxmanifest.lua index 3a8c8fca..0cb962ea 100644 --- a/[esx_addons]/esx_boat/fxmanifest.lua +++ b/[esx_addons]/esx_boat/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Boat' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_clotheshop/fxmanifest.lua b/[esx_addons]/esx_clotheshop/fxmanifest.lua index a8dd1b89..41e7a38b 100644 --- a/[esx_addons]/esx_clotheshop/fxmanifest.lua +++ b/[esx_addons]/esx_clotheshop/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Clothes Shop' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_cruisecontrol/fxmanifest.lua b/[esx_addons]/esx_cruisecontrol/fxmanifest.lua index e92aa300..c6fa2dee 100644 --- a/[esx_addons]/esx_cruisecontrol/fxmanifest.lua +++ b/[esx_addons]/esx_cruisecontrol/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'CruiseControl System for ESX' -version '1.6.0' +version '1.6.5' dependencies { 'es_extended' diff --git a/[esx_addons]/esx_datastore/fxmanifest.lua b/[esx_addons]/esx_datastore/fxmanifest.lua index 4f948458..aa84426e 100644 --- a/[esx_addons]/esx_datastore/fxmanifest.lua +++ b/[esx_addons]/esx_datastore/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Data Store' -version '1.6.0' +version '1.6.5' server_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_dmvschool/fxmanifest.lua b/[esx_addons]/esx_dmvschool/fxmanifest.lua index 433a2fb3..726b5d16 100644 --- a/[esx_addons]/esx_dmvschool/fxmanifest.lua +++ b/[esx_addons]/esx_dmvschool/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX DMV School' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_drugs/fxmanifest.lua b/[esx_addons]/esx_drugs/fxmanifest.lua index 45e910b1..45782bd6 100644 --- a/[esx_addons]/esx_drugs/fxmanifest.lua +++ b/[esx_addons]/esx_drugs/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Drugs' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_garage/fxmanifest.lua b/[esx_addons]/esx_garage/fxmanifest.lua index 02614ad7..28a0dc29 100644 --- a/[esx_addons]/esx_garage/fxmanifest.lua +++ b/[esx_addons]/esx_garage/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Garage' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_holdup/fxmanifest.lua b/[esx_addons]/esx_holdup/fxmanifest.lua index 1aec4396..52619849 100644 --- a/[esx_addons]/esx_holdup/fxmanifest.lua +++ b/[esx_addons]/esx_holdup/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Holdup' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_joblisting/fxmanifest.lua b/[esx_addons]/esx_joblisting/fxmanifest.lua index a910652f..c5e4bd50 100644 --- a/[esx_addons]/esx_joblisting/fxmanifest.lua +++ b/[esx_addons]/esx_joblisting/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Job Listing' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_jobs/fxmanifest.lua b/[esx_addons]/esx_jobs/fxmanifest.lua index 8beb059a..25d637af 100644 --- a/[esx_addons]/esx_jobs/fxmanifest.lua +++ b/[esx_addons]/esx_jobs/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Jobs' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_license/fxmanifest.lua b/[esx_addons]/esx_license/fxmanifest.lua index 8d907995..9bef90a7 100644 --- a/[esx_addons]/esx_license/fxmanifest.lua +++ b/[esx_addons]/esx_license/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX License' -version '1.6.0' +version '1.6.5' server_scripts { '@async/async.lua', diff --git a/[esx_addons]/esx_lscustom/fxmanifest.lua b/[esx_addons]/esx_lscustom/fxmanifest.lua index d6ec6779..19efd417 100644 --- a/[esx_addons]/esx_lscustom/fxmanifest.lua +++ b/[esx_addons]/esx_lscustom/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX LS Customs' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_mechanicjob/fxmanifest.lua b/[esx_addons]/esx_mechanicjob/fxmanifest.lua index 4d24aeee..dfc4140a 100644 --- a/[esx_addons]/esx_mechanicjob/fxmanifest.lua +++ b/[esx_addons]/esx_mechanicjob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Mechanic Job' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_optionalneeds/fxmanifest.lua b/[esx_addons]/esx_optionalneeds/fxmanifest.lua index f5793a9a..2e788e88 100644 --- a/[esx_addons]/esx_optionalneeds/fxmanifest.lua +++ b/[esx_addons]/esx_optionalneeds/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Optional Needs' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_phone/fxmanifest.lua b/[esx_addons]/esx_phone/fxmanifest.lua index 96733393..c7f52a52 100644 --- a/[esx_addons]/esx_phone/fxmanifest.lua +++ b/[esx_addons]/esx_phone/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Phone' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_policejob/fxmanifest.lua b/[esx_addons]/esx_policejob/fxmanifest.lua index 60c00cf7..6dd5ac08 100644 --- a/[esx_addons]/esx_policejob/fxmanifest.lua +++ b/[esx_addons]/esx_policejob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Police Job' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_property/fxmanifest.lua b/[esx_addons]/esx_property/fxmanifest.lua index dddedcc2..0ef6d6e9 100644 --- a/[esx_addons]/esx_property/fxmanifest.lua +++ b/[esx_addons]/esx_property/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Property' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_realestateagentjob/fxmanifest.lua b/[esx_addons]/esx_realestateagentjob/fxmanifest.lua index 5201b2c8..1dbccfd7 100644 --- a/[esx_addons]/esx_realestateagentjob/fxmanifest.lua +++ b/[esx_addons]/esx_realestateagentjob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Real Estate Job' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_rpchat/fxmanifest.lua b/[esx_addons]/esx_rpchat/fxmanifest.lua index 4d8ae670..06774b5d 100644 --- a/[esx_addons]/esx_rpchat/fxmanifest.lua +++ b/[esx_addons]/esx_rpchat/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX RP Chat' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_service/fxmanifest.lua b/[esx_addons]/esx_service/fxmanifest.lua index d271c37c..9f49bd78 100644 --- a/[esx_addons]/esx_service/fxmanifest.lua +++ b/[esx_addons]/esx_service/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Service' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_shops/fxmanifest.lua b/[esx_addons]/esx_shops/fxmanifest.lua index 9aebaf69..fdf23909 100644 --- a/[esx_addons]/esx_shops/fxmanifest.lua +++ b/[esx_addons]/esx_shops/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Shops' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_sit/fxmanifest.lua b/[esx_addons]/esx_sit/fxmanifest.lua index 630b2898..2e971618 100644 --- a/[esx_addons]/esx_sit/fxmanifest.lua +++ b/[esx_addons]/esx_sit/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Sit' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_society/fxmanifest.lua b/[esx_addons]/esx_society/fxmanifest.lua index 43769fd6..79fe1448 100644 --- a/[esx_addons]/esx_society/fxmanifest.lua +++ b/[esx_addons]/esx_society/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Society' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_status/fxmanifest.lua b/[esx_addons]/esx_status/fxmanifest.lua index d4ebd2c7..68bd5b3f 100644 --- a/[esx_addons]/esx_status/fxmanifest.lua +++ b/[esx_addons]/esx_status/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Status' -version '1.6.0' +version '1.6.5' lua54 'yes' diff --git a/[esx_addons]/esx_taxijob/fxmanifest.lua b/[esx_addons]/esx_taxijob/fxmanifest.lua index b2e67b5f..54e4ea72 100644 --- a/[esx_addons]/esx_taxijob/fxmanifest.lua +++ b/[esx_addons]/esx_taxijob/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Taxi Job' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_vehicleshop/fxmanifest.lua b/[esx_addons]/esx_vehicleshop/fxmanifest.lua index f87595e3..82c483c0 100644 --- a/[esx_addons]/esx_vehicleshop/fxmanifest.lua +++ b/[esx_addons]/esx_vehicleshop/fxmanifest.lua @@ -6,7 +6,7 @@ lua54 'yes' description 'ESX Vehicle Shop' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' diff --git a/[esx_addons]/esx_voice/fxmanifest.lua b/[esx_addons]/esx_voice/fxmanifest.lua index a8e2697a..9ffc0aeb 100644 --- a/[esx_addons]/esx_voice/fxmanifest.lua +++ b/[esx_addons]/esx_voice/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Voice Controller' -version '1.6.0' +version '1.6.5' client_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_weaponshop/fxmanifest.lua b/[esx_addons]/esx_weaponshop/fxmanifest.lua index 65e74b5e..64296bf3 100644 --- a/[esx_addons]/esx_weaponshop/fxmanifest.lua +++ b/[esx_addons]/esx_weaponshop/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Weapon Shop' -version '1.6.0' +version '1.6.5' shared_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/esx_whitelist/fxmanifest.lua b/[esx_addons]/esx_whitelist/fxmanifest.lua index 8c6515e6..6319d5d9 100644 --- a/[esx_addons]/esx_whitelist/fxmanifest.lua +++ b/[esx_addons]/esx_whitelist/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'ESX Whitelist' -version '1.6.0' +version '1.6.5' server_scripts { '@es_extended/imports.lua', diff --git a/[esx_addons]/instance/fxmanifest.lua b/[esx_addons]/instance/fxmanifest.lua index 57aa044e..f5a4b905 100644 --- a/[esx_addons]/instance/fxmanifest.lua +++ b/[esx_addons]/instance/fxmanifest.lua @@ -4,7 +4,7 @@ game 'gta5' description 'Instance' -version '1.6.0' +version '1.6.5' shared_script '@es_extended/imports.lua' From 003a8efaf106e9414c6f01f05abe69658a97fdb6 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Wed, 23 Mar 2022 16:25:16 +0000 Subject: [PATCH 082/132] Remove Submodule --- [esx_addons]/esx_multicharacter | 1 - 1 file changed, 1 deletion(-) delete mode 160000 [esx_addons]/esx_multicharacter diff --git a/[esx_addons]/esx_multicharacter b/[esx_addons]/esx_multicharacter deleted file mode 160000 index 02352a8e..00000000 --- a/[esx_addons]/esx_multicharacter +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 02352a8e18176cb9f369ba608aab66ccf0311fe0 From 56e7bd3bcf62a50d5deb799566ad14530de009c0 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Thu, 24 Mar 2022 00:45:20 +0000 Subject: [PATCH 083/132] Fix: Hopefully Fix Ammo Bug --- [esx]/es_extended/client/main.lua | 52 ++++++++++++++----------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/[esx]/es_extended/client/main.lua b/[esx]/es_extended/client/main.lua index 2897991f..182c35bf 100644 --- a/[esx]/es_extended/client/main.lua +++ b/[esx]/es_extended/client/main.lua @@ -389,36 +389,32 @@ end function StartServerSyncLoops() if not Config.OxInventory then - -- keep track of ammo - CreateThread(function() - local currentWeapon = {timer=0} - while ESX.PlayerLoaded do - local sleep = 500 + -- keep track of ammo - if currentWeapon.timer == sleep then - local ammoCount = GetAmmoInPedWeapon(ESX.PlayerData.ped, currentWeapon.hash) - TriggerServerEvent('esx:updateWeaponAmmo', currentWeapon.name, ammoCount) - currentWeapon.timer = 0 - elseif currentWeapon.timer > sleep then - currentWeapon.timer = currentWeapon.timer - sleep - end - - if IsPedArmed(ESX.PlayerData.ped, 4) then - sleep = 0 - if IsPedShooting(ESX.PlayerData.ped) then - local _,weaponHash = GetCurrentPedWeapon(ESX.PlayerData.ped, true) - local weapon = ESX.GetWeaponFromHash(weaponHash) - - if weapon then - currentWeapon.name = weapon.name - currentWeapon.hash = weaponHash - currentWeapon.timer = 100 * sleep - end + CreateThread(function() + local currentWeapon = {Ammo = 0} + while ESX.PlayerLoaded do + local sleep = 250 + if IsPedArmed(ESX.PlayerData.ped, 4) or IsPedArmed(ESX.PlayerData.ped, 2) then + sleep = 0 + local _,weaponHash = GetCurrentPedWeapon(ESX.PlayerData.ped, true) + local weapon = ESX.GetWeaponFromHash(weaponHash) + if weapon then + local ammoCount = GetAmmoInPedWeapon(ESX.PlayerData.ped, weaponHash) + if weapon.name ~= currentWeapon.name then + currentWeapon.Ammo = ammoCount + currentWeapon.name = weapon.name + else + if ammoCount ~= currentWeapon.Ammo then + currentWeapon.Ammo = ammoCount + TriggerServerEvent('esx:updateWeaponAmmo', weapon.name, ammoCount) + end + end + end + end + Wait(sleep) end - end - Wait(sleep) - end - end) + end) end -- sync current player coords with server From a3dc7a25607a07d2e54c3962546181209c3ad6a5 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Thu, 24 Mar 2022 00:49:02 +0000 Subject: [PATCH 084/132] Fix Formatting --- [esx]/es_extended/client/main.lua | 38 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/[esx]/es_extended/client/main.lua b/[esx]/es_extended/client/main.lua index 182c35bf..5faf26ba 100644 --- a/[esx]/es_extended/client/main.lua +++ b/[esx]/es_extended/client/main.lua @@ -394,25 +394,25 @@ function StartServerSyncLoops() CreateThread(function() local currentWeapon = {Ammo = 0} while ESX.PlayerLoaded do - local sleep = 250 - if IsPedArmed(ESX.PlayerData.ped, 4) or IsPedArmed(ESX.PlayerData.ped, 2) then - sleep = 0 - local _,weaponHash = GetCurrentPedWeapon(ESX.PlayerData.ped, true) - local weapon = ESX.GetWeaponFromHash(weaponHash) - if weapon then - local ammoCount = GetAmmoInPedWeapon(ESX.PlayerData.ped, weaponHash) - if weapon.name ~= currentWeapon.name then - currentWeapon.Ammo = ammoCount - currentWeapon.name = weapon.name - else - if ammoCount ~= currentWeapon.Ammo then - currentWeapon.Ammo = ammoCount - TriggerServerEvent('esx:updateWeaponAmmo', weapon.name, ammoCount) - end - end - end - end - Wait(sleep) + local sleep = 250 + if IsPedArmed(ESX.PlayerData.ped, 4) or IsPedArmed(ESX.PlayerData.ped, 2) then + sleep = 0 + local _,weaponHash = GetCurrentPedWeapon(ESX.PlayerData.ped, true) + local weapon = ESX.GetWeaponFromHash(weaponHash) + if weapon then + local ammoCount = GetAmmoInPedWeapon(ESX.PlayerData.ped, weaponHash) + if weapon.name ~= currentWeapon.name then + currentWeapon.Ammo = ammoCount + currentWeapon.name = weapon.name + else + if ammoCount ~= currentWeapon.Ammo then + currentWeapon.Ammo = ammoCount + TriggerServerEvent('esx:updateWeaponAmmo', weapon.name, ammoCount) + end + end + end + end + Wait(sleep) end end) end From 6ccd047cb6fa42e61af734a12627d93717a4af56 Mon Sep 17 00:00:00 2001 From: RoadToSix <92928205+RoadPhone@users.noreply.github.com> Date: Thu, 24 Mar 2022 15:46:45 +0100 Subject: [PATCH 085/132] Update fxmanifest.lua --- [esx_addons]/esx_atm/fxmanifest.lua | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/[esx_addons]/esx_atm/fxmanifest.lua b/[esx_addons]/esx_atm/fxmanifest.lua index 9d6f4325..bae5d469 100644 --- a/[esx_addons]/esx_atm/fxmanifest.lua +++ b/[esx_addons]/esx_atm/fxmanifest.lua @@ -6,33 +6,18 @@ description 'ESX Atm' version '1.6.5' -shared_script '@es_extended/imports.lua' +shared_scripts { + '@es_extended/imports.lua', + '@es_extended/locale.lua', + 'locales/*.lua', + 'config.lua' +} server_scripts { - '@es_extended/locale.lua', - 'locales/de.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/fi.lua', - 'locales/fr.lua', - 'locales/es.lua', - 'locales/sv.lua', - 'locales/cs.lua', - 'config.lua', 'server/main.lua' } client_scripts { - '@es_extended/locale.lua', - 'locales/de.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/fi.lua', - 'locales/fr.lua', - 'locales/es.lua', - 'locales/sv.lua', - 'locales/cs.lua', - 'config.lua', 'client/main.lua' } From 64b973fbb5fb88d1cd4fd82b3a7c9c432191f570 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Thu, 24 Mar 2022 18:52:57 +0000 Subject: [PATCH 086/132] Fix: AmbulanceJob - Missing Comma --- [esx_addons]/esx_ambulancejob/fxmanifest.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[esx_addons]/esx_ambulancejob/fxmanifest.lua b/[esx_addons]/esx_ambulancejob/fxmanifest.lua index 3894c46d..679963c0 100644 --- a/[esx_addons]/esx_ambulancejob/fxmanifest.lua +++ b/[esx_addons]/esx_ambulancejob/fxmanifest.lua @@ -7,7 +7,7 @@ description 'ESX Ambulance Job' version '1.6.5' shared_scripts { - '@es_extended/imports.lua' + '@es_extended/imports.lua', '@es_extended/locale.lua', 'locales/*.lua', 'config.lua' From c2029077ad7db7e47ac6f908463a66f8754bbf45 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Thu, 24 Mar 2022 18:54:06 +0000 Subject: [PATCH 087/132] Refactor: JobListing - Optimisations and security patches --- [esx_addons]/esx_joblisting/README.md | 29 ++--------- [esx_addons]/esx_joblisting/client/main.lua | 56 +++++++++------------ [esx_addons]/esx_joblisting/config.lua | 16 ++++-- [esx_addons]/esx_joblisting/fxmanifest.lua | 31 +++--------- [esx_addons]/esx_joblisting/server/main.lua | 41 ++++++++------- 5 files changed, 69 insertions(+), 104 deletions(-) diff --git a/[esx_addons]/esx_joblisting/README.md b/[esx_addons]/esx_joblisting/README.md index 3af12895..ab7707a6 100644 --- a/[esx_addons]/esx_joblisting/README.md +++ b/[esx_addons]/esx_joblisting/README.md @@ -1,34 +1,11 @@ # esx_joblisting -Simple job listing script, you can specify what jobs you want to be whitelisted in db. +Simple job listing/Job Centre script, you can specify what jobs you want to be whitelisted in db. -## Download & Installation +## Legal -### Using [fvm](https://github.com/qlaffont/fvm-installer) -``` -fvm install --save --folder=esx esx-org/esx_joblisting -``` - -### Using Git -``` -cd resources -git clone https://github.com/ESX-Org/esx_joblisting [esx]/esx_joblisting -``` - -### Manually -- Download https://github.com/ESX-Org/esx_joblisting/archive/master.zip -- Put it in the `[esx]` directory - -## Installation -- Import `esx_joblisting.sql` in your database -- Add this in your `server.cfg`: - -``` -start esx_joblisting -``` - -# Legal ### License + esx_joblisting - job listing script Copyright (C) 2015-2022 Jérémie N'gadi diff --git a/[esx_addons]/esx_joblisting/client/main.lua b/[esx_addons]/esx_joblisting/client/main.lua index 811eac57..d21c5a1d 100644 --- a/[esx_addons]/esx_joblisting/client/main.lua +++ b/[esx_addons]/esx_joblisting/client/main.lua @@ -1,13 +1,14 @@ -local menuIsShowed, hasAlreadyEnteredMarker, isInMarker = false, false, false +local menuIsShowed = false function ShowJobListingMenu() + menuIsShowed = true ESX.TriggerServerCallback('esx_joblisting:getJobsList', function(jobs) local elements = {} - for i=1, #jobs, 1 do + for k,v in pairs(jobs) do table.insert(elements, { - label = jobs[i].label, - job = jobs[i].job + label = v.label, + job = k }) end @@ -18,8 +19,10 @@ function ShowJobListingMenu() }, function(data, menu) TriggerServerEvent('esx_joblisting:setJob', data.current.job) ESX.ShowNotification(_U('new_job')) + menuIsShowed = false menu.close() end, function(data, menu) + menuIsShowed = false menu.close() end) @@ -33,7 +36,7 @@ end) -- Activate menu when player is inside marker, and draw markers CreateThread(function() while true do - Wait(0) + local Sleep = 1500 local coords = GetEntityCoords(PlayerPedId()) isInMarker = false @@ -42,23 +45,24 @@ CreateThread(function() local distance = #(coords - Config.Zones[i]) if distance < Config.DrawDistance then + Sleep = 0 DrawMarker(Config.MarkerType, Config.Zones[i], 0.0, 0.0, 0.0, 0, 0.0, 0.0, Config.ZoneSize.x, Config.ZoneSize.y, Config.ZoneSize.z, Config.MarkerColor.r, Config.MarkerColor.g, Config.MarkerColor.b, 100, false, true, 2, false, false, false, false) + else + if menuIsShowed then + ESX.UI.Menu.CloseAll() + menuIsShowed = false + end end if distance < (Config.ZoneSize.x / 2) then - isInMarker = true ESX.ShowHelpNotification(_U('access_job_center')) + if IsControlJustReleased(0, 38) and not menuIsShowed then + ESX.UI.Menu.CloseAll() + ShowJobListingMenu() + end end end - - if isInMarker and not hasAlreadyEnteredMarker then - hasAlreadyEnteredMarker = true - end - - if not isInMarker and hasAlreadyEnteredMarker then - hasAlreadyEnteredMarker = false - TriggerEvent('esx_joblisting:hasExitedMarker') - end + Wait(Sleep) end end) @@ -67,26 +71,14 @@ CreateThread(function() for i=1, #Config.Zones, 1 do local blip = AddBlipForCoord(Config.Zones[i]) - SetBlipSprite (blip, 407) - SetBlipDisplay(blip, 4) - SetBlipScale (blip, 1.2) - SetBlipColour (blip, 27) - SetBlipAsShortRange(blip, true) + SetBlipSprite (blip, Config.Blip.Sprite) + SetBlipDisplay(blip, Config.Blip.Display) + SetBlipScale (blip, Config.Blip.Scale) + SetBlipColour (blip, Config.Blip.Colour) + SetBlipAsShortRange(blip, Config.Blip.ShortRange) BeginTextCommandSetBlipName("STRING") AddTextComponentSubstringPlayerName(_U('job_center')) EndTextCommandSetBlipName(blip) end end) - --- Menu Controls -CreateThread(function() - while true do - Wait(0) - - if IsControlJustReleased(0, 38) and isInMarker and not menuIsShowed then - ESX.UI.Menu.CloseAll() - ShowJobListingMenu() - end - end -end) diff --git a/[esx_addons]/esx_joblisting/config.lua b/[esx_addons]/esx_joblisting/config.lua index 72dbdcb9..a053d362 100644 --- a/[esx_addons]/esx_joblisting/config.lua +++ b/[esx_addons]/esx_joblisting/config.lua @@ -1,12 +1,20 @@ Config = {} Config.DrawDistance = 10.0 -Config.ZoneSize = {x = 3.0, y = 3.0, z = 0.5} -Config.MarkerColor = {r = 100, g = 100, b = 204} -Config.MarkerType = 1 +Config.ZoneSize = {x = 2.7, y = 2.7, z = 0.5} +Config.MarkerColor = {r = 100, g = 200, b = 104} +Config.MarkerType = 27 Config.Locale = 'en' Config.Zones = { - vector3(-265.0, -963.6, 30.2) + vector3(-265.08, -964.1, 30.3) } + +Config.Blip = { + Sprite = 407, + Display = 4, + Scale = 0.9, + Colour = 27, + ShortRange = true +} \ No newline at end of file diff --git a/[esx_addons]/esx_joblisting/fxmanifest.lua b/[esx_addons]/esx_joblisting/fxmanifest.lua index c5e4bd50..16c15c27 100644 --- a/[esx_addons]/esx_joblisting/fxmanifest.lua +++ b/[esx_addons]/esx_joblisting/fxmanifest.lua @@ -6,36 +6,19 @@ description 'ESX Job Listing' version '1.6.5' -shared_script '@es_extended/imports.lua' - +shared_scripts { + '@es_extended/imports.lua', + '@es_extended/locale.lua', + 'config.lua' +} server_scripts { '@oxmysql/lib/MySQL.lua', - '@es_extended/locale.lua', - 'config.lua', - 'locales/de.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/fi.lua', - 'locales/fr.lua', - 'locales/es.lua', - 'locales/sv.lua', - 'locales/pl.lua', - 'locales/cs.lua', + 'locales/*.lua', 'server/main.lua' } client_scripts { - '@es_extended/locale.lua', - 'config.lua', - 'locales/de.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/fi.lua', - 'locales/fr.lua', - 'locales/es.lua', - 'locales/sv.lua', - 'locales/pl.lua', - 'locales/cs.lua', + 'locales/*.lua', 'client/main.lua' } diff --git a/[esx_addons]/esx_joblisting/server/main.lua b/[esx_addons]/esx_joblisting/server/main.lua index 732010e5..823f10b3 100644 --- a/[esx_addons]/esx_joblisting/server/main.lua +++ b/[esx_addons]/esx_joblisting/server/main.lua @@ -1,32 +1,37 @@ local availableJobs = {} -MySQL.ready(function() - MySQL.query('SELECT name, label FROM jobs WHERE whitelisted = @whitelisted', { - ['@whitelisted'] = false - }, function(result) - for i=1, #result, 1 do - table.insert(availableJobs, { - job = result[i].name, - label = result[i].label - }) - end - end) -end) +for k,v in pairs(ESX.Jobs) do + print(v.whitelisted) + if v.whitelisted == false then + availableJobs[k] = {label = v.label} + end +end ESX.RegisterServerCallback('esx_joblisting:getJobsList', function(source, cb) cb(availableJobs) end) +function IsNearCentre(player) + local Ped = GetPlayerPed(player) + local PedCoords = GetEntityCoords(Ped) + local Zones = Config.Zones + + for i=1, #Config.Zones, 1 do + local distance = #(PedCoords - Config.Zones[i]) + + if distance < Config.DrawDistance then + return true + end + end +end + RegisterServerEvent('esx_joblisting:setJob') AddEventHandler('esx_joblisting:setJob', function(job) local xPlayer = ESX.GetPlayerFromId(source) - if xPlayer then - for k,v in ipairs(availableJobs) do - if v.job == job then - xPlayer.setJob(job, 0) - break - end + if xPlayer and IsNearCentre(source) then + if availableJobs[job] then + xPlayer.setJob(job, 0) end end end) From 5fe0a660bd73f3862f1c3e83169b248da823f099 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Thu, 24 Mar 2022 19:03:00 +0000 Subject: [PATCH 088/132] Tweak: ESX Property - Optimisations --- [esx_addons]/esx_property/client/main.lua | 9 ++------- [esx_addons]/esx_property/config.lua | 2 +- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/[esx_addons]/esx_property/client/main.lua b/[esx_addons]/esx_property/client/main.lua index 0dbdadb0..66f1df7d 100644 --- a/[esx_addons]/esx_property/client/main.lua +++ b/[esx_addons]/esx_property/client/main.lua @@ -860,17 +860,15 @@ CreateThread(function() end if letSleep then - Wait(500) + Wait(1500) end end end) -- Key controls CreateThread(function() - while true do + while CurrentAction do Wait(0) - - if CurrentAction then ESX.ShowHelpNotification(CurrentActionMsg) if IsControlJustReleased(0, 38) then @@ -890,8 +888,5 @@ CreateThread(function() CurrentAction = nil end - else - Wait(500) - end end end) diff --git a/[esx_addons]/esx_property/config.lua b/[esx_addons]/esx_property/config.lua index 23bd8dc1..e7869012 100644 --- a/[esx_addons]/esx_property/config.lua +++ b/[esx_addons]/esx_property/config.lua @@ -1,6 +1,6 @@ Config = {} -Config.DrawDistance = 100 +Config.DrawDistance = 10.0 Config.MarkerSize = {x = 1.5, y = 1.5, z = 1.0} Config.MarkerColor = {r = 102, g = 102, b = 204} Config.RoomMenuMarkerColor = {r = 102, g = 204, b = 102} From 20b6f534c6708b41bf9db1366b42198bb5a2d7b7 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Thu, 24 Mar 2022 19:54:45 +0000 Subject: [PATCH 089/132] Fix: ESX Jobs --- [esx_addons]/esx_jobs/client/main.lua | 34 +++++++++-------- [esx_addons]/esx_jobs/fxmanifest.lua | 54 +++++---------------------- 2 files changed, 27 insertions(+), 61 deletions(-) diff --git a/[esx_addons]/esx_jobs/client/main.lua b/[esx_addons]/esx_jobs/client/main.lua index 53915dc2..5ae6b9a3 100644 --- a/[esx_addons]/esx_jobs/client/main.lua +++ b/[esx_addons]/esx_jobs/client/main.lua @@ -30,7 +30,6 @@ local vehicleMaxHealth = nil RegisterNetEvent('esx:playerLoaded') AddEventHandler('esx:playerLoaded', function(xPlayer) - ESX.PlayerData = xPlayer refreshBlips() end) @@ -230,7 +229,6 @@ function refreshBlips() if ESX.PlayerData.job ~= nil then for jobKey,jobValues in pairs(Config.Jobs) do - if jobKey == ESX.PlayerData.job.name then for zoneKey,zoneValues in pairs(jobValues.Zones) do @@ -245,11 +243,10 @@ function refreshBlips() else _Pos = zoneValues.Pos end - print(_Pos.x) local blip = AddBlipForCoord(_Pos.x, _Pos.y, _Pos.z) SetBlipSprite (blip, jobValues.BlipInfos.Sprite) SetBlipDisplay (blip, 4) - SetBlipScale (blip, 1.2) + SetBlipScale (blip, 0.0) SetBlipCategory(blip, 3) SetBlipColour (blip, jobValues.BlipInfos.Color) SetBlipAsShortRange(blip, true) @@ -301,21 +298,16 @@ end) -- Show top left hint CreateThread(function() - while true do + while hintIsShowed do Wait(0) - - if hintIsShowed then - ESX.ShowHelpNotification(hintToDisplay) - else - Wait(500) - end + ESX.ShowHelpNotification(hintToDisplay) end end) -- Display markers (only if on duty and the player's job ones) CreateThread(function() while true do - Wait(0) + local Sleep = 1500 local zones = {} if ESX.PlayerData.job ~= nil then @@ -332,18 +324,22 @@ CreateThread(function() TriggerEvent("izone:getZoneCenter", v.Zone, function(center) if (not(center == nil)) then if(v.Marker ~= -1 and #(coords - center) < Config.DrawDistance) then + Sleep = 0 DrawMarker(v.Marker, center.x, center.y, center.z - 1, 0.0, 0.0, 0.0, 0, 0.0, 0.0, v.Size.x, v.Size.y, v.Size.z, v.Color.r, v.Color.g, v.Color.b, 100, false, true, 2, false, false, false, false) end end end) else - if(v.Marker ~= -1 and #(coords - v.Pos) < Config.DrawDistance) then + local Pos = vector3(v.Pos.x, v.Pos.y, v.Pos.z) + if(v.Marker ~= -1 and #(coords - Pos) < Config.DrawDistance) then + Sleep = 0 DrawMarker(v.Marker, v.Pos.x, v.Pos.y, v.Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, v.Size.x, v.Size.y, v.Size.z, v.Color.r, v.Color.g, v.Color.b, 100, false, true, 2, false, false, false, false) end end end end end + Wait(Sleep) end end) @@ -363,13 +359,14 @@ end) -- Activate public marker CreateThread(function() while true do - Wait(0) + local Sleep = 1500 local coords = GetEntityCoords(PlayerPedId()) local position = nil local zone = nil for k,v in pairs(Config.PublicZones) do if #(coords - v.Pos) < v.Size.x/2 then + Sleep = 0 isInPublicMarker = true position = v.Teleport zone = v @@ -394,6 +391,7 @@ CreateThread(function() hintIsShowed = false end end + Wait(Sleep) end end) @@ -401,7 +399,7 @@ end) CreateThread(function() while true do - Wait(0) + local Sleep = 1500 if ESX.PlayerData.job ~= nil and ESX.PlayerData.job.name ~= 'unemployed' then local zones = nil @@ -425,6 +423,7 @@ CreateThread(function() if v.Zone then TriggerEvent("izone:isPlayerInZone", v.Zone, function(isIn) if isIn then + Sleep = 0 isInMarker = true currentZone = k zone = v @@ -439,7 +438,9 @@ CreateThread(function() end -- Else use radius defined from center else - if #(coords - v.Pos) < v.Size.x then + local Pos = vector3(v.Pos.x, v.Pos.y, v.Pos.z) + if #(coords - Pos) < v.Size.x then + Sleep = 0 isInMarker = true currentZone = k zone = v @@ -509,6 +510,7 @@ CreateThread(function() end end end + Wait(Sleep) end end) diff --git a/[esx_addons]/esx_jobs/fxmanifest.lua b/[esx_addons]/esx_jobs/fxmanifest.lua index 25d637af..1ddcb7ee 100644 --- a/[esx_addons]/esx_jobs/fxmanifest.lua +++ b/[esx_addons]/esx_jobs/fxmanifest.lua @@ -2,60 +2,24 @@ fx_version 'adamant' game 'gta5' -description 'ESX Jobs' +description 'ESX Job Listing' version '1.6.5' -shared_script '@es_extended/imports.lua' - -server_scripts { +shared_scripts { + '@es_extended/imports.lua', '@es_extended/locale.lua', - 'locales/br.lua', - 'locales/en.lua', - 'locales/es.lua', - 'locales/fi.lua', - 'locales/fr.lua', - 'locales/sv.lua', - 'locales/cs.lua', - 'locales/de.lua', 'config.lua', - - 'jobs/fisherman.lua', - 'jobs/fueler.lua', - 'jobs/lumberjack.lua', - 'jobs/miner.lua', - 'jobs/reporter.lua', - 'jobs/slaughterer.lua', - 'jobs/tailor.lua', - + 'jobs/*.lua', + 'locales/*.lua', +} +server_scripts { + '@oxmysql/lib/MySQL.lua', 'server/main.lua' } client_scripts { - '@es_extended/locale.lua', - 'locales/br.lua', - 'locales/fi.lua', - 'locales/en.lua', - 'locales/es.lua', - 'locales/fr.lua', - 'locales/sv.lua', - 'locales/cs.lua', - 'config.lua', - - 'jobs/fisherman.lua', - 'jobs/fueler.lua', - 'jobs/lumberjack.lua', - 'jobs/miner.lua', - 'jobs/reporter.lua', - 'jobs/slaughterer.lua', - 'jobs/tailor.lua', - 'client/main.lua' } -dependencies { - 'es_extended', - 'esx_addonaccount', - 'skinchanger', - 'esx_skin' -} +dependency 'es_extended' From b3a1211590c2e7c9f1f1565f153b9af1c057d8bc Mon Sep 17 00:00:00 2001 From: Mycroft Date: Thu, 24 Mar 2022 20:28:52 +0000 Subject: [PATCH 090/132] Tweak: ESX LScustom - Optimisations --- [esx_addons]/esx_lscustom/README.md | 27 +------- [esx_addons]/esx_lscustom/client/main.lua | 78 +++++++---------------- 2 files changed, 26 insertions(+), 79 deletions(-) diff --git a/[esx_addons]/esx_lscustom/README.md b/[esx_addons]/esx_lscustom/README.md index b569359f..dd0044de 100644 --- a/[esx_addons]/esx_lscustom/README.md +++ b/[esx_addons]/esx_lscustom/README.md @@ -1,34 +1,11 @@ # esx_lscustom ## Requirements + - [esx_vehicleshop](https://github.com/ESX-Org/esx_vehicleshop) -## Download & Installation +## Legal -### Using [fvm](https://github.com/qlaffont/fvm-installer) -``` -fvm install --save --folder=esx esx-org/esx_lscustom -``` - -### Using Git -``` -cd resources -git clone https://github.com/ESX-Org/esx_lscustom [esx]/esx_lscustom -``` - -### Manually -- Download https://github.com/ESX-Org/esx_lscustom/archive/master.zip -- Put it in the `[esx]` directory - -## Installation -- Add this to your `server.cfg`: - -``` -start esx_lscustom -``` - -# Legal -### License esx_lscustoms - The best LS Custom out there for FX Copyright (C) 2015-2022 Jérémie N'gadi diff --git a/[esx_addons]/esx_lscustom/client/main.lua b/[esx_addons]/esx_lscustom/client/main.lua index 237837c6..c23fe574 100644 --- a/[esx_addons]/esx_lscustom/client/main.lua +++ b/[esx_addons]/esx_lscustom/client/main.lua @@ -1,12 +1,8 @@ -local Vehicles = {} -local lsMenuIsShowed = false -local isInLSMarker = false -local myCar = {} - +local Vehicles, myCar = {},{} +local lsMenuIsShowed, isInLSMarker = false, false RegisterNetEvent('esx:playerLoaded') AddEventHandler('esx:playerLoaded', function(xPlayer) - ESX.PlayerData = xPlayer ESX.PlayerLoaded = true ESX.TriggerServerCallback('esx_lscustom:getVehiclesPrices', function(vehicles) @@ -14,11 +10,6 @@ AddEventHandler('esx:playerLoaded', function(xPlayer) end) end) -RegisterNetEvent('esx:setJob') -AddEventHandler('esx:setJob', function(job) - ESX.PlayerData.job = job -end) - RegisterNetEvent('esx_lscustom:installMod') AddEventHandler('esx_lscustom:installMod', function() local vehicle = GetVehiclePedIsIn(PlayerPedId(), false) @@ -378,7 +369,7 @@ end) -- Activate menu when player is inside marker CreateThread(function() while true do - Wait(0) + local Sleep = 1500 local playerPed = PlayerPedId() if IsPedInAnyVehicle(playerPed, false) then @@ -389,57 +380,36 @@ CreateThread(function() for k,v in pairs(Config.Zones) do local zonePos = vector3(v.Pos.x, v.Pos.y, v.Pos.z) if #(coords - zonePos) < v.Size.x and not lsMenuIsShowed then - isInLSMarker = true + Sleep = 0 ESX.ShowHelpNotification(v.Hint) - break - else - isInLSMarker = false + if IsControlJustReleased(0, 38) then + lsMenuIsShowed = true + + local vehicle = GetVehiclePedIsIn(playerPed, false) + FreezeEntityPosition(vehicle, true) + myCar = ESX.Game.GetVehicleProperties(vehicle) + + ESX.UI.Menu.CloseAll() + GetAction({value = 'main'}) + end end end end - - if IsControlJustReleased(0, 38) and not lsMenuIsShowed and isInLSMarker then - if (ESX.PlayerData.job and ESX.PlayerData.job.name == 'mechanic') or not Config.IsMechanicJobOnly then - lsMenuIsShowed = true - - local vehicle = GetVehiclePedIsIn(playerPed, false) - FreezeEntityPosition(vehicle, true) - - myCar = ESX.Game.GetVehicleProperties(vehicle) - - ESX.UI.Menu.CloseAll() - GetAction({value = 'main'}) - end - end - - if isInLSMarker and not hasAlreadyEnteredMarker then - hasAlreadyEnteredMarker = true - end - - if not isInLSMarker and hasAlreadyEnteredMarker then - hasAlreadyEnteredMarker = false - end - end + Wait(Sleep) end end) -- Prevent Free Tunning Bug CreateThread(function() - while true do - Wait(0) - - if lsMenuIsShowed then - DisableControlAction(2, 288, true) - DisableControlAction(2, 289, true) - DisableControlAction(2, 170, true) - DisableControlAction(2, 167, true) - DisableControlAction(2, 168, true) - DisableControlAction(2, 23, true) - DisableControlAction(0, 75, true) -- Disable exit vehicle - DisableControlAction(27, 75, true) -- Disable exit vehicle - else - Wait(500) - end + while lsMenuIsShowed do + DisableControlAction(2, 288, true) + DisableControlAction(2, 289, true) + DisableControlAction(2, 170, true) + DisableControlAction(2, 167, true) + DisableControlAction(2, 168, true) + DisableControlAction(2, 23, true) + DisableControlAction(0, 75, true) -- Disable exit vehicle + DisableControlAction(27, 75, true) -- Disable exit vehicle end end) From fde3a48d9a8b51ab7de6563762493bdcedcf0538 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Thu, 24 Mar 2022 20:36:59 +0000 Subject: [PATCH 091/132] Tweak: Real Estate Agent Job - Optimisations --- .../esx_realestateagentjob/client/main.lua | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/[esx_addons]/esx_realestateagentjob/client/main.lua b/[esx_addons]/esx_realestateagentjob/client/main.lua index 022a8aeb..2413d022 100644 --- a/[esx_addons]/esx_realestateagentjob/client/main.lua +++ b/[esx_addons]/esx_realestateagentjob/client/main.lua @@ -225,22 +225,24 @@ end) -- Display markers CreateThread(function() while true do - Wait(0) + local Sleep = 1500 local coords = GetEntityCoords(PlayerPedId()) for k,v in pairs(Config.Zones) do if(v.Type ~= -1 and #(coords - v.Pos) < Config.DrawDistance) then + Sleep = 0 DrawMarker(v.Type, v.Pos.x, v.Pos.y, v.Pos.z, 0.0, 0.0, 0.0, 0, 0.0, 0.0, v.Size.x, v.Size.y, v.Size.z, Config.MarkerColor.r, Config.MarkerColor.g, Config.MarkerColor.b, 100, false, true, 2, false, false, false, false) end end + Wait(Sleep) end end) -- Enter / Exit marker events CreateThread(function() while true do - Wait(0) + local Sleep = 500 local coords = GetEntityCoords(PlayerPedId()) local isInMarker = false @@ -248,6 +250,7 @@ CreateThread(function() for k,v in pairs(Config.Zones) do if #(coords - v.Pos) < v.Size.x then + Sleep = 0 isInMarker = true currentZone = k end @@ -263,15 +266,14 @@ CreateThread(function() hasAlreadyEnteredMarker = false TriggerEvent('esx_realestateagentjob:hasExitedMarker', LastZone) end + Wait(Sleep) end end) -- Key controls CreateThread(function() - while true do + while CurrentAction do Wait(0) - - if CurrentAction then ESX.ShowHelpNotification(CurrentActionMsg) if IsControlJustReleased(0, 38) then @@ -281,9 +283,6 @@ CreateThread(function() CurrentAction = nil end - else - Wait(500) - end end end) From f947029eab410b1f4c799858388c55593489e0d6 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Thu, 24 Mar 2022 20:49:40 +0000 Subject: [PATCH 092/132] Tweak: TaxiJob - Optimisations --- [esx_addons]/esx_taxijob/client/main.lua | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/[esx_addons]/esx_taxijob/client/main.lua b/[esx_addons]/esx_taxijob/client/main.lua index ff7c4571..6ff23355 100644 --- a/[esx_addons]/esx_taxijob/client/main.lua +++ b/[esx_addons]/esx_taxijob/client/main.lua @@ -495,10 +495,9 @@ end) -- Enter / Exit marker events, and draw markers CreateThread(function() - while true do + while ESX.PlayerData.job and ESX.PlayerData.job.name == 'taxi' do Wait(0) - if ESX.PlayerData.job and ESX.PlayerData.job.name == 'taxi' then local coords = GetEntityCoords(PlayerPedId()) local isInMarker, letSleep, currentZone = false, true @@ -529,20 +528,14 @@ CreateThread(function() if letSleep then Wait(500) end - else - Wait(1000) - end end end) -- Taxi Job CreateThread(function() - while true do - + while OnJob do Wait(0) - local playerPed = PlayerPedId() - - if OnJob then + local playerPed = PlayerPedId() if CurrentCustomer == nil then DrawSub(_U('drive_search_pass'), 5000) @@ -695,9 +688,6 @@ CreateThread(function() else DrawSub(_U('return_to_veh'), 5000) end - end - else - Wait(500) end end end) @@ -717,10 +707,8 @@ end) -- Key Controls CreateThread(function() - while true do + while CurrentAction and not ESX.PlayerData.dead do Wait(0) - - if CurrentAction and not ESX.GetPlayerData().dead then ESX.ShowHelpNotification(CurrentActionMsg) if IsControlJustReleased(0, 38) and ESX.PlayerData.job and ESX.PlayerData.job.name == 'taxi' then @@ -737,7 +725,6 @@ CreateThread(function() CurrentAction = nil end end - end end) RegisterCommand('taximenu', function() if not ESX.GetPlayerData().dead and Config.EnablePlayerManagement and ESX.PlayerData.job and ESX.PlayerData.job.name == 'taxi' then From 7329ac43bd77985e354640381bbc64c4d8b928f5 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Thu, 24 Mar 2022 20:49:52 +0000 Subject: [PATCH 093/132] Tweak: MechanicJob - Optimisations --- [esx_addons]/esx_mechanicjob/client/main.lua | 28 +++++++++----------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/[esx_addons]/esx_mechanicjob/client/main.lua b/[esx_addons]/esx_mechanicjob/client/main.lua index 36dfe516..612c5e31 100644 --- a/[esx_addons]/esx_mechanicjob/client/main.lua +++ b/[esx_addons]/esx_mechanicjob/client/main.lua @@ -771,9 +771,10 @@ end) -- Pop NPC mission vehicle when inside area CreateThread(function() while true do - Wait(0) + local Sleep = 1500 if NPCTargetTowableZone and not NPCHasSpawnedTowable then + Sleep = 0 local coords = GetEntityCoords(PlayerPedId()) local zone = Config.Zones[NPCTargetTowableZone] @@ -789,14 +790,17 @@ CreateThread(function() end if NPCTargetTowableZone and NPCHasSpawnedTowable and not NPCHasBeenNextToTowable then + Sleep = 500 local coords = GetEntityCoords(PlayerPedId()) local zone = Config.Zones[NPCTargetTowableZone] if #(coords - zone.Pos) < Config.NPCNextToDistance then + Sleep = 0 ESX.ShowNotification(_U('please_tow')) NPCHasBeenNextToTowable = true end end + Wait(Sleep) end end) @@ -818,31 +822,28 @@ end) -- Display markers CreateThread(function() while true do - Wait(0) + local Sleep = 2000 if ESX.PlayerData.job and ESX.PlayerData.job.name == 'mechanic' then + Sleep = 500 local coords, letSleep = GetEntityCoords(PlayerPedId()), true for k,v in pairs(Config.Zones) do if v.Type ~= -1 and #(coords - v.Pos) < Config.DrawDistance then + Sleep = 0 DrawMarker(v.Type, v.Pos.x, v.Pos.y, v.Pos.z, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, v.Size.x, v.Size.y, v.Size.z, v.Color.r, v.Color.g, v.Color.b, 100, false, true, 2, false, nil, nil, false) letSleep = false end end - - if letSleep then - Wait(500) - end - else - Wait(500) end + Wait(Sleep) end end) -- Enter / Exit marker events CreateThread(function() while true do - Wait(0) + local Sleep = 500 if ESX.PlayerData.job and ESX.PlayerData.job.name == 'mechanic' then @@ -852,6 +853,7 @@ CreateThread(function() for k,v in pairs(Config.Zones) do if(#(coords - v.Pos) < v.Size.x) then + Sleep = 0 isInMarker = true currentZone = k end @@ -867,8 +869,8 @@ CreateThread(function() HasAlreadyEnteredMarker = false TriggerEvent('esx_mechanicjob:hasExitedMarker', LastZone) end - end + Wait(Sleep) end end) @@ -917,10 +919,8 @@ end) -- Key Controls CreateThread(function() - while true do + while CurrentAction do Wait(0) - - if CurrentAction then ESX.ShowHelpNotification(CurrentActionMsg) if IsControlJustReleased(0, 38) and ESX.PlayerData.job and ESX.PlayerData.job.name == 'mechanic' then @@ -983,8 +983,6 @@ CreateThread(function() end end end - - end end) AddEventHandler('esx:onPlayerDeath', function(data) isDead = true end) From abb18fe4a9c95faddb89279e2068342949b253c1 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Thu, 24 Mar 2022 20:50:12 +0000 Subject: [PATCH 094/132] Tweak: ESX Drugs - Optimisations --- [esx_addons]/esx_drugs/client/main.lua | 19 ++++++++++--------- [esx_addons]/esx_drugs/client/weed.lua | 6 +++--- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/[esx_addons]/esx_drugs/client/main.lua b/[esx_addons]/esx_drugs/client/main.lua index 04304c16..bfc5cd2f 100644 --- a/[esx_addons]/esx_drugs/client/main.lua +++ b/[esx_addons]/esx_drugs/client/main.lua @@ -32,7 +32,9 @@ end) --drawk marker CreateThread(function() while true do + local Sleep = 1500 if(inRangeMarkerDrugShop) then + Sleep = 0 local coordsMarker = Config.CircleZones.DrugDealer.coords local color = cfgMarker.Color DrawMarker(cfgMarker.Type, coordsMarker.x, coordsMarker.y,coordsMarker.z - 1.0, @@ -40,23 +42,22 @@ CreateThread(function() cfgMarker.Size, color.r,color.g,color.b,color.a, false, true, 2, false, nil, nil, false) end - Wait(0) + Wait(Sleep) end end) --main loop CreateThread(function () while true do - if inZoneDrugShop then - if(not menuOpen) then - ESX.ShowHelpNotification(_U('dealer_prompt'),true) - if IsControlJustPressed(0, 38) then - OpenDrugShop() - end + local Sleep = 1500 + if inZoneDrugShop and not menuOpen then + Sleep = 0 + ESX.ShowHelpNotification(_U('dealer_prompt'),true) + if IsControlJustPressed(0, 38) then + OpenDrugShop() end end - - Wait(15) + Wait(Sleep) end end) diff --git a/[esx_addons]/esx_drugs/client/weed.lua b/[esx_addons]/esx_drugs/client/weed.lua index b31f9685..8becb871 100644 --- a/[esx_addons]/esx_drugs/client/weed.lua +++ b/[esx_addons]/esx_drugs/client/weed.lua @@ -73,7 +73,7 @@ end CreateThread(function() while true do - Wait(0) + local Sleep = 1500 local playerPed = PlayerPedId() local coords = GetEntityCoords(playerPed) @@ -86,6 +86,7 @@ CreateThread(function() end if nearbyObject and IsPedOnFoot(playerPed) then + Sleep = 0 if not isPickingUp then ESX.ShowHelpNotification(_U('weed_pickupprompt')) end @@ -114,9 +115,8 @@ CreateThread(function() isPickingUp = false end, 'cannabis') end - else - Wait(500) end + Wait(Sleep) end end) From 232b5da2719f8d349d0fdb62db2bcc9f36c74d58 Mon Sep 17 00:00:00 2001 From: Fezz <43589668+FBFezz@users.noreply.github.com> Date: Sat, 26 Mar 2022 15:08:55 +0000 Subject: [PATCH 095/132] Update fxmanifest.lua --- [esx_addons]/esx_joblisting/fxmanifest.lua | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/[esx_addons]/esx_joblisting/fxmanifest.lua b/[esx_addons]/esx_joblisting/fxmanifest.lua index 16c15c27..e2c73a61 100644 --- a/[esx_addons]/esx_joblisting/fxmanifest.lua +++ b/[esx_addons]/esx_joblisting/fxmanifest.lua @@ -1,5 +1,4 @@ -fx_version 'adamant' - +fx_version 'bodacious' game 'gta5' description 'ESX Job Listing' @@ -9,17 +8,12 @@ version '1.6.5' shared_scripts { '@es_extended/imports.lua', '@es_extended/locale.lua', + 'locales/*.lua', 'config.lua' } -server_scripts { - '@oxmysql/lib/MySQL.lua', - 'locales/*.lua', - 'server/main.lua' -} -client_scripts { - 'locales/*.lua', - 'client/main.lua' -} +server_script 'server/main.lua' + +client_script 'client/main.lua' dependency 'es_extended' From 894668f7c9d4f2e3dfadb4f4f77ab66492698d71 Mon Sep 17 00:00:00 2001 From: Fezz <43589668+FBFezz@users.noreply.github.com> Date: Sat, 26 Mar 2022 15:09:18 +0000 Subject: [PATCH 096/132] Fixed Not Showing Jobs --- [esx_addons]/esx_joblisting/server/main.lua | 22 +++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/[esx_addons]/esx_joblisting/server/main.lua b/[esx_addons]/esx_joblisting/server/main.lua index 823f10b3..7190ed08 100644 --- a/[esx_addons]/esx_joblisting/server/main.lua +++ b/[esx_addons]/esx_joblisting/server/main.lua @@ -1,14 +1,18 @@ -local availableJobs = {} - -for k,v in pairs(ESX.Jobs) do - print(v.whitelisted) - if v.whitelisted == false then - availableJobs[k] = {label = v.label} +function getJobs() + local jobs = ESX.GetJobs() + local availableJobs = {} + for k,v in pairs(jobs) do + print(v.whitelisted) + if v.whitelisted == false then + availableJobs[k] = {label = v.label} + end end + return availableJobs end ESX.RegisterServerCallback('esx_joblisting:getJobsList', function(source, cb) - cb(availableJobs) + local jobs = getJobs() + cb(jobs) end) function IsNearCentre(player) @@ -27,10 +31,12 @@ end RegisterServerEvent('esx_joblisting:setJob') AddEventHandler('esx_joblisting:setJob', function(job) + local source = source local xPlayer = ESX.GetPlayerFromId(source) + local jobs = getJobs() if xPlayer and IsNearCentre(source) then - if availableJobs[job] then + if jobs[job] then xPlayer.setJob(job, 0) end end From 9b9ce389384a7de3f077af444107800b001599bb Mon Sep 17 00:00:00 2001 From: Mycroft Date: Sat, 26 Mar 2022 18:58:59 +0000 Subject: [PATCH 097/132] Refactor: ESX Whitelist --- [esx_addons]/esx_whitelist/README.md | 26 -------- [esx_addons]/esx_whitelist/esx_whitelist.sql | 8 --- [esx_addons]/esx_whitelist/fxmanifest.lua | 6 +- [esx_addons]/esx_whitelist/locales/en.lua | 8 +-- [esx_addons]/esx_whitelist/players.json | 1 + .../esx_whitelist/server/commands.lua | 26 -------- [esx_addons]/esx_whitelist/server/main.lua | 61 +++++++++++++------ 7 files changed, 52 insertions(+), 84 deletions(-) delete mode 100644 [esx_addons]/esx_whitelist/esx_whitelist.sql create mode 100644 [esx_addons]/esx_whitelist/players.json delete mode 100644 [esx_addons]/esx_whitelist/server/commands.lua diff --git a/[esx_addons]/esx_whitelist/README.md b/[esx_addons]/esx_whitelist/README.md index a6a9cf72..9ea7a128 100644 --- a/[esx_addons]/esx_whitelist/README.md +++ b/[esx_addons]/esx_whitelist/README.md @@ -1,32 +1,6 @@ # esx_whitelist -## Download & Installation - -### Using [fvm](https://github.com/qlaffont/fvm-installer) -``` -fvm install --save --folder=esx esx-org/esx_whitelist -``` - -### Using Git -``` -cd resources -git clone https://github.com/ESX-Org/esx_whitelist [esx]/esx_whitelist -``` - -### Manually -- Download https://github.com/ESX-Org/esx_whitelist/archive/master.zip -- Put it in the `[esx]` directory - -## Installation -- Import `esx_whitelist.sql` to your database -- Add this in your `server.cfg`: - -``` -start esx_whitelist -``` - # Legal -### License esx_whitelist - Whitelist script Copyright (C) 2015-2022 Jérémie N'gadi diff --git a/[esx_addons]/esx_whitelist/esx_whitelist.sql b/[esx_addons]/esx_whitelist/esx_whitelist.sql deleted file mode 100644 index 68bcf92a..00000000 --- a/[esx_addons]/esx_whitelist/esx_whitelist.sql +++ /dev/null @@ -1,8 +0,0 @@ -USE `es_extended`; - -CREATE TABLE `whitelist` ( - `identifier` varchar(60) NOT NULL, - - PRIMARY KEY (`identifier`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - diff --git a/[esx_addons]/esx_whitelist/fxmanifest.lua b/[esx_addons]/esx_whitelist/fxmanifest.lua index 6319d5d9..1ea8d736 100644 --- a/[esx_addons]/esx_whitelist/fxmanifest.lua +++ b/[esx_addons]/esx_whitelist/fxmanifest.lua @@ -6,12 +6,12 @@ description 'ESX Whitelist' version '1.6.5' +server_only 'yes' + server_scripts { '@es_extended/imports.lua', - '@oxmysql/lib/MySQL.lua', '@es_extended/locale.lua', 'config.lua', 'locales/*.lua', - 'server/main.lua', - 'server/commands.lua' + 'server/main.lua' } diff --git a/[esx_addons]/esx_whitelist/locales/en.lua b/[esx_addons]/esx_whitelist/locales/en.lua index 8b7443c6..398c3964 100644 --- a/[esx_addons]/esx_whitelist/locales/en.lua +++ b/[esx_addons]/esx_whitelist/locales/en.lua @@ -1,8 +1,8 @@ Locales['en'] = { - ['whitelist_check'] = 'making sure you\'re whitelisted on this server . . .', - ['not_whitelisted'] = 'you are not whitelisted on this server', - ['whitelist_empty'] = 'the whitelist hasn\'t been loaded yet, or alternatively no one has been whitelisted!', - ['license_missing'] = 'your license could not be found', + ['whitelist_check'] = 'Checking you are Allowlisted.', + ['not_whitelisted'] = 'You Must be Allowlisted to join this server!', + ['whitelist_empty'] = 'There Are no whitelists saved for this server.', + ['license_missing'] = 'Error: Your Identifier is missing!', ['help_whitelist_add'] = 'add someone to the whitelist', ['help_whitelist_load'] = 'reload the whitelist', } diff --git a/[esx_addons]/esx_whitelist/players.json b/[esx_addons]/esx_whitelist/players.json new file mode 100644 index 00000000..0637a088 --- /dev/null +++ b/[esx_addons]/esx_whitelist/players.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/[esx_addons]/esx_whitelist/server/commands.lua b/[esx_addons]/esx_whitelist/server/commands.lua deleted file mode 100644 index e9d8193e..00000000 --- a/[esx_addons]/esx_whitelist/server/commands.lua +++ /dev/null @@ -1,26 +0,0 @@ -ESX.RegisterCommand('wlrefresh', 'admin', function(xPlayer, args, showError) - loadWhiteList(function() - showError('Whitelist reloaded') - end) -end, true, {help = _U('help_whitelist_load')}) - -ESX.RegisterCommand('wladd', 'admin', function(xPlayer, args, showError) - args.license = args.license:lower() - - if string.len(args.license) == 40 then - if WhiteList[args.license] then - showError('The player is already whitelisted on this server!') - else - MySQL.update('INSERT INTO whitelist (identifier) VALUES (@identifier)', { - ['@identifier'] = args.license - }, function(rowsChanged) - WhiteList[args.license] = true - showError('The player has been whitelisted!') - end) - end - else - showError('Invalid license ID length!') - end -end, true, {help = _U('help_whitelist_add'), validate = true, arguments = { - {name = 'license', help = 'the player license', type = 'string'} -}}) diff --git a/[esx_addons]/esx_whitelist/server/main.lua b/[esx_addons]/esx_whitelist/server/main.lua index 399ed818..2983e090 100644 --- a/[esx_addons]/esx_whitelist/server/main.lua +++ b/[esx_addons]/esx_whitelist/server/main.lua @@ -1,28 +1,20 @@ WhiteList = {} -function loadWhiteList(cb) - Whitelist = {} +function loadWhiteList() + Whitelist = nil - MySQL.query('SELECT identifier FROM whitelist', function(result) - for k,v in ipairs(result) do - WhiteList[v.identifier] = true - end - - if cb then - cb() - end - end) + local List = LoadResourceFile(GetCurrentResourceName(),'players.json') + if List then + Whitelist = json.decode(List) + end end -MySQL.ready(function() - loadWhiteList() -end) +loadWhiteList() AddEventHandler('playerConnecting', function(name, setCallback, deferrals) - if #GetPlayers() < Config.MinPlayer then + if #(GetPlayers()) < Config.MinPlayer then deferrals.done() - end - + else -- Mark this connection as deferred, this is to prevent problems while checking player identifiers. deferrals.defer() @@ -49,4 +41,39 @@ AddEventHandler('playerConnecting', function(name, setCallback, deferrals) else deferrals.done() end + end end) + +ESX.RegisterCommand('wlrefresh', 'admin', function(xPlayer, args, showError) + loadWhiteList(function() + showError('Whitelist reloaded') + end) +end, true, {help = _U('help_whitelist_load')}) + +ESX.RegisterCommand('wladd', 'admin', function(xPlayer, args, showError) + args.license = args.license:lower() + + if WhiteList[args.license] then + showError('The player is already allowlisted on this server!') + else + WhiteList[args.license] = true + SaveResourceFile(GetCurrentResourceName(), 'players.json', json.encode(WhiteList)) + loadWhiteList() + end +end, true, {help = _U('help_whitelist_add'), validate = true, arguments = { + {name = 'license', help = 'the player license', type = 'string'} +}}) + +ESX.RegisterCommand('wlremove', 'admin', function(xPlayer, args, showError) + args.license = args.license:lower() + + if WhiteList[args.license] then + WhiteList[args.license] = nil + SaveResourceFile(GetCurrentResourceName(), 'players.json', json.encode(WhiteList)) + loadWhiteList() + else + showError('Identifier is not Allowlisted on this server!') + end +end, true, {help = _U('help_whitelist_add'), validate = true, arguments = { + {name = 'license', help = 'the player license', type = 'string'} +}}) From 133caab3c3b3d3c2955027a550f03cbe379ed54a Mon Sep 17 00:00:00 2001 From: Mycroft Date: Sat, 26 Mar 2022 19:43:32 +0000 Subject: [PATCH 098/132] Refactor: ESX Weaponshop --- [esx_addons]/esx_weaponshop/README.md | 26 ---- [esx_addons]/esx_weaponshop/client/main.lua | 27 +--- [esx_addons]/esx_weaponshop/config.lua | 145 +++++++++++++++++- .../esx_weaponshop/esx_weaponshop.sql | 55 +------ [esx_addons]/esx_weaponshop/fxmanifest.lua | 1 - [esx_addons]/esx_weaponshop/server/main.lua | 40 ++--- 6 files changed, 156 insertions(+), 138 deletions(-) diff --git a/[esx_addons]/esx_weaponshop/README.md b/[esx_addons]/esx_weaponshop/README.md index 827916e4..b6e29da8 100644 --- a/[esx_addons]/esx_weaponshop/README.md +++ b/[esx_addons]/esx_weaponshop/README.md @@ -2,33 +2,7 @@ ESX Weapon Shop adds.. well you guessed it - weapon shops to the already existing shops in the world. -## Download & Installation - -### Using [fvm](https://github.com/qlaffont/fvm-installer) -``` -fvm install --save --folder=esx esx-org/esx_weaponshop -``` - -### Using Git -``` -cd resources -git clone https://github.com/ESX-Org/esx_weaponshop.git [esx]/esx_weaponshop -``` - -### Manually -- Download https://github.com/ESX-Org/esx_weaponshop/archive/master.zip -- Put it in the `[esx]` directory - -## Installation -- Import `esx_weaponshop.sql` in your database -- Add this to your `server.cfg`: - -``` -start esx_weaponshop -``` - # Legal -### License esx_weaponshop - Legal and illegal weapon shops Copyright (C) 2015-2022 Jérémie N'gadi diff --git a/[esx_addons]/esx_weaponshop/client/main.lua b/[esx_addons]/esx_weaponshop/client/main.lua index d494ba0f..5b7f9d95 100644 --- a/[esx_addons]/esx_weaponshop/client/main.lua +++ b/[esx_addons]/esx_weaponshop/client/main.lua @@ -5,19 +5,6 @@ local CurrentActionMsg = '' local CurrentActionData = {} local ShopOpen = false -ESX.TriggerServerCallback('esx_weaponshop:getShop', function(shopItems) - for k,v in pairs(shopItems) do - Config.Zones[k].Items = v - end -end) - -RegisterNetEvent('esx_weaponshop:sendShop') -AddEventHandler('esx_weaponshop:sendShop', function(shopItems) - for k,v in pairs(shopItems) do - Config.Zones[k].Items = v - end -end) - function OpenBuyLicenseMenu(zone) ESX.UI.Menu.CloseAll() @@ -48,11 +35,12 @@ function OpenShopMenu(zone) for i=1, #Config.Zones[zone].Items, 1 do local item = Config.Zones[zone].Items[i] + item.label = ESX.GetWeaponLabel(item.name) table.insert(elements, { label = ('%s - %s'):format(item.label, _U('shop_menu_item', ESX.Math.GroupDigits(item.price))), price = item.price, - weaponName = item.item + weaponName = item.name }) end @@ -140,7 +128,7 @@ CreateThread(function() SetBlipSprite (blip, 110) SetBlipDisplay(blip, 4) - SetBlipScale (blip, 1.0) + SetBlipScale (blip, 0.8) SetBlipColour (blip, 81) SetBlipAsShortRange(blip, true) @@ -202,11 +190,8 @@ end) -- Key Controls CreateThread(function() - while true do - local Sleep = 1500 - - if CurrentAction ~= nil then - Sleep = 0 + while CurrentAction do + Wait(0) ESX.ShowHelpNotification(CurrentActionMsg) if IsControlJustReleased(0, 38) then @@ -227,7 +212,5 @@ CreateThread(function() CurrentAction = nil end - end - Wait(Sleep) end end) diff --git a/[esx_addons]/esx_weaponshop/config.lua b/[esx_addons]/esx_weaponshop/config.lua index 63a3b425..33da63f4 100644 --- a/[esx_addons]/esx_weaponshop/config.lua +++ b/[esx_addons]/esx_weaponshop/config.lua @@ -1,6 +1,6 @@ Config = {} -Config.DrawDistance = 10 +Config.DrawDistance = 10.0 Config.Size = { x = 1.5, y = 1.5, z = 0.5 } Config.Color = { r = 0, g = 128, b = 255 } Config.Type = 1 @@ -16,7 +16,76 @@ Config.Zones = { GunShop = { Legal = true, - Items = {}, + Items = { + { + name = "WEAPON_PISTOL", + price = 500 + }, + { + name = "WEAPON_FLASHLIGHT", + price = 70 + }, + { + name = "WEAPON_MACHETE", + price = 110 + }, + { + name = "WEAPON_NIGHTSTICK", + price = 150 + }, + { + name = "WEAPON_BAT", + price = 50 + }, + { + name = "WEAPON_STUNGUN", + price = 60 + }, + { + name = "WEAPON_MICROSMG", + price = 1700 + }, + { + name = "WEAPON_ASSAULTRIFLE", + price = 11000 + }, + { + name = "WEAPON_STUNGUN", + price = 60 + }, + { + name = "WEAPON_SPECIALCARBINE", + price = 15000 + }, + { + name = "WEAPON_SNIPERRIFLE", + price = 24000 + }, + { + name = "WEAPON_FIREWORK", + price = 21000 + }, + { + name = "WEAPON_GRENADE", + price = 700 + }, + { + name = "WEAPON_BZGAS", + price = 200 + }, + { + name = "WEAPON_FIREEXTINGUISHER", + price = 100 + }, + { + name = "WEAPON_BALL", + price = 30 + }, + { + name = "WEAPON_SMOKEGRENADE", + price = 100 + }, + }, Locations = { vector3(-662.1, -935.3, 20.8), vector3(810.2, -2157.3, 28.6), @@ -32,10 +101,78 @@ Config.Zones = { BlackWeashop = { Legal = false, - Items = {}, + Items = { + { + name = "WEAPON_PISTOL", + price = 500 + }, + { + name = "WEAPON_FLASHLIGHT", + price = 70 + }, + { + name = "WEAPON_MACHETE", + price = 110 + }, + { + name = "WEAPON_NIGHTSTICK", + price = 150 + }, + { + name = "WEAPON_BAT", + price = 50 + }, + { + name = "WEAPON_STUNGUN", + price = 60 + }, + { + name = "WEAPON_MICROSMG", + price = 1700 + }, + { + name = "WEAPON_ASSAULTRIFLE", + price = 11000 + }, + { + name = "WEAPON_STUNGUN", + price = 60 + }, + { + name = "WEAPON_SPECIALCARBINE", + price = 15000 + }, + { + name = "WEAPON_SNIPERRIFLE", + price = 24000 + }, + { + name = "WEAPON_FIREWORK", + price = 21000 + }, + { + name = "WEAPON_GRENADE", + price = 700 + }, + { + name = "WEAPON_BZGAS", + price = 200 + }, + { + name = "WEAPON_FIREEXTINGUISHER", + price = 100 + }, + { + name = "WEAPON_BALL", + price = 30 + }, + { + name = "WEAPON_SMOKEGRENADE", + price = 100 + }, + }, Locations = { vector3(-1306.2, -394.0, 35.6) } } - } diff --git a/[esx_addons]/esx_weaponshop/esx_weaponshop.sql b/[esx_addons]/esx_weaponshop/esx_weaponshop.sql index 9f866ec5..7f46bb4f 100644 --- a/[esx_addons]/esx_weaponshop/esx_weaponshop.sql +++ b/[esx_addons]/esx_weaponshop/esx_weaponshop.sql @@ -1,58 +1,5 @@ USE `es_extended`; -CREATE TABLE `weashops` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `zone` varchar(255) NOT NULL, - `item` varchar(255) NOT NULL, - `price` int(11) NOT NULL, - - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - - INSERT INTO `licenses` (`type`, `label`) VALUES - ('weapon', "Permis de port d'arme") -; - -INSERT INTO `weashops` (`zone`, `item`, `price`) VALUES - ('GunShop','WEAPON_PISTOL', 300), - ('BlackWeashop','WEAPON_PISTOL', 500), - ('GunShop', 'WEAPON_FLASHLIGHT', 60), - ('BlackWeashop', 'WEAPON_FLASHLIGHT', 70), - ('GunShop', 'WEAPON_MACHETE', 90), - ('BlackWeashop', 'WEAPON_MACHETE', 110), - ('GunShop', 'WEAPON_NIGHTSTICK', 150), - ('BlackWeashop', 'WEAPON_NIGHTSTICK', 150), - ('GunShop', 'WEAPON_BAT', 100), - ('BlackWeashop', 'WEAPON_BAT', 100), - ('GunShop', 'WEAPON_STUNGUN', 50), - ('BlackWeashop', 'WEAPON_STUNGUN', 50), - ('GunShop', 'WEAPON_MICROSMG', 1400), - ('BlackWeashop', 'WEAPON_MICROSMG', 1700), - ('GunShop', 'WEAPON_PUMPSHOTGUN', 3400), - ('BlackWeashop', 'WEAPON_PUMPSHOTGUN', 3500), - ('GunShop', 'WEAPON_ASSAULTRIFLE', 10000), - ('BlackWeashop', 'WEAPON_ASSAULTRIFLE', 11000), - ('GunShop', 'WEAPON_SPECIALCARBINE', 15000), - ('BlackWeashop', 'WEAPON_SPECIALCARBINE', 16500), - ('GunShop', 'WEAPON_SNIPERRIFLE', 22000), - ('BlackWeashop', 'WEAPON_SNIPERRIFLE', 24000), - ('GunShop', 'WEAPON_FIREWORK', 18000), - ('BlackWeashop', 'WEAPON_FIREWORK', 20000), - ('GunShop', 'WEAPON_GRENADE', 500), - ('BlackWeashop', 'WEAPON_GRENADE', 650), - ('GunShop', 'WEAPON_BZGAS', 200), - ('BlackWeashop', 'WEAPON_BZGAS', 350), - ('GunShop', 'WEAPON_FIREEXTINGUISHER', 100), - ('BlackWeashop', 'WEAPON_FIREEXTINGUISHER', 100), - ('GunShop', 'WEAPON_BALL', 50), - ('BlackWeashop', 'WEAPON_BALL', 50), - ('GunShop', 'WEAPON_SMOKEGRENADE', 100), - ('BlackWeashop', 'WEAPON_SMOKEGRENADE', 100), - ('BlackWeashop', 'WEAPON_APPISTOL', 1100), - ('BlackWeashop', 'WEAPON_CARBINERIFLE', 12000), - ('BlackWeashop', 'WEAPON_HEAVYSNIPER', 30000), - ('BlackWeashop', 'WEAPON_MINIGUN', 45000), - ('BlackWeashop', 'WEAPON_RAILGUN', 50000), - ('BlackWeashop', 'WEAPON_STICKYBOMB', 500) + ('weapon', "Weapon licence") ; diff --git a/[esx_addons]/esx_weaponshop/fxmanifest.lua b/[esx_addons]/esx_weaponshop/fxmanifest.lua index 64296bf3..3e038edc 100644 --- a/[esx_addons]/esx_weaponshop/fxmanifest.lua +++ b/[esx_addons]/esx_weaponshop/fxmanifest.lua @@ -14,7 +14,6 @@ shared_scripts { } server_scripts { - '@oxmysql/lib/MySQL.lua', 'server/main.lua' } diff --git a/[esx_addons]/esx_weaponshop/server/main.lua b/[esx_addons]/esx_weaponshop/server/main.lua index 2f19e15b..75a7d5ca 100644 --- a/[esx_addons]/esx_weaponshop/server/main.lua +++ b/[esx_addons]/esx_weaponshop/server/main.lua @@ -1,28 +1,3 @@ -local shopItems = {} - -MySQL.ready(function() - - MySQL.query('SELECT * FROM weashops', function(result) - for i=1, #result, 1 do - if shopItems[result[i].zone] == nil then - shopItems[result[i].zone] = {} - end - - table.insert(shopItems[result[i].zone], { - item = result[i].item, - price = result[i].price, - label = ESX.GetWeaponLabel(result[i].item) - }) - end - - TriggerClientEvent('esx_weaponshop:sendShop', -1, shopItems) - end) - -end) - -ESX.RegisterServerCallback('esx_weaponshop:getShop', function(source, cb) - cb(shopItems) -end) ESX.RegisterServerCallback('esx_weaponshop:buyLicense', function(source, cb) local xPlayer = ESX.GetPlayerFromId(source) @@ -77,13 +52,16 @@ ESX.RegisterServerCallback('esx_weaponshop:buyWeapon', function(source, cb, weap end) function GetPrice(weaponName, zone) - local price = MySQL.scalar.await('SELECT price FROM weashops WHERE zone = @zone AND item = @item', { - ['@zone'] = zone, - ['@item'] = weaponName - }) + local weapon = nil + for k,v in pairs(Config.Zones[zone].items) + if v.name == weaponName then + weapon = v + break + end + end - if price then - return price + if weapon then + return v.price else return 0 end From d9f17c499406c10751e456eebbd99bb4065f9baf Mon Sep 17 00:00:00 2001 From: Mycroft Date: Sat, 26 Mar 2022 20:11:13 +0000 Subject: [PATCH 099/132] Weaponshop refactor --- [esx_addons]/esx_weaponshop/client/main.lua | 92 +++++---------------- 1 file changed, 21 insertions(+), 71 deletions(-) diff --git a/[esx_addons]/esx_weaponshop/client/main.lua b/[esx_addons]/esx_weaponshop/client/main.lua index 5b7f9d95..2b0b2930 100644 --- a/[esx_addons]/esx_weaponshop/client/main.lua +++ b/[esx_addons]/esx_weaponshop/client/main.lua @@ -83,7 +83,6 @@ function DisplayBoughtScaleform(weaponName, price) ScaleformMovieMethodAddParamInt(GetHashKey(weaponName)) ScaleformMovieMethodAddParamTextureNameString('') ScaleformMovieMethodAddParamInt(100) - EndScaleformMovieMethod() PlaySoundFrontend(-1, 'WEAPON_PURCHASE', 'HUD_AMMO_SHOP_SOUNDSET', false) @@ -98,19 +97,6 @@ function DisplayBoughtScaleform(weaponName, price) end) end -AddEventHandler('esx_weaponshop:hasEnteredMarker', function(zone) - if zone == 'GunShop' or zone == 'BlackWeashop' then - CurrentAction = 'shop_menu' - CurrentActionMsg = _U('shop_menu_prompt') - CurrentActionData = { zone = zone } - end -end) - -AddEventHandler('esx_weaponshop:hasExitedMarker', function(zone) - CurrentAction = nil - ESX.UI.Menu.CloseAll() -end) - AddEventHandler('onResourceStop', function(resource) if resource == GetCurrentResourceName() then if ShopOpen then @@ -151,66 +137,30 @@ CreateThread(function() for i = 1, #v.Locations, 1 do if (Config.Type ~= -1 and #(coords - v.Locations[i]) < Config.DrawDistance) then Sleep = 0 + ESX.ShowHelpNotification(_U('shop_menu_prompt')) + + if IsControlJustReleased(0, 38) then + if Config.LicenseEnable and v.Legal then + ESX.TriggerServerCallback('esx_license:checkLicense', function(hasWeaponLicense) + if hasWeaponLicense then + OpenShopMenu(k) + else + OpenBuyLicenseMenu(k) + end + end, GetPlayerServerId(PlayerId()), 'weapon') + else + OpenShopMenu(k) + end + end DrawMarker(Config.Type, v.Locations[i], 0.0, 0.0, 0.0, 0, 0.0, 0.0, Config.Size.x, Config.Size.y, Config.Size.z, Config.Color.r, Config.Color.g, Config.Color.b, 100, false, true, 2, false, false, false, false) - end - end - end - Wait(Sleep) - end -end) - --- Enter / Exit marker events -CreateThread(function() - while true do - local Sleep = 1000 - - local coords = GetEntityCoords(PlayerPedId()) - local isInMarker, currentZone = false, nil - - for k,v in pairs(Config.Zones) do - for i=1, #v.Locations, 1 do - if #(coords - v.Locations[i]) < Config.Size.x then - Sleep = 0 - isInMarker, ShopItems, currentZone, LastZone = true, v.Items, k, k - end - end - end - if isInMarker and not HasAlreadyEnteredMarker then - HasAlreadyEnteredMarker = true - TriggerEvent('esx_weaponshop:hasEnteredMarker', currentZone) - end - - if not isInMarker and HasAlreadyEnteredMarker then - HasAlreadyEnteredMarker = false - TriggerEvent('esx_weaponshop:hasExitedMarker', LastZone) - end - Wait(Sleep) - end -end) - --- Key Controls -CreateThread(function() - while CurrentAction do - Wait(0) - ESX.ShowHelpNotification(CurrentActionMsg) - - if IsControlJustReleased(0, 38) then - - if CurrentAction == 'shop_menu' then - if Config.LicenseEnable and Config.Zones[CurrentActionData.zone].Legal then - ESX.TriggerServerCallback('esx_license:checkLicense', function(hasWeaponLicense) - if hasWeaponLicense then - OpenShopMenu(CurrentActionData.zone) - else - OpenBuyLicenseMenu(CurrentActionData.zone) - end - end, GetPlayerServerId(PlayerId()), 'weapon') - else - OpenShopMenu(CurrentActionData.zone) + else + if ShopOpen then + ESX.UI.Menu.CloseAll() + ShopOpen = false end end - - CurrentAction = nil end + end + Wait(Sleep) end end) From 65213f2c1668f37e572600f696d02ce76df2f0be Mon Sep 17 00:00:00 2001 From: iSentrie Date: Sun, 27 Mar 2022 14:33:43 +0300 Subject: [PATCH 100/132] Fixed loop --- [esx_addons]/esx_lscustom/client/main.lua | 29 ++++++++++++----------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/[esx_addons]/esx_lscustom/client/main.lua b/[esx_addons]/esx_lscustom/client/main.lua index c23fe574..765463c2 100644 --- a/[esx_addons]/esx_lscustom/client/main.lua +++ b/[esx_addons]/esx_lscustom/client/main.lua @@ -391,6 +391,21 @@ CreateThread(function() ESX.UI.Menu.CloseAll() GetAction({value = 'main'}) + + -- Prevent Free Tunning Bug + CreateThread(function() + while lsMenuIsShowed do + DisableControlAction(2, 288, true) + DisableControlAction(2, 289, true) + DisableControlAction(2, 170, true) + DisableControlAction(2, 167, true) + DisableControlAction(2, 168, true) + DisableControlAction(2, 23, true) + DisableControlAction(0, 75, true) -- Disable exit vehicle + DisableControlAction(27, 75, true) -- Disable exit vehicle + Wait(0) + end + end) end end end @@ -399,17 +414,3 @@ CreateThread(function() Wait(Sleep) end end) - --- Prevent Free Tunning Bug -CreateThread(function() - while lsMenuIsShowed do - DisableControlAction(2, 288, true) - DisableControlAction(2, 289, true) - DisableControlAction(2, 170, true) - DisableControlAction(2, 167, true) - DisableControlAction(2, 168, true) - DisableControlAction(2, 23, true) - DisableControlAction(0, 75, true) -- Disable exit vehicle - DisableControlAction(27, 75, true) -- Disable exit vehicle - end -end) From a132299ebe35d20243e38e635342a00ecc5a5182 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Sun, 27 Mar 2022 15:00:12 +0100 Subject: [PATCH 101/132] Update Discord Link --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index ace393cd..4607d927 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -

ESX Legacy

Discord - Website - Documentation +

ESX Legacy

Discord - Website - Documentation **IMPORTANT**: ESX Legacy now supports ox Inventory. **HOWEVER, THIS SHOULD ONLY BE USED IF YOU ARE EXPERIENCED AND KNOW WHAT YOU ARE DOING**. From 4c4c53c0d2840f0ac869509dfbe82fd39cf7205a Mon Sep 17 00:00:00 2001 From: iSentrie Date: Sun, 27 Mar 2022 18:54:27 +0300 Subject: [PATCH 102/132] prop fixes --- [esx_addons]/esx_sit/config.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/[esx_addons]/esx_sit/config.lua b/[esx_addons]/esx_sit/config.lua index 45ff65b6..a00bc82c 100644 --- a/[esx_addons]/esx_sit/config.lua +++ b/[esx_addons]/esx_sit/config.lua @@ -12,7 +12,7 @@ Config.Interactables = { 'prop_bench_04', 'prop_bench_05', 'prop_bench_06', - 'prop_bench_05', + 'prop_bench_07', 'prop_bench_08', 'prop_bench_09', 'prop_bench_10', @@ -30,7 +30,7 @@ Config.Interactables = { 'prop_chair_04b', 'prop_chair_05', 'prop_chair_06', - 'prop_chair_05', + 'prop_chair_07', 'prop_chair_08', 'prop_chair_09', 'prop_chair_10', From fa0b5892ceca06d440851bfae8f0124121b66fb1 Mon Sep 17 00:00:00 2001 From: iSentrie Date: Sun, 27 Mar 2022 18:56:02 +0300 Subject: [PATCH 103/132] mistyped --- [esx_addons]/esx_sit/lists/seat.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[esx_addons]/esx_sit/lists/seat.lua b/[esx_addons]/esx_sit/lists/seat.lua index 6cb5df31..c54f51b2 100644 --- a/[esx_addons]/esx_sit/lists/seat.lua +++ b/[esx_addons]/esx_sit/lists/seat.lua @@ -32,7 +32,7 @@ Config.Sitable = { prop_chair_04b = { scenario = 'PROP_HUMAN_SEAT_BENCH', verticalOffset = -0.5, forwardOffset = 0.0, leftOffset = 0.0}, prop_chair_05 = { scenario = 'PROP_HUMAN_SEAT_BENCH', verticalOffset = -0.5, forwardOffset = 0.0, leftOffset = 0.0}, prop_chair_06 = { scenario = 'PROP_HUMAN_SEAT_BENCH', verticalOffset = -0.5, forwardOffset = 0.0, leftOffset = 0.0}, - prop_chair_057 = { scenario = 'PROP_HUMAN_SEAT_BENCH', verticalOffset = -0.5, forwardOffset = 0.0, leftOffset = 0.0}, + prop_chair_07 = { scenario = 'PROP_HUMAN_SEAT_BENCH', verticalOffset = -0.5, forwardOffset = 0.0, leftOffset = 0.0}, prop_chair_08 = { scenario = 'PROP_HUMAN_SEAT_BENCH', verticalOffset = -0.5, forwardOffset = 0.0, leftOffset = 0.0}, prop_chair_09 = { scenario = 'PROP_HUMAN_SEAT_BENCH', verticalOffset = -0.5, forwardOffset = 0.0, leftOffset = 0.0}, prop_chair_10 = { scenario = 'PROP_HUMAN_SEAT_BENCH', verticalOffset = -0.5, forwardOffset = 0.0, leftOffset = 0.0}, From 7cfa2035f1f31b4b895567eaeb01834d3fb33c4d Mon Sep 17 00:00:00 2001 From: Haroki Date: Mon, 28 Mar 2022 16:30:43 +0100 Subject: [PATCH 104/132] Bug Fix: Someone forgot do :) --- [esx_addons]/esx_weaponshop/server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[esx_addons]/esx_weaponshop/server/main.lua b/[esx_addons]/esx_weaponshop/server/main.lua index 75a7d5ca..969558ae 100644 --- a/[esx_addons]/esx_weaponshop/server/main.lua +++ b/[esx_addons]/esx_weaponshop/server/main.lua @@ -53,7 +53,7 @@ end) function GetPrice(weaponName, zone) local weapon = nil - for k,v in pairs(Config.Zones[zone].items) + for k,v in pairs(Config.Zones[zone].items) do if v.name == weaponName then weapon = v break From 89eb52f5f6dba8bba81238f07c439e0c164eb354 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Tue, 29 Mar 2022 16:30:38 +0100 Subject: [PATCH 105/132] Fix(esx_property): Fix Broken Loop --- [esx_addons]/esx_property/client/main.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/[esx_addons]/esx_property/client/main.lua b/[esx_addons]/esx_property/client/main.lua index 66f1df7d..185416bd 100644 --- a/[esx_addons]/esx_property/client/main.lua +++ b/[esx_addons]/esx_property/client/main.lua @@ -867,8 +867,10 @@ end) -- Key controls CreateThread(function() - while CurrentAction do - Wait(0) + while true do + local Sleep = 1500 + if CurrentAction then + Sleep = 0 ESX.ShowHelpNotification(CurrentActionMsg) if IsControlJustReleased(0, 38) then @@ -888,5 +890,6 @@ CreateThread(function() CurrentAction = nil end + Wait(Sleep) end end) From 1c945de12a8d51e8b56c3865c918df896592dba4 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Tue, 29 Mar 2022 16:34:55 +0100 Subject: [PATCH 106/132] Fix(esx_jobs):Fix Blips not showing --- [esx_addons]/esx_jobs/client/main.lua | 2 +- [esx_addons]/esx_jobs/fxmanifest.lua | 2 ++ [esx_addons]/esx_jobs/locales/en.lua | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/[esx_addons]/esx_jobs/client/main.lua b/[esx_addons]/esx_jobs/client/main.lua index 5ae6b9a3..5915ba6c 100644 --- a/[esx_addons]/esx_jobs/client/main.lua +++ b/[esx_addons]/esx_jobs/client/main.lua @@ -246,7 +246,7 @@ function refreshBlips() local blip = AddBlipForCoord(_Pos.x, _Pos.y, _Pos.z) SetBlipSprite (blip, jobValues.BlipInfos.Sprite) SetBlipDisplay (blip, 4) - SetBlipScale (blip, 0.0) + SetBlipScale (blip, 0.8) SetBlipCategory(blip, 3) SetBlipColour (blip, jobValues.BlipInfos.Color) SetBlipAsShortRange(blip, true) diff --git a/[esx_addons]/esx_jobs/fxmanifest.lua b/[esx_addons]/esx_jobs/fxmanifest.lua index 1ddcb7ee..92e3e7b0 100644 --- a/[esx_addons]/esx_jobs/fxmanifest.lua +++ b/[esx_addons]/esx_jobs/fxmanifest.lua @@ -19,6 +19,8 @@ server_scripts { } client_scripts { + '@es_extended/locale.lua', + 'locales/*.lua', 'client/main.lua' } diff --git a/[esx_addons]/esx_jobs/locales/en.lua b/[esx_addons]/esx_jobs/locales/en.lua index aaca224f..2bf8792e 100644 --- a/[esx_addons]/esx_jobs/locales/en.lua +++ b/[esx_addons]/esx_jobs/locales/en.lua @@ -112,4 +112,4 @@ Locales['en'] = { ['dd_clothing'] = 'clothing', ['dd_makeclothing'] = 'press ~INPUT_PICKUP~ to retrieve clothing.', ['dd_deliver_clothes'] = 'press ~INPUT_PICKUP~ to deliver the clothes.', - } +} From 08b26b2a49fdfbe363019ec6eb6f8975585641f2 Mon Sep 17 00:00:00 2001 From: RoadToSix <92928205+RoadPhone@users.noreply.github.com> Date: Fri, 1 Apr 2022 13:51:18 +0200 Subject: [PATCH 107/132] Refactor fxmanifest.lua --- [esx_addons]/esx_jobs/fxmanifest.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/[esx_addons]/esx_jobs/fxmanifest.lua b/[esx_addons]/esx_jobs/fxmanifest.lua index 92e3e7b0..c45248da 100644 --- a/[esx_addons]/esx_jobs/fxmanifest.lua +++ b/[esx_addons]/esx_jobs/fxmanifest.lua @@ -2,7 +2,7 @@ fx_version 'adamant' game 'gta5' -description 'ESX Job Listing' +description 'ESX Jobs' version '1.6.5' @@ -19,8 +19,6 @@ server_scripts { } client_scripts { - '@es_extended/locale.lua', - 'locales/*.lua', 'client/main.lua' } From c9a179f143f5dfd1cfce00bef3de0077ee736c2b Mon Sep 17 00:00:00 2001 From: Benzo <102178921+Benzo00@users.noreply.github.com> Date: Fri, 1 Apr 2022 14:28:24 +0200 Subject: [PATCH 108/132] Update main.lua --- [esx_addons]/esx_property/client/main.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/[esx_addons]/esx_property/client/main.lua b/[esx_addons]/esx_property/client/main.lua index 185416bd..6b831b9b 100644 --- a/[esx_addons]/esx_property/client/main.lua +++ b/[esx_addons]/esx_property/client/main.lua @@ -890,6 +890,7 @@ CreateThread(function() CurrentAction = nil end - Wait(Sleep) end + Wait(Sleep) +end end) From fddf5ac63b240906d2d84e393831cada80e8890a Mon Sep 17 00:00:00 2001 From: Benzo <102178921+Benzo00@users.noreply.github.com> Date: Sat, 2 Apr 2022 17:29:58 +0200 Subject: [PATCH 109/132] Update config.lua --- [esx_addons]/esx_shops/config.lua | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/[esx_addons]/esx_shops/config.lua b/[esx_addons]/esx_shops/config.lua index c5c86dce..4a3864f4 100644 --- a/[esx_addons]/esx_shops/config.lua +++ b/[esx_addons]/esx_shops/config.lua @@ -21,14 +21,14 @@ Config.Zones = { } }, Pos = { - vector3(373.8, 325.8, 102.5), - vector3(2557.4, 382.2, 107.6), - vector3(-3038.9, 585.9, 6.9), - vector3(-3241.9, 1001.4, 11.8), - vector3(547.4, 2671.7, 41.1), - vector3(1961.4, 3740.6, 31.3), - vector3(2678.9, 3280.6, 54.2), - vector3(1729.2, 6414.1, 34.0) + vector3(373.8, 325.8, 103.5), + vector3(2557.4, 382.2, 108.6), + vector3(-3038.9, 585.9, 7.9), + vector3(-3241.9, 1001.4, 12.8), + vector3(547.4, 2671.7, 42.1), + vector3(1961.4, 3740.6, 32.3), + vector3(2678.9, 3280.6, 55.2), + vector3(1729.2, 6414.1, 35.0) }, Size = 1.0, Type = 59, From 06905ea81d490fa8507f6091580eeda049c1108a Mon Sep 17 00:00:00 2001 From: Benzo <102178921+Benzo00@users.noreply.github.com> Date: Sat, 2 Apr 2022 17:34:47 +0200 Subject: [PATCH 110/132] Update config.lua --- [esx_addons]/esx_shops/config.lua | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/[esx_addons]/esx_shops/config.lua b/[esx_addons]/esx_shops/config.lua index 4a3864f4..616ce8d5 100644 --- a/[esx_addons]/esx_shops/config.lua +++ b/[esx_addons]/esx_shops/config.lua @@ -51,15 +51,15 @@ Config.Zones = { } }, Pos = { - vector3(1135.8, -982.2, 45.4), - vector3(-1222.9, -906.9, 11.3), - vector3(-1487.5, -379.1, 39.1), - vector3(-2968.2, 390.9, 14.0), - vector3(1166.0, 2708.9, 37.1), - vector3(1392.5, 3604.6, 33.9), - vector3(127.8, -1284.7, 28.2), --StripClub - vector3(-1393.4, -606.6, 29.3), --Tequila la - vector3(-559.9, 287.0, 81.1) --Bahamamas + vector3(1135.8, -982.2, 46.4), + vector3(-1222.9, -906.9, 12.3), + vector3(-1487.5, -379.1, 40.1), + vector3(-2968.2, 390.9, 15.0), + vector3(1166.0, 2708.9, 38.1), + vector3(1392.5, 3604.6, 34.9), + vector3(127.8, -1284.7, 29.2), --StripClub + vector3(-1393.4, -606.6, 30.3), --Tequila la + vector3(-559.9, 287.0, 82.1) --Bahamamas }, Size = 1.0, Type = 59, @@ -82,11 +82,11 @@ Config.Zones = { } }, Pos = { - vector3(-48.5, -1757.5, 28.4), - vector3(1163.3, -323.8, 68.2), - vector3(-707.5, -914.2, 18.2), - vector3(-1820.5, 792.5, 137.1), - vector3(1698.3, 4924.4, 41.0) + vector3(-48.5, -1757.5, 29.4), + vector3(1163.3, -323.8, 69.2), + vector3(-707.5, -914.2, 19.2), + vector3(-1820.5, 792.5, 138.1), + vector3(1698.3, 4924.4, 42.0) }, Size = 1.0, Type = 59, @@ -95,3 +95,4 @@ Config.Zones = { ShowMarker = true } } + From 96cd8c074dd6a3000b16086a0827c0efa8a69573 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Sat, 2 Apr 2022 21:19:35 +0100 Subject: [PATCH 111/132] Tweak(es_extended): Allow all weapons to work with ammo --- [esx]/es_extended/client/main.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/[esx]/es_extended/client/main.lua b/[esx]/es_extended/client/main.lua index 5faf26ba..b7465c4a 100644 --- a/[esx]/es_extended/client/main.lua +++ b/[esx]/es_extended/client/main.lua @@ -394,8 +394,8 @@ function StartServerSyncLoops() CreateThread(function() local currentWeapon = {Ammo = 0} while ESX.PlayerLoaded do - local sleep = 250 - if IsPedArmed(ESX.PlayerData.ped, 4) or IsPedArmed(ESX.PlayerData.ped, 2) then + local sleep = 300 + if GetSelectedPedWeapon(ESX.PlayerData.ped) ~= -1569615261 then sleep = 0 local _,weaponHash = GetCurrentPedWeapon(ESX.PlayerData.ped, true) local weapon = ESX.GetWeaponFromHash(weaponHash) From a3bccaa6d1d38827dece96316bd8d4ef66cf21f7 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Sat, 2 Apr 2022 21:26:28 +0100 Subject: [PATCH 112/132] Fix(es_extended): ammo saves when its more than previous --- [esx]/es_extended/server/classes/player.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/[esx]/es_extended/server/classes/player.lua b/[esx]/es_extended/server/classes/player.lua index 1243c6d1..c47dd6cb 100644 --- a/[esx]/es_extended/server/classes/player.lua +++ b/[esx]/es_extended/server/classes/player.lua @@ -445,9 +445,7 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, local loadoutNum, weapon = self.getWeapon(weaponName) if weapon then - if ammoCount < weapon.ammo then - weapon.ammo = ammoCount - end + weapon.ammo = ammoCount end end From 6fe249d1c44a7f1f232280147053dfeab8a96644 Mon Sep 17 00:00:00 2001 From: FantomasIsBad <102142635+FantomasIsBad@users.noreply.github.com> Date: Sun, 3 Apr 2022 19:44:03 +0200 Subject: [PATCH 113/132] Tweek: Update ESX.GetPlayers to ESX.GetExtendedPlayers --- [esx]/es_extended/server/commands.lua | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/[esx]/es_extended/server/commands.lua b/[esx]/es_extended/server/commands.lua index a6e9becf..17f6d8ea 100644 --- a/[esx]/es_extended/server/commands.lua +++ b/[esx]/es_extended/server/commands.lua @@ -212,10 +212,9 @@ ESX.RegisterCommand("noclip", 'admin', function(xPlayer, args, showError) end, false) ESX.RegisterCommand('players', "admin", function(xPlayer, args, showError) - local xAll = ESX.GetPlayers() - print("^5"..#xAll.." ^2online player(s)^0") - for i=1, #xAll, 1 do - local xPlayer = ESX.GetPlayerFromId(xAll[i]) + local xPlayers = ESX.GetExtendedPlayers() -- Returns all xPlayers + print("^5"..#xPlayers.." ^2online player(s)^0") + for _, xPlayer in pairs(xPlayers) do print("^1[ ^2ID : ^5"..xPlayer.source.." ^0| ^2Name : ^5"..xPlayer.getName().." ^0 | ^2Group : ^5"..xPlayer.getGroup().." ^0 | ^2Identifier : ^5".. xPlayer.identifier .."^1]^0\n") end end, true) From 2bf1d3859c62b6eca89df22bfee5f81e175360be Mon Sep 17 00:00:00 2001 From: Tinky <48660658+Tinky124@users.noreply.github.com> Date: Tue, 5 Apr 2022 15:52:59 +0100 Subject: [PATCH 114/132] Update config.lua --- [esx]/es_extended/config.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/[esx]/es_extended/config.lua b/[esx]/es_extended/config.lua index 6d9f4203..dafb3beb 100644 --- a/[esx]/es_extended/config.lua +++ b/[esx]/es_extended/config.lua @@ -20,3 +20,5 @@ Config.EnablePVP = true -- Allow Player to player combat Config.Multichar = false -- Enable support for esx_multicharacter Config.Identity = true -- Select a characters identity data before they have loaded in (this happens by default with multichar) + +Config.DistanceGive = 4.0 -- Max distance when giving items, weapons etc. From c8d167dcbf782b111ff2df3a9ac1d7e974149f81 Mon Sep 17 00:00:00 2001 From: Tinky <48660658+Tinky124@users.noreply.github.com> Date: Tue, 5 Apr 2022 15:53:03 +0100 Subject: [PATCH 115/132] Added Config.DistanceGive --- [esx]/es_extended/server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[esx]/es_extended/server/main.lua b/[esx]/es_extended/server/main.lua index f9ee2366..dd5801c4 100644 --- a/[esx]/es_extended/server/main.lua +++ b/[esx]/es_extended/server/main.lua @@ -363,7 +363,7 @@ if not Config.OxInventory then local distance = #(GetEntityCoords(GetPlayerPed(playerId)) - GetEntityCoords(GetPlayerPed(target))) if not sourceXPlayer then return end if not targetXPlayer then print("Cheating: " .. GetPlayerName(playerId)) return end - if distance > 4.0 then print("Cheating: " .. GetPlayerName(playerId)) return end + if distance > Config.DistanceGive then print("Cheating: " .. GetPlayerName(playerId)) return end if type == 'item_standard' then From 02cd3b9d5e4a60ce705045bef1b2f9fe1f05badf Mon Sep 17 00:00:00 2001 From: Mycroft Date: Wed, 6 Apr 2022 19:20:41 +0100 Subject: [PATCH 116/132] Tweak(esx_multicharacter/client): Change Backticks to GetHashKey --- [esx]/esx_multicharacter/client/main.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/[esx]/esx_multicharacter/client/main.lua b/[esx]/esx_multicharacter/client/main.lua index cb10ca8f..0a3595a3 100644 --- a/[esx]/esx_multicharacter/client/main.lua +++ b/[esx]/esx_multicharacter/client/main.lua @@ -102,7 +102,7 @@ if ESX.GetConfig().Multichar then y = Config.Spawn.y, z = Config.Spawn.z, heading = Config.Spawn.w, - model = Characters[index].model or `mp_m_freemode_01`, + model = Characters[index].model or GetHashKey("mp_m_freemode_01"), skipFade = true }, function() canRelog = false @@ -158,7 +158,7 @@ if ESX.GetConfig().Multichar then y = Config.Spawn.y, z = Config.Spawn.z, heading = Config.Spawn.w, - model = `mp_m_freemode_01`, + model = GetHashKey("mp_m_freemode_01"), skipFade = true }, function() canRelog = false @@ -173,7 +173,7 @@ if ESX.GetConfig().Multichar then else for k,v in pairs(Characters) do if not v.model and v.skin then - if v.skin.model then v.model = v.skin.model elseif v.skin.sex == 1 then v.model = `mp_f_freemode_01` else v.model = `mp_m_freemode_01` end + if v.skin.model then v.model = v.skin.model elseif v.skin.sex == 1 then v.model = GetHashKey("mp_m_freemode_01") else v.model = GetHashKey("mp_m_freemode_01") end end if spawned == false then SetupCharacter(Character) end local label = v.firstname..' '..v.lastname @@ -272,7 +272,7 @@ if ESX.GetConfig().Multichar then if isNew or not skin or #skin == 1 then local finished = false local sex = skin.sex or 0 - if sex == 0 then model = `mp_m_freemode_01` else model = `mp_f_freemode_01` end + if sex == 0 then model = GetHashKey("mp_m_freemode_01") else model = GetHashKey("mp_m_freemode_01") end RequestModel(model) while not HasModelLoaded(model) do RequestModel(model) From 9acf0b29d637b0b97c33a1151c550ee33a0457b6 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Wed, 6 Apr 2022 19:25:26 +0100 Subject: [PATCH 117/132] Tweak(esx_multicharacter): remove backticks that are messing with linter --- [esx]/esx_multicharacter/config.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[esx]/esx_multicharacter/config.lua b/[esx]/esx_multicharacter/config.lua index fe18b776..078a9c4b 100644 --- a/[esx]/esx_multicharacter/config.lua +++ b/[esx]/esx_multicharacter/config.lua @@ -19,7 +19,7 @@ if IsDuplicityVersion() then else -- Sets the location for the character selection scene - -- To set the spawn location for new characters, modify the default value in the `users` SQL table + -- To set the spawn location for new characters, modify the default value in the users SQL table Config.Spawn = vector4(-113.7, 565.3, 195.2, 0) -------------------- From ba09b5fc4a5199b68af197512881e84ea1b68cc5 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Wed, 6 Apr 2022 19:41:19 +0100 Subject: [PATCH 118/132] Refactor (esx_example (client &server )): Fix Formatting and add useful prints --- esx_example/client/main.lua | 3 ++- esx_example/server/main.lua | 14 +++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/esx_example/client/main.lua b/esx_example/client/main.lua index 6a5da8b3..fe995759 100644 --- a/esx_example/client/main.lua +++ b/esx_example/client/main.lua @@ -1,11 +1,12 @@ RegisterNetEvent('esx:playerLoaded') -- Store the players data AddEventHandler('esx:playerLoaded', function(xPlayer, isNew) + print("Player Loaded. New | " .. isNew) ESX.PlayerData = xPlayer ESX.PlayerLoaded = true end) RegisterNetEvent('esx:playerLogout') -- When a player logs out (multicharacter), reset their data -AddEventHandler('esx:playerLogout', function(xPlayer, isNew) +AddEventHandler('esx:playerLogout', function() ESX.PlayerLoaded = false ESX.PlayerData = {} end) diff --git a/esx_example/server/main.lua b/esx_example/server/main.lua index 8f8b56e8..7507adbb 100644 --- a/esx_example/server/main.lua +++ b/esx_example/server/main.lua @@ -4,16 +4,19 @@ CreateThread(function() end) RegisterNetEvent('esx:playerLoaded') -- When a player loads in, we can store some basic information about them locally -AddEventHandler('esx:playerLoaded', function(playerId, xPlayer, isNew) +AddEventHandler('esx:playerLoaded', function(playerId, xPlayer) + print("Player | ".. playerId .. "spawned in") ESX.Players[playerId] = xPlayer.job.name end) RegisterNetEvent('esx:setJob') -- The stored data does not sync with the framework unless we tell it to -AddEventHandler('esx:setJob', function(playerId, job, lastJob) +AddEventHandler('esx:setJob', function(playerId, job) + print("Player | ".. playerId .. " | Changed Job. Job |".. job.label) ESX.Players[playerId] = job.name end) AddEventHandler('esx:playerDropped', function(playerId, reason) -- Remove any cached data once the player no longer exists + print("Player | ".. PlayerId .. "Dropped. Reason | ".. reason) ESX.Players[playerId] = nil end) @@ -28,10 +31,11 @@ AddEventHandler('onResourceStart', function(resourceName) -- The resource just r end end) -ESX.RegisterCommand('get', 'user', function(xPlayer, args, showError) +ESX.RegisterCommand('get', 'user', function(xPlayer, args) + print("Player |".. xPlayer.source.. "| Fetching all users.") local xPlayers = ESX.GetExtendedPlayers(args.key, args.val) -- New hitchless xPlayer loop, with the ability to only return players with specific data - for _, xPlayer in pairs(xPlayers) do -- Job and any non-table variable will work, ie. name, group, identifier, source - print(xPlayer.source, xPlayer.job.grade_label, xPlayer.name) + for _, xTarget in pairs(xPlayers) do -- Job and any non-table variable will work, ie. name, group, identifier, source + print("^1[ ^2ID : ^5".. xTarget.source.." ^0| ^2Name : ^5"..xTarget.getName().." ^0 | ^Job : ^5".. xTarget.job.label .." ^0 | ^2Identifier : ^5".. xTarget.identifier .."^1]^0\n") end end, true, {help = 'Display all online players with specific player data', validate = false, arguments = { {name = 'key', help = 'Variable to check (ie. job)', type = 'string'}, From cd8bd9ece8bf51abec77479e1e521d308c5e25de Mon Sep 17 00:00:00 2001 From: Mycroft Date: Wed, 6 Apr 2022 19:45:10 +0100 Subject: [PATCH 119/132] Fix(esx_example/server): fix typo --- esx_example/server/main.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esx_example/server/main.lua b/esx_example/server/main.lua index 7507adbb..cc333502 100644 --- a/esx_example/server/main.lua +++ b/esx_example/server/main.lua @@ -16,7 +16,7 @@ AddEventHandler('esx:setJob', function(playerId, job) end) AddEventHandler('esx:playerDropped', function(playerId, reason) -- Remove any cached data once the player no longer exists - print("Player | ".. PlayerId .. "Dropped. Reason | ".. reason) + print("Player | ".. playerId .. "Dropped. Reason | ".. reason) ESX.Players[playerId] = nil end) @@ -35,7 +35,7 @@ ESX.RegisterCommand('get', 'user', function(xPlayer, args) print("Player |".. xPlayer.source.. "| Fetching all users.") local xPlayers = ESX.GetExtendedPlayers(args.key, args.val) -- New hitchless xPlayer loop, with the ability to only return players with specific data for _, xTarget in pairs(xPlayers) do -- Job and any non-table variable will work, ie. name, group, identifier, source - print("^1[ ^2ID : ^5".. xTarget.source.." ^0| ^2Name : ^5"..xTarget.getName().." ^0 | ^Job : ^5".. xTarget.job.label .." ^0 | ^2Identifier : ^5".. xTarget.identifier .."^1]^0\n") + print("ID - ".. xTarget.source.." | Name - "..xTarget.getName().." | Job - ".. xTarget.job.label) end end, true, {help = 'Display all online players with specific player data', validate = false, arguments = { {name = 'key', help = 'Variable to check (ie. job)', type = 'string'}, From 6e3006c5fc5bba89950018821fd8aa82e1813c09 Mon Sep 17 00:00:00 2001 From: Mycroft Date: Wed, 6 Apr 2022 19:50:57 +0100 Subject: [PATCH 120/132] tweak(instance/server): change` k,v in pairs` to` for i` --- [esx_addons]/instance/server/main.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/[esx_addons]/instance/server/main.lua b/[esx_addons]/instance/server/main.lua index 3f51be44..7accbc07 100644 --- a/[esx_addons]/instance/server/main.lua +++ b/[esx_addons]/instance/server/main.lua @@ -3,16 +3,16 @@ local instances = {} function GetInstancedPlayers() local players = {} - for k,v in pairs(instances) do - for k2,v2 in ipairs(v.players) do - players[v2] = true + for i = 1, #(instances) do + for player = 1, #(instances[i].players) do + players[instances[i].players[player]] = true end end return players end -AddEventHandler('playerDropped', function(reason) +AddEventHandler('playerDropped', function() if instances[source] then CloseInstance(source) end From a81d9abd3263073e4f6fb6e21432b4918c8488fe Mon Sep 17 00:00:00 2001 From: Unslaught <102593774+unslaught@users.noreply.github.com> Date: Thu, 7 Apr 2022 22:28:12 +0200 Subject: [PATCH 121/132] Add files via upload nl language --- [esx_addons]/esx_jobs/locales/nl.lua | 117 +++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 [esx_addons]/esx_jobs/locales/nl.lua diff --git a/[esx_addons]/esx_jobs/locales/nl.lua b/[esx_addons]/esx_jobs/locales/nl.lua new file mode 100644 index 00000000..099c99d1 --- /dev/null +++ b/[esx_addons]/esx_jobs/locales/nl.lua @@ -0,0 +1,117 @@ +Locales['nl'] = { + -- Global menus + ['cloakroom'] = 'Kleedkamer', + ['cloak_change'] = 'Druk op ~INPUT_PICKUP~ om je werkkleding aan/uit te doen.', + ['citizen_wear'] = 'Burgerkleding', + ['job_wear'] = 'Werkkleding', + ['bank_deposit_returned'] = 'a security deposit of ~g~$%s~s~ was returned to you.', + ['bank_deposit_taken'] = 'a security deposit of ~r~$%s~s~ was taken from you.', + ['foot_work'] = 'Je moet uit een voertuig zijn om te werken', + ['next_point'] = 'Ga naar de volgende stap zodra je klaar bent met deze.', + ['not_your_vehicle'] = 'Dit is niet jou voertuig of je moet de bestuurder zijn.', + ['in_vehicle'] = 'Je moet in een voertuig zitten', + ['wrong_point'] = 'Je bent bij het verkeerde afleverpunt', + ['max_limit'] = 'Je hebt al het maximale ~y~%s~s~ bij je', + ['not_enough'] = 'Je hebt niet genoeg ~y~%s~s~ om het werk te voltooien', + ['spawn_veh'] = 'Pak werkvoertuig', + ['spawn_veh_button'] = 'Druk op ~INPUT_PICKUP~ om je werkvoertuig op te roepen', + ['spawn_truck_button'] = 'Druk op ~INPUT_PICKUP~ om een vrachtwagen te pakken', + ['spawn_blocked'] = 'Een voertuig blokkerd het spawnpoint!', + ['service_vh'] = 'service voertuig', + ['return_vh'] = 'Voertuig terug zetten', + ['return_vh_button'] = 'Druk op ~INPUT_PICKUP~ om het voertuig terug te zetten', + ['delivery_point'] = 'Afleverpunt', + ['delivery'] = 'Afleveren', + ['public_enter'] = 'Druk op ~INPUT_PICKUP~ om het gebouw te betreden', + ['public_leave'] = 'Druk op ~INPUT_PICKUP~ om het gebouw te verlaten', + + -- Lumber Jack job + ['lj_locker_room'] = 'Houthakker kleedkamer', + ['lj_mapblip'] = 'Houthandel', + ['lj_wood'] = 'Hout', + ['lj_pickup'] = 'Druk op ~INPUT_PICKUP~ om hout op te halen', + ['lj_cutwood'] = 'Het hout word gezaagd', + ['lj_cutwood_button'] = 'Druk op ~INPUT_PICKUP~ om het hout te zagen', + ['lj_board'] = 'Plaken', + ['lj_planks'] = 'pakket met planken', + ['lj_cutwood'] = 'hout zagen', + ['lj_pick_boards'] = 'Druk op ~INPUT_PICKUP~ om hout te zagen', + ['lj_deliver_button'] = 'Druk op ~INPUT_PICKUP~ om het hout te leveren', + + -- Fisherman + ['fm_fish_locker'] = 'Vissers kleedkamer', + ['fm_fish'] = 'Vis', + ['fm_fish_area'] = 'Vis gebied', + ['fm_fish_button'] = 'Druk op ~INPUT_PICKUP~ om te beginnen met vissen', + ['fm_spawnboat_title'] = 'Pak een vissersboot', + ['fm_spawnboat'] = 'Druk op ~INPUT_PICKUP~ om de boot op te roepen', + ['fm_boat_title'] = 'boot', + ['fm_boat_return_title'] = 'Boot terugzetten', + ['fm_boat_return_button'] = 'Druk op ~INPUT_PICKUP~ om de boot terug te zetten', + ['fm_deliver_fish'] = 'Druk op ~INPUT_PICKUP~ om de vis af te leveren', + + -- Fuel + ['f_oil_refiner'] = 'Olie transporteur kleedkamer', + ['f_drill_oil'] = 'Olieboor', + ['f_fuel'] = 'Olie', + ['f_drillbutton'] = 'Druk op ~INPUT_PICKUP~ om te beginnen met olie boren', + ['f_fuel_refine'] = 'olie raffineren', + ['f_refine_fuel_button'] = 'Druk op ~INPUT_PICKUP~ om te raffineren', + ['f_fuel_mixture'] = 'mix geraffineerde olie', + ['f_gas'] = 'Brandstof', + ['f_fuel_mixture_button'] = 'Druk op ~INPUT_PICKUP~ om olie te mixen', + ['f_deliver_gas'] = 'Brandstof afleveren', + ['f_deliver_gas_button'] = 'Druk op ~INPUT_PICKUP~ om de brandstof af te leveren', + ['caution_afford'] = 'Je hebt onvoldoende Geld opzak om een voertuig te leasen!', + + -- Miner + ['m_miner_locker'] = 'Kleedkamer', + ['m_rock'] = 'Metaal erts', + ['m_pickrocks'] = 'Druk op ~INPUT_PICKUP~ om erts te verzamelen', + ['m_washrock'] = 'erts verwerken', + ['m_rock_button'] = 'Druk op ~INPUT_PICKUP~ om de erts te verwerken', + ['m_rock_smelting'] = 'erts omsmelten', + ['m_copper'] = 'Koper', + ['m_sell_copper'] = 'Koper verkopen', + ['m_deliver_copper'] = 'druk op ~INPUT_PICKUP~ om Koper te verkopen', + ['m_iron'] = 'Aluminium', + ['m_sell_iron'] = 'Aluminium verkoop', + ['m_deliver_iron'] = 'Drup op ~INPUT_PICKUP~ om Aluminium te verkopen', + ['m_gold'] = 'Goud', + ['m_sell_gold'] = 'Goud verkopen', + ['m_deliver_gold'] = 'Druk op ~INPUT_PICKUP~ om Goud te verkopen', + ['m_diamond'] = 'Diamant', + ['m_sell_diamond'] = 'Diamanten verkopen', + ['m_deliver_diamond'] = 'Druk op ~INPUT_PICKUP~ om Diamant te verkopen', + ['m_melt_button'] = 'Druk op ~INPUT_PICKUP~ om de erts om te smelten', + + -- Reporter + ['reporter_locker'] = 'Kleedkamer', + ['reporter_name'] = 'OmroepZeeland', + ['reporter_garage'] = 'Druk op ~INPUT_PICKUP~ om nara de garage te gaan', + + -- Slaughterer + ['s_slaughter_locker'] = 'Kûppen kleedkamer', + ['s_hen'] = 'Kûppenhok', + ['s_alive_chicken'] = 'Levende Kûppen', + ['s_catch_hen'] = 'Druk op ~INPUT_PICKUP~ om levende Kûppen te vangen', + ['s_slaughtered_chicken'] = 'Kûppen om te verpakken', + ['s_chop_animal'] = 'Druk op ~INPUT_PICKUP~ om de Kûppen te slachten', + ['s_slaughtered'] = 'Slachthuis', + ['s_package'] = 'verpakken', + ['s_packagechicken'] = 'krat met Kûpfilet', + ['s_unpackaged'] = 'Kûppen om te verpakken', + ['s_unpackaged_button'] = 'Druk op ~INPUT_PICKUP~ om de Kûpfilet in de krat te doen', + ['s_deliver'] = 'Druk op ~INPUT_PICKUP~ om de kratten met Kûppen af te leveren', + + -- Dress Designer + ['dd_dress_locker'] = 'kleding ontwerper kleedkamer', + ['dd_wool'] = 'wol', + ['dd_pickup'] = 'Druk op ~INPUT_PICKUP~ om schapenwol te verzamelen', + ['dd_fabric'] = 'kleding stof', + ['dd_makefabric'] = 'Druk op ~INPUT_PICKUP~ om van wol kleding stof te maken', + ['dd_clothing'] = 'Kleding', + ['dd_makeclothing'] = 'Druk op ~INPUT_PICKUP~ om kleding te maken', + ['dd_deliver_clothes'] = 'Druk op ~INPUT_PICKUP~ om kleding af te leveren', +} + \ No newline at end of file From 64633b7ff92957f43b946c2962f882fe1ce9118c Mon Sep 17 00:00:00 2001 From: Unslaught <102593774+unslaught@users.noreply.github.com> Date: Thu, 7 Apr 2022 22:33:17 +0200 Subject: [PATCH 122/132] added dutch language added dutch translation --- [esx_addons]/esx_accessories/locales/nl.lua | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 [esx_addons]/esx_accessories/locales/nl.lua diff --git a/[esx_addons]/esx_accessories/locales/nl.lua b/[esx_addons]/esx_accessories/locales/nl.lua new file mode 100644 index 00000000..4567594a --- /dev/null +++ b/[esx_addons]/esx_accessories/locales/nl.lua @@ -0,0 +1,19 @@ +Locales ['nl'] = { + ['valid_purchase'] = 'kopen?', + ['yes'] = 'ja ($%s)', + ['no'] = 'nee', + ['helmet'] = 'Helm / Hoed', + ['glasses'] = 'Brillen', + ['mask'] = 'Masker', + ['ears'] = 'Oor accessories', + ['shop'] = '%s Winkel', + ['set_unset'] = 'Doe aan / doe uit', + ['not_enough_money'] = 'Je hebt niet genoeg geld', + ['press_access'] = 'Druk op ~INPUT_CONTEXT~ om het menu te openen', + ['accessories_blip'] = 'Accessories', + ['no_ears'] = 'Je hebt geen oor accessories', + ['no_glasses'] = 'je hebt geen brillen', + ['no_helmet'] = 'je hebt geen helm', + ['no_mask'] = 'je hebt geen masker', + ['you_paid'] = 'je betaalde ~g~$%s~s~', +} From e34f9e1663e41874bfd967327d8840f4dbe37d9c Mon Sep 17 00:00:00 2001 From: Unslaught <102593774+unslaught@users.noreply.github.com> Date: Thu, 7 Apr 2022 22:34:59 +0200 Subject: [PATCH 123/132] Dutch Translations Added Dutch translations --- [esx_addons]/esx_atm/locales/nl.lua | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 [esx_addons]/esx_atm/locales/nl.lua diff --git a/[esx_addons]/esx_atm/locales/nl.lua b/[esx_addons]/esx_atm/locales/nl.lua new file mode 100644 index 00000000..0adcdc13 --- /dev/null +++ b/[esx_addons]/esx_atm/locales/nl.lua @@ -0,0 +1,7 @@ +Locales['nl'] = { + ['invalid_amount'] = '~r~Ongeldige hoeveelheid geld~s~', + ['deposit_money'] = '~g~€%s~s~ Gestort', + ['withdraw_money'] = '~g~€%s~s~ Opgenomen', + ['press_e_atm'] = 'Druk op ~INPUT_PICKUP~ om op te nemen of te storten ~g~PIN~s~', + ['atm_blip'] = 'PIN', +} From af9c4c560fdff8ed858b9f64c3f2fad46535a0da Mon Sep 17 00:00:00 2001 From: Unslaught <102593774+unslaught@users.noreply.github.com> Date: Thu, 7 Apr 2022 22:36:08 +0200 Subject: [PATCH 124/132] Dutch Translation Added Dutch translation --- [esx_addons]/esx_bankerjob/locales/nl.lua | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 [esx_addons]/esx_bankerjob/locales/nl.lua diff --git a/[esx_addons]/esx_bankerjob/locales/nl.lua b/[esx_addons]/esx_bankerjob/locales/nl.lua new file mode 100644 index 00000000..79f92a03 --- /dev/null +++ b/[esx_addons]/esx_bankerjob/locales/nl.lua @@ -0,0 +1,18 @@ +Locales['nl'] = { + ['actions'] = 'acties', + ['amount'] = 'bedrag', + ['balance'] = 'saldo', + ['bank'] = 'bank', + ['bill_amount'] = 'rekening bedrag', + ['billing'] = 'rekeningen', + ['customer'] = 'klant', + ['customers'] = 'klanten', + ['deposit'] = 'storten', + ['invalid_amount'] = 'ongedig bedrag', + ['no_player_nearby'] = 'geen speler in de omgeving', + ['press_input_context_to_open_menu'] = 'druk op ~INPUT_CONTEXT~ om het ~g~Bank Menu~s~te openen.', + ['withdraw'] = 'opnemen', + ['boss_actions'] = 'baas acties', + ['phone_receive'] = 'bank klant', + ['phone_label'] = 'bank', +} From 6683f2e6b423c4729afb33300e937df6a3aefe7d Mon Sep 17 00:00:00 2001 From: Unslaught <102593774+unslaught@users.noreply.github.com> Date: Thu, 7 Apr 2022 22:44:53 +0200 Subject: [PATCH 125/132] feat(dutch language translation for esx_boat) Additional Translation for esx_boat --- [esx_addons]/esx_boat/locales/nl.lua | 31 ++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 [esx_addons]/esx_boat/locales/nl.lua diff --git a/[esx_addons]/esx_boat/locales/nl.lua b/[esx_addons]/esx_boat/locales/nl.lua new file mode 100644 index 00000000..69935cfb --- /dev/null +++ b/[esx_addons]/esx_boat/locales/nl.lua @@ -0,0 +1,31 @@ +Locales['nl'] = { + -- shop + ['boat_shop'] = 'boten winkel', + ['boat_shop_open'] = 'Druk op ~INPUT_CONTEXT~ tom de ~y~boten winkel~s~te openen.', + ['boat_shop_confirm'] = 'Koop %s voor €%s?', + ['boat_shop_bought'] = 'Je hebt een ~y~gekocht~s~een ~b~%s~s~ voor ~g~€%s~s~', + ['boat_shop_nomoney'] = 'Deze boot kan je niet betalen!', + ['confirm_no'] = 'nee', + ['confirm_yes'] = 'ja', + + -- garage + ['garage'] = 'boten garage', + ['garage_open'] = 'Druk op ~INPUT_CONTEXT~ om je ~y~boten garage~s~te openen.', + ['garage_store'] = 'Druk op ~INPUT_CONTEXT~ om je boot op te slaan.', + ['garage_taken'] = 'de boot staat klaar!', + ['garage_stored'] = 'de boot is opgeslagen in je garage!', + ['garage_noboats'] = 'je hebt geen opgeslagen boten! Ga naar de ~y~boten winkel~s~ om er een te kopen.', + ['garage_blocked'] = 'de boot kan er niet uit omdat iets het spawnpunt blokkeerd!', + ['garage_notowner'] = 'je bent geen eigenaar van deze boot!', + + -- license + ['license_menu'] = 'Koop Vaarbewijs?', + ['license_buy_no'] = 'nee', + ['license_buy_yes'] = 'Koop vaarbewijs €%s', + ['license_bought'] = 'je kocht het ~y~Vaar Bewijs~s~ voor ~g~€%s~s~', + ['license_nomoney'] = 'je kan het ~y~Vaar Bewijs~s~niet betalen! ', + + -- blips + ['blip_garage'] = 'boten garage', + ['blip_shop'] = 'boten winkel', +} From c370d4851cfbc712843e03fbe8cc08551dcc5b75 Mon Sep 17 00:00:00 2001 From: TheDiego845 <69425536+TheDiego845@users.noreply.github.com> Date: Sat, 9 Apr 2022 20:55:50 +0200 Subject: [PATCH 126/132] HTML and Questions in Spanish for dmvscool --- .../esx_dmvschool/html/questions_es.js | 91 ++++++++++++++ [esx_addons]/esx_dmvschool/html/ui_es.html | 119 ++++++++++++++++++ 2 files changed, 210 insertions(+) create mode 100644 [esx_addons]/esx_dmvschool/html/questions_es.js create mode 100644 [esx_addons]/esx_dmvschool/html/ui_es.html diff --git a/[esx_addons]/esx_dmvschool/html/questions_es.js b/[esx_addons]/esx_dmvschool/html/questions_es.js new file mode 100644 index 00000000..efd70570 --- /dev/null +++ b/[esx_addons]/esx_dmvschool/html/questions_es.js @@ -0,0 +1,91 @@ +var tableauQuestion = [ + { + question: "Si vas a 80 km / h, y te aproximas a una zona residencial, debes:", + propositionA: "Acelerar", + propositionB: "Mantienes tu velocidad, si no pasas otros vehículos.", + propositionC: "Frenas", + propositionD: "Mantienes la velocidad", + reponse: "C" + }, + + { + question: "Si está girando a la derecha en un semáforo, pero ve un cruce de peatones, ¿qué hace?", + propositionA: "Pasas del peaton", + propositionB: "Comprueba que no hay otros vehículos alrededor.", + propositionC: "Esperas hasta que el peatón haya cruzado.", + propositionD: "Disparas al peatón y sigues conduciendo.", + reponse: "C" + }, + + { + question: "Sin ninguna indicación previa, la velocidad en una zona residencial es de: __ km / h", + propositionA: "30 km/h", + propositionB: "50 km/h", + propositionC: "40 km/h", + propositionD: "60 km/h", + reponse: "B" + }, + + { + question: "Antes de cada cambio de carril debe:", + propositionA: "Mirar por los espejos", + propositionB: "Comprobar los puntos muertos del vehiculo", + propositionC: "Señalizar tu intención de girar", + propositionD: "Todas las anteriores", + reponse: "D" + }, + + { + question: "¿Qué nivel de alcohol en la sangre se clasifica como conducir bajo los efectos del alcohol?", + propositionA: "0,5", + propositionB: "0,1", + propositionC: "0,8", + propositionD: "0,0", + reponse: "C" + }, + + { + question: "¿Cuándo puedes continuar conduciendo en un semáforo?", + propositionA: "Cuando esta verde", + propositionB: "Cuando no esta cruzando nadie", + propositionC: "Cuando estas en una zona de colegio", + propositionD: "Cuando estas entre un 60 u 80 km/h", + reponse: "A" + }, + + { + question: "Un peatón tiene una señal de no cruzar, ¿qué haces?", + propositionA: "Le dejas cruzar", + propositionB: "Te quedas mirandolo", + propositionC: "Le dices que cruce para que lo puedas atropellar", + propositionD: "Continuas porque tu señal de tráfico esta en verde", + reponse: "D" + }, + + { + question: "¿Que esta permitido cuando adelantas a otro vehículo?", + propositionA: "Lo sigues de cerca para pasarlo más rápido.", + propositionB: "Lo adelantas por la acera si es necesario.", + propositionC: "Conduce por el lado opuesto de la carretera para adelantarlo.", + propositionD: "Lo adelantas rapido", + reponse: "C" + }, + + { + question: "Usted está conduciendo en una carretera que indica una velocidad máxima de 120 km / h. Pero la mayoría de los conductores conducen a 125 km / h, por lo que no debe conducir más rápido que:", + propositionA: "120 km/h", + propositionB: "125 km/h", + propositionC: "130 km/h", + propositionD: "110 km/h", + reponse: "A" + }, + + { + question: "Cuando es superado por otro vehículo, es importante NO:", + propositionA: "Seguir con la misma velocidad", + propositionB: "Comprobar los espejos", + propositionC: "Mirar a otros conductores", + propositionD: "Aumentar la velocidad", + reponse: "D" + }, +] diff --git a/[esx_addons]/esx_dmvschool/html/ui_es.html b/[esx_addons]/esx_dmvschool/html/ui_es.html new file mode 100644 index 00000000..ce2cf51c --- /dev/null +++ b/[esx_addons]/esx_dmvschool/html/ui_es.html @@ -0,0 +1,119 @@ + + + + + + +

+
+ +
+

Escuela de Conducción

+
+ +
+
+ +
+ +
+

Bienvenido a la Escuela de Conducción +

+
+
Todos los ciudadanos de la ciudad deben aprobar su examen antes de poder conducir. +
Tómese su tiempo, responda con sentido común y no conteste al azar. +
+
Examen teórico +
- La prueba teórica cuesta $ 200, esto no se reembolsa si falla la prueba. +
- No tenga miedo, la escuela de conducción acepta crédito, pero tenga cuidado de no entrar en deuda. +
- Si falla la prueba la primera vez, no puede volver a tomarla de inmediato, tendrá que realizarla más adelante. +
+
Examen de Conducir +
- La prueba de conducir cuesta $500, al igual que la prueba de la teoría, este pago no se devolverá si fallas. +
- ¡Asegúrate de estar alerta mientras conduces y de evitar accidentes!

+
+
+
+ Empezar +
+
+

Progreso

+ +
+
+ +
+
+

+

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+

Progreso

+ +
+
+ +
+
+
+

¡Buen trabajo!

+
+
Lo hiciste bien durante el examen. +
+
Puede cerrar esta ventana y tomar la prueba de conducción. +
+
+
+ Cerrar +
+
+

Progress

+ +
+
+
+
+
+

Has fallado

+
+
No estabas listo para esta prueba, inténtalo de nuevo más tarde ... +
+
+
+
+
+ Cerrar +
+
+

Progress

+ +
+
+
+
+ + + + + + + \ No newline at end of file From f06193c99b640b112233db21f0941f400336a788 Mon Sep 17 00:00:00 2001 From: TheDiego845 <69425536+TheDiego845@users.noreply.github.com> Date: Sat, 9 Apr 2022 21:00:00 +0200 Subject: [PATCH 127/132] Fixed some ES words --- [esx_addons]/esx_vehicleshop/locales/es.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/[esx_addons]/esx_vehicleshop/locales/es.lua b/[esx_addons]/esx_vehicleshop/locales/es.lua index 7b4b8f7f..4e69fdc1 100644 --- a/[esx_addons]/esx_vehicleshop/locales/es.lua +++ b/[esx_addons]/esx_vehicleshop/locales/es.lua @@ -1,13 +1,13 @@ Locales['es'] = { -- global menus - ['not_enough_in_society'] = 'No hay mas de ese item en la socieda!', + ['not_enough_in_society'] = 'No hay mas de ese item en la sociedad!', ['player_cannot_hold'] = '~r~no~s~ tienes ~y~suficiente espacio~s~ en tu inventario!', - ['vehicle_belongs'] = 'a vehicle with plate ~y~%s~s~ now belongs to ~b~you~s~', + ['vehicle_belongs'] = 'un vehiculo con matricula ~y~%s~s~ ahora es ~b~tuyo~s~', ['broke_company'] = 'No hay dinero en la compañía', ['license_missing'] = 'no tenes licencia de conducir!', ['buy_vehicle_shop'] = 'queres comprar %s por $%s?', ['buy_vehicle'] = 'comprar vehiculo', - ['car_dealer'] = 'Vendedor de autosship', + ['car_dealer'] = 'Concesionario', ['shop_awaiting_model'] = 'El vehiculo esta cargando, por favor espera', ['create_bill'] = 'crear factura', ['dealer_boss'] = 'Vendedor de autos - Boss', @@ -37,7 +37,7 @@ Locales['es'] = { ['generic_shopitem'] = '$%s', ['vehicle_dealer'] = 'Vehiculo - Vendedor de autos', ['vehicle_menu'] = 'Presiona ~INPUT_CONTEXT~ to give back the rented vehicle', - ['vehicle_purchased'] = 'you bought a vehicle', + ['vehicle_purchased'] = 'has comprado un vehiculo', ['vehicle_set_owned'] = 'el vehiculo ~y~%s~s~ fue asignado a ~b~%s~s~', ['vehicle_set_rented'] = 'el vehiculo ~y~%s~s~ fue rentado a ~b~%s~s~', ['vehicle_sold_for'] = 'el ~b~%s~s~ fue ~y~vendido~s~ por ~g~$%s~s~', From 59179dfdbeaccc80518668db7ee769bfce3ca55a Mon Sep 17 00:00:00 2001 From: TheDiego845 <69425536+TheDiego845@users.noreply.github.com> Date: Sat, 9 Apr 2022 21:01:29 +0200 Subject: [PATCH 128/132] Update es.lua --- [esx_addons]/esx_vehicleshop/locales/es.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[esx_addons]/esx_vehicleshop/locales/es.lua b/[esx_addons]/esx_vehicleshop/locales/es.lua index 4e69fdc1..cfc01aff 100644 --- a/[esx_addons]/esx_vehicleshop/locales/es.lua +++ b/[esx_addons]/esx_vehicleshop/locales/es.lua @@ -29,7 +29,7 @@ Locales['es'] = { ['pop_vehicle'] = 'Poner vehiculo a la venta', ['rent_vehicle'] = 'Vendedor de autos - Vehiculos para rentar', ['return_provider_menu'] = 'Vendedor de autos - Devolver a proveedor', - ['rental_amount'] = 'rental amount', + ['rental_amount'] = 'Cantidad de renta', ['sell_menu'] = 'Presiona ~INPUT_CONTEXT~ para vender tu ~y~%s~s~ por ~g~$%s~s~', ['set_vehicle_owner_rent'] = 'Alquilar vehiculo', ['set_vehicle_owner_sell'] = 'Vender vehiculo', From 664f1c41c4060b6b932a5d8c29ac0242b4a868b9 Mon Sep 17 00:00:00 2001 From: manutrix Date: Mon, 11 Apr 2022 12:47:39 -0400 Subject: [PATCH 129/132] Add esx_shops.sql. This table is being used in esx_optionalneeds but never created --- [esx_addons]/esx_shops/esx_shops.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 [esx_addons]/esx_shops/esx_shops.sql diff --git a/[esx_addons]/esx_shops/esx_shops.sql b/[esx_addons]/esx_shops/esx_shops.sql new file mode 100644 index 00000000..891ef747 --- /dev/null +++ b/[esx_addons]/esx_shops/esx_shops.sql @@ -0,0 +1,10 @@ +USE `es_extended`; + +CREATE TABLE `shops` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `store` varchar(100) NOT NULL, + `item` varchar(100) NOT NULL, + `price` int(11) NOT NULL, + + PRIMARY KEY (`id`) +); \ No newline at end of file From 3415b4c33162e25b5b35326f56fe60723a74508b Mon Sep 17 00:00:00 2001 From: Esplike <66953319+Esplike@users.noreply.github.com> Date: Mon, 11 Apr 2022 20:06:51 +0100 Subject: [PATCH 130/132] fix(esx_phone/html/ui.html): Default lang 'en'. Nothing crazy but the default language for the phone will be in English... --- [esx_addons]/esx_phone/html/ui.html | 30 ++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/[esx_addons]/esx_phone/html/ui.html b/[esx_addons]/esx_phone/html/ui.html index d958ac00..c02e423b 100644 --- a/[esx_addons]/esx_phone/html/ui.html +++ b/[esx_addons]/esx_phone/html/ui.html @@ -19,20 +19,20 @@
- Répertoire + Contacts
-

Aucun contact

+

No contacts

@@ -45,7 +45,7 @@
-

Aucun message

+

No messages

@@ -57,23 +57,23 @@
- - - - + + + +
-
Ajouter - un contact
+
Add a + contact
- - - - + + + +
@@ -87,4 +87,4 @@ - \ No newline at end of file + From 8c529f742d3674de7c76254b6853690c59ae71c1 Mon Sep 17 00:00:00 2001 From: Esplike <66953319+Esplike@users.noreply.github.com> Date: Mon, 11 Apr 2022 20:11:14 +0100 Subject: [PATCH 131/132] fix(esx_phone/html/ui_es.html): Moved HTML folder Moved the ui_es.html into the html folder... --- [esx_addons]/esx_phone/html/ui_es.html | 87 ++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 [esx_addons]/esx_phone/html/ui_es.html diff --git a/[esx_addons]/esx_phone/html/ui_es.html b/[esx_addons]/esx_phone/html/ui_es.html new file mode 100644 index 00000000..9b730801 --- /dev/null +++ b/[esx_addons]/esx_phone/html/ui_es.html @@ -0,0 +1,87 @@ + + + + + + + + + + +
+ +
+ +
+ + unknown +
+ + + +
+ +
Contactos
+
+
+
+

No hay contactos

+
+
+
+
+ +
+
Mensajes + +
+
+
+
+

No hay mensajes

+
+
+
+
+ +
+
+
+
+ + + + + +
+
+
+ +
+
Añadir contacto
+
+
+ + + + +
+
+
+ +
+
+ + + + + + + + From 99a9692529a373ab027e6eb91d0e50d52acbcd22 Mon Sep 17 00:00:00 2001 From: Esplike <66953319+Esplike@users.noreply.github.com> Date: Mon, 11 Apr 2022 20:11:24 +0100 Subject: [PATCH 132/132] Delete ui_es.html --- [esx_addons]/esx_phone/ui_es.html | 87 ------------------------------- 1 file changed, 87 deletions(-) delete mode 100644 [esx_addons]/esx_phone/ui_es.html diff --git a/[esx_addons]/esx_phone/ui_es.html b/[esx_addons]/esx_phone/ui_es.html deleted file mode 100644 index 9b730801..00000000 --- a/[esx_addons]/esx_phone/ui_es.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - -
- -
- -
- - unknown -
- - - -
- -
Contactos
-
-
-
-

No hay contactos

-
-
-
-
- -
-
Mensajes - -
-
-
-
-

No hay mensajes

-
-
-
-
- -
-
-
-
- - - - - -
-
-
- -
-
Añadir contacto
-
-
- - - - -
-
-
- -
-
- - - - - - - -