756 lines
		
	
	
	
		
			30 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			756 lines
		
	
	
	
		
			30 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)
 | 
						|
 | 
						|
if not Bridge.InventoryEvent then
 | 
						|
    if Bridge.InventoryName == 'ps-inventory' and resource.isMinimalVersion(Bridge.InventoryName, '1.0.5') then
 | 
						|
        Bridge.InventoryEvent = 'ps-inventory'
 | 
						|
    elseif Bridge.InventoryName == 'qb-inventory' and resource.isMinimalVersion(Bridge.InventoryName, '2.0.0') then
 | 
						|
        Bridge.InventoryEvent = 'qb-inventory'
 | 
						|
        QBInventory = exports[Bridge.InventoryName]
 | 
						|
    else
 | 
						|
        Bridge.InventoryEvent = 'inventory'
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
Framework.OnReady(QBCore, function()
 | 
						|
    Framework.Items = {}
 | 
						|
    for k, v in pairs(QBCore.Shared.Items) 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.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)
 | 
						|
 | 
						|
---Get Stash Items
 | 
						|
---@return Item[]
 | 
						|
local function GetStashItems(inventory)
 | 
						|
    inventory = inventory:gsub("%-", "_")
 | 
						|
    local items = {}
 | 
						|
    local result = Database.scalar('SELECT items FROM stashitems WHERE stash = ?', { inventory })
 | 
						|
    if not result then return items end
 | 
						|
 | 
						|
    local stashItems = json.decode(result)
 | 
						|
    if not stashItems then return items end
 | 
						|
 | 
						|
    for _, item in pairs(stashItems) do
 | 
						|
        local itemInfo = Framework.Items[item.name:lower()]
 | 
						|
        if itemInfo then
 | 
						|
            items[item.slot] = {
 | 
						|
                name = itemInfo.name,
 | 
						|
                count = tonumber(item.amount),
 | 
						|
                label = itemInfo.label,
 | 
						|
                description = itemInfo.description,
 | 
						|
                metadata = item.info,
 | 
						|
                stack = itemInfo.stack,
 | 
						|
                weight = itemInfo.weight,
 | 
						|
                close = itemInfo.close,
 | 
						|
                image = itemInfo.image,
 | 
						|
                type = itemInfo.type,
 | 
						|
                slot = item.slot,
 | 
						|
            }
 | 
						|
        end
 | 
						|
    end
 | 
						|
    return items
 | 
						|
end
 | 
						|
 | 
						|
---Add Item To Stash
 | 
						|
---@param inventory string
 | 
						|
---@param item string
 | 
						|
---@param count number
 | 
						|
---@param metadata? table
 | 
						|
---@param slot? number
 | 
						|
---@return boolean
 | 
						|
local function AddStashItem(inventory, item, count, metadata, slot)
 | 
						|
    inventory = inventory:gsub("%-", "_")
 | 
						|
    count = tonumber(count) or 1
 | 
						|
    local stash = {}
 | 
						|
    local result = Database.scalar('SELECT items FROM stashitems WHERE stash = ?', { inventory })
 | 
						|
    if result then stash = json.decode(result) end
 | 
						|
    local itemInfo = QBCore.Shared.Items[item:lower()]
 | 
						|
    metadata = metadata or {}
 | 
						|
    metadata.created = metadata.created or os.time()
 | 
						|
    metadata.quality = metadata.quality or 100
 | 
						|
    if itemInfo['type'] == 'weapon' then
 | 
						|
        metadata.serie = metadata.serie or
 | 
						|
            tostring(Framework.RandomInteger(2) ..
 | 
						|
                Framework.RandomString(3) ..
 | 
						|
                Framework.RandomInteger(1) ..
 | 
						|
                Framework.RandomString(2) .. Framework.RandomInteger(3) .. Framework.RandomString(4))
 | 
						|
    end
 | 
						|
    if not itemInfo.unique then
 | 
						|
        if type(slot) == "number" and stash[slot] and stash[slot].name == item and table.matches(metadata, stash[slot].info) then
 | 
						|
            stash[slot].amount = stash[slot].amount + count
 | 
						|
        else
 | 
						|
            slot = #stash + 1
 | 
						|
            stash[slot] = {
 | 
						|
                name = itemInfo["name"],
 | 
						|
                amount = count,
 | 
						|
                info = metadata or {},
 | 
						|
                label = itemInfo["label"],
 | 
						|
                description = itemInfo["description"] or "",
 | 
						|
                weight = itemInfo["weight"],
 | 
						|
                type = itemInfo["type"],
 | 
						|
                unique = itemInfo["unique"],
 | 
						|
                useable = itemInfo["useable"],
 | 
						|
                image = itemInfo["image"],
 | 
						|
                slot = slot,
 | 
						|
            }
 | 
						|
        end
 | 
						|
    else
 | 
						|
        slot = #stash + 1
 | 
						|
        stash[slot] = {
 | 
						|
            name = itemInfo["name"],
 | 
						|
            amount = count,
 | 
						|
            info = metadata or {},
 | 
						|
            label = itemInfo["label"],
 | 
						|
            description = itemInfo["description"] or "",
 | 
						|
            weight = itemInfo["weight"],
 | 
						|
            type = itemInfo["type"],
 | 
						|
            unique = itemInfo["unique"],
 | 
						|
            useable = itemInfo["useable"],
 | 
						|
            image = itemInfo["image"],
 | 
						|
            slot = slot,
 | 
						|
        }
 | 
						|
    end
 | 
						|
    Database.insert(
 | 
						|
        'INSERT INTO stashitems (stash, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', {
 | 
						|
            ['stash'] = inventory,
 | 
						|
            ['items'] = json.encode(stash)
 | 
						|
        })
 | 
						|
    return true
 | 
						|
end
 | 
						|
 | 
						|
---Remove Item From Stash
 | 
						|
---@param inventory string
 | 
						|
---@param item string
 | 
						|
---@param count number
 | 
						|
---@param metadata? table
 | 
						|
---@param slot? number
 | 
						|
---@return boolean
 | 
						|
local function RemoveStashItem(inventory, item, count, metadata, slot)
 | 
						|
    inventory = inventory:gsub("%-", "_")
 | 
						|
    local stash = {}
 | 
						|
    local result = Database.scalar('SELECT items FROM stashitems WHERE stash = ?', { inventory })
 | 
						|
    if result then stash = json.decode(result) else return false end
 | 
						|
    count = tonumber(count) or 1
 | 
						|
    if type(slot) == "number" and stash[slot] and stash[slot].name == item then
 | 
						|
        if metadata and not table.matches(metadata, stash[slot].info) then return false end
 | 
						|
        if stash[slot].amount > count then
 | 
						|
            stash[slot].amount = stash[slot].amount - count
 | 
						|
        else
 | 
						|
            stash[slot] = nil
 | 
						|
        end
 | 
						|
        Database.insert(
 | 
						|
            'INSERT INTO stashitems (stash, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', {
 | 
						|
                ['stash'] = inventory,
 | 
						|
                ['items'] = json.encode(stash)
 | 
						|
            })
 | 
						|
        return true
 | 
						|
    else
 | 
						|
        local removed = count
 | 
						|
        local newstash = stash
 | 
						|
        for _, v in pairs(stash) do
 | 
						|
            if v.name == item then
 | 
						|
                if metadata and table.matches(metadata, v.info) then
 | 
						|
                    if removed >= v.amount then
 | 
						|
                        newstash[v.slot] = nil
 | 
						|
                        removed = removed - v.amount
 | 
						|
                    else
 | 
						|
                        newstash[v.slot].amount = newstash[v.slot].amount - removed
 | 
						|
                        removed = removed - removed
 | 
						|
                    end
 | 
						|
                elseif not metadata then
 | 
						|
                    if removed >= v.amount then
 | 
						|
                        newstash[v.slot] = nil
 | 
						|
                        removed = removed - v.amount
 | 
						|
                    else
 | 
						|
                        newstash[v.slot].amount = newstash[v.slot].amount - removed
 | 
						|
                        removed = 0
 | 
						|
                    end
 | 
						|
                end
 | 
						|
            end
 | 
						|
 | 
						|
            if removed == 0 then
 | 
						|
                break
 | 
						|
            end
 | 
						|
        end
 | 
						|
 | 
						|
        if removed == 0 then
 | 
						|
            Database.insert(
 | 
						|
                'INSERT INTO stashitems (stash, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', {
 | 
						|
                    ['stash'] = inventory,
 | 
						|
                    ['items'] = json.encode(newstash)
 | 
						|
                })
 | 
						|
            return true
 | 
						|
        else
 | 
						|
            return false
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
Framework.AddItem = function(inventory, item, count, metadata, slot)
 | 
						|
    if type(inventory) == "string" then
 | 
						|
        if QBInventory then
 | 
						|
            return QBInventory:AddItem(inventory, item, count, slot, metadata)
 | 
						|
        else
 | 
						|
            return AddStashItem(inventory, item, count, metadata, slot)
 | 
						|
        end
 | 
						|
    elseif type(inventory) == "number" then
 | 
						|
        local Player = QBCore.Functions.GetPlayer(inventory)
 | 
						|
        if Player.Functions.AddItem(item, count, slot, metadata) then
 | 
						|
            TriggerClientEvent(Bridge.InventoryEvent .. ':client:ItemBox', inventory, QBCore.Shared.Items[item], 'add',
 | 
						|
                count)
 | 
						|
            return true
 | 
						|
        end
 | 
						|
        return false
 | 
						|
    end
 | 
						|
    return false
 | 
						|
end
 | 
						|
 | 
						|
Framework.RemoveItem = function(inventory, item, count, metadata, slot)
 | 
						|
    if type(inventory) == "string" then
 | 
						|
        if QBInventory then
 | 
						|
            local inventoryData = QBInventory:GetInventory(inventory)
 | 
						|
            if not inventoryData then return false end
 | 
						|
            if slot then
 | 
						|
                if metadata then
 | 
						|
                    if table.matches(metadata, Framework.GetItemMetadata(inventory, slot)) then
 | 
						|
                        if QBInventory:RemoveItem(inventory, item, count, slot) then
 | 
						|
                            if type(inventory) == "number" then
 | 
						|
                                TriggerClientEvent(Bridge.InventoryEvent .. ':client:ItemBox', inventory, QBCore.Shared.Items[item], "remove", count)
 | 
						|
                            end
 | 
						|
                            return true
 | 
						|
                        else
 | 
						|
                            return false
 | 
						|
                        end
 | 
						|
                    end
 | 
						|
                    return false
 | 
						|
                else
 | 
						|
                    if QBInventory:RemoveItem(inventory, item, count, slot) then
 | 
						|
                        TriggerClientEvent(Bridge.InventoryEvent .. ':client:ItemBox', inventory, QBCore.Shared.Items[item], "remove", count)
 | 
						|
                        return true
 | 
						|
                    else
 | 
						|
                        return false
 | 
						|
                    end
 | 
						|
                end
 | 
						|
            else
 | 
						|
                local removed = count
 | 
						|
                local removedItems = {}
 | 
						|
                for _, v in pairs(inventoryData.items) do
 | 
						|
                    if metadata and table.matches(metadata, Framework.GetItemMetadata(inventory, v.slot)) then
 | 
						|
                        if removed >= v.amount and QBInventory:RemoveItem(inventory, item, v.amount, v.slot) then
 | 
						|
                            removedItems[#removedItems + 1] = v
 | 
						|
                            removed = removed - v.amount
 | 
						|
                        elseif QBInventory:RemoveItem(inventory, item, removed, v.slot) then
 | 
						|
                            removedItems[#removedItems + 1] = v
 | 
						|
                            removed = removed - removed
 | 
						|
                        end
 | 
						|
                    elseif not metadata then
 | 
						|
                        if removed >= v.amount and QBInventory:RemoveItem(inventory, item, v.amount, v.slot) then
 | 
						|
                            removedItems[#removedItems + 1] = v
 | 
						|
                            removed = removed - v.amount
 | 
						|
                        elseif QBInventory:RemoveItem(inventory, item, removed, v.slot) then
 | 
						|
                            removedItems[#removedItems + 1] = v
 | 
						|
                            removed = removed - removed
 | 
						|
                        end
 | 
						|
                    end
 | 
						|
                    if removed == 0 then
 | 
						|
                        break
 | 
						|
                    end
 | 
						|
                end
 | 
						|
 | 
						|
                if removed == 0 then
 | 
						|
                    if type(inventory) == "number" then
 | 
						|
                        TriggerClientEvent(Bridge.InventoryEvent .. ':client:ItemBox', inventory,
 | 
						|
                            QBCore.Shared.Items[item],
 | 
						|
                            "remove", count)
 | 
						|
                    end
 | 
						|
                    return true
 | 
						|
                else
 | 
						|
                    for _, v in pairs(removedItems) do
 | 
						|
                        Framework.AddItem(inventory, item, v.amount, v.slot, v.info)
 | 
						|
                    end
 | 
						|
                    return false
 | 
						|
                end
 | 
						|
            end
 | 
						|
        else
 | 
						|
            return RemoveStashItem(inventory, item, count, metadata, slot)
 | 
						|
        end
 | 
						|
    elseif type(inventory) == "number" then
 | 
						|
        local Player = QBCore.Functions.GetPlayer(inventory)
 | 
						|
        if slot then
 | 
						|
            if metadata then
 | 
						|
                if table.matches(metadata, Framework.GetItemMetadata(inventory, slot)) then
 | 
						|
                    if Player.Functions.RemoveItem(item, count, slot) then
 | 
						|
                        TriggerClientEvent(Bridge.InventoryEvent .. ':client:ItemBox', inventory,
 | 
						|
                            QBCore.Shared.Items[item], "remove", count)
 | 
						|
                        return true
 | 
						|
                    else
 | 
						|
                        return false
 | 
						|
                    end
 | 
						|
                end
 | 
						|
                return false
 | 
						|
            else
 | 
						|
                if Player.Functions.GetItemBySlot(slot) and Player.Functions.RemoveItem(item, count, slot) then
 | 
						|
                    TriggerClientEvent(Bridge.InventoryEvent .. ':client:ItemBox', inventory, QBCore.Shared.Items[item],
 | 
						|
                        "remove", count)
 | 
						|
                    return true
 | 
						|
                else
 | 
						|
                    return false
 | 
						|
                end
 | 
						|
            end
 | 
						|
        else
 | 
						|
            local removed = count
 | 
						|
            local removedItems = {}
 | 
						|
            local items = Player.Functions.GetItemsByName(item)
 | 
						|
            for _, v in pairs(items) do
 | 
						|
                if metadata and table.matches(metadata, Framework.GetItemMetadata(inventory, v.slot)) then
 | 
						|
                    if removed >= v.amount and Player.Functions.RemoveItem(item, v.amount, v.slot) then
 | 
						|
                        removedItems[#removedItems + 1] = v
 | 
						|
                        removed = removed - v.amount
 | 
						|
                    elseif Player.Functions.RemoveItem(item, removed, v.slot) then
 | 
						|
                        removedItems[#removedItems + 1] = v
 | 
						|
                        removed = removed - removed
 | 
						|
                    end
 | 
						|
                elseif not metadata then
 | 
						|
                    if removed >= v.amount and Player.Functions.RemoveItem(item, v.amount, v.slot) then
 | 
						|
                        removedItems[#removedItems + 1] = v
 | 
						|
                        removed = removed - v.amount
 | 
						|
                    elseif Player.Functions.RemoveItem(item, removed, v.slot) then
 | 
						|
                        removedItems[#removedItems + 1] = v
 | 
						|
                        removed = removed - removed
 | 
						|
                    end
 | 
						|
                end
 | 
						|
                if removed == 0 then
 | 
						|
                    break
 | 
						|
                end
 | 
						|
            end
 | 
						|
 | 
						|
            if removed == 0 then
 | 
						|
                TriggerClientEvent(Bridge.InventoryEvent .. ':client:ItemBox', inventory, QBCore.Shared.Items[item],
 | 
						|
                    "remove", count)
 | 
						|
                return true
 | 
						|
            else
 | 
						|
                for _, v in pairs(removedItems) do
 | 
						|
                    Framework.AddItem(inventory, item, v.amount, v.slot, v.info)
 | 
						|
                end
 | 
						|
                return false
 | 
						|
            end
 | 
						|
        end
 | 
						|
    end
 | 
						|
    return false
 | 
						|
end
 | 
						|
 | 
						|
---@diagnostic disable-next-line: duplicate-set-field
 | 
						|
Framework.GetItem = function(inventory, item, metadata, strict)
 | 
						|
    local items = {}
 | 
						|
    ---@cast items table<number, Item>
 | 
						|
    if type(inventory) == "string" then
 | 
						|
        if QBInventory then
 | 
						|
            local inventoryData = QBInventory:GetInventory(inventory)
 | 
						|
            if not inventoryData then return items end
 | 
						|
            for k, v in pairs(inventoryData.items) 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] = v
 | 
						|
                ::skipLoop::
 | 
						|
            end
 | 
						|
        else
 | 
						|
            for k, v in pairs(GetStashItems(inventory)) do
 | 
						|
                if v.name ~= item then goto skipLoop end
 | 
						|
                if metadata and (strict and not table.matches(v.metadata, metadata) or not table.contains(v.metadata, metadata)) then goto skipLoop end
 | 
						|
                items[#items + 1] = v
 | 
						|
                ::skipLoop::
 | 
						|
            end
 | 
						|
        end
 | 
						|
    elseif type(inventory) == "number" then
 | 
						|
        local Player = QBCore.Functions.GetPlayer(inventory)
 | 
						|
        for k, v in pairs(Player.PlayerData.items) 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
 | 
						|
    end
 | 
						|
    return items
 | 
						|
end
 | 
						|
 | 
						|
Framework.GetItemCount = function(inventory, item, metadata, strict)
 | 
						|
    local count = 0
 | 
						|
    if type(inventory) == "string" then
 | 
						|
        if QBInventory then
 | 
						|
            local inventoryData = QBInventory:GetInventory(inventory)
 | 
						|
            if not inventoryData then return count end
 | 
						|
            for k, v in pairs(inventoryData.items) 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
 | 
						|
                count = count + tonumber(v.amount)
 | 
						|
                ::skipLoop::
 | 
						|
            end
 | 
						|
        else
 | 
						|
            for k, v in pairs(GetStashItems(inventory)) do
 | 
						|
                if v.name ~= item then goto skipLoop end
 | 
						|
                if metadata and (strict and not table.matches(v.metadata, metadata) or not table.contains(v.metadata, metadata)) then
 | 
						|
                    goto skipLoop
 | 
						|
                end
 | 
						|
                count = count + tonumber(v.count)
 | 
						|
                ::skipLoop::
 | 
						|
            end
 | 
						|
        end
 | 
						|
    elseif type(inventory) == "number" then
 | 
						|
        local Player = QBCore.Functions.GetPlayer(inventory)
 | 
						|
        local items = Player.Functions.GetItemsByName(item)
 | 
						|
        for k, v in pairs(items) 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
 | 
						|
            count = count + tonumber(v.amount)
 | 
						|
            ::skipLoop::
 | 
						|
        end
 | 
						|
    end
 | 
						|
    return count
 | 
						|
end
 | 
						|
 | 
						|
---@diagnostic disable-next-line: duplicate-set-field
 | 
						|
Framework.HasItem = function(inventory, items, count, metadata, strict)
 | 
						|
    if type(items) == "string" then
 | 
						|
        local counted = 0
 | 
						|
        for _, v in pairs(Framework.GetItem(inventory, 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(inventory, 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(inventory, item, metadata, strict)) do
 | 
						|
                    counted += v.count
 | 
						|
                end
 | 
						|
                if counted < (count or 1) then return false end
 | 
						|
            end
 | 
						|
            return true
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
Framework.GetItemMetadata = function(inventory, slot)
 | 
						|
    if type(inventory) == "string" then
 | 
						|
        inventory = inventory:gsub("%-", "_")
 | 
						|
        if QBInventory then
 | 
						|
            local inventoryData = QBInventory:GetInventory(inventory)
 | 
						|
            if not inventoryData then return {} end
 | 
						|
            for k, v in pairs(inventoryData.items) do
 | 
						|
                if v.slot == slot then
 | 
						|
                    return v.info
 | 
						|
                end
 | 
						|
            end
 | 
						|
            return {}
 | 
						|
        else
 | 
						|
            local result = Database.scalar('SELECT items FROM stashitems WHERE stash = ?', { inventory })
 | 
						|
            if not result then return nil end
 | 
						|
            local stash = json.decode(result)
 | 
						|
            for k, item in pairs(stash) do
 | 
						|
                if item.slot == slot then
 | 
						|
                    return item.info
 | 
						|
                end
 | 
						|
            end
 | 
						|
            return {}
 | 
						|
        end
 | 
						|
    elseif type(inventory) == "number" then
 | 
						|
        local Player = QBCore.Functions.GetPlayer(inventory)
 | 
						|
        return Player.Functions.GetItemBySlot(slot)?.info
 | 
						|
    end
 | 
						|
    return {}
 | 
						|
end
 | 
						|
 | 
						|
Framework.SetItemMetadata = function(inventory, slot, metadata)
 | 
						|
    if type(inventory) == "string" then
 | 
						|
        inventory = inventory:gsub("%-", "_")
 | 
						|
        if QBInventory then
 | 
						|
            local inventoryData = QBInventory:GetInventory(inventory)
 | 
						|
            for k, v in pairs(inventoryData.items) do
 | 
						|
                if v.slot == slot then
 | 
						|
                    inventoryData.items[k].info = metadata
 | 
						|
                    break
 | 
						|
                end
 | 
						|
            end
 | 
						|
            QBInventory:SetInventory(inventory, inventoryData.items)
 | 
						|
        else
 | 
						|
            local result = Database.scalar('SELECT items FROM stashitems WHERE stash = ?', { inventory })
 | 
						|
            if not result then return end
 | 
						|
            local stash = json.decode(result)
 | 
						|
            for k, item in pairs(stash) do
 | 
						|
                if item.slot == slot then
 | 
						|
                    stash[k].info = metadata
 | 
						|
                    break
 | 
						|
                end
 | 
						|
            end
 | 
						|
            if not next(stash) then return end
 | 
						|
            Database.insert(
 | 
						|
                'INSERT INTO stashitems (stash, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', {
 | 
						|
                    ['stash'] = inventory,
 | 
						|
                    ['items'] = json.encode(stash)
 | 
						|
                })
 | 
						|
        end
 | 
						|
    elseif type(inventory) == "number" then
 | 
						|
        local Player = QBCore.Functions.GetPlayer(inventory)
 | 
						|
        if Player.PlayerData.items[slot] then
 | 
						|
            Player.PlayerData.items[slot].info = metadata
 | 
						|
            Player.Functions.SetInventory(Player.PlayerData.items)
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
Framework.GetInventory = function(inventory)
 | 
						|
    local items = {}
 | 
						|
    if type(inventory) == "string" then
 | 
						|
        if QBInventory then
 | 
						|
            local inventoryData = QBInventory:GetInventory(inventory)
 | 
						|
            for k, v in pairs(inventoryData.items) do
 | 
						|
                items[k] = {
 | 
						|
                    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,
 | 
						|
                }
 | 
						|
            end
 | 
						|
        else
 | 
						|
            items = GetStashItems(inventory)
 | 
						|
        end
 | 
						|
    elseif type(inventory) == "number" then
 | 
						|
        local Player = QBCore.Functions.GetPlayer(inventory)
 | 
						|
        for k, v in pairs(Player.PlayerData.items) do
 | 
						|
            items[k] = {
 | 
						|
                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,
 | 
						|
            }
 | 
						|
        end
 | 
						|
    end
 | 
						|
    return items
 | 
						|
end
 | 
						|
 | 
						|
Framework.ClearInventory = function(inventory, keep)
 | 
						|
    if type(inventory) == "string" then
 | 
						|
        inventory = inventory:gsub("%-", "_")
 | 
						|
        local stash = {}
 | 
						|
        if QBInventory then
 | 
						|
            local inventoryData = QBInventory:GetInventory(inventory)
 | 
						|
            if keep then
 | 
						|
                local keepType = type(keep)
 | 
						|
                if keepType == "string" then
 | 
						|
                    for k, v in pairs(inventoryData.items) do
 | 
						|
                        if v.name == keep then
 | 
						|
                            stash[k] = v
 | 
						|
                        end
 | 
						|
                    end
 | 
						|
                elseif keepType == "table" and table.type(keep) == "array" then
 | 
						|
                    for k, v in pairs(inventoryData.items) do
 | 
						|
                        for i = 1, #keep do
 | 
						|
                            if v.name == keep[i] then
 | 
						|
                                stash[k] = v
 | 
						|
                            end
 | 
						|
                        end
 | 
						|
                    end
 | 
						|
                end
 | 
						|
            end
 | 
						|
            QBInventory:SetInventory(inventory, stash)
 | 
						|
        else
 | 
						|
            if keep then
 | 
						|
                local result = Database.scalar('SELECT items FROM stashitems WHERE stash = ?', { inventory })
 | 
						|
                if not result then return end
 | 
						|
 | 
						|
                local stashItems = json.decode(result)
 | 
						|
                if not next(stashItems) then return end
 | 
						|
 | 
						|
                local keepType = type(keep)
 | 
						|
                if keepType == "string" then
 | 
						|
                    for k, v in pairs(stashItems) do
 | 
						|
                        if v.name == keep then
 | 
						|
                            stash[k] = v
 | 
						|
                        end
 | 
						|
                    end
 | 
						|
                elseif keepType == "table" and table.type(keep) == "array" then
 | 
						|
                    for k, v in pairs(stashItems) do
 | 
						|
                        for i = 1, #keep do
 | 
						|
                            if v.name == keep[i] then
 | 
						|
                                stash[k] = v
 | 
						|
                            end
 | 
						|
                        end
 | 
						|
                    end
 | 
						|
                end
 | 
						|
            end
 | 
						|
 | 
						|
            Database.insert(
 | 
						|
                'INSERT INTO stashitems (stash, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', {
 | 
						|
                    ['stash'] = inventory,
 | 
						|
                    ['items'] = json.encode(stash)
 | 
						|
                })
 | 
						|
        end
 | 
						|
    elseif type(inventory) == "number" then
 | 
						|
        local Player = QBCore.Functions.GetPlayer(inventory)
 | 
						|
        Player.Functions.ClearInventory(keep)
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
local stashes = {}
 | 
						|
Framework.RegisterStash = function(name, slots, weight, owner, groups)
 | 
						|
    name = name:gsub("%-", "_")
 | 
						|
    if not stashes[name] then
 | 
						|
        if QBInventory then
 | 
						|
            QBInventory:CreateInventory(name, { maxweight = weight, slots = slots })
 | 
						|
            stashes[name] = { slots = slots, weight = weight, owner = owner, groups = groups }
 | 
						|
        else
 | 
						|
            stashes[name] = { slots = slots, weight = weight, owner = owner, groups = groups }
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
RegisterNetEvent(Bridge.Resource .. ':bridge:OpenStash', function(name)
 | 
						|
    local src = source
 | 
						|
    name = name:gsub("%-", "_")
 | 
						|
    local stash = stashes[name]
 | 
						|
    if not stash then return end
 | 
						|
    local Player = Framework.GetPlayer(src)
 | 
						|
    if not Player then return end
 | 
						|
    local isAllowed = false
 | 
						|
    if stash.groups and Framework.HasJob(stash.groups, Player) then isAllowed = true end
 | 
						|
    if stash.groups and Framework.HasGang(stash.groups, Player) then isAllowed = true end
 | 
						|
    if stash.groups and not isAllowed then return end
 | 
						|
    if stash.owner and type(stash.owner) == 'string' and Player.Identifier ~= stash.owner then return end
 | 
						|
    if stash.owner and type(stash.owner) == 'boolean' then name = name .. Player.Identifier end
 | 
						|
    QBInventory:OpenInventory(src, name, { maxweight = stash.weight, slots = stash.slots })
 | 
						|
end)
 | 
						|
 | 
						|
Framework.CreateCallback(Bridge.Resource .. ':bridge:GetStash', function(source, cb, name)
 | 
						|
    name = name:gsub("%-", "_")
 | 
						|
    cb(stashes[name] and stashes[name] or nil)
 | 
						|
end)
 | 
						|
 | 
						|
local shops = {}
 | 
						|
Framework.RegisterShop = function(name, data)
 | 
						|
    if shops[name] then return end
 | 
						|
    if QBInventory then
 | 
						|
        local items = {}
 | 
						|
        for i = 1, #data.items do
 | 
						|
            items[i] = {
 | 
						|
                name = data.items[i].name,
 | 
						|
                price = data.items[i].price,
 | 
						|
                amount = data.items[i].count or 1,
 | 
						|
                info = data.items[i].metadata or {},
 | 
						|
                slot = i
 | 
						|
            }
 | 
						|
        end
 | 
						|
 | 
						|
        QBInventory:CreateShop({
 | 
						|
            name = name,
 | 
						|
            label = name,
 | 
						|
            slots = #items,
 | 
						|
            items = items
 | 
						|
        })
 | 
						|
    end
 | 
						|
    shops[name] = data
 | 
						|
end
 | 
						|
 | 
						|
RegisterNetEvent(Bridge.Resource .. ':bridge:OpenShop', function(name)
 | 
						|
    local src = source
 | 
						|
    if not shops[name] then return end
 | 
						|
    local isAllowed = false
 | 
						|
    local Player = Framework.GetPlayer(src)
 | 
						|
    if not Player then return end
 | 
						|
    if shops[name].groups and Framework.HasJob(shops[name].groups, Player) then isAllowed = true end
 | 
						|
    if shops[name].groups and Framework.HasGang(shops[name].groups, Player) then isAllowed = true end
 | 
						|
    if type(shops[name].groups) == "table" and (shops[name].groups and not isAllowed) then return end
 | 
						|
    QBInventory:OpenShop(src, name)
 | 
						|
end)
 | 
						|
 | 
						|
Framework.CreateCallback(Bridge.Resource .. ':bridge:OpenShop', function(source, cb, name)
 | 
						|
    if not shops[name] then cb({}) end
 | 
						|
    local isAllowed = false
 | 
						|
    local Player = Framework.GetPlayer(source)
 | 
						|
    if shops[name].groups and Framework.HasJob(shops[name].groups, Player) then isAllowed = true end
 | 
						|
    if shops[name].groups and Framework.HasGang(shops[name].groups, Player) then isAllowed = true end
 | 
						|
    if type(shops[name].groups) == "table" and (shops[name].groups and not isAllowed) then cb({}) end
 | 
						|
    cb(shops[name])
 | 
						|
end)
 | 
						|
 | 
						|
Framework.ConfiscateInventory = function(source)
 | 
						|
    local src = source
 | 
						|
    local Player = QBCore.Functions.GetPlayer(src)
 | 
						|
    if not Player then return end
 | 
						|
    Player.Functions.SetMetaData("jailitems", Player.PlayerData.items)
 | 
						|
    Wait(2000)
 | 
						|
    Player.Functions.ClearInventory()
 | 
						|
end
 | 
						|
 | 
						|
Framework.ReturnInventory = function(source)
 | 
						|
    local src = source
 | 
						|
    local Player = QBCore.Functions.GetPlayer(src)
 | 
						|
    if not Player then return end
 | 
						|
    for _, item in pairs(Player.PlayerData.metadata['jailitems']) do
 | 
						|
        if item ~= nil then
 | 
						|
            Player.Functions.AddItem(item.name, item.amount, false, item.info)
 | 
						|
            TriggerClientEvent(Bridge.InventoryEvent .. ':client:ItemBox', src, QBCore.Shared.Items[item.name], 'add', item.amount)
 | 
						|
        end
 | 
						|
    end
 | 
						|
    Wait(2000)
 | 
						|
    Player.Functions.SetMetaData("jailitems", {})
 | 
						|
end
 |