From 5d3f2884dc7c29066593aef4dc92ec55f91ca252 Mon Sep 17 00:00:00 2001 From: Linden Date: Mon, 17 May 2021 01:21:11 +1000 Subject: [PATCH] Begin rebranding (refactor+rewrite) - Kashacters events renamed - Update MySQL.Async queries to modern standards and remove string concatenation - Rewrote `GetPlayerCharacters` to only use relevant information --- client/main.lua | 31 ++++++++-------- config.lua | 2 +- fxmanifest.lua | 9 +++-- html/js/app.js | 4 +-- server/main.lua | 94 +++++++++++++++++++++---------------------------- 5 files changed, 62 insertions(+), 78 deletions(-) diff --git a/client/main.lua b/client/main.lua index 6a72ab0a..518058c5 100644 --- a/client/main.lua +++ b/client/main.lua @@ -2,15 +2,12 @@ ESX = exports['es_extended']:getSharedObject() if ESX.GetConfig().Multichar then local IsChoosing = true - -- This Code Was changed to fix error With player spawner as default -- - -- Link to the post with the error fix -- - -- https://forum.fivem.net/t/release-esx-kashacters-multi-character/251613/316?u=xxfri3ndlyxx -- CreateThread(function() while true do Wait(0) if NetworkIsPlayerActive(PlayerId()) and not ESX.IsPlayerLoaded() then - TriggerServerEvent("kashactersS:SetupCharacters") - TriggerEvent("kashactersC:SetupCharacters") + TriggerServerEvent("esx_multicharacter:SetupCharacters") + TriggerEvent("esx_multicharacter:SetupCharacters") break end end @@ -24,8 +21,8 @@ if ESX.GetConfig().Multichar then local cam, cam2 = nil, nil - RegisterNetEvent('kashactersC:SetupCharacters') - AddEventHandler('kashactersC:SetupCharacters', function() + RegisterNetEvent('esx_multicharacter:SetupCharacters') + AddEventHandler('esx_multicharacter:SetupCharacters', function() ESX.UI.HUD.SetDisplay(0.0) DisplayHud(false) DisplayRadar(false) @@ -42,8 +39,8 @@ if ESX.GetConfig().Multichar then RenderScriptCams(true, false, 1, true, true) end) - RegisterNetEvent('kashactersC:SetupUI') - AddEventHandler('kashactersC:SetupUI', function(Characters) + RegisterNetEvent('esx_multicharacter:SetupUI') + AddEventHandler('esx_multicharacter:SetupUI', function(Characters) DoScreenFadeIn(500) Citizen.Wait(500) SetNuiFocus(true, true) @@ -53,8 +50,8 @@ if ESX.GetConfig().Multichar then }) end) - RegisterNetEvent('kashactersC:SpawnCharacter') - AddEventHandler('kashactersC:SpawnCharacter', function(spawn, isNew, skin) + RegisterNetEvent('esx_multicharacter:SpawnCharacter') + AddEventHandler('esx_multicharacter:SpawnCharacter', function(spawn, isNew, skin) local pos = spawn SetTimecycleModifier('default') @@ -110,16 +107,16 @@ if ESX.GetConfig().Multichar then end) end) - RegisterNetEvent('kashactersC:ReloadCharacters') - AddEventHandler('kashactersC:ReloadCharacters', function() - TriggerServerEvent("kashactersS:SetupCharacters") - TriggerEvent("kashactersC:SetupCharacters") + RegisterNetEvent('esx_multicharacter:ReloadCharacters') + AddEventHandler('esx_multicharacter:ReloadCharacters', function() + TriggerServerEvent("esx_multicharacter:SetupCharacters") + TriggerEvent("esx_multicharacter:SetupCharacters") end) RegisterNUICallback("CharacterChosen", function(data, cb) SetNuiFocus(false,false) DoScreenFadeOut(500) - TriggerServerEvent('kashactersS:CharacterChosen', data.charid, data.ischar) + TriggerServerEvent('esx_multicharacter:CharacterChosen', data.charid, data.ischar) if not data.ischar then TriggerEvent('esx_identity:showRegisterIdentity') end while not IsScreenFadedOut() do Citizen.Wait(10) @@ -130,7 +127,7 @@ if ESX.GetConfig().Multichar then RegisterNUICallback("DeleteCharacter", function(data, cb) SetNuiFocus(false,false) DoScreenFadeOut(500) - TriggerServerEvent('kashactersS:DeleteCharacter', data.charid) + TriggerServerEvent('esx_multicharacter:DeleteCharacter', data.charid) while not IsScreenFadedOut() do Citizen.Wait(10) end diff --git a/config.lua b/config.lua index bb79ddf5..182c2d9b 100644 --- a/config.lua +++ b/config.lua @@ -1,3 +1,3 @@ Config = {} -Config.databaseName = "es_extended" \ No newline at end of file +Config.databaseName = 'es_extended' \ No newline at end of file diff --git a/fxmanifest.lua b/fxmanifest.lua index c7393b21..9cdcda5b 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -3,14 +3,13 @@ fx_version 'adamant' game 'gta5' server_scripts { - "@mysql-async/lib/MySQL.lua", - "config.lua", - "server/main.lua", + '@mysql-async/lib/MySQL.lua', + 'config.lua', + 'server/main.lua', } client_scripts { - "config.lua", - "client/main.lua", + 'client/main.lua', } ui_page { diff --git a/html/js/app.js b/html/js/app.js index 5c8de03f..40c608e5 100644 --- a/html/js/app.js +++ b/html/js/app.js @@ -40,7 +40,7 @@ $(".character-box").click(function () { $("#play-char").click(function () { - $.post("http://esx_kashacters/CharacterChosen", JSON.stringify({ + $.post("http://esx_multicharacter/CharacterChosen", JSON.stringify({ charid: Number($('.active-char').attr("data-charid")), ischar: ($('.active-char').attr("data-ischar") == "true"), })); @@ -48,7 +48,7 @@ $("#play-char").click(function () { }); $("#deletechar").click(function () { - $.post("http://esx_kashacters/DeleteCharacter", JSON.stringify({ + $.post("http://esx_multicharacter/DeleteCharacter", JSON.stringify({ charid: Number($('.active-char').attr("data-charid")), })); Kashacter.CloseUI(); diff --git a/server/main.lua b/server/main.lua index 889bc125..fa16df17 100644 --- a/server/main.lua +++ b/server/main.lua @@ -7,7 +7,6 @@ if ESX.GetConfig().Multichar then MySQL.ready(function () MySQL.Async.fetchAll('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = @id AND TABLE_SCHEMA = @db', { ['@id'] = "owner", ["@db"] = Config.databaseName}, function(result) if result then - --print(json.encode(result)) for k, v in pairs(result) do table.insert( IdentifierTables, {table = v.TABLE_NAME, column = "owner"}) end @@ -15,29 +14,50 @@ if ESX.GetConfig().Multichar then end) MySQL.Async.fetchAll('SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = @id AND TABLE_SCHEMA = @db', { ['@id'] = "identifier", ["@db"] = Config.databaseName}, function(result) if result then - --print(json.encode(result)) for k, v in pairs(result) do table.insert( IdentifierTables, {table = v.TABLE_NAME, column = "identifier"}) end end end) end) - Citizen.Wait(1000) + Citizen.Wait(500) ESX.Jobs = exports['es_extended']:getSharedObject().Jobs end) end GetTables() - RegisterServerEvent("kashactersS:SetupCharacters") - AddEventHandler('kashactersS:SetupCharacters', function() - local src = source - local Characters = GetPlayerCharacters(src) - TriggerClientEvent('kashactersC:SetupUI', src, Characters) + RegisterServerEvent("esx_multicharacter:SetupCharacters") + AddEventHandler('esx_multicharacter:SetupCharacters', function() + local playerId = source + local identifier = 'char%:'..ESX.GetIdentifier(playerId) + MySQL.Async.fetchAll("SELECT `identifier`, `accounts`, `job`, `job_grade`, `firstname`, `lastname`, `dateofbirth`, `sex` FROM `users` WHERE `identifier` LIKE @identifier", { + ['@identifier'] = identifier + }, function(result) + local characters = {} + for i=1, #result, 1 do + local job = ESX.Jobs[result[i].job] + local grade = ESX.Jobs[job.name].grades[tostring(result[i].job_grade)].label + local accounts = json.decode(result[i].accounts) + if grade == 'Unemployed' then grade = '' end + characters[i] = { + bank = accounts.bank, + money = accounts.money, + job = job.label, + job_grade = grade, + firstname = result[i].firstname, + lastname = result[i].lastname, + dateofbirth = result[i].dateofbirth, + identifier = result[i].identifier + } + if result[i].sex == 'm' then characters[i].sex = 'Male' else characters[i].sex = 'Female' end + end + TriggerClientEvent('esx_multicharacter:SetupUI', playerId, characters) + end) end) - RegisterServerEvent("kashactersS:CharacterChosen") - AddEventHandler('kashactersS:CharacterChosen', function(charid, ischar) + RegisterServerEvent("esx_multicharacter:CharacterChosen") + AddEventHandler('esx_multicharacter:CharacterChosen', function(charid, ischar) local src = source local isNew = true if ischar then isNew = false end @@ -49,57 +69,25 @@ if ESX.GetConfig().Multichar then end end) - RegisterServerEvent("kashactersS:DeleteCharacter") - AddEventHandler('kashactersS:DeleteCharacter', function(charid) + RegisterServerEvent("esx_multicharacter:DeleteCharacter") + AddEventHandler('esx_multicharacter:DeleteCharacter', function(charid) local src = source if type(charid) == "number" and string.len(charid) == 1 then - DeleteCharacter(ESX.GetIdentifier(src), charid) - TriggerClientEvent("kashactersC:ReloadCharacters", src) + DeleteCharacter(src, charid) + TriggerClientEvent("esx_multicharacter:ReloadCharacters", src) else -- Trigger Ban Event here to ban individuals trying to use SQL Injections end end) - function GetPlayerCharacters(source) - local Chars = MySQLAsyncExecute("SELECT * FROM `users` WHERE `identifier` LIKE 'char%:"..ESX.GetIdentifier(source).."'") - for i = 1, #Chars, 1 do - local charJob = ESX.Jobs[Chars[i].job] - local charGrade = ESX.Jobs[Chars[i].job].grades[tostring(Chars[i].job_grade)] - local accounts = json.decode(Chars[i].accounts) - Chars[i].bank = accounts["bank"] - Chars[i].money = accounts["money"] - Chars[i].job = charJob.label - if charJob.label == "Unemployed" then - Chars[i].job_grade = "" - else - Chars[i].job_grade = charGrade.label - end - if Chars[i].sex == "m" then - Chars[i].sex = "Male" - else - Chars[i].sex = "Female" - end - end - return Chars - end - - function DeleteCharacter(identifier, charid) - local identifier = 'char'..charid..':'..identifier + function DeleteCharacter(playerId, charid) + local identifier = 'char'..charid..':'..ESX.GetIdentifier(playerId) for _, itable in pairs(IdentifierTables) do - MySQLAsyncExecute("DELETE FROM `"..itable.table.."` WHERE `"..itable.column.."` = '"..identifier.."'") + MySQL.Async.fetchAll("DELETE FROM @table WHERE @column = @identifier", { + ['@table'] = itable.table, + ['@column'] = itable.column, + ['@identifier'] = identifier + }) end end - - function MySQLAsyncExecute(query) - local IsBusy = true - local result = nil - MySQL.Async.fetchAll(query, {}, function(data) - result = data - IsBusy = false - end) - while IsBusy do - Citizen.Wait(0) - end - return result - end end