mirror of
https://github.com/sky-systems/sky_phone.git
synced 2026-08-29 04:01:32 +00:00
4fa4bf3c78
* ENH - centralize phone configuration defaults * FIX - enforce fixed phone permissions
133 lines
4.7 KiB
Lua
133 lines
4.7 KiB
Lua
local inventory_adapters = {
|
|
{ name = "jaksam", resource = "jaksam_inventory" },
|
|
{ name = "qs", resource = "qs-inventory" },
|
|
{ name = "ps", resource = "ps-inventory", framework = "qb" },
|
|
{ name = "codem", resource = "codem-inventory" },
|
|
{ name = "tgiann", resource = "tgiann-inventory" },
|
|
{ name = "core", resource = "core_inventory" },
|
|
{ name = "jpr", resource = "jpr-inventory", framework = "qb" },
|
|
{ name = "origen", resource = "origen_inventory" },
|
|
{ name = "ak47", resource = "ak47_inventory" },
|
|
{ name = "one", resource = "one_inventory" },
|
|
{ name = "ox", resource = "ox_inventory" },
|
|
{ name = "mf", resource = "mf-inventory", framework = "esx" },
|
|
{ name = "smx", resource = "smx-inventory", framework = "esx" },
|
|
{ name = "lj", resource = "lj-inventory" },
|
|
{ name = "qb", resource = "qb-inventory" },
|
|
{ name = "hex", resource = "hex_4_inventory", framework = "esx", metadata = false },
|
|
{ name = "esx", resource = "es_extended", framework = "esx", metadata = false },
|
|
}
|
|
|
|
local inventory_aliases = {
|
|
["qb-inv"] = "qb",
|
|
qbox = "ox",
|
|
}
|
|
local supported_inventories = {}
|
|
for _, adapter in ipairs(inventory_adapters) do
|
|
inventory_aliases[adapter.resource] = adapter.name
|
|
supported_inventories[adapter.name] = adapter
|
|
end
|
|
|
|
local configured_inventory = Config.Bridge.Inventory
|
|
configured_inventory = inventory_aliases[configured_inventory] or configured_inventory
|
|
local framework_name = Bridge.Framework.GetName()
|
|
|
|
if configured_inventory == "auto" then
|
|
for _, adapter in ipairs(inventory_adapters) do
|
|
local compatible_framework = not adapter.framework or adapter.framework == framework_name
|
|
if adapter.name ~= "esx" and compatible_framework and GetResourceState(adapter.resource) == "started" then
|
|
configured_inventory = adapter.name
|
|
break
|
|
end
|
|
end
|
|
|
|
if configured_inventory == "auto" and framework_name == "esx" then
|
|
configured_inventory = "esx"
|
|
end
|
|
end
|
|
|
|
local selected_adapter = supported_inventories[configured_inventory]
|
|
if not selected_adapter then
|
|
error(("[sky_phone] Unsupported or unavailable inventory '%s'. Configure a supported inventory adapter."):format(tostring(configured_inventory)))
|
|
end
|
|
if GetResourceState(selected_adapter.resource) ~= "started" then
|
|
error(("[sky_phone] Inventory '%s' is configured, but resource '%s' is not started.")
|
|
:format(tostring(configured_inventory), selected_adapter.resource))
|
|
end
|
|
if selected_adapter.framework and selected_adapter.framework ~= framework_name then
|
|
error(("[sky_phone] Inventory '%s' is only supported with framework '%s'.")
|
|
:format(tostring(configured_inventory), selected_adapter.framework))
|
|
end
|
|
|
|
Bridge.Inventory.Name = configured_inventory
|
|
|
|
local metadata_free_inventory = selected_adapter.metadata == false
|
|
|
|
local function enforce_metadata_compatibility()
|
|
if not metadata_free_inventory then
|
|
return
|
|
end
|
|
|
|
local modes_changed = Config.Phone.Unique ~= false or Config.Sim.Enabled ~= false
|
|
Config.Phone.Unique = false
|
|
Config.Sim.Enabled = false
|
|
|
|
if modes_changed then
|
|
Bridge.Debug(
|
|
"warn",
|
|
"[sky_phone] Inventory '%s' does not support item metadata; unique phones and physical SIM cards were disabled automatically.",
|
|
configured_inventory
|
|
)
|
|
end
|
|
end
|
|
|
|
enforce_metadata_compatibility()
|
|
|
|
AddEventHandler("sky_phone:configurator:serverUpdated", enforce_metadata_compatibility)
|
|
|
|
function Bridge.Inventory.NormalizeItem(item, metadata_field, fallback_slot)
|
|
if type(item) ~= "table" then
|
|
return nil
|
|
end
|
|
|
|
local metadata = item[metadata_field or "metadata"]
|
|
if type(metadata) ~= "table" then
|
|
metadata = item.metadata or item.info
|
|
end
|
|
|
|
local slot = item.slot or item.id or fallback_slot
|
|
local numeric_slot = tonumber(slot)
|
|
local count = tonumber(item.count or item.amount or item.quantity) or 0
|
|
|
|
return {
|
|
name = item.name or item.item,
|
|
slot = numeric_slot or slot,
|
|
count = count,
|
|
amount = count,
|
|
metadata = type(metadata) == "table" and metadata or {},
|
|
}
|
|
end
|
|
|
|
function Bridge.Inventory.MetadataMatches(actual, expected)
|
|
if type(expected) ~= "table" then
|
|
return true
|
|
end
|
|
actual = type(actual) == "table" and actual or {}
|
|
for key, value in pairs(expected) do
|
|
if actual[key] ~= value then
|
|
return false
|
|
end
|
|
end
|
|
return true
|
|
end
|
|
|
|
function Bridge.Inventory.ResolveUsableItem(...)
|
|
for index = select("#", ...), 1, -1 do
|
|
local candidate = select(index, ...)
|
|
if type(candidate) == "table" and (candidate.name or candidate.item) then
|
|
return candidate
|
|
end
|
|
end
|
|
return nil
|
|
end
|