---@class InventoryUtils : SharedInventoryUtils local inventory = Luxu.require("bridge.shared.inventory") local function isResourceRunning(resource) return GetResourceState(resource) == "started" end ---@param source number ---@return 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