From c9c6a28063c33bee11ed6c308dc5e0affbf197d1 Mon Sep 17 00:00:00 2001 From: Kenshin13 <63159154+Kenshiin13@users.noreply.github.com> Date: Sun, 13 Jul 2025 10:11:50 +0200 Subject: [PATCH] feat(es_extended): refresh/add items during runtime --- [core]/es_extended/client/functions.lua | 2 +- [core]/es_extended/client/modules/events.lua | 4 + [core]/es_extended/server/common.lua | 6 +- [core]/es_extended/server/functions.lua | 73 +++++++++++++++++++ .../es_extended/server/modules/commands.lua | 4 + 5 files changed, 84 insertions(+), 5 deletions(-) diff --git a/[core]/es_extended/client/functions.lua b/[core]/es_extended/client/functions.lua index 6e2aa519..c8483d02 100644 --- a/[core]/es_extended/client/functions.lua +++ b/[core]/es_extended/client/functions.lua @@ -85,7 +85,7 @@ end function ESX.SetPlayerData(key, val) local current = ESX.PlayerData[key] ESX.PlayerData[key] = val - if key ~= "inventory" and key ~= "loadout" then + if key ~= "loadout" then if type(val) == "table" or val ~= current then TriggerEvent("esx:setPlayerData", key, val, current) end diff --git a/[core]/es_extended/client/modules/events.lua b/[core]/es_extended/client/modules/events.lua index db4d0c2d..d68ef3e5 100644 --- a/[core]/es_extended/client/modules/events.lua +++ b/[core]/es_extended/client/modules/events.lua @@ -57,6 +57,10 @@ ESX.SecureNetEvent("esx:setMaxWeight", function(newMaxWeight) ESX.SetPlayerData("maxWeight", newMaxWeight) end) +ESX.SecureNetEvent("esx:setInventory", function(newInventory) + ESX.SetPlayerData("inventory", newInventory) +end) + local function onPlayerSpawn() ESX.SetPlayerData("ped", PlayerPedId()) ESX.SetPlayerData("dead", false) diff --git a/[core]/es_extended/server/common.lua b/[core]/es_extended/server/common.lua index 49071d8b..a0f571df 100644 --- a/[core]/es_extended/server/common.lua +++ b/[core]/es_extended/server/common.lua @@ -36,11 +36,9 @@ end MySQL.ready(function() Core.DatabaseConnected = true + if not Config.CustomInventory then - local items = MySQL.query.await("SELECT * FROM items") - for _, v in ipairs(items) do - ESX.Items[v.name] = { label = v.label, weight = v.weight, rare = v.rare, canRemove = v.can_remove } - end + ESX.RefreshItems() end ESX.RefreshJobs() diff --git a/[core]/es_extended/server/functions.lua b/[core]/es_extended/server/functions.lua index cb4157b1..f7176d4a 100644 --- a/[core]/es_extended/server/functions.lua +++ b/[core]/es_extended/server/functions.lua @@ -635,6 +635,79 @@ if not Config.CustomInventory then TriggerClientEvent("esx:createPickup", -1, pickupId, label, coords, itemType, name, components, tintIndex) Core.PickupId = pickupId end + + local function refreshPlayerInventories() + for i, xPlayer in ipairs(ESX.GetExtendedPlayers()) do + local minimalInv = xPlayer.getInventory(true) + + for itemName, itemCount in pairs(minimalInv) do + if not ESX.Items[itemName] then + xPlayer.setInventoryItem(itemName, 0) + minimalInv[itemName] = nil + end + end + + xPlayer.inventory = {} + for itemName, itemData in pairs(ESX.Items) do + xPlayer.inventory[#xPlayer.inventory+1] = { + name = itemName, + count = minimalInv[itemName] or 0, + label = itemData.label, + weight = itemData.weight, + usable = Core.UsableItemsCallbacks[itemName] ~= nil, + rare = itemData.rare, + canRemove = itemData.canRemove, + } + end + + TriggerClientEvent("esx:setInventory", xPlayer.source, xPlayer.inventory) + end + end + + function ESX.RefreshItems() + ESX.Items = {} + + local items = MySQL.query.await("SELECT * FROM items") + for _, v in ipairs(items) do + ESX.Items[v.name] = { label = v.label, weight = v.weight, rare = v.rare, canRemove = v.can_remove } + end + + refreshPlayerInventories() + end + + ---@param name string + ---@param label string + ---@param weight number + ---@param rare boolean? + ---@param canRemove boolean? + function ESX.AddItem(name, label, weight, rare, canRemove) + assert(type(name) == "string", "Item name must be a string") + assert(type(label) == "string", "Item label must be a string") + assert(type(weight) == "number", "Item weight must be a number") + assert(type(rare) == "boolean" or rare == nil, "Item rare must be a boolean or nil") + assert(type(canRemove) == "boolean" or canRemove == nil, "Item canRemove must be a boolean or nil") + + if ESX.Items[name] then + return + end + + MySQL.insert.await("INSERT INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`) VALUES (?, ?, ?, ?, ?)", { + name, + label, + weight, + rare or false, + canRemove or false, + }) + + ESX.Items[name] = { + label = label, + weight = weight, + rare = rare or false, + canRemove = canRemove or false, + } + + refreshPlayerInventories() + end end ---@param job string diff --git a/[core]/es_extended/server/modules/commands.lua b/[core]/es_extended/server/modules/commands.lua index 628e85ea..27cd5959 100644 --- a/[core]/es_extended/server/modules/commands.lua +++ b/[core]/es_extended/server/modules/commands.lua @@ -438,6 +438,10 @@ ESX.RegisterCommand("refreshjobs", "admin", function() ESX.RefreshJobs() end, true, { help = TranslateCap("command_clearall") }) +ESX.RegisterCommand("refreshitems", "admin", function() + ESX.RefreshItems() +end, true, { help = TranslateCap("command_clearall") }) + if not Config.CustomInventory then ESX.RegisterCommand( "clearinventory",