1
0
Fork 0
forked from Simnation/Main
Main/resources/[Developer]/[Anna]/ngd-Bridge/inventory/qs-inventory/client.lua
2025-06-07 08:51:21 +02:00

133 lines
No EOL
4.8 KiB
Lua

---@diagnostic disable: duplicate-set-field
module 'shared/debug'
module 'shared/resource'
module 'shared/table'
Version = resource.version(Bridge.InventoryName)
Bridge.Debug('Inventory', Bridge.InventoryName, Version)
local qs_inventory = exports[Bridge.InventoryName]
Framework.OnReady(qs_inventory, function()
Framework.Items = {}
for k, v in pairs(qs_inventory:GetItemList()) do
local item = {}
if not v.name then v.name = k end
item.name = v.name
item.label = v.label
item.description = v.description
item.stack = not v.unique and true
item.weight = v.weight or 0
item.close = v.shouldClose == nil and true or v.shouldClose
item.image = v.image
item.type = v.type
Framework.Items[v.name] = item
end
setmetatable(Framework.Items, {
__index = function(table, key)
error(('^9Item \'%s\' Does Not Exist.^0'):format(tostring(key)), 0)
end
})
end)
Framework.OpenStash = function(name)
name = name:gsub("%-", "_")
Framework.TriggerCallback(Bridge.Resource .. ':bridge:GetStash', function(stash)
if not stash then return end
local isAllowed = false
if stash.groups and Framework.HasJob(stash.groups, Framework.Player) then isAllowed = true end
if stash.groups and Framework.HasGang(stash.groups, Framework.Player) then isAllowed = true end
if stash.groups and not isAllowed then return end
if stash.owner and type(stash.owner) == 'string' and Framework.Player.Identifier ~= stash.owner then return end
if stash.owner and type(stash.owner) == 'boolean' then name = name .. Framework.Player.Identifier end
qs_inventory:RegisterStash(name, stash.slots, stash.weight)
end, name)
end
Framework.OpenShop = function(name)
Framework.TriggerCallback(Bridge.Resource .. ':bridge:OpenShop', function(shopdata)
if table.type(shopdata) ~= 'empty' then
local Shop = {}
Shop.label = shopdata.name
Shop.items = {}
for i = 1, #shopdata.items do
Shop.items[i] = {
name = shopdata.items[i].name,
price = shopdata.items[i].price,
amount = shopdata.items[i].count or 1,
info = shopdata.items[i].metadata or {},
type = Framework.Items[shopdata.items[i].name].type,
slot = i
}
end
TriggerServerEvent("inventory:server:OpenInventory", "shop", shopdata.name, Shop)
end
end, name)
end
Framework.CloseInventory = function()
ExecuteCommand('closeinv')
end
Framework.GetItem = function(item, metadata, strict)
local items = {}
---@cast items table<number, Item>
for k, v in pairs(qs_inventory:getUserInventory()) do
if v.name ~= item then goto skipLoop end
if metadata and (strict and not table.matches(v.info, metadata) or not table.contains(v.info, metadata)) then goto skipLoop end
items[#items + 1] = {
name = v.name,
count = tonumber(v.amount),
label = v.label,
description = v.description,
metadata = v.info,
stack = not v.unique and true,
weight = v.weight or 0,
close = v.shouldClose == nil and true or v.shouldClose,
image = v.image,
type = v.type,
slot = v.slot,
}
::skipLoop::
end
return items
end
Framework.HasItem = function(items, count, metadata, strict)
if type(items) == "string" then
local counted = 0
for _, v in pairs(Framework.GetItem(items, metadata, strict)) do
counted+=v.count
end
return counted >= (count or 1)
elseif type(items) == "table" then
if table.type(items) == 'hash' then
for item, amount in pairs(items) do
local counted = 0
for _, v in pairs(Framework.GetItem(item, metadata, strict)) do
counted+=v.count
end
if counted < amount then return false end
end
return true
elseif table.type(items) == 'array' then
local counted = 0
for i = 1, #items do
local item = items[i]
for _, v in pairs(Framework.GetItem(item, metadata, strict)) do
counted+=v.count
end
if counted < (count or 1) then return false end
end
return true
end
end
end
Framework.LockInventory = function()
LocalPlayer.state:set('inv_busy', true, true)
end
Framework.UnlockInventory = function()
LocalPlayer.state:set('inv_busy', false, true)
end