mirror of
https://github.com/sky-systems/sky_phone.git
synced 2026-08-30 01:38:55 +00:00
97db163cd0
* FIX - repair inventory metadata and ESX contracts Use the stable core_inventory metadata setter and validate the complete inventory adapter contract after provider bridges load. Preserve the real ESX configuration error instead of cascading into a missing RegisterUsableItem failure. * FIX - clarify phone opening without SIM * FIX - harden inventory and device contracts Validate SIM number configuration before item handling, preserve QB metadata mutation contracts, and propagate phone-open failures to callers. Extend regression coverage for inventory bridges and device bootstrap errors. * FIX - resolve reported phone interaction issues Stop game-input passthrough while NUI text fields are focused and add an independent hold-to-look option. Propagate SIM number formatting to the frontend, migrate configured currency symbols to utf8mb4, and clarify SkyRide, VaultX, and DarkChat behavior with focused contract coverage. * FIX - detect missing packaged phone UI Validate the generated NUI entrypoint, its referenced assets, and required static media when the resource starts. Print an actionable server-console warning for incomplete source archives, package phone sounds through the manifest, and cover the detection contract with Lua regressions.
87 lines
3.0 KiB
Lua
87 lines
3.0 KiB
Lua
local configured_inventory = Config.Bridge.Inventory
|
|
|
|
if configured_inventory == "auto" then
|
|
if GetResourceState("ox_inventory") == "started" then
|
|
configured_inventory = "ox"
|
|
elseif GetResourceState("qb-inventory") == "started" then
|
|
configured_inventory = "qb"
|
|
elseif GetResourceState("lj-inventory") == "started" then
|
|
configured_inventory = "lj"
|
|
elseif GetResourceState("qs-inventory") == "started" then
|
|
configured_inventory = "qs"
|
|
elseif GetResourceState("codem-inventory") == "started" then
|
|
configured_inventory = "codem"
|
|
elseif GetResourceState("core_inventory") == "started" then
|
|
configured_inventory = "core"
|
|
elseif GetResourceState("mf-inventory") == "started" then
|
|
configured_inventory = "mf"
|
|
elseif GetResourceState("smx-inventory") == "started" then
|
|
configured_inventory = "smx"
|
|
elseif GetResourceState("hex_4_inventory") == "started" then
|
|
configured_inventory = "hex"
|
|
elseif Bridge.Framework.GetName() == "esx" then
|
|
configured_inventory = "esx"
|
|
end
|
|
end
|
|
|
|
local supported_inventories = {
|
|
ox = true,
|
|
qb = true,
|
|
lj = true,
|
|
qs = true,
|
|
codem = true,
|
|
core = true,
|
|
mf = true,
|
|
smx = true,
|
|
hex = true,
|
|
esx = true,
|
|
}
|
|
|
|
if not supported_inventories[configured_inventory] then
|
|
error(("[sky_phone] Unsupported or unavailable inventory '%s'. Configure a supported inventory adapter."):format(tostring(configured_inventory)))
|
|
end
|
|
|
|
Bridge.Inventory.Name = configured_inventory
|
|
|
|
if configured_inventory == "hex" or configured_inventory == "esx" then
|
|
if Bridge.Framework.GetName() ~= "esx" then
|
|
Bridge.Inventory.ConfigurationError =
|
|
("[sky_phone] Inventory '%s' is only supported with ESX."):format(configured_inventory)
|
|
elseif Config.Phone.Unique ~= false or Config.Sim.Enabled ~= false then
|
|
Bridge.Inventory.ConfigurationError = ("[sky_phone] Inventory '%s' cannot store unique phone or physical SIM metadata. Set Config.Phone.Unique = false and Config.Sim.Enabled = false, or configure a metadata-capable inventory.")
|
|
:format(configured_inventory)
|
|
end
|
|
end
|
|
|
|
function Bridge.Inventory.NormalizeItem(item, metadata_field)
|
|
if not item then
|
|
return nil
|
|
end
|
|
|
|
local metadata = item[metadata_field or "metadata"]
|
|
if type(metadata) ~= "table" then
|
|
metadata = item.metadata or item.info
|
|
end
|
|
|
|
return {
|
|
name = item.name,
|
|
slot = item.slot or item.id,
|
|
count = tonumber(item.count or item.amount) or 0,
|
|
amount = tonumber(item.amount or item.count) or 0,
|
|
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
|