mirror of
https://github.com/sky-systems/sky_phone.git
synced 2026-08-29 19:01:40 +00:00
161 lines
5.0 KiB
Lua
161 lines
5.0 KiB
Lua
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"
|
|
|
|
local inventory_items = {
|
|
{ name = Config.Phone.Item, label = Config.Phone.DeviceName, weight = 100, rare = false, canRemove = true },
|
|
}
|
|
if Config.Sim.Enabled ~= false then
|
|
inventory_items[#inventory_items + 1] = {
|
|
name = Config.Sim.RegisteredItem,
|
|
label = "Registered SIM",
|
|
weight = 5,
|
|
rare = false,
|
|
canRemove = true,
|
|
}
|
|
inventory_items[#inventory_items + 1] = {
|
|
name = Config.Sim.AnonymousItem,
|
|
label = "Anonymous SIM",
|
|
weight = 5,
|
|
rare = false,
|
|
canRemove = true,
|
|
}
|
|
end
|
|
ESX.AddItems(inventory_items)
|
|
|
|
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
|