Files
sky_phone-sky-systems/sky_phone/source/bridge/server/inventory/esx.lua
T
Leon.Schmidt df6b06c6db FIX - support HEX inventory compatibility
Auto-detect hex_4_inventory and add a count-based ESX adapter for non-unique, virtual-SIM phone configurations. Expose the LB Phone IsOpen alias required by HEX and document/test the supported configuration boundaries.
2026-08-18 20:06:50 +02:00

113 lines
3.3 KiB
Lua

if Bridge.Inventory.Name ~= "esx" and Bridge.Inventory.Name ~= "hex" then
return
end
if GetResourceState("es_extended") ~= "started" then
error("[sky_phone] The ESX inventory adapter requires es_extended to be started.")
end
if Bridge.Inventory.Name == "hex" and GetResourceState("hex_4_inventory") ~= "started" then
error("[sky_phone] hex_4_inventory is configured, but the resource is not started.")
end
local ESX = exports["es_extended"]:getSharedObject()
local function get_player(source)
return ESX.GetPlayerFromId(source)
end
local function get_item(source, item_name)
local player = get_player(source)
local item = player and player.getInventoryItem(item_name) or nil
local count = item and tonumber(item.count) or 0
if count < 1 then
return nil
end
return {
name = item_name,
slot = item_name,
count = count,
amount = count,
metadata = {},
}
end
local function has_metadata(metadata)
return type(metadata) == "table" and next(metadata) ~= nil
end
function Bridge.Inventory.GetResourceName()
return Bridge.Inventory.Name == "hex" and "hex_4_inventory" or "es_extended"
end
function Bridge.Inventory.GetSlot(source, slot_id)
return get_item(source, tostring(slot_id))
end
function Bridge.Inventory.GetSlotsWithItem(source, item_name, metadata)
local item = get_item(source, item_name)
if not item or has_metadata(metadata) then
return {}
end
return { item }
end
function Bridge.Inventory.SetSlotMetadata()
return false
end
function Bridge.Inventory.CanCarryItem(source, item_name, count, metadata)
if has_metadata(metadata) then
return false
end
local player = get_player(source)
return player and player.canCarryItem(item_name, count) or false
end
function Bridge.Inventory.AddItem(source, item_name, count, _, metadata)
if not Bridge.Inventory.CanCarryItem(source, item_name, count, metadata) then
return false
end
local player = get_player(source)
local before = player.getInventoryItem(item_name)
local before_count = before and tonumber(before.count) or 0
player.addInventoryItem(item_name, count)
local after = player.getInventoryItem(item_name)
return (after and tonumber(after.count) or 0) - before_count == count
end
function Bridge.Inventory.RemoveItem(source, item_name, count, _, metadata)
if has_metadata(metadata) then
return 0
end
local player = get_player(source)
local before = player and player.getInventoryItem(item_name) or nil
local before_count = before and tonumber(before.count) or 0
if not player or before_count < count then
return 0
end
player.removeInventoryItem(item_name, count)
local after = player.getInventoryItem(item_name)
return before_count - (after and tonumber(after.count) or 0)
end
function Bridge.Inventory.RegisterUsableItem(item_name, callback)
ESX.RegisterUsableItem(item_name, function(source)
local item = get_item(source, item_name)
if not item then
Bridge.Debug(
"warn",
"[sky_phone] ESX usable callback could not resolve item '%s' for source %s.",
item_name,
tostring(source)
)
return
end
callback(source, item)
end)
return true
end