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] 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)