ENH - refine phone apps and FiveM integration

This commit is contained in:
smx.pusha
2026-08-06 18:49:30 +02:00
parent c304f4a9f3
commit 50df7d11c4
31 changed files with 3057 additions and 420 deletions
@@ -15,6 +15,8 @@ if configured_inventory == "auto" then
configured_inventory = "core"
elseif GetResourceState("mf-inventory") == "started" then
configured_inventory = "mf"
elseif GetResourceState("smx-inventory") == "started" then
configured_inventory = "smx"
end
end
@@ -26,6 +28,7 @@ local supported_inventories = {
codem = true,
core = true,
mf = true,
smx = true,
}
if not supported_inventories[configured_inventory] then
@@ -0,0 +1,145 @@
if Bridge.Inventory.Name ~= "smx" then
return
end
if Bridge.Framework.GetName() ~= "esx" then
error("[sky_phone] smx-inventory is only supported with ESX.")
end
local ESX = exports["es_extended"]:getSharedObject()
local metadata_key = "sky_phone_inventory"
ESX.AddItems({
{ name = Config.Phone.Item, label = Config.Phone.DeviceName, weight = 100, rare = false, canRemove = true },
{ name = Config.Sim.RegisteredItem, label = "Registered SIM", weight = 5, rare = false, canRemove = true },
{ name = Config.Sim.AnonymousItem, label = "Anonymous SIM", weight = 5, rare = false, canRemove = true },
})
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
if not item or (tonumber(item.count) or 0) < 1 then
return nil
end
local player_metadata = player.getMeta()
local all_metadata = type(player_metadata) == "table" and player_metadata[metadata_key] or nil
local metadata = type(all_metadata) == "table" and all_metadata[item_name] or nil
return {
name = item_name,
slot = item_name,
count = 1,
amount = 1,
metadata = type(metadata) == "table" and metadata or {},
}
end
local function set_item_metadata(source, item_name, metadata)
local player = get_player(source)
if not player or not get_item(source, item_name) then
return false
end
local player_metadata = player.getMeta()
local all_metadata = type(player_metadata) == "table" and player_metadata[metadata_key] or nil
all_metadata = type(all_metadata) == "table" and all_metadata or {}
all_metadata[item_name] = metadata or {}
player.setMeta(metadata_key, all_metadata)
return true
end
local function clear_item_metadata(player, item_name)
local player_metadata = player.getMeta()
local all_metadata = type(player_metadata) == "table" and player_metadata[metadata_key] or nil
if type(all_metadata) ~= "table" or all_metadata[item_name] == nil then
return
end
all_metadata[item_name] = nil
player.setMeta(metadata_key, all_metadata)
end
function Bridge.Inventory.GetResourceName()
return "smx-inventory"
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 not Bridge.Inventory.MetadataMatches(item.metadata, metadata) then
return {}
end
return { item }
end
function Bridge.Inventory.SetSlotMetadata(source, slot_id, metadata)
return set_item_metadata(source, tostring(slot_id), metadata)
end
function Bridge.Inventory.CanCarryItem(source, item_name, count)
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)
local player = get_player(source)
if not player or not player.canCarryItem(item_name, count) then
return false
end
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)
local added = (after and tonumber(after.count) or 0) - before_count
if added ~= count then
return false
end
if metadata and not set_item_metadata(source, item_name, metadata) then
player.removeInventoryItem(item_name, count)
return false
end
return true
end
function Bridge.Inventory.RemoveItem(source, item_name, count)
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)
local removed = before_count - (after and tonumber(after.count) or 0)
if removed == count then
clear_item_metadata(player, item_name)
end
return removed
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] smx-inventory usable callback could not resolve item '%s' for source %s.",
item_name,
tostring(source)
)
return
end
callback(source, item)
end)
return true
end