mirror of
https://github.com/sky-systems/sky_phone.git
synced 2026-08-30 17:01:39 +00:00
95 lines
3.1 KiB
Lua
95 lines
3.1 KiB
Lua
if Bridge.Inventory.Name ~= "mf" then
|
|
return
|
|
end
|
|
|
|
if Bridge.Framework.GetName() ~= "esx" then
|
|
error("[sky_phone] mf-inventory is only supported with ESX.")
|
|
end
|
|
|
|
local ESX = exports["es_extended"]:getSharedObject()
|
|
local inventory = exports["mf-inventory"]
|
|
|
|
local function get_identifier(source)
|
|
local player = ESX.GetPlayerFromId(source)
|
|
return player and player.identifier or nil
|
|
end
|
|
|
|
local function get_inventory(source)
|
|
local identifier = get_identifier(source)
|
|
return identifier and inventory:getInventoryItems(identifier) or {}
|
|
end
|
|
|
|
local function normalize(item)
|
|
return Bridge.Inventory.NormalizeItem(item, "metadata")
|
|
end
|
|
|
|
function Bridge.Inventory.GetResourceName()
|
|
return "mf-inventory"
|
|
end
|
|
|
|
function Bridge.Inventory.GetSlot(source, slot_id)
|
|
for _, item in pairs(get_inventory(source)) do
|
|
if tostring(item.slot) == tostring(slot_id) then
|
|
return normalize(item)
|
|
end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
function Bridge.Inventory.GetSlotsWithItem(source, item_name, metadata)
|
|
local matches = {}
|
|
for _, item in pairs(get_inventory(source)) do
|
|
local normalized = normalize(item)
|
|
if normalized.name == item_name and Bridge.Inventory.MetadataMatches(normalized.metadata, metadata) then
|
|
matches[#matches + 1] = normalized
|
|
end
|
|
end
|
|
return matches
|
|
end
|
|
|
|
function Bridge.Inventory.SetSlotMetadata(source, slot_id, metadata)
|
|
local identifier = get_identifier(source)
|
|
local slot = identifier and Bridge.Inventory.GetSlot(source, slot_id) or nil
|
|
if not slot then
|
|
return false
|
|
end
|
|
inventory:setItemProperty(identifier, slot.slot, "metadata", metadata or {})
|
|
local updated = Bridge.Inventory.GetSlot(source, slot.slot)
|
|
return updated and Bridge.Inventory.MetadataMatches(updated.metadata, metadata or {}) or false
|
|
end
|
|
|
|
function Bridge.Inventory.CanCarryItem(source, item_name, count)
|
|
local identifier = get_identifier(source)
|
|
return identifier and inventory:canCarry(identifier, item_name, count) == true or false
|
|
end
|
|
|
|
function Bridge.Inventory.AddItem(source, item_name, count, _, metadata)
|
|
local identifier = get_identifier(source)
|
|
if not identifier or not Bridge.Inventory.CanCarryItem(source, item_name, count, metadata) then
|
|
return false
|
|
end
|
|
return inventory:addInventoryItem(identifier, item_name, count, source, 100, metadata or {}) == true
|
|
end
|
|
|
|
function Bridge.Inventory.RemoveItem(source, item_name, count, slot, metadata)
|
|
if metadata and not slot then
|
|
local slots = Bridge.Inventory.GetSlotsWithItem(source, item_name, metadata)
|
|
slot = slots[1] and slots[1].slot or nil
|
|
if not slot then
|
|
return 0
|
|
end
|
|
end
|
|
local identifier = get_identifier(source)
|
|
if not identifier then
|
|
return 0
|
|
end
|
|
return inventory:removeInventoryItem(identifier, item_name, count, source, slot) == true and count or 0
|
|
end
|
|
|
|
function Bridge.Inventory.RegisterUsableItem(item_name, callback)
|
|
ESX.RegisterUsableItem(item_name, function(source, _, _, item)
|
|
callback(source, normalize(item))
|
|
end)
|
|
return true
|
|
end
|