From a92852298cf44a611f8c2a2b2ee6827b17b8d9fc Mon Sep 17 00:00:00 2001 From: zykem#0643 <86602828+Zykem@users.noreply.github.com> Date: Mon, 21 Jul 2025 01:27:03 +0200 Subject: [PATCH 01/12] Add Config Value and logic inside core / player class --- [core]/es_extended/server/classes/player.lua | 4 ++-- [core]/es_extended/server/functions.lua | 5 +++-- [core]/es_extended/shared/config/main.lua | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index 31e8f578..64516d22 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -52,10 +52,10 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, if Config.Multichar then local startIndex = identifier:find(":", 1) if startIndex then - self.license = ("license%s"):format(identifier:sub(startIndex, identifier:len())) + self.license = ("%s%s"):format(Config.Identifier, identifier:sub(startIndex, identifier:len())) end else - self.license = ("license:%s"):format(identifier) + self.license = ("%s:%s"):format(Config.Identifier, identifier) end if type(self.metadata.jobDuty) ~= "boolean" then diff --git a/[core]/es_extended/server/functions.lua b/[core]/es_extended/server/functions.lua index 633d5b95..77db980a 100644 --- a/[core]/es_extended/server/functions.lua +++ b/[core]/es_extended/server/functions.lua @@ -380,8 +380,9 @@ function ESX.GetIdentifier(playerId) playerId = tostring(playerId) - local identifier = GetPlayerIdentifierByType(playerId, "license") - return identifier and identifier:gsub("license:", "") + local identifierType = Config.Identifier + local identifier = GetPlayerIdentifierByType(playerId, identifierType) + return identifier and identifier:gsub(("%s:"):format(identifierType), "") end ---@param model string|number diff --git a/[core]/es_extended/shared/config/main.lua b/[core]/es_extended/shared/config/main.lua index 8932e30c..ef6bc288 100644 --- a/[core]/es_extended/shared/config/main.lua +++ b/[core]/es_extended/shared/config/main.lua @@ -72,3 +72,4 @@ if GetResourceState("ox_inventory") ~= "missing" then end Config.EnableDefaultInventory = Config.CustomInventory == false -- Display the default Inventory ( F2 ) +Config.Identifier = GetConvar("esx:identifier", "license") \ No newline at end of file From 38d4b089bfb61fc2d4d569fa4de4bcf085ad77a2 Mon Sep 17 00:00:00 2001 From: zykem#0643 <86602828+Zykem@users.noreply.github.com> Date: Mon, 21 Jul 2025 01:27:24 +0200 Subject: [PATCH 02/12] Remove Server:GetIdentifier --- [core]/esx_multicharacter/server/modules/functions.lua | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/[core]/esx_multicharacter/server/modules/functions.lua b/[core]/esx_multicharacter/server/modules/functions.lua index 69975e54..2808412f 100644 --- a/[core]/esx_multicharacter/server/modules/functions.lua +++ b/[core]/esx_multicharacter/server/modules/functions.lua @@ -1,15 +1,5 @@ ESX.Players = {} -function Server:GetIdentifier(source) - local fxDk = GetConvarInt("sv_fxdkMode", 0) - if fxDk == 1 then - return "ESX-DEBUG-LICENCE" - end - - local identifier = GetPlayerIdentifierByType(source, self.identifierType) - return identifier and identifier:gsub(self.identifierType .. ":", "") -end - function Server:ResetPlayers() if next(ESX.Players) then local players = table.clone(ESX.Players) From 3a63fb9771332677e3522f9c3bf88fbc8c9f62b9 Mon Sep 17 00:00:00 2001 From: zykem#0643 <86602828+Zykem@users.noreply.github.com> Date: Mon, 21 Jul 2025 01:29:31 +0200 Subject: [PATCH 03/12] Replace Server:GetIdentifier with ESX.GetIdentifier --- [core]/esx_multicharacter/server/modules/database.lua | 2 +- [core]/esx_multicharacter/server/modules/functions.lua | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/[core]/esx_multicharacter/server/modules/database.lua b/[core]/esx_multicharacter/server/modules/database.lua index 4bf4ee33..6a148e09 100644 --- a/[core]/esx_multicharacter/server/modules/database.lua +++ b/[core]/esx_multicharacter/server/modules/database.lua @@ -73,7 +73,7 @@ MySQL.ready(function() end) function Database:DeleteCharacter(source, charid) - local identifier = ("%s%s:%s"):format(Server.prefix, charid, Server:GetIdentifier(source)) + local identifier = ("%s%s:%s"):format(Server.prefix, charid, ESX.GetIdentifier(source)) local query = "DELETE FROM `%s` WHERE %s = ?" local queries = {} local count = 0 diff --git a/[core]/esx_multicharacter/server/modules/functions.lua b/[core]/esx_multicharacter/server/modules/functions.lua index 2808412f..4e0b260f 100644 --- a/[core]/esx_multicharacter/server/modules/functions.lua +++ b/[core]/esx_multicharacter/server/modules/functions.lua @@ -6,7 +6,7 @@ function Server:ResetPlayers() table.wipe(ESX.Players) for _, v in pairs(players) do - ESX.Players[self:GetIdentifier(v.source)] = v.identifier + ESX.Players[ESX.GetIdentifier(v.source)] = v.identifier end else ESX.Players = {} @@ -16,7 +16,7 @@ end function Server:OnConnecting(source, deferrals) deferrals.defer() Wait(0) -- Required - local identifier = self:GetIdentifier(source) + local identifier = ESX.GetIdentifier(source) -- luacheck: ignore if not SetEntityOrphanMode then From 7417454478d814edf80ad8d31ed8996b4467eb38 Mon Sep 17 00:00:00 2001 From: zykem#0643 <86602828+Zykem@users.noreply.github.com> Date: Mon, 21 Jul 2025 01:29:47 +0200 Subject: [PATCH 04/12] Use key argument for ESX.GetConfig --- [core]/esx_multicharacter/server/main.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[core]/esx_multicharacter/server/main.lua b/[core]/esx_multicharacter/server/main.lua index 0418e173..32e6410b 100644 --- a/[core]/esx_multicharacter/server/main.lua +++ b/[core]/esx_multicharacter/server/main.lua @@ -4,7 +4,7 @@ Server._index = Server Server.oneSync = GetConvar("onesync", "off") Server.slots = Config.Slots or 4 Server.prefix = Config.Prefix or "char" -Server.identifierType = ESX.GetConfig().Identifier or GetConvar("sv_lan", "") == "true" and "ip" or "license" +Server.identifierType = ESX.GetConfig("Identifier") or GetConvar("sv_lan", "") == "true" and "ip" or "license" AddEventHandler("playerConnecting", function(_, _, deferrals) local source = source From 25b5a3d7a1a39f4b230bf668af1046b8c1ed78a2 Mon Sep 17 00:00:00 2001 From: zykem <86602828+Zykem@users.noreply.github.com> Date: Sat, 26 Jul 2025 19:32:24 +0200 Subject: [PATCH 05/12] Make return type optional in GetIdentifier --- [core]/es_extended/server/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[core]/es_extended/server/functions.lua b/[core]/es_extended/server/functions.lua index 77db980a..b6a25a29 100644 --- a/[core]/es_extended/server/functions.lua +++ b/[core]/es_extended/server/functions.lua @@ -371,7 +371,7 @@ function ESX.IsPlayerLoaded(source) end ---@param playerId number | string ----@return string +---@return string? function ESX.GetIdentifier(playerId) local fxDk = GetConvarInt("sv_fxdkMode", 0) if fxDk == 1 then From e315272e48feaa104774d331109dbb882504d32e Mon Sep 17 00:00:00 2001 From: zykem <86602828+Zykem@users.noreply.github.com> Date: Sat, 26 Jul 2025 19:36:11 +0200 Subject: [PATCH 06/12] Validate player identifier in DeleteCharacter function --- [core]/esx_multicharacter/server/modules/database.lua | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/[core]/esx_multicharacter/server/modules/database.lua b/[core]/esx_multicharacter/server/modules/database.lua index 6a148e09..bc4ba941 100644 --- a/[core]/esx_multicharacter/server/modules/database.lua +++ b/[core]/esx_multicharacter/server/modules/database.lua @@ -73,7 +73,14 @@ MySQL.ready(function() end) function Database:DeleteCharacter(source, charid) - local identifier = ("%s%s:%s"):format(Server.prefix, charid, ESX.GetIdentifier(source)) + local playerIdentifier = ESX.GetIdentifier(source) + if not playerIdentifier then + local name = GetPlayerName(source) or "Unknown" + print(("[^1ERROR^7] Failed to delete character for ^5%s %s^7: invalid or missing identifier"):format(name, source)) + return + end + + local identifier = ("%s%s:%s"):format(Server.prefix, charid, playerIdentifier) local query = "DELETE FROM `%s` WHERE %s = ?" local queries = {} local count = 0 @@ -141,4 +148,4 @@ function Database:DisableSlot(identifier, slot) return updated > 0 end -Database:GetConnection() \ No newline at end of file +Database:GetConnection() From 36a69f2c81e0ff2ce9d404de2d96964ad0d641ef Mon Sep 17 00:00:00 2001 From: zykem <86602828+Zykem@users.noreply.github.com> Date: Sat, 26 Jul 2025 19:38:19 +0200 Subject: [PATCH 07/12] Validate player identifier in ResetPlayers function --- [core]/esx_multicharacter/server/modules/functions.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/[core]/esx_multicharacter/server/modules/functions.lua b/[core]/esx_multicharacter/server/modules/functions.lua index 4e0b260f..66e10597 100644 --- a/[core]/esx_multicharacter/server/modules/functions.lua +++ b/[core]/esx_multicharacter/server/modules/functions.lua @@ -6,7 +6,10 @@ function Server:ResetPlayers() table.wipe(ESX.Players) for _, v in pairs(players) do - ESX.Players[ESX.GetIdentifier(v.source)] = v.identifier + local identifier = ESX.GetIdentifier(v.source) + if identifier then + ESX.Players[identifier] = v.identifier + end end else ESX.Players = {} From d9becc9cb48ea5eca0596157ee7877451daa0348 Mon Sep 17 00:00:00 2001 From: zykem <86602828+Zykem@users.noreply.github.com> Date: Sat, 26 Jul 2025 19:44:28 +0200 Subject: [PATCH 08/12] Update functions.lua --- [core]/esx_multicharacter/server/modules/functions.lua | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/[core]/esx_multicharacter/server/modules/functions.lua b/[core]/esx_multicharacter/server/modules/functions.lua index 66e10597..4e0b260f 100644 --- a/[core]/esx_multicharacter/server/modules/functions.lua +++ b/[core]/esx_multicharacter/server/modules/functions.lua @@ -6,10 +6,7 @@ function Server:ResetPlayers() table.wipe(ESX.Players) for _, v in pairs(players) do - local identifier = ESX.GetIdentifier(v.source) - if identifier then - ESX.Players[identifier] = v.identifier - end + ESX.Players[ESX.GetIdentifier(v.source)] = v.identifier end else ESX.Players = {} From 83835b4ec1b1ebecfa591d1101e3026fcee6e2d1 Mon Sep 17 00:00:00 2001 From: zykem <86602828+Zykem@users.noreply.github.com> Date: Sat, 26 Jul 2025 19:45:01 +0200 Subject: [PATCH 09/12] Update database.lua --- [core]/esx_multicharacter/server/modules/database.lua | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/[core]/esx_multicharacter/server/modules/database.lua b/[core]/esx_multicharacter/server/modules/database.lua index bc4ba941..b7f2768f 100644 --- a/[core]/esx_multicharacter/server/modules/database.lua +++ b/[core]/esx_multicharacter/server/modules/database.lua @@ -73,14 +73,7 @@ MySQL.ready(function() end) function Database:DeleteCharacter(source, charid) - local playerIdentifier = ESX.GetIdentifier(source) - if not playerIdentifier then - local name = GetPlayerName(source) or "Unknown" - print(("[^1ERROR^7] Failed to delete character for ^5%s %s^7: invalid or missing identifier"):format(name, source)) - return - end - - local identifier = ("%s%s:%s"):format(Server.prefix, charid, playerIdentifier) + local identifier = ("%s%s:%s"):format(Server.prefix, charid, ESX.GetIdentifier(source)) local query = "DELETE FROM `%s` WHERE %s = ?" local queries = {} local count = 0 From afcce2d1a93ddb96e9e943dd7dc84fba8d39e960 Mon Sep 17 00:00:00 2001 From: zykem <86602828+Zykem@users.noreply.github.com> Date: Sat, 26 Jul 2025 19:45:26 +0200 Subject: [PATCH 10/12] Update multicharacter.lua --- [core]/esx_multicharacter/server/modules/multicharacter.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/[core]/esx_multicharacter/server/modules/multicharacter.lua b/[core]/esx_multicharacter/server/modules/multicharacter.lua index 8c95be93..ac4005b8 100644 --- a/[core]/esx_multicharacter/server/modules/multicharacter.lua +++ b/[core]/esx_multicharacter/server/modules/multicharacter.lua @@ -10,7 +10,7 @@ function Multicharacter:SetupCharacters(source) Wait(100) end - local identifier = Server:GetIdentifier(source) + local identifier = ESX.GetIdentifier(source) ESX.Players[identifier] = source local slots = Database:GetPlayerSlots(identifier) From c5aee6b78d38df4d0ab01622e0df19b81c3c702f Mon Sep 17 00:00:00 2001 From: zykem <86602828+Zykem@users.noreply.github.com> Date: Sat, 26 Jul 2025 19:46:55 +0200 Subject: [PATCH 11/12] Validate identifier --- [core]/es_extended/server/functions.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/[core]/es_extended/server/functions.lua b/[core]/es_extended/server/functions.lua index b6a25a29..7ed694cd 100644 --- a/[core]/es_extended/server/functions.lua +++ b/[core]/es_extended/server/functions.lua @@ -371,7 +371,7 @@ function ESX.IsPlayerLoaded(source) end ---@param playerId number | string ----@return string? +---@return string function ESX.GetIdentifier(playerId) local fxDk = GetConvarInt("sv_fxdkMode", 0) if fxDk == 1 then @@ -382,7 +382,10 @@ function ESX.GetIdentifier(playerId) local identifierType = Config.Identifier local identifier = GetPlayerIdentifierByType(playerId, identifierType) - return identifier and identifier:gsub(("%s:"):format(identifierType), "") + + assert(identifier, ("[ESX] GetIdentifier failed: no identifier found for playerId %s with type '%s'"):format(playerId, identifierType)) + + return identifier:gsub(("%s:"):format(identifierType), "") end ---@param model string|number From 9d11780816a2c70f9e5b7bcc16c38abb6949f51a Mon Sep 17 00:00:00 2001 From: zykem <86602828+Zykem@users.noreply.github.com> Date: Sat, 26 Jul 2025 20:24:53 +0200 Subject: [PATCH 12/12] Update multicharacter.lua --- .../esx_multicharacter/server/modules/multicharacter.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/[core]/esx_multicharacter/server/modules/multicharacter.lua b/[core]/esx_multicharacter/server/modules/multicharacter.lua index ac4005b8..91d8d839 100644 --- a/[core]/esx_multicharacter/server/modules/multicharacter.lua +++ b/[core]/esx_multicharacter/server/modules/multicharacter.lua @@ -70,7 +70,7 @@ function Multicharacter:CharacterChosen(source, charid, isNew) else SetPlayerRoutingBucket(source, 0) if not ESX.GetConfig().EnableDebug then - local identifier = ("%s%s:%s"):format(Server.prefix, charid, Server:GetIdentifier(source)) + local identifier = ("%s%s:%s"):format(Server.prefix, charid, ESX.GetIdentifier(source)) if ESX.GetPlayerFromIdentifier(identifier) then DropPlayer(source, "[ESX Multicharacter] Your identifier " .. identifier .. " is already on the server!") @@ -80,7 +80,7 @@ function Multicharacter:CharacterChosen(source, charid, isNew) local charIdentifier = ("%s%s"):format(Server.prefix, charid) TriggerEvent("esx:onPlayerJoined", source, charIdentifier) - ESX.Players[Server:GetIdentifier(source)] = charIdentifier + ESX.Players[ESX.GetIdentifier(source)] = charIdentifier end end @@ -88,7 +88,7 @@ function Multicharacter:RegistrationComplete(source, data) local charId = self.awaitingRegistration[source] local charIdentifier = ("%s%s"):format(Server.prefix, charId) self.awaitingRegistration[source] = nil - ESX.Players[Server:GetIdentifier(source)] = charIdentifier + ESX.Players[ESX.GetIdentifier(source)] = charIdentifier SetPlayerRoutingBucket(source, 0) TriggerEvent("esx:onPlayerJoined", source, charIdentifier, data) @@ -96,5 +96,5 @@ end function Multicharacter:PlayerDropped(player) self.awaitingRegistration[player] = nil - ESX.Players[Server:GetIdentifier(player)] = nil + ESX.Players[ESX.GetIdentifier(player)] = nil end