Files
2026-03-29 21:41:17 +03:00

326 lines
14 KiB
Lua

---@class InventoryUtils : SharedInventoryUtils
local inventory = Luxu.require("bridge.shared.inventory")
local function isResourceRunning(resource)
return GetResourceState(resource) == "started"
end
---@param source number
---@return table<number, table>
function inventory.getPlayerItems(source)
local playerObj = Luxu.player.getPlayerObject(source)
if not playerObj then return {} end
local result = {}
if Framework.name == 'ox' then
result = exports.ox_inventory:GetInventoryItems(source) --[[ @as table ]]
elseif isResourceRunning("tgiann-inventory") then
result = exports["tgiann-inventory"]:GetPlayerItems(source)
elseif Framework.name == 'qb' or Framework.name == 'qbx' then
result = playerObj.PlayerData.items
elseif Framework.name == 'esx' then
result = playerObj.getInventory()
else
result = {} --[[ CUSTOM FRAMEWORK ]]
end
local formated = {}
for k, item in pairs(result) do
if item and item.name then
item.amount = item.amount or item.count
item.image = item.image
formated[k] = item
end
end
return formated
end
---@param source number
function inventory.addItem(source, item, amount, metadata)
local playerObj = Luxu.player.getPlayerObject(source)
if not playerObj then return false end
if isResourceRunning('ox_inventory') then
exports.ox_inventory:AddItem(source, item, amount, metadata, nil, nil)
elseif isResourceRunning("origen_inventory") then
exports.origen_inventory:AddItem(source, item, amount, nil, metadata)
elseif isResourceRunning('ak47_inventory') then
exports['ak47_inventory']:AddItem(source, item, amount, nil, metadata)
elseif isResourceRunning('ak47_qb_inventory') then
exports['ak47_qb_inventory']:AddItem(source, item, amount, nil, metadata)
elseif isResourceRunning('core_inventory') then
local identifier = Luxu.player.getCharId(playerObj)
local inventory = 'content-' .. identifier:gsub(':', '')
exports['core_inventory']:addItem(inventory, item, amount, metadata, "content")
elseif isResourceRunning('qs-inventory') then
exports['qs-inventory']:AddItem(source, item, amount, nil, metadata)
elseif isResourceRunning("tgiann-inventory") then
exports["tgiann-inventory"]:AddItem(source, item, amount)
elseif isResourceRunning("codem-inventory") then
exports["codem-inventory"]:AddItem(source, item, amount, nil, metadata)
elseif isResourceRunning("jaksam_inventory") then
exports['jaksam_inventory']:addItem(source, item, amount, metadata)
else
if Framework.name == "qb" or Framework.name == "qbx" then
playerObj.Functions.AddItem(item, amount, nil, metadata)
elseif Framework.name == "esx" then
local xPlayer = ESX.GetPlayerFromId(source)
xPlayer.addInventoryItem(item, amount)
end
end
return true
end
function inventory.removeItem(source, item, amount, slot)
local playerObj = Luxu.player.getPlayerObject(source)
if not playerObj then return false end
if isResourceRunning('ox_inventory') then
exports.ox_inventory:RemoveItem(source, item, amount)
elseif isResourceRunning('origen_inventory') then
exports.origen_inventory:RemoveItem(source, item, amount)
elseif isResourceRunning('ak47_inventory') then
exports['ak47_inventory']:RemoveItem(source, item, amount)
elseif isResourceRunning('ak47_qb_inventory') then
exports['ak47_qb_inventory']:RemoveItem(source, item, amount)
elseif isResourceRunning('core_inventory') then
local identifier = Luxu.player.getCharId(playerObj)
local inventory = 'content-' .. identifier:gsub(":", "")
exports['core_inventory']:removeItem(inventory, item, tonumber(amount))
elseif isResourceRunning('qs-inventory') then
exports['qs-inventory']:RemoveItem(source, item, amount)
elseif isResourceRunning("tgiann-inventory") then
exports["tgiann-inventory"]:RemoveItem(source, item, amount)
elseif isResourceRunning("jaksam_inventory") then
exports["jaksam_inventory"]:removeItem(source, item, amount, nil, slot)
elseif isResourceRunning("codem-inventory") then
exports["codem-inventory"]:RemoveItem(source, item, amount, slot)
else
if Framework.name == "qb" or Framework.name == "qbx" then
playerObj.Functions.RemoveItem(item, amount)
elseif Framework.name == "esx" then
local xPlayer = ESX.GetPlayerFromId(source)
xPlayer.removeInventoryItem(item, amount)
end
end
end
---@return boolean
function inventory.canCarryItem(source, item, amount)
local playerObj = Luxu.player.getPlayerObject(source)
if not playerObj then return false end
if isResourceRunning('ox_inventory') then
return exports.ox_inventory:CanCarryItem(source, item, amount) == true
elseif isResourceRunning("origen_inventory") then
return exports.origen_inventory:CanCarryItem(source, item, amount)
elseif isResourceRunning("ak47_inventory") then
return exports['ak47_inventory']:CanAddItem(source, item, amount)
elseif isResourceRunning('ak47_qb_inventory') then
return exports['ak47_qb_inventory']:CanAddItem(source, item, amount)
elseif isResourceRunning('core_inventory') then
local identifier = Luxu.player.getCharId(playerObj)
local inventory = 'content-' .. identifier:gsub(":", "")
return exports['core_inventory']:canCarry(inventory, item, amount)
elseif isResourceRunning('qs-inventory') then
return exports['qs-inventory']:CanCarryItem(source, item, amount)
elseif isResourceRunning("tgiann-inventory") then
return exports["tgiann-inventory"]:CanCarryItem(source, item, amount)
elseif isResourceRunning("jaksam_inventory") then
return exports["jaksam_inventory"]:canCarryItem(source, item, amount)
elseif isResourceRunning("codem-inventory") then
local itemList = exports["codem-inventory"]:GetItemList()
local itemData = itemList[item]
if not itemData then return false end
return exports["codem-inventory"]:CanCarryItem(source, item, amount)
else
if Framework.name == "qb" or Framework.name == "qbx" then
local totalWeight = QBCore.Player.GetTotalWeight(playerObj.PlayerData.items)
local info = QBCore.Shared.Items[item:lower()]
return (totalWeight + (info['weight'] * amount)) <= 120000
elseif Framework.name == "esx" then
local xPlayer = ESX.GetPlayerFromId(source)
return xPlayer.canCarryItem(item, amount)
end
end
return true
end
---@return boolean
function inventory.hasItem(source, item, amount)
local playerObj = Luxu.player.getPlayerObject(source)
if not playerObj then return false end
if isResourceRunning('ox_inventory') then
local count = exports.ox_inventory:GetItem(source, item, nil, true)
return count >= amount
elseif isResourceRunning('origen_inventory') then
return exports.origen_inventory:HasItem(source, item, amount)
elseif isResourceRunning('ak47_inventory') then
return exports['ak47_inventory']:GetAmount(source, item) >= amount
elseif isResourceRunning('ak47_qb_inventory') then
return exports['ak47_qb_inventory']:GetAmount(source, item) >= amount
elseif isResourceRunning('core_inventory') then
local identifier = Luxu.player.getCharId(playerObj)
local inventory = 'content-' .. identifier:gsub(":", "")
local item = exports['core_inventory']:getItem(inventory, item)
local count = item and item.amount or 0
return count >= amount
elseif isResourceRunning('qs-inventory') then
local count = exports['qs-inventory']:GetItemTotalAmount(source, item)
return count >= amount
elseif isResourceRunning("codem-inventory") then
return exports["codem-inventory"]:CheckItemValid(source, item, amount)
elseif isResourceRunning("tgiann-inventory") then
return exports["tgiann-inventory"]:HasItem(source, item, amount)
elseif isResourceRunning("jaksam_inventory") then
return exports['jaksam_inventory']:hasItem(source, item, amount)
else
if Framework.name == "qb" or Framework.name == "qbx" then
local items = playerObj.PlayerData.items
local count = 0
for _, v in pairs(items) do
if item == v.name then
count = count + v.amount
end
end
return count >= amount
elseif Framework.name == "esx" then
local xPlayer = ESX.GetPlayerFromId(source)
return xPlayer.getInventoryItem(item).count >= amount
end
end
return false
end
function inventory.getItemCount(source, item)
local playerObj = Luxu.player.getPlayerObject(source)
if not playerObj then return 0 end
if isResourceRunning('ox_inventory') then
return exports.ox_inventory:GetItem(source, item, nil, true)
elseif isResourceRunning('origen_inventory') then
return exports.origen_inventory:GetItemCount(source, item)
elseif isResourceRunning('ak47_inventory') then
return exports['ak47_inventory']:GetAmount(source, item)
elseif isResourceRunning('ak47_qb_inventory') then
return exports['ak47_qb_inventory']:GetAmount(source, item)
elseif isResourceRunning('core_inventory') then
local identifier = Luxu.player.getCharId(playerObj)
local inventory = 'content-' .. identifier:gsub(":", "")
local itemData = exports['core_inventory']:getItem(inventory, item)
return itemData and itemData.amount or 0
elseif isResourceRunning('qs-inventory') then
return exports['qs-inventory']:GetItemTotalAmount(source, item)
elseif isResourceRunning("codem-inventory") then
return exports["codem-inventory"]:GetItemCount(source, item)
elseif isResourceRunning("tgiann-inventory") then
return exports["tgiann-inventory"]:GetItemCount(source, item)
elseif isResourceRunning("jaksam_inventory") then
return exports['jaksam_inventory']:getTotalItemAmount(source, item)
else
if Framework.name == "qb" or Framework.name == "qbx" then
local items = playerObj.PlayerData.items
local count = 0
for _, v in pairs(items) do
if item == v.name then
count = count + v.amount
end
end
return count
elseif Framework.name == "esx" then
local xPlayer = ESX.GetPlayerFromId(source)
return xPlayer.getInventoryItem(item).count
end
end
return 0
end
function inventory.getAllPlayersInventory()
local result = {}
if Framework.name == "qb" or Framework.name == "qbx" then
for _, playerObj in pairs(Framework.object.Functions.GetQBPlayers()) do
local items = playerObj.PlayerData.items
-- Safety check
for _, item in pairs(items) do
item.amount = item.amount or item.count
item.label = item.label or item.name
end
table.insert(result, {
charId = playerObj.PlayerData.citizenid,
name = playerObj.PlayerData.charinfo.firstname .. " " .. playerObj.PlayerData.charinfo.lastname,
inventory = items
})
end
elseif Framework.name == "esx" then
if Framework.object.GetExtendedPlayers then
for _, playerObj in pairs(Framework.object.GetExtendedPlayers()) do
local items = playerObj.inventory
for _, item in pairs(items) do
item.amount = item.amount or item.count
item.label = item.label or item.name
end
table.insert(result, {
charId = playerObj.identifier,
name = playerObj.getName(),
inventory = items
})
end
else
--- Fallback
for _, src in ipairs(GetPlayers()) do
local playerObj = Framework.object.getGetPlayerFromId(src)
if playerObj then
local items = playerObj.inventory
for _, item in pairs(items) do
item.amount = item.amount or item.count
item.label = item.label or item.name
end
table.insert(result, {
charId = playerObj.identifier,
name = playerObj.getName(),
inventory = items
})
end
end
end
end
return result
end
---@param typeofStash "stash" | "trunk" | "glovebox"
---@param id string could be vehicle plate
function inventory.getStash(typeofStash, id)
if isResourceRunning('ox_inventory') then
if typeofStash == "stash" then
else
local playersTable = "player_vehicles"
if Framework.name == "esx" then
playersTable = "owned_vehicles"
end
local query = ("SELECT %s FROM %s WHERE plate = ?"):format(typeofStash, playersTable)
local result = MySQL.prepare.await(query, { id })
local items = result and json.decode(result) or {}
return items
end
elseif isResourceRunning("core_inventory") then
return exports.core_inventory:getInventory("stash-" .. id)
end
return {}
end
return inventory