feat(es_extended): refresh/add items during runtime

This commit is contained in:
Kenshin13
2025-07-13 10:11:50 +02:00
parent 90826b18ab
commit c9c6a28063
5 changed files with 84 additions and 5 deletions
+1 -1
View File
@@ -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
@@ -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)
+2 -4
View File
@@ -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()
+73
View File
@@ -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
@@ -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",