mirror of
https://github.com/sky-systems/sky_phone.git
synced 2026-08-29 13:01:40 +00:00
df6b06c6db
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.
113 lines
3.3 KiB
Lua
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
|