if Config.Inventory ~= "codem-inventory" then return end local INVENTORY_RESOURCE = 'codem-inventory' local EVENT_REFRESH_DELAY = 500 local refreshQueued = false --- @return table|nil local function ReadInventory() local ok, result = pcall(function() return exports[INVENTORY_RESOURCE]:GetClientPlayerInventory() end) if not ok then Debugprint('Codem Inventory read failed:', tostring(result)) return nil end if type(result) ~= 'table' then return nil end return type(result.items) == 'table' and result.items or result end --- @param item table --- @return number local function GetItemCount(item) return tonumber(item.amount) or tonumber(item.count) or tonumber(item.quantity) or 0 end --- @param item table --- @return table local function GetItemMetadata(item) if type(item.metadata) == 'table' then return item.metadata end if type(item.info) == 'table' then return item.info end return {} end --- @param inventory table --- @param itemName string --- @return table|nil local function FindInventoryItem(inventory, itemName) for _, item in pairs(inventory) do if type(item) == 'table' and item.name == itemName and GetItemCount(item) > 0 then return item end end end --- @param inventory table --- @param itemName string --- @param phoneId string --- @return table|nil local function FindPhoneInstance(inventory, itemName, phoneId) for _, item in pairs(inventory) do if type(item) == 'table' and item.name == itemName and GetItemCount(item) > 0 and GetItemMetadata(item).phoneID == phoneId then return item end end end --- @param inventory table --- @return table|nil local function FindConfiguredPhoneItem(inventory) for _, item in pairs(inventory) do if type(item) == 'table' and Config.ItemName[item.name] and GetItemCount(item) > 0 then return item end end end local function ReconcilePhoneItem() local inventory = ReadInventory() if not inventory then return end if PhoneUniqueId and LastItemData then if not Config.ItemRequire then return end local item if Config.MetaItem then item = FindPhoneInstance(inventory, LastItemData.name, PhoneUniqueId) else item = FindInventoryItem(inventory, LastItemData.name) end if not item then ItemPhoneDeleted() end return end if PhoneUniqueId == nil then local item = FindConfiguredPhoneItem(inventory) if item then ForceLoadPhone(item.name) end end end local function QueuePhoneRefresh() if not Config.ItemRequire or refreshQueued then return end refreshQueued = true SetTimeout(EVENT_REFRESH_DELAY, function() refreshQueued = false ReconcilePhoneItem() end) end --- @param itemName string --- @return boolean function JobCenterHasItem(itemName) local inventory = ReadInventory() return inventory ~= nil and FindInventoryItem(inventory, itemName) ~= nil end RegisterNetEvent('QBCore:Player:SetPlayerData', QueuePhoneRefresh) RegisterNetEvent('esx:addInventoryItem', QueuePhoneRefresh) RegisterNetEvent('esx:removeInventoryItem', QueuePhoneRefresh) RegisterNetEvent('gksphone:client:inventoryChanged', QueuePhoneRefresh) exports('RefreshPhoneItem', QueuePhoneRefresh)