From c0783422ffaa04b84263d5492dfe6d2c467321e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=20Gerg=C5=91?= Date: Tue, 21 Feb 2023 23:18:05 +0100 Subject: [PATCH 01/11] feat: esx:updatePlayerData --- [core]/es_extended/client/main.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/[core]/es_extended/client/main.lua b/[core]/es_extended/client/main.lua index 4dfff72c..78034770 100644 --- a/[core]/es_extended/client/main.lua +++ b/[core]/es_extended/client/main.lua @@ -646,3 +646,8 @@ for i = 1, #DoNotUse do print("[^1ERROR^7] YOU ARE USING A RESOURCE THAT WILL BREAK ^1ESX^7, PLEASE REMOVE ^5" .. DoNotUse[i] .. "^7") end end + +RegisterNetEvent('esx:updatePlayerData', function(key, val) + if GetInvokingResource() ~= 'es_extended' then return end + ESX.SetPlayerData(key, val) +end) \ No newline at end of file From 5a5d4bbe093744c575488fb6211f0530cb252762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=20Gerg=C5=91?= Date: Tue, 21 Feb 2023 23:20:05 +0100 Subject: [PATCH 02/11] feat: Metadata --- [core]/es_extended/server/classes/player.lua | 65 +++++++++++++++++++- [core]/es_extended/server/functions.lua | 8 ++- [core]/es_extended/server/main.lua | 19 ++++-- 3 files changed, 82 insertions(+), 10 deletions(-) diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index d02757e0..5a8bf3f8 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -4,7 +4,7 @@ local DoesEntityExist = DoesEntityExist local GetEntityCoords = GetEntityCoords local GetEntityHeading = GetEntityHeading -function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, weight, job, loadout, name, coords) +function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, weight, job, loadout, name, coords, meta) local targetOverrides = Config.PlayerFunctionOverride and Core.PlayerFunctionOverrides[Config.PlayerFunctionOverride] or {} local self = {} @@ -22,6 +22,7 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, self.variables = {} self.weight = weight self.maxWeight = Config.MaxWeight + self.meta = meta if Config.Multichar then self.license = 'license'.. identifier:sub(identifier:find(':'), identifier:len()) else self.license = 'license:'..identifier end ExecuteCommand(('add_principal identifier.%s group.%s'):format(self.license, self.group)) @@ -573,6 +574,68 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, self.triggerEvent('esx:showHelpNotification', msg, thisFrame, beep, duration) end + function self.getMeta(index) + if index then + if self.meta[index] then + return self.meta[index] + else + return print(("[^1ERROR^7] xPlayer.getMeta ^5%s^7 not exist!"):format(index)) + end + end + + return self.meta + end + + function self.setMeta(index, value) + if not index then + return print(("[^1ERROR^7] xPlayer.setMeta ^5%s^7 is Missing!"):format(index)) + end + + if type(index) == 'table' then + for key, val in pairs(index) do + self.setMeta(key, val) + end + + return + end + + if not value then + return print(("[^1ERROR^7] xPlayer.setMeta ^5%s^7 is Missing!"):format(value)) + end + + local _type = type(value) + + if _type ~= "number" and _type ~= "string" and _type ~= "table" then + return print("[^1ERROR^7] xPlayer.setMeta ^5value^7 should be ^5number^7 or ^5string^7 or ^5table^7!") + end + + self.meta[index] = value + self.triggerEvent('esx:updatePlayerData', 'meta', self.meta) + Player(self.source).state:set('meta', self.meta, true) + end + + function self.clearMeta(index) + if not index then + return print(("[^1ERROR^7] xPlayer.clearMeta ^5%s^7 is Missing!"):format(index)) + end + + if type(index) == 'table' then + for _, val in pairs(index) do + self.clearMeta(val) + end + + return + end + + if not self.meta[index] then + return print(("[^1ERROR^7] xPlayer.clearMeta ^5%s^7 not exist!"):format(index)) + end + + self.meta[index] = nil + self.triggerEvent('esx:updatePlayerData', 'meta', self.meta) + Player(self.source).state:set('meta', self.meta, true) + end + for fnName,fn in pairs(targetOverrides) do self[fnName] = fn(self) end diff --git a/[core]/es_extended/server/functions.lua b/[core]/es_extended/server/functions.lua index 3e10f922..b580ff1a 100644 --- a/[core]/es_extended/server/functions.lua +++ b/[core]/es_extended/server/functions.lua @@ -159,16 +159,17 @@ function Core.SavePlayer(xPlayer, cb) local parameters = { json.encode(xPlayer.getAccounts(true)), xPlayer.job.name, - xPlayer.job.grade, + xPlayer.job.grade, xPlayer.group, json.encode(xPlayer.getCoords()), json.encode(xPlayer.getInventory(true)), json.encode(xPlayer.getLoadout(true)), + json.encode(xPlayer.getMeta()), xPlayer.identifier } MySQL.prepare( - 'UPDATE `users` SET `accounts` = ?, `job` = ?, `job_grade` = ?, `group` = ?, `position` = ?, `inventory` = ?, `loadout` = ? WHERE `identifier` = ?', + 'UPDATE `users` SET `accounts` = ?, `job` = ?, `job_grade` = ?, `group` = ?, `position` = ?, `inventory` = ?, `loadout` = ?, `meta` = ? WHERE `identifier` = ?', parameters, function(affectedRows) if affectedRows == 1 then @@ -200,12 +201,13 @@ function Core.SavePlayers(cb) json.encode(xPlayer.getCoords()), json.encode(xPlayer.getInventory(true)), json.encode(xPlayer.getLoadout(true)), + json.encode(xPlayer.getMeta()), xPlayer.identifier } end MySQL.prepare( - "UPDATE `users` SET `accounts` = ?, `job` = ?, `job_grade` = ?, `group` = ?, `position` = ?, `inventory` = ?, `loadout` = ? WHERE `identifier` = ?", + "UPDATE `users` SET `accounts` = ?, `job` = ?, `job_grade` = ?, `group` = ?, `position` = ?, `inventory` = ?, `loadout` = ?, `meta` = ? WHERE `identifier` = ?", parameters, function(results) if not results then diff --git a/[core]/es_extended/server/main.lua b/[core]/es_extended/server/main.lua index 456004e1..85624952 100644 --- a/[core]/es_extended/server/main.lua +++ b/[core]/es_extended/server/main.lua @@ -2,7 +2,7 @@ SetMapName('San Andreas') SetGameType('ESX Legacy') local newPlayer = 'INSERT INTO `users` SET `accounts` = ?, `identifier` = ?, `group` = ?' -local loadPlayer = 'SELECT `accounts`, `job`, `job_grade`, `group`, `position`, `inventory`, `skin`, `loadout`' +local loadPlayer = 'SELECT `accounts`, `job`, `job_grade`, `group`, `position`, `inventory`, `skin`, `loadout`, `meta`' if Config.Multichar then newPlayer = newPlayer .. ', `firstname` = ?, `lastname` = ?, `dateofbirth` = ?, `sex` = ?, `height` = ?' @@ -111,8 +111,9 @@ if not Config.Multichar then end function loadESXPlayer(identifier, playerId, isNew) - local userData = {accounts = {}, inventory = {}, job = {}, loadout = {}, playerName = GetPlayerName(playerId), weight = 0} + local userData = {accounts = {}, inventory = {}, job = {}, loadout = {}, playerName = GetPlayerName(playerId), weight = 0, meta = {}} + print(json.encode(loadPlayer,{indent=true})) local result = MySQL.prepare.await(loadPlayer, {identifier}) local job, grade, jobObject, gradeObject = result.job, tostring(result.job_grade) local foundAccounts, foundItems = {}, {} @@ -271,8 +272,13 @@ function loadESXPlayer(identifier, playerId, isNew) end end + if result.meta and result.meta ~= '' then + local meta = json.decode(result.meta) + userData.meta = meta + end + local xPlayer = CreateExtendedPlayer(playerId, identifier, userData.group, userData.accounts, userData.inventory, userData.weight, userData.job, - userData.loadout, userData.playerName, userData.coords) + userData.loadout, userData.playerName, userData.coords, userData.meta) ESX.Players[playerId] = xPlayer Core.playersByIdentifier[identifier] = xPlayer @@ -307,7 +313,8 @@ function loadESXPlayer(identifier, playerId, isNew) lastName = xPlayer.get("lastName") or "Doe", dateofbirth = xPlayer.get("dateofbirth") or "01/01/2000", height = xPlayer.get("height") or 120, - dead = false + dead = false, + meta = xPlayer.getMeta() }, isNew, userData.skin) @@ -579,7 +586,7 @@ ESX.RegisterServerCallback('esx:getPlayerData', function(source, cb) local xPlayer = ESX.GetPlayerFromId(source) cb({identifier = xPlayer.identifier, accounts = xPlayer.getAccounts(), inventory = xPlayer.getInventory(), job = xPlayer.getJob(), - loadout = xPlayer.getLoadout(), money = xPlayer.getMoney(), position = xPlayer.getCoords(true)}) + loadout = xPlayer.getLoadout(), money = xPlayer.getMoney(), position = xPlayer.getCoords(true), meta = xPlayer.getMeta()}) end) ESX.RegisterServerCallback('esx:isUserAdmin', function(source, cb) @@ -594,7 +601,7 @@ ESX.RegisterServerCallback('esx:getOtherPlayerData', function(source, cb, target local xPlayer = ESX.GetPlayerFromId(target) cb({identifier = xPlayer.identifier, accounts = xPlayer.getAccounts(), inventory = xPlayer.getInventory(), job = xPlayer.getJob(), - loadout = xPlayer.getLoadout(), money = xPlayer.getMoney(), position = xPlayer.getCoords(true)}) + loadout = xPlayer.getLoadout(), money = xPlayer.getMoney(), position = xPlayer.getCoords(true), meta = xPlayer.getMeta()}) end) ESX.RegisterServerCallback('esx:getPlayerNames', function(source, cb, players) From 3ce044eda21621125784e70c1fb1313324783198 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=20Gerg=C5=91?= Date: Tue, 21 Feb 2023 23:39:10 +0100 Subject: [PATCH 03/11] fix: (Metadata) small fixes --- [core]/es_extended/server/classes/player.lua | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index 5a8bf3f8..84fc2e9c 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -591,12 +591,8 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, return print(("[^1ERROR^7] xPlayer.setMeta ^5%s^7 is Missing!"):format(index)) end - if type(index) == 'table' then - for key, val in pairs(index) do - self.setMeta(key, val) - end - - return + if type(index) ~= "string" then + return print(("[^1ERROR^7] xPlayer.setMeta ^5%s^7 should be ^5string^7!")):format(index) end if not value then @@ -606,7 +602,7 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, local _type = type(value) if _type ~= "number" and _type ~= "string" and _type ~= "table" then - return print("[^1ERROR^7] xPlayer.setMeta ^5value^7 should be ^5number^7 or ^5string^7 or ^5table^7!") + return print(("[^1ERROR^7] xPlayer.setMeta ^5%s^7 should be ^5number^7 or ^5string^7 or ^5table^7!"):format(value)) end self.meta[index] = value From 31a7f022b6f85849ee8b4dd29e7ed1b8f01c6a4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=20Gerg=C5=91?= Date: Tue, 21 Feb 2023 23:40:14 +0100 Subject: [PATCH 04/11] fix:(Metadata) Remove forgotten debug print --- [core]/es_extended/server/main.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/[core]/es_extended/server/main.lua b/[core]/es_extended/server/main.lua index 85624952..603b85d2 100644 --- a/[core]/es_extended/server/main.lua +++ b/[core]/es_extended/server/main.lua @@ -112,8 +112,6 @@ end function loadESXPlayer(identifier, playerId, isNew) local userData = {accounts = {}, inventory = {}, job = {}, loadout = {}, playerName = GetPlayerName(playerId), weight = 0, meta = {}} - - print(json.encode(loadPlayer,{indent=true})) local result = MySQL.prepare.await(loadPlayer, {identifier}) local job, grade, jobObject, gradeObject = result.job, tostring(result.job_grade) local foundAccounts, foundItems = {}, {} From c0a151a3680de04190b10bb80b468c4307035bef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=20Gerg=C5=91?= Date: Tue, 21 Feb 2023 23:49:12 +0100 Subject: [PATCH 05/11] Fix: (Metadata) Forgotten statebag setter --- [core]/es_extended/server/classes/player.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index 84fc2e9c..10aa4e5b 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -33,6 +33,7 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, stateBag:set("job", self.job, true) stateBag:set("group", self.group, true) stateBag:set("name", self.name, true) + stateBag:set("meta", self.meta, true) function self.triggerEvent(eventName, ...) TriggerClientEvent(eventName, self.source, ...) From 5dedf4fcde1b5393a03073fcec1cd809b2d9a5fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=20Gerg=C5=91?= Date: Wed, 22 Feb 2023 12:57:41 +0100 Subject: [PATCH 06/11] Feat: (Metadata) subModule --- [core]/es_extended/server/classes/player.lua | 31 ++++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index 10aa4e5b..9c33f8a7 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -575,25 +575,32 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, self.triggerEvent('esx:showHelpNotification', msg, thisFrame, beep, duration) end - function self.getMeta(index) + function self.getMeta(index, subIndex) if index then + if self.meta[index] then + + if subIndex and type(self.meta[index]) == "table" and self.meta[index][subIndex] then + return self.meta[index][subIndex] + end + return self.meta[index] else return print(("[^1ERROR^7] xPlayer.getMeta ^5%s^7 not exist!"):format(index)) end + end return self.meta end - function self.setMeta(index, value) + function self.setMeta(index, value, subValue) if not index then return print(("[^1ERROR^7] xPlayer.setMeta ^5%s^7 is Missing!"):format(index)) end if type(index) ~= "string" then - return print(("[^1ERROR^7] xPlayer.setMeta ^5%s^7 should be ^5string^7!")):format(index) + return print("[^1ERROR^7] xPlayer.setMeta ^5index^7 should be ^5string^7!") end if not value then @@ -602,11 +609,23 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, local _type = type(value) - if _type ~= "number" and _type ~= "string" and _type ~= "table" then - return print(("[^1ERROR^7] xPlayer.setMeta ^5%s^7 should be ^5number^7 or ^5string^7 or ^5table^7!"):format(value)) + if not subValue then + + if _type ~= "number" and _type ~= "string" and _type ~= "table" then + return print(("[^1ERROR^7] xPlayer.setMeta ^5%s^7 should be ^5number^7 or ^5string^7 or ^5table^7!"):format(value)) + end + + self.meta[index] = value + else + + if _type ~= "string" then + return print(("[^1ERROR^7] xPlayer.setMeta ^5value^7 should be ^5string^7 as a subIndex!"):format(value)) + end + + self.meta[index][value] = subValue end - self.meta[index] = value + self.triggerEvent('esx:updatePlayerData', 'meta', self.meta) Player(self.source).state:set('meta', self.meta, true) end From cd5b562f838509da7d17e916595d24900370bb33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=20Gerg=C5=91?= Date: Wed, 22 Feb 2023 13:04:16 +0100 Subject: [PATCH 07/11] fix: (Metadata) string check on getMeta --- [core]/.gitignore | 1 + [core]/es_extended/server/classes/player.lua | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 [core]/.gitignore diff --git a/[core]/.gitignore b/[core]/.gitignore new file mode 100644 index 00000000..30d74d25 --- /dev/null +++ b/[core]/.gitignore @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index 9c33f8a7..e6151768 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -578,6 +578,10 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, function self.getMeta(index, subIndex) if index then + if type(index) ~= "string" then + return print("[^1ERROR^7] xPlayer.getMeta ^5index^7 should be ^5string^7!") + end + if self.meta[index] then if subIndex and type(self.meta[index]) == "table" and self.meta[index][subIndex] then From 13a260f12afe7ea3e6d9df4377b68977d744baf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=20Gerg=C5=91?= Date: Wed, 22 Feb 2023 13:26:08 +0100 Subject: [PATCH 08/11] feat: (Metadata) Extra table subIndex option --- [core]/es_extended/server/classes/player.lua | 26 ++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index e6151768..b21868e2 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -584,8 +584,30 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, if self.meta[index] then - if subIndex and type(self.meta[index]) == "table" and self.meta[index][subIndex] then - return self.meta[index][subIndex] + local _type = type(subIndex) + if subIndex and type(self.meta[index]) == "table" then + + if _type == "string" then + if self.meta[index][subIndex] then + return self.meta[index][subIndex] + end + + return print(("[^1ERROR^7] xPlayer.getMeta ^5%s^7 not esxist on ^5%s^7!"):format(subIndex, index)) + end + + if _type == "table" then + local returnValues = {} + for i = 1, #subIndex do + if self.meta[index][subIndex[i]] then + returnValues[subIndex[i]] = self.meta[index][subIndex[i]] + else + print(("[^1ERROR^7] xPlayer.getMeta ^5%s^7 not esxist on ^5%s^7!"):format(subIndex[i], index)) + end + end + + return returnValues + end + end return self.meta[index] From 3d5deda92cf65eaba77a4837fc038bf92dff19ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=20Gerg=C5=91?= Date: Wed, 22 Feb 2023 14:06:58 +0100 Subject: [PATCH 09/11] Fix: Remove gitignore, and sql update --- [core]/.gitignore | 1 - [core]/es_extended/es_extended.sql | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 [core]/.gitignore diff --git a/[core]/.gitignore b/[core]/.gitignore deleted file mode 100644 index 30d74d25..00000000 --- a/[core]/.gitignore +++ /dev/null @@ -1 +0,0 @@ -test \ No newline at end of file diff --git a/[core]/es_extended/es_extended.sql b/[core]/es_extended/es_extended.sql index bb156c90..91ffd225 100644 --- a/[core]/es_extended/es_extended.sql +++ b/[core]/es_extended/es_extended.sql @@ -15,6 +15,7 @@ CREATE TABLE `users` ( `job` VARCHAR(20) NULL DEFAULT 'unemployed', `job_grade` INT NULL DEFAULT 0, `loadout` LONGTEXT NULL DEFAULT NULL, + `meta` LONGTEXT NULL DEFAULT NULL, `position` longtext NULL DEFAULT NULL, PRIMARY KEY (`identifier`) From 9d16575791a4bbb9256a234f488659486b828020 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=20Gerg=C5=91?= Date: Wed, 22 Feb 2023 14:12:37 +0100 Subject: [PATCH 10/11] Why do we have 2 sql? --- [SQL]/legacy.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/[SQL]/legacy.sql b/[SQL]/legacy.sql index ecf145c7..b081b38d 100644 --- a/[SQL]/legacy.sql +++ b/[SQL]/legacy.sql @@ -389,6 +389,7 @@ CREATE TABLE `users` ( `job` varchar(20) DEFAULT 'unemployed', `job_grade` int(11) DEFAULT 0, `loadout` longtext DEFAULT NULL, + `meta` LONGTEXT NULL DEFAULT NULL, `position` longtext NULL DEFAULT NULL, `firstname` varchar(16) DEFAULT NULL, `lastname` varchar(16) DEFAULT NULL, From 9ab108e71f4752a7d972165b7c82a9d210847073 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=20Gerg=C5=91?= Date: Wed, 22 Feb 2023 22:14:18 +0100 Subject: [PATCH 11/11] Small fixes --- [core]/es_extended/server/classes/player.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/[core]/es_extended/server/classes/player.lua b/[core]/es_extended/server/classes/player.lua index b21868e2..58779920 100644 --- a/[core]/es_extended/server/classes/player.lua +++ b/[core]/es_extended/server/classes/player.lua @@ -584,8 +584,8 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, if self.meta[index] then - local _type = type(subIndex) if subIndex and type(self.meta[index]) == "table" then + local _type = type(subIndex) if _type == "string" then if self.meta[index][subIndex] then @@ -622,7 +622,7 @@ function CreateExtendedPlayer(playerId, identifier, group, accounts, inventory, function self.setMeta(index, value, subValue) if not index then - return print(("[^1ERROR^7] xPlayer.setMeta ^5%s^7 is Missing!"):format(index)) + return print("[^1ERROR^7] xPlayer.setMeta ^5index^7 is Missing!") end if type(index) ~= "string" then