Scripts/resources/[ps]/ps-inventory/server/main.lua
2024-12-29 21:29:10 +01:00

2712 lines
118 KiB
Lua

-- Variables
local QBCore = exports['qb-core']:GetCoreObject()
local Drops = {}
local Trunks = {}
local Gloveboxes = {}
local Stashes = {}
local ShopItems = {}
-- Functions
---Loads the inventory for the player with the citizenid that is provided
local function LoadInventory(source, citizenid)
local inventory = MySQL.prepare.await('SELECT inventory FROM players WHERE citizenid = ?', { citizenid })
local loadedInventory = {}
local missingItems = {}
if not inventory then return loadedInventory end
inventory = json.decode(inventory)
if table.type(inventory) == "empty" then return loadedInventory end
for _, item in pairs(inventory) do
if item then
local itemInfo = QBCore.Shared.Items[item.name:lower()]
if itemInfo then
loadedInventory[item.slot] = {
name = itemInfo['name'],
amount = item.amount,
info = item.info or '',
label = itemInfo['label'],
description = itemInfo['description'] or '',
weight = itemInfo['weight'],
type = itemInfo['type'],
unique = itemInfo['unique'],
useable = itemInfo['useable'],
image = itemInfo['image'],
shouldClose = itemInfo['shouldClose'],
slot = item.slot,
combinable = itemInfo['combinable'],
created = item.created,
}
else
missingItems[#missingItems + 1] = item.name:lower()
end
end
end
if #missingItems > 0 then
print(("The following items were removed for player %s as they no longer exist"):format(GetPlayerName(source)))
QBCore.Debug(missingItems)
end
return loadedInventory
end
exports("LoadInventory", LoadInventory)
---Saves the inventory for the player with the provided source or PlayerData is they're offline
local function SaveInventory(source, offline)
local PlayerData
if not offline then
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return end
PlayerData = Player.PlayerData
else
PlayerData = source -- for offline users, the playerdata gets sent over the source variable
end
local items = PlayerData.items
local ItemsJson = {}
if items and table.type(items) ~= "empty" then
for slot, item in pairs(items) do
if items[slot] then
ItemsJson[#ItemsJson+1] = {
name = item.name,
amount = item.amount,
info = item.info,
type = item.type,
slot = slot,
created = item.created
}
end
end
MySQL.prepare('UPDATE players SET inventory = ? WHERE citizenid = ?', { json.encode(ItemsJson), PlayerData.citizenid })
else
MySQL.prepare('UPDATE players SET inventory = ? WHERE citizenid = ?', { '[]', PlayerData.citizenid })
end
end
exports("SaveInventory", SaveInventory)
---Gets the totalweight of the items provided
local function GetTotalWeight(items)
local weight = 0
if not items then return 0 end
for _, item in pairs(items) do
weight += item.weight * item.amount
end
return tonumber(weight)
end
exports("GetTotalWeight", GetTotalWeight)
---Gets the slots that the provided item is in
local function GetSlotsByItem(items, itemName)
local slotsFound = {}
if not items then return slotsFound end
for slot, item in pairs(items) do
if item.name:lower() == itemName:lower() then
slotsFound[#slotsFound+1] = slot
end
end
return slotsFound
end
exports("GetSlotsByItem", GetSlotsByItem)
---Get the first slot where the item is located
local function GetFirstSlotByItem(items, itemName)
if not items then return nil end
for slot, item in pairs(items) do
if item.name:lower() == itemName:lower() then
return tonumber(slot)
end
end
return nil
end
exports("GetFirstSlotByItem", GetFirstSlotByItem)
---Add an item to the inventory of the player
local function AddItem(source, item, amount, slot, info, created)
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return false end
local totalWeight = GetTotalWeight(Player.PlayerData.items)
local itemInfo = QBCore.Shared.Items[item:lower()]
local time = os.time()
if not created then
itemInfo['created'] = time
else
itemInfo['created'] = created
end
if not itemInfo and not Player.Offline then
QBCore.Functions.Notify(source, "Ting findes ikke", 'error')
return false
end
amount = tonumber(amount) or 1
slot = tonumber(slot) or GetFirstSlotByItem(Player.PlayerData.items, item)
info = info or {}
itemInfo['created'] = created or time
info.quality = info.quality or 100
if itemInfo['type'] == 'weapon' then
info.serie = info.serie or tostring(QBCore.Shared.RandomInt(2) .. QBCore.Shared.RandomStr(3) .. QBCore.Shared.RandomInt(1) .. QBCore.Shared.RandomStr(2) .. QBCore.Shared.RandomInt(3) .. QBCore.Shared.RandomStr(4))
info.quality = info.quality or 100
end
if (totalWeight + (itemInfo['weight'] * amount)) <= Config.MaxInventoryWeight then
if (slot and Player.PlayerData.items[slot]) and (Player.PlayerData.items[slot].name:lower() == item:lower()) and (itemInfo['type'] == 'item' and not itemInfo['unique']) then
if Player.PlayerData.items[slot].info.quality == info.quality then
Player.PlayerData.items[slot].amount = Player.PlayerData.items[slot].amount + amount
Player.Functions.SetPlayerData("items", Player.PlayerData.items)
if Player.Offline then return true end
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'AddItem', 'green', '**' .. GetPlayerName(source) .. ' (citizenid: ' .. Player.PlayerData.citizenid .. ' | id: ' .. source .. ')** got item: [slot:' .. slot .. '], itemname: ' .. Player.PlayerData.items[slot].name .. ', added amount: ' .. amount .. ', new total amount: ' .. Player.PlayerData.items[slot].amount)
return true
else
for i = 1, Config.MaxInventorySlots, 1 do
if Player.PlayerData.items[i] == nil then
Player.PlayerData.items[i] = { name = itemInfo['name'], amount = amount, info = info or '', label = itemInfo['label'], description = itemInfo['description'] or '', weight = itemInfo['weight'], type = itemInfo['type'], unique = itemInfo['unique'], useable = itemInfo['useable'], image = itemInfo['image'], shouldClose = itemInfo['shouldClose'], slot = i, combinable = itemInfo['combinable'], created = itemInfo['created'] }
Player.Functions.SetPlayerData("items", Player.PlayerData.items)
if Player.Offline then return true end
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'AddItem', 'green', '**' .. GetPlayerName(source) .. ' (citizenid: ' .. Player.PlayerData.citizenid .. ' | id: ' .. source .. ')** got item: [slot:' .. i .. '], itemname: ' .. Player.PlayerData.items[i].name .. ', added amount: ' .. amount .. ', new total amount: ' .. Player.PlayerData.items[i].amount)
return true
end
end
end
elseif not itemInfo['unique'] and slot or slot and Player.PlayerData.items[slot] == nil then
Player.PlayerData.items[slot] = { name = itemInfo['name'], amount = amount, info = info or '', label = itemInfo['label'], description = itemInfo['description'] or '', weight = itemInfo['weight'], type = itemInfo['type'], unique = itemInfo['unique'], useable = itemInfo['useable'], image = itemInfo['image'], shouldClose = itemInfo['shouldClose'], slot = slot, combinable = itemInfo['combinable'], created = itemInfo['created'] }
Player.Functions.SetPlayerData("items", Player.PlayerData.items)
if Player.Offline then return true end
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'AddItem', 'green', '**' .. GetPlayerName(source) .. ' (citizenid: ' .. Player.PlayerData.citizenid .. ' | id: ' .. source .. ')** got item: [slot:' .. slot .. '], itemname: ' .. Player.PlayerData.items[slot].name .. ', added amount: ' .. amount .. ', new total amount: ' .. Player.PlayerData.items[slot].amount)
return true
elseif itemInfo['unique'] or (not slot or slot == nil) or itemInfo['type'] == 'weapon' then
for i = 1, Config.MaxInventorySlots, 1 do
if Player.PlayerData.items[i] == nil then
Player.PlayerData.items[i] = { name = itemInfo['name'], amount = amount, info = info or '', label = itemInfo['label'], description = itemInfo['description'] or '', weight = itemInfo['weight'], type = itemInfo['type'], unique = itemInfo['unique'], useable = itemInfo['useable'], image = itemInfo['image'], shouldClose = itemInfo['shouldClose'], slot = i, combinable = itemInfo['combinable'], created = itemInfo['created'] }
Player.Functions.SetPlayerData("items", Player.PlayerData.items)
if Player.Offline then return true end
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'AddItem', 'green', '**' .. GetPlayerName(source) .. ' (citizenid: ' .. Player.PlayerData.citizenid .. ' | id: ' .. source .. ')** got item: [slot:' .. i .. '], itemname: ' .. Player.PlayerData.items[i].name .. ', added amount: ' .. amount .. ', new total amount: ' .. Player.PlayerData.items[i].amount)
return true
end
end
end
elseif not Player.Offline then
QBCore.Functions.Notify(source, "Inventar er fyldt", 'error')
end
return false
end
exports("AddItem", AddItem)
---Remove an item from the inventory of the player
local function RemoveItem(source, item, amount, slot)
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return false end
amount = tonumber(amount) or 1
slot = tonumber(slot)
if slot then
if Player.PlayerData.items[slot].amount > amount then
Player.PlayerData.items[slot].amount = Player.PlayerData.items[slot].amount - amount
Player.Functions.SetPlayerData("items", Player.PlayerData.items)
if not Player.Offline then
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(source) .. ' (citizenid: ' .. Player.PlayerData.citizenid .. ' | id: ' .. source .. ')** lost item: [slot:' .. slot .. '], itemname: ' .. Player.PlayerData.items[slot].name .. ', removed amount: ' .. amount .. ', new total amount: ' .. Player.PlayerData.items[slot].amount)
end
return true
elseif Player.PlayerData.items[slot].amount == amount then
Player.PlayerData.items[slot] = nil
Player.Functions.SetPlayerData("items", Player.PlayerData.items)
if Player.Offline then return true end
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(source) .. ' (citizenid: ' .. Player.PlayerData.citizenid .. ' | id: ' .. source .. ')** lost item: [slot:' .. slot .. '], itemname: ' .. item .. ', removed amount: ' .. amount .. ', item removed')
return true
end
else
local slots = GetSlotsByItem(Player.PlayerData.items, item)
local amountToRemove = amount
if not slots then return false end
for _, _slot in pairs(slots) do
if Player.PlayerData.items[_slot].amount > amountToRemove then
Player.PlayerData.items[_slot].amount = Player.PlayerData.items[_slot].amount - amountToRemove
Player.Functions.SetPlayerData("items", Player.PlayerData.items)
if not Player.Offline then
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(source) .. ' (citizenid: ' .. Player.PlayerData.citizenid .. ' | id: ' .. source .. ')** lost item: [slot:' .. _slot .. '], itemname: ' .. Player.PlayerData.items[_slot].name .. ', removed amount: ' .. amount .. ', new total amount: ' .. Player.PlayerData.items[_slot].amount)
end
return true
elseif Player.PlayerData.items[_slot].amount == amountToRemove then
Player.PlayerData.items[_slot] = nil
Player.Functions.SetPlayerData("items", Player.PlayerData.items)
if Player.Offline then return true end
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'RemoveItem', 'red', '**' .. GetPlayerName(source) .. ' (citizenid: ' .. Player.PlayerData.citizenid .. ' | id: ' .. source .. ')** lost item: [slot:' .. _slot .. '], itemname: ' .. item .. ', removed amount: ' .. amount .. ', item removed')
return true
end
end
end
return false
end
exports("RemoveItem", RemoveItem)
---Get the item with the slot
local function GetItemBySlot(source, slot)
local Player = QBCore.Functions.GetPlayer(source)
slot = tonumber(slot)
return Player.PlayerData.items[slot]
end
exports("GetItemBySlot", GetItemBySlot)
---Get the item from the inventory of the player with the provided source by the name of the item
local function GetItemByName(source, item)
local Player = QBCore.Functions.GetPlayer(source)
item = tostring(item):lower()
local slot = GetFirstSlotByItem(Player.PlayerData.items, item)
return Player.PlayerData.items[slot]
end
exports("GetItemByName", GetItemByName)
---Get the item from the inventory of the player with the provided source by the name of the item in an array for all slots that the item is in
local function GetItemsByName(source, item)
local Player = QBCore.Functions.GetPlayer(source)
item = tostring(item):lower()
local items = {}
local slots = GetSlotsByItem(Player.PlayerData.items, item)
for _, slot in pairs(slots) do
if slot then
items[#items+1] = Player.PlayerData.items[slot]
end
end
return items
end
exports("GetItemsByName", GetItemsByName)
local function ClearInventory(source, filterItems)
local Player = QBCore.Functions.GetPlayer(source)
local savedItemData = {}
if filterItems then
local filterItemsType = type(filterItems)
if filterItemsType == "string" then
local item = GetItemByName(source, filterItems)
if item then
savedItemData[item.slot] = item
end
elseif filterItemsType == "table" and table.type(filterItems) == "array" then
for i = 1, #filterItems do
local item = GetItemByName(source, filterItems[i])
if item then
savedItemData[item.slot] = item
end
end
end
end
Player.Functions.SetPlayerData("items", savedItemData)
if Player.Offline then return end
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'ClearInventory', 'red', '**' .. GetPlayerName(source) .. ' (citizenid: ' .. Player.PlayerData.citizenid .. ' | id: ' .. source .. ')** inventory cleared')
end
exports("ClearInventory", ClearInventory)
---Sets the items playerdata to the provided items param
local function SetInventory(source, items)
local Player = QBCore.Functions.GetPlayer(source)
Player.Functions.SetPlayerData("items", items)
if Player.Offline then return end
TriggerEvent('qb-log:server:CreateLog', 'playerinventory', 'SetInventory', 'blue', '**' .. GetPlayerName(source) .. ' (citizenid: ' .. Player.PlayerData.citizenid .. ' | id: ' .. source .. ')** items set: ' .. json.encode(items))
end
exports("SetInventory", SetInventory)
---Set the data of a specific item
local function SetItemData(source, itemName, key, val)
if not itemName or not key then return false end
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return end
local item = GetItemByName(source, itemName)
if not item then return false end
item[key] = val
Player.PlayerData.items[item.slot] = item
Player.Functions.SetPlayerData("items", Player.PlayerData.items)
return true
end
exports("SetItemData", SetItemData)
---Checks if you have an item or not
local function HasItem(source, items, amount)
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return false end
local isTable = type(items) == 'table'
local isArray = isTable and table.type(items) == 'array' or false
local totalItems = #items
local count = 0
local kvIndex = 2
if isTable and not isArray then
totalItems = 0
for _ in pairs(items) do totalItems += 1 end
kvIndex = 1
end
if isTable then
for k, v in pairs(items) do
local itemKV = {k, v}
local item = GetItemByName(source, itemKV[kvIndex])
if item and ((amount and item.amount >= amount) or (not isArray and item.amount >= v) or (not amount and isArray)) then
count += 1
end
end
if count == totalItems then
return true
end
else -- Single item as string
local item = GetItemByName(source, items)
if item and (not amount or (item and amount and item.amount >= amount)) then
return true
end
end
return false
end
exports("HasItem", HasItem)
---Create a usable item with a callback on use
---@param itemName string The name of the item to make usable
---@param data any
local function CreateUsableItem(itemName, data)
QBCore.Functions.CreateUseableItem(itemName, data)
end
exports("CreateUsableItem", CreateUsableItem)
---Get the usable item data for the specified item
---@param itemName string The item to get the data for
---@return any usable_item
local function GetUsableItem(itemName)
return QBCore.Functions.CanUseItem(itemName)
end
exports("GetUsableItem", GetUsableItem)
---Use an item from the QBCore.UsableItems table if a callback is present
---@param itemName string The name of the item to use
---@param ... any Arguments for the callback, this will be sent to the callback and can be used to get certain values
local function UseItem(itemName, ...)
local itemData = GetUsableItem(itemName)
local callback = type(itemData) == 'table' and (rawget(itemData, '__cfx_functionReference') and itemData or itemData.cb or itemData.callback) or type(itemData) == 'function' and itemData
if not callback then return end
callback(...)
end
exports("UseItem", UseItem)
local function recipeContains(recipe, fromItem)
for _, v in pairs(recipe.accept) do
if v == fromItem.name then
return true
end
end
return false
end
local function hasCraftItems(source, CostItems, amount)
for k, v in pairs(CostItems) do
local item = GetItemByName(source, k)
if not item then return false end
if item.amount < (v * amount) then return false end
end
return true
end
local function IsVehicleOwned(plate)
local result = MySQL.scalar.await('SELECT 1 from player_vehicles WHERE plate = ?', {plate})
return result
end
-- Shop Items
local function SetupShopItems(shopItems)
local items = {}
if shopItems and next(shopItems) then
for _, item in pairs(shopItems) do
local itemInfo = QBCore.Shared.Items[item.name:lower()]
if itemInfo then
items[item.slot] = {
name = itemInfo["name"],
amount = tonumber(item.amount),
info = item.info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
price = item.price,
image = itemInfo["image"],
slot = item.slot,
}
end
end
end
return items
end
-- Stash Items
local function GetStashItems(stashId)
local items = {}
local result = MySQL.scalar.await('SELECT items FROM stashitems WHERE stash = ?', {stashId})
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 = QBCore.Shared.Items[item.name:lower()]
if itemInfo then
items[item.slot] = {
name = itemInfo["name"],
amount = tonumber(item.amount),
info = item.info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
created = item.created,
slot = item.slot,
}
end
end
return items
end
local function SaveStashItems(stashId, items)
if Stashes[stashId].label == "Stash-None" or not items then return end
for _, item in pairs(items) do
item.description = nil
end
MySQL.insert('INSERT INTO stashitems (stash, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', {
['stash'] = stashId,
['items'] = json.encode(items)
})
Stashes[stashId].isOpen = false
end
local function AddToStash(stashId, slot, otherslot, itemName, amount, info, created)
amount = tonumber(amount) or 1
local ItemData = QBCore.Shared.Items[itemName]
if not ItemData.unique then
if Stashes[stashId].items[slot] and Stashes[stashId].items[slot].name == itemName then
Stashes[stashId].items[slot].amount = Stashes[stashId].items[slot].amount + amount
else
local itemInfo = QBCore.Shared.Items[itemName:lower()]
Stashes[stashId].items[slot] = {
name = itemInfo["name"],
amount = amount,
info = info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
created = created,
slot = slot,
}
end
else
if Stashes[stashId].items[slot] and Stashes[stashId].items[slot].name == itemName then
local itemInfo = QBCore.Shared.Items[itemName:lower()]
Stashes[stashId].items[otherslot] = {
name = itemInfo["name"],
amount = amount,
info = info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
created = created,
slot = otherslot,
}
else
local itemInfo = QBCore.Shared.Items[itemName:lower()]
Stashes[stashId].items[slot] = {
name = itemInfo["name"],
amount = amount,
info = info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
created = created,
slot = slot,
}
end
end
end
local function RemoveFromStash(stashId, slot, itemName, amount)
amount = tonumber(amount) or 1
if Stashes[stashId].items[slot] and Stashes[stashId].items[slot].name == itemName then
if Stashes[stashId].items[slot].amount > amount then
Stashes[stashId].items[slot].amount = Stashes[stashId].items[slot].amount - amount
else
Stashes[stashId].items[slot] = nil
end
else
Stashes[stashId].items[slot] = nil
if Stashes[stashId].items == nil then
Stashes[stashId].items[slot] = nil
end
end
end
-- Trunk items
local function GetOwnedVehicleItems(plate)
local items = {}
local result = MySQL.scalar.await('SELECT items FROM trunkitems WHERE plate = ?', {plate})
if not result then return items end
local trunkItems = json.decode(result)
if not trunkItems then return items end
for _, item in pairs(trunkItems) do
local itemInfo = QBCore.Shared.Items[item.name:lower()]
if itemInfo then
items[item.slot] = {
name = itemInfo["name"],
amount = tonumber(item.amount),
info = item.info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
created = item.created,
slot = item.slot,
}
end
end
return items
end
local function SaveOwnedVehicleItems(plate, items)
if Trunks[plate].label == "Trunk-None" or not items then return end
for _, item in pairs(items) do
item.description = nil
end
MySQL.insert('INSERT INTO trunkitems (plate, items) VALUES (:plate, :items) ON DUPLICATE KEY UPDATE items = :items', {
['plate'] = plate,
['items'] = json.encode(items)
})
Trunks[plate].isOpen = false
end
local function AddToTrunk(plate, slot, otherslot, itemName, amount, info, created)
amount = tonumber(amount) or 1
local ItemData = QBCore.Shared.Items[itemName]
if not ItemData.unique then
if Trunks[plate].items[slot] and Trunks[plate].items[slot].name == itemName then
Trunks[plate].items[slot].amount = Trunks[plate].items[slot].amount + amount
else
local itemInfo = QBCore.Shared.Items[itemName:lower()]
Trunks[plate].items[slot] = {
name = itemInfo["name"],
amount = amount,
info = info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
created = created,
slot = slot,
}
end
else
if Trunks[plate].items[slot] and Trunks[plate].items[slot].name == itemName then
local itemInfo = QBCore.Shared.Items[itemName:lower()]
Trunks[plate].items[otherslot] = {
name = itemInfo["name"],
amount = amount,
info = info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
created = created,
slot = otherslot,
}
else
local itemInfo = QBCore.Shared.Items[itemName:lower()]
Trunks[plate].items[slot] = {
name = itemInfo["name"],
amount = amount,
info = info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
created = created,
slot = slot,
}
end
end
end
local function RemoveFromTrunk(plate, slot, itemName, amount)
amount = tonumber(amount) or 1
if Trunks[plate].items[slot] and Trunks[plate].items[slot].name == itemName then
if Trunks[plate].items[slot].amount > amount then
Trunks[plate].items[slot].amount = Trunks[plate].items[slot].amount - amount
else
Trunks[plate].items[slot] = nil
end
else
Trunks[plate].items[slot] = nil
if Trunks[plate].items == nil then
Trunks[plate].items[slot] = nil
end
end
end
-- Glovebox items
local function GetOwnedVehicleGloveboxItems(plate)
local items = {}
local result = MySQL.scalar.await('SELECT items FROM gloveboxitems WHERE plate = ?', {plate})
if not result then return items end
local gloveboxItems = json.decode(result)
if not gloveboxItems then return items end
for _, item in pairs(gloveboxItems) do
local itemInfo = QBCore.Shared.Items[item.name:lower()]
if itemInfo then
items[item.slot] = {
name = itemInfo["name"],
amount = tonumber(item.amount),
info = item.info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
created = item.created,
slot = item.slot,
}
end
end
return items
end
local function SaveOwnedGloveboxItems(plate, items)
if Gloveboxes[plate].label == "Glovebox-None" or not items then return end
for _, item in pairs(items) do
item.description = nil
end
MySQL.insert('INSERT INTO gloveboxitems (plate, items) VALUES (:plate, :items) ON DUPLICATE KEY UPDATE items = :items', {
['plate'] = plate,
['items'] = json.encode(items)
})
Gloveboxes[plate].isOpen = false
end
local function AddToGlovebox(plate, slot, otherslot, itemName, amount, info, created)
amount = tonumber(amount) or 1
local ItemData = QBCore.Shared.Items[itemName]
if not ItemData.unique then
if Gloveboxes[plate].items[slot] and Gloveboxes[plate].items[slot].name == itemName then
Gloveboxes[plate].items[slot].amount = Gloveboxes[plate].items[slot].amount + amount
else
local itemInfo = QBCore.Shared.Items[itemName:lower()]
Gloveboxes[plate].items[slot] = {
name = itemInfo["name"],
amount = amount,
info = info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
created = created,
slot = slot,
}
end
else
if Gloveboxes[plate].items[slot] and Gloveboxes[plate].items[slot].name == itemName then
local itemInfo = QBCore.Shared.Items[itemName:lower()]
Gloveboxes[plate].items[otherslot] = {
name = itemInfo["name"],
amount = amount,
info = info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
created = created,
slot = otherslot,
}
else
local itemInfo = QBCore.Shared.Items[itemName:lower()]
Gloveboxes[plate].items[slot] = {
name = itemInfo["name"],
amount = amount,
info = info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
created = created,
slot = slot,
}
end
end
end
local function RemoveFromGlovebox(plate, slot, itemName, amount)
amount = tonumber(amount) or 1
if Gloveboxes[plate].items[slot] and Gloveboxes[plate].items[slot].name == itemName then
if Gloveboxes[plate].items[slot].amount > amount then
Gloveboxes[plate].items[slot].amount = Gloveboxes[plate].items[slot].amount - amount
else
Gloveboxes[plate].items[slot] = nil
end
else
Gloveboxes[plate].items[slot] = nil
if Gloveboxes[plate].items == nil then
Gloveboxes[plate].items[slot] = nil
end
end
end
---Add an item to a drop
---@param dropId integer The id of the drop
---@param slot number The slot of the drop inventory to add the item to
---@param itemName string Name of the item to add
---@param amount? number The amount of the item to add
---@param info? table Extra info to add to the item
local function AddToDrop(dropId, slot, itemName, amount, info, created)
amount = tonumber(amount) or 1
Drops[dropId].createdTime = os.time()
if Drops[dropId].items[slot] and Drops[dropId].items[slot].name == itemName then
Drops[dropId].items[slot].amount = Drops[dropId].items[slot].amount + amount
else
local itemInfo = QBCore.Shared.Items[itemName:lower()]
Drops[dropId].items[slot] = {
name = itemInfo["name"],
amount = amount,
info = info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
created = created,
slot = slot,
id = dropId,
}
end
end
local function RemoveFromDrop(dropId, slot, itemName, amount)
amount = tonumber(amount) or 1
Drops[dropId].createdTime = os.time()
if Drops[dropId].items[slot] and Drops[dropId].items[slot].name == itemName then
if Drops[dropId].items[slot].amount > amount then
Drops[dropId].items[slot].amount = Drops[dropId].items[slot].amount - amount
else
Drops[dropId].items[slot] = nil
end
else
Drops[dropId].items[slot] = nil
if Drops[dropId].items == nil then
Drops[dropId].items[slot] = nil
end
end
end
local function CreateDropId()
if Drops then
local id = math.random(10000, 99999)
local dropid = id
while Drops[dropid] do
id = math.random(10000, 99999)
dropid = id
end
return dropid
else
local id = math.random(10000, 99999)
local dropid = id
return dropid
end
end
local function CreateNewDrop(source, fromSlot, toSlot, itemAmount, created)
itemAmount = tonumber(itemAmount) or 1
local Player = QBCore.Functions.GetPlayer(source)
local itemData = GetItemBySlot(source, fromSlot)
if not itemData then return end
local coords = GetEntityCoords(GetPlayerPed(source))
if RemoveItem(source, itemData.name, itemAmount, itemData.slot) then
TriggerClientEvent("inventory:client:CheckWeapon", source, itemData.name)
local itemInfo = QBCore.Shared.Items[itemData.name:lower()]
local dropId = CreateDropId()
Drops[dropId] = {}
Drops[dropId].coords = coords
Drops[dropId].createdTime = os.time()
Drops[dropId].items = {}
Drops[dropId].items[toSlot] = {
name = itemInfo["name"],
amount = itemAmount,
info = itemData.info or "",
label = itemInfo["label"],
description = itemInfo["description"] or "",
weight = itemInfo["weight"],
type = itemInfo["type"],
unique = itemInfo["unique"],
useable = itemInfo["useable"],
image = itemInfo["image"],
created = created,
slot = toSlot,
id = dropId,
}
TriggerEvent("qb-log:server:CreateLog", "drop", "New Item Drop", "red", "**".. GetPlayerName(source) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..source.."*) dropped new item; name: **"..itemData.name.."**, amount: **" .. itemAmount .. "**")
TriggerClientEvent("inventory:client:DropItemAnim", source)
TriggerClientEvent("inventory:client:AddDropItem", -1, dropId, source, coords)
if itemData.name:lower() == "radio" then
TriggerClientEvent('Radio.Set', source, false)
end
else
TriggerClientEvent("QBCore:Notify", source, "Du har ikke den ting", "error")
return
end
end
local function OpenInventory(name, id, other, origin)
local src = origin
local ply = Player(src)
local Player = QBCore.Functions.GetPlayer(src)
if ply.state.inv_busy then
return QBCore.Functions.Notify(src, Lang:t("notify.noaccess"), 'error')
end
if name and id then
local secondInv = {}
if name == "stash" then
if Stashes[id] then
if Stashes[id].isOpen then
local Target = QBCore.Functions.GetPlayer(Stashes[id].isOpen)
if Target then
TriggerClientEvent('inventory:client:CheckOpenState', Stashes[id].isOpen, name, id, Stashes[id].label)
else
Stashes[id].isOpen = false
end
end
end
local maxweight = 1000000
local slots = 50
if other then
maxweight = other.maxweight or 1000000
slots = other.slots or 50
end
secondInv.name = "stash-"..id
secondInv.label = "Stash-"..id
secondInv.maxweight = maxweight
secondInv.inventory = {}
secondInv.slots = slots
if Stashes[id] and Stashes[id].isOpen then
secondInv.name = "none-inv"
secondInv.label = "Stash-None"
secondInv.maxweight = 1000000
secondInv.inventory = {}
secondInv.slots = 0
else
local stashItems = GetStashItems(id)
if next(stashItems) then
secondInv.inventory = stashItems
Stashes[id] = {}
Stashes[id].items = stashItems
Stashes[id].isOpen = src
Stashes[id].label = secondInv.label
else
Stashes[id] = {}
Stashes[id].items = {}
Stashes[id].isOpen = src
Stashes[id].label = secondInv.label
end
end
elseif name == "trunk" then
if Trunks[id] then
if Trunks[id].isOpen then
local Target = QBCore.Functions.GetPlayer(Trunks[id].isOpen)
if Target then
TriggerClientEvent('inventory:client:CheckOpenState', Trunks[id].isOpen, name, id, Trunks[id].label)
else
Trunks[id].isOpen = false
end
end
end
secondInv.name = "trunk-"..id
secondInv.label = "Trunk-"..id
secondInv.maxweight = other.maxweight or 60000
secondInv.inventory = {}
secondInv.slots = other.slots or 50
if (Trunks[id] and Trunks[id].isOpen) or (QBCore.Shared.SplitStr(id, "PLZI")[2] and (Player.PlayerData.job.name ~= "police" or Player.PlayerData.job.type ~= "leo")) then
secondInv.name = "none-inv"
secondInv.label = "Trunk-None"
secondInv.maxweight = other.maxweight or 60000
secondInv.inventory = {}
secondInv.slots = 0
else
if id then
local ownedItems = GetOwnedVehicleItems(id)
if IsVehicleOwned(id) and next(ownedItems) then
secondInv.inventory = ownedItems
Trunks[id] = {}
Trunks[id].items = ownedItems
Trunks[id].isOpen = src
Trunks[id].label = secondInv.label
elseif Trunks[id] and not Trunks[id].isOpen then
secondInv.inventory = Trunks[id].items
Trunks[id].isOpen = src
Trunks[id].label = secondInv.label
else
Trunks[id] = {}
Trunks[id].items = {}
Trunks[id].isOpen = src
Trunks[id].label = secondInv.label
end
end
end
elseif name == "glovebox" then
if Gloveboxes[id] then
if Gloveboxes[id].isOpen then
local Target = QBCore.Functions.GetPlayer(Gloveboxes[id].isOpen)
if Target then
TriggerClientEvent('inventory:client:CheckOpenState', Gloveboxes[id].isOpen, name, id, Gloveboxes[id].label)
else
Gloveboxes[id].isOpen = false
end
end
end
secondInv.name = "glovebox-"..id
secondInv.label = "Glovebox-"..id
secondInv.maxweight = 10000
secondInv.inventory = {}
secondInv.slots = 5
if Gloveboxes[id] and Gloveboxes[id].isOpen then
secondInv.name = "none-inv"
secondInv.label = "Glovebox-None"
secondInv.maxweight = 10000
secondInv.inventory = {}
secondInv.slots = 0
else
local ownedItems = GetOwnedVehicleGloveboxItems(id)
if Gloveboxes[id] and not Gloveboxes[id].isOpen then
secondInv.inventory = Gloveboxes[id].items
Gloveboxes[id].isOpen = src
Gloveboxes[id].label = secondInv.label
elseif IsVehicleOwned(id) and next(ownedItems) then
secondInv.inventory = ownedItems
Gloveboxes[id] = {}
Gloveboxes[id].items = ownedItems
Gloveboxes[id].isOpen = src
Gloveboxes[id].label = secondInv.label
else
Gloveboxes[id] = {}
Gloveboxes[id].items = {}
Gloveboxes[id].isOpen = src
Gloveboxes[id].label = secondInv.label
end
end
elseif name == "shop" then
secondInv.name = "itemshop-"..id
secondInv.label = other.label
secondInv.maxweight = 900000
secondInv.inventory = SetupShopItems(other.items)
ShopItems[id] = {}
ShopItems[id].items = other.items
secondInv.slots = #other.items
elseif name == "traphouse" then
secondInv.name = "traphouse-"..id
secondInv.label = other.label
secondInv.maxweight = 900000
secondInv.inventory = other.items
secondInv.slots = other.slots
elseif name == "crafting" then
secondInv.name = "crafting"
secondInv.label = other.label
secondInv.maxweight = 900000
secondInv.inventory = other.items
secondInv.slots = #other.items
elseif name == "attachment_crafting" then
secondInv.name = "attachment_crafting"
secondInv.label = other.label
secondInv.maxweight = 900000
secondInv.inventory = other.items
secondInv.slots = #other.items
elseif name == "otherplayer" then
local OtherPlayer = QBCore.Functions.GetPlayer(tonumber(id))
if OtherPlayer then
secondInv.name = "otherplayer-"..id
secondInv.label = "Player-"..id
secondInv.maxweight = Config.MaxInventoryWeight
secondInv.inventory = OtherPlayer.PlayerData.items
if (Player.PlayerData.job.name == "police" or Player.PlayerData.job.type == "leo") and Player.PlayerData.job.onduty then
secondInv.slots = Config.MaxInventorySlots
else
secondInv.slots = Config.MaxInventorySlots - 1
end
Wait(250)
end
else
if Drops[id] then
if Drops[id].isOpen then
local Target = QBCore.Functions.GetPlayer(Drops[id].isOpen)
if Target then
TriggerClientEvent('inventory:client:CheckOpenState', Drops[id].isOpen, name, id, Drops[id].label)
else
Drops[id].isOpen = false
end
end
end
if Drops[id] and not Drops[id].isOpen then
secondInv.coords = Drops[id].coords
secondInv.name = id
secondInv.label = "Dropped-"..tostring(id)
secondInv.maxweight = 100000
secondInv.inventory = Drops[id].items
secondInv.slots = 30
Drops[id].isOpen = src
Drops[id].label = secondInv.label
Drops[id].createdTime = os.time()
else
secondInv.name = "none-inv"
secondInv.label = "Dropped-None"
secondInv.maxweight = 100000
secondInv.inventory = {}
secondInv.slots = 0
end
end
TriggerClientEvent("ps-inventory:client:closeinv", id)
TriggerClientEvent("inventory:client:OpenInventory", src, {}, Player.PlayerData.items, secondInv)
else
TriggerClientEvent("inventory:client:OpenInventory", src, {}, Player.PlayerData.items)
end
end
exports('OpenInventory',OpenInventory)
-- Events
AddEventHandler('QBCore:Server:PlayerLoaded', function(Player)
QBCore.Functions.AddPlayerMethod(Player.PlayerData.source, "AddItem", function(item, amount, slot, info)
return AddItem(Player.PlayerData.source, item, amount, slot, info)
end)
QBCore.Functions.AddPlayerMethod(Player.PlayerData.source, "RemoveItem", function(item, amount, slot)
return RemoveItem(Player.PlayerData.source, item, amount, slot)
end)
QBCore.Functions.AddPlayerMethod(Player.PlayerData.source, "GetItemBySlot", function(slot)
return GetItemBySlot(Player.PlayerData.source, slot)
end)
QBCore.Functions.AddPlayerMethod(Player.PlayerData.source, "GetItemByName", function(item)
return GetItemByName(Player.PlayerData.source, item)
end)
QBCore.Functions.AddPlayerMethod(Player.PlayerData.source, "GetItemsByName", function(item)
return GetItemsByName(Player.PlayerData.source, item)
end)
QBCore.Functions.AddPlayerMethod(Player.PlayerData.source, "ClearInventory", function(filterItems)
ClearInventory(Player.PlayerData.source, filterItems)
end)
QBCore.Functions.AddPlayerMethod(Player.PlayerData.source, "SetInventory", function(items)
SetInventory(Player.PlayerData.source, items)
end)
end)
AddEventHandler('onResourceStart', function(resourceName)
if resourceName ~= GetCurrentResourceName() then return end
local Players = QBCore.Functions.GetQBPlayers()
for k in pairs(Players) do
QBCore.Functions.AddPlayerMethod(k, "AddItem", function(item, amount, slot, info)
return AddItem(k, item, amount, slot, info)
end)
QBCore.Functions.AddPlayerMethod(k, "RemoveItem", function(item, amount, slot)
return RemoveItem(k, item, amount, slot)
end)
QBCore.Functions.AddPlayerMethod(k, "GetItemBySlot", function(slot)
return GetItemBySlot(k, slot)
end)
QBCore.Functions.AddPlayerMethod(k, "GetItemByName", function(item)
return GetItemByName(k, item)
end)
QBCore.Functions.AddPlayerMethod(k, "GetItemsByName", function(item)
return GetItemsByName(k, item)
end)
QBCore.Functions.AddPlayerMethod(k, "ClearInventory", function(filterItems)
ClearInventory(k, filterItems)
end)
QBCore.Functions.AddPlayerMethod(k, "SetInventory", function(items)
SetInventory(k, items)
end)
end
end)
RegisterNetEvent('QBCore:Server:UpdateObject', function()
if source ~= '' then return end -- Safety check if the event was not called from the server.
QBCore = exports['qb-core']:GetCoreObject()
end)
function addTrunkItems(plate, items)
Trunks[plate] = {}
Trunks[plate].items = items
end
exports('addTrunkItems',addTrunkItems)
function addGloveboxItems(plate, items)
Gloveboxes[plate] = {}
Gloveboxes[plate].items = items
end
exports('addGloveboxItems',addGloveboxItems)
RegisterNetEvent('inventory:server:combineItem', function(item, fromItem, toItem)
local src = source
-- Check that inputs are not nil
-- Most commonly when abusing this exploit, this values are left as
if fromItem == nil then return end
if toItem == nil then return end
-- Check that they have the items
fromItem = GetItemByName(src, fromItem)
toItem = GetItemByName(src, toItem)
if fromItem == nil then return end
if toItem == nil then return end
-- Check the recipe is valid
local recipe = QBCore.Shared.Items[toItem.name].combinable
if recipe and recipe.reward ~= item then return end
if not recipeContains(recipe, fromItem) then return end
TriggerClientEvent('inventory:client:ItemBox', src, QBCore.Shared.Items[item], 'add')
AddItem(src, item, 1)
RemoveItem(src, fromItem.name, 1)
RemoveItem(src, toItem.name, 1)
end)
RegisterNetEvent('inventory:server:CraftItems', function(itemName, itemCosts, amount, toSlot, points)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
amount = tonumber(amount)
if not itemName or not itemCosts then return end
for k, v in pairs(itemCosts) do
RemoveItem(src, k, (v*amount))
end
AddItem(src, itemName, amount, toSlot)
Player.Functions.SetMetaData("craftingrep", Player.PlayerData.metadata["craftingrep"] + (points * amount))
TriggerClientEvent("inventory:client:UpdatePlayerInventory", src, false)
end)
RegisterNetEvent('inventory:server:CraftAttachment', function(itemName, itemCosts, amount, toSlot, points)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
amount = tonumber(amount)
if not itemName or not itemCosts then return end
for k, v in pairs(itemCosts) do
RemoveItem(src, k, (v*amount))
end
AddItem(src, itemName, amount, toSlot)
Player.Functions.SetMetaData("attachmentcraftingrep", Player.PlayerData.metadata["attachmentcraftingrep"] + (points * amount))
TriggerClientEvent("inventory:client:UpdatePlayerInventory", src, false)
end)
RegisterNetEvent('inventory:server:SetIsOpenState', function(IsOpen, type, id)
if IsOpen then return end
if type == "stash" then
Stashes[id].isOpen = false
elseif type == "trunk" then
Trunks[id].isOpen = false
elseif type == "glovebox" then
Gloveboxes[id].isOpen = false
elseif type == "drop" then
Drops[id].isOpen = false
end
end)
RegisterNetEvent('inventory:server:OpenInventory', function(name, id, other)
local src = source
local ply = Player(src)
local Player = QBCore.Functions.GetPlayer(src)
if ply.state.inv_busy then
return QBCore.Functions.Notify(src, Lang:t("notify.noaccess"), 'error')
end
if name and id then
local secondInv = {}
if name == "stash" then
if Stashes[id] then
if Stashes[id].isOpen then
local Target = QBCore.Functions.GetPlayer(Stashes[id].isOpen)
if Target then
TriggerClientEvent('inventory:client:CheckOpenState', Stashes[id].isOpen, name, id, Stashes[id].label)
else
Stashes[id].isOpen = false
end
end
end
local maxweight = 1000000
local slots = 50
if other then
maxweight = other.maxweight or 1000000
slots = other.slots or 50
end
secondInv.name = "stash-"..id
secondInv.label = "Stash-"..id
secondInv.maxweight = maxweight
secondInv.inventory = {}
secondInv.slots = slots
if Stashes[id] and Stashes[id].isOpen then
secondInv.name = "none-inv"
secondInv.label = "Stash-None"
secondInv.maxweight = 1000000
secondInv.inventory = {}
secondInv.slots = 0
else
local stashItems = GetStashItems(id)
if next(stashItems) then
secondInv.inventory = stashItems
Stashes[id] = {}
Stashes[id].items = stashItems
Stashes[id].isOpen = src
Stashes[id].label = secondInv.label
else
Stashes[id] = {}
Stashes[id].items = {}
Stashes[id].isOpen = src
Stashes[id].label = secondInv.label
end
end
elseif name == "trunk" then
if Trunks[id] then
if Trunks[id].isOpen then
local Target = QBCore.Functions.GetPlayer(Trunks[id].isOpen)
if Target then
TriggerClientEvent('inventory:client:CheckOpenState', Trunks[id].isOpen, name, id, Trunks[id].label)
else
Trunks[id].isOpen = false
end
end
end
secondInv.name = "trunk-"..id
secondInv.label = "Trunk-"..id
secondInv.maxweight = other.maxweight or 60000
secondInv.inventory = {}
secondInv.slots = other.slots or 50
if (Trunks[id] and Trunks[id].isOpen) or (QBCore.Shared.SplitStr(id, "PLZI")[2] and (Player.PlayerData.job.name ~= "police" or Player.PlayerData.job.type ~= "leo")) then
secondInv.name = "none-inv"
secondInv.label = "Trunk-None"
secondInv.maxweight = other.maxweight or 60000
secondInv.inventory = {}
secondInv.slots = 0
else
if id then
local ownedItems = GetOwnedVehicleItems(id)
if IsVehicleOwned(id) and next(ownedItems) then
secondInv.inventory = ownedItems
Trunks[id] = {}
Trunks[id].items = ownedItems
Trunks[id].isOpen = src
Trunks[id].label = secondInv.label
elseif Trunks[id] and not Trunks[id].isOpen then
secondInv.inventory = Trunks[id].items
Trunks[id].isOpen = src
Trunks[id].label = secondInv.label
else
Trunks[id] = {}
Trunks[id].items = {}
Trunks[id].isOpen = src
Trunks[id].label = secondInv.label
end
end
end
elseif name == "glovebox" then
if Gloveboxes[id] then
if Gloveboxes[id].isOpen then
local Target = QBCore.Functions.GetPlayer(Gloveboxes[id].isOpen)
if Target then
TriggerClientEvent('inventory:client:CheckOpenState', Gloveboxes[id].isOpen, name, id, Gloveboxes[id].label)
else
Gloveboxes[id].isOpen = false
end
end
end
secondInv.name = "glovebox-"..id
secondInv.label = "Glovebox-"..id
secondInv.maxweight = 10000
secondInv.inventory = {}
secondInv.slots = 5
if Gloveboxes[id] and Gloveboxes[id].isOpen then
secondInv.name = "none-inv"
secondInv.label = "Glovebox-None"
secondInv.maxweight = 10000
secondInv.inventory = {}
secondInv.slots = 0
else
local ownedItems = GetOwnedVehicleGloveboxItems(id)
if Gloveboxes[id] and not Gloveboxes[id].isOpen then
secondInv.inventory = Gloveboxes[id].items
Gloveboxes[id].isOpen = src
Gloveboxes[id].label = secondInv.label
elseif IsVehicleOwned(id) and next(ownedItems) then
secondInv.inventory = ownedItems
Gloveboxes[id] = {}
Gloveboxes[id].items = ownedItems
Gloveboxes[id].isOpen = src
Gloveboxes[id].label = secondInv.label
else
Gloveboxes[id] = {}
Gloveboxes[id].items = {}
Gloveboxes[id].isOpen = src
Gloveboxes[id].label = secondInv.label
end
end
elseif name == "shop" then
secondInv.name = "itemshop-"..id
secondInv.label = other.label
secondInv.maxweight = 900000
secondInv.inventory = SetupShopItems(other.items)
ShopItems[id] = {}
ShopItems[id].items = other.items
secondInv.slots = #other.items
elseif name == "traphouse" then
secondInv.name = "traphouse-"..id
secondInv.label = other.label
secondInv.maxweight = 900000
secondInv.inventory = other.items
secondInv.slots = other.slots
elseif name == "crafting" then
secondInv.name = "crafting"
secondInv.label = other.label
secondInv.maxweight = 900000
secondInv.inventory = other.items
secondInv.slots = #other.items
elseif name == "attachment_crafting" then
secondInv.name = "attachment_crafting"
secondInv.label = other.label
secondInv.maxweight = 900000
secondInv.inventory = other.items
secondInv.slots = #other.items
elseif name == "otherplayer" then
local OtherPlayer = QBCore.Functions.GetPlayer(tonumber(id))
if OtherPlayer then
secondInv.name = "otherplayer-"..id
secondInv.label = "Player-"..id
secondInv.maxweight = Config.MaxInventoryWeight
secondInv.inventory = OtherPlayer.PlayerData.items
if (Player.PlayerData.job.name == "police" or Player.PlayerData.job.type == "leo") and Player.PlayerData.job.onduty then
secondInv.slots = Config.MaxInventorySlots
else
secondInv.slots = Config.MaxInventorySlots - 1
end
Wait(250)
end
else
if Drops[id] then
if Drops[id].isOpen then
local Target = QBCore.Functions.GetPlayer(Drops[id].isOpen)
if Target then
TriggerClientEvent('inventory:client:CheckOpenState', Drops[id].isOpen, name, id, Drops[id].label)
else
Drops[id].isOpen = false
end
end
end
if Drops[id] and not Drops[id].isOpen then
secondInv.coords = Drops[id].coords
secondInv.name = id
secondInv.label = "Dropped-"..tostring(id)
secondInv.maxweight = 100000
secondInv.inventory = Drops[id].items
secondInv.slots = 30
Drops[id].isOpen = src
Drops[id].label = secondInv.label
Drops[id].createdTime = os.time()
else
secondInv.name = "none-inv"
secondInv.label = "Dropped-None"
secondInv.maxweight = 100000
secondInv.inventory = {}
secondInv.slots = 0
end
end
TriggerClientEvent("ps-inventory:client:closeinv", id)
TriggerClientEvent("inventory:client:OpenInventory", src, {}, Player.PlayerData.items, secondInv)
else
TriggerClientEvent("inventory:client:OpenInventory", src, {}, Player.PlayerData.items)
end
end)
RegisterNetEvent('inventory:server:SaveInventory', function(type, id)
if type == "trunk" then
if IsVehicleOwned(id) then
SaveOwnedVehicleItems(id, Trunks[id].items)
else
Trunks[id].isOpen = false
end
elseif type == "glovebox" then
if (IsVehicleOwned(id)) then
SaveOwnedGloveboxItems(id, Gloveboxes[id].items)
else
Gloveboxes[id].isOpen = false
end
elseif type == "stash" then
SaveStashItems(id, Stashes[id].items)
elseif type == "drop" then
if Drops[id] then
Drops[id].isOpen = false
if Drops[id].items == nil or next(Drops[id].items) == nil then
Drops[id] = nil
TriggerClientEvent("inventory:client:RemoveDropItem", -1, id)
end
end
end
end)
RegisterNetEvent('inventory:server:UseItemSlot', function(slot)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
local itemData = Player.Functions.GetItemBySlot(slot)
if itemData then
local itemInfo = QBCore.Shared.Items[itemData.name]
if itemData.type == "weapon" then
if itemData.info.quality then
if itemData.info.quality > 0 then
TriggerClientEvent("inventory:client:UseWeapon", src, itemData, true)
else
TriggerClientEvent("inventory:client:UseWeapon", src, itemData, false)
end
else
TriggerClientEvent("inventory:client:UseWeapon", src, itemData, true)
end
TriggerClientEvent('inventory:client:ItemBox', src, itemInfo, "use")
elseif itemData.useable then
if itemData.info.quality then
if itemData.info.quality > 0 then
UseItem(itemData.name, src, itemData)
TriggerClientEvent('inventory:client:ItemBox', src, itemInfo, "use")
else
if itemInfo['delete'] and RemoveItem(src,itemData.name,1,slot) then
TriggerClientEvent('inventory:client:ItemBox',src, itemInfo, "remove")
else
TriggerClientEvent("QBCore:Notify", src, "Du kan ikke bruge denne ting!", "error")
end
end
else
UseItem(itemData.name, src, itemData)
TriggerClientEvent('inventory:client:ItemBox', src, itemInfo, "use")
end
end
end
end)
RegisterNetEvent('inventory:server:UseItem', function(inventory, item)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if inventory == "player" or inventory == "hotbar" then
local itemData = Player.Functions.GetItemBySlot(item.slot)
if itemData then
local itemInfo = QBCore.Shared.Items[itemData.name]
if itemData.type ~= "weapon" then
if itemData.info.quality then
if itemData.info.quality <= 0 then
if itemInfo['delete'] and RemoveItem(src,itemData.name,1,item.slot) then
TriggerClientEvent("QBCore:Notify", src, "Du kan ikke bruge denne ting!", "error")
TriggerClientEvent('inventory:client:ItemBox',src, itemInfo, "remove")
return
else
TriggerClientEvent("QBCore:Notify", src, "Du kan ikke bruge denne ting!", "error")
return
end
end
end
end
UseItem(itemData.name, src, itemData)
TriggerClientEvent('inventory:client:ItemBox', src, itemInfo, "use")
end
end
end)
RegisterNetEvent('inventory:server:SetInventoryData', function(fromInventory, toInventory, fromSlot, toSlot, fromAmount, toAmount)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
fromSlot = tonumber(fromSlot)
toSlot = tonumber(toSlot)
if (fromInventory == "player" or fromInventory == "hotbar") and (QBCore.Shared.SplitStr(toInventory, "-")[1] == "itemshop" or toInventory == "crafting") then
return
end
if fromInventory == "player" or fromInventory == "hotbar" then
local fromItemData = GetItemBySlot(src, fromSlot)
fromAmount = tonumber(fromAmount) or fromItemData.amount
if fromItemData and fromItemData.amount >= fromAmount then
if toInventory == "player" or toInventory == "hotbar" then
local toItemData = GetItemBySlot(src, toSlot)
RemoveItem(src, fromItemData.name, fromAmount, fromSlot)
TriggerClientEvent("inventory:client:CheckWeapon", src, fromItemData.name)
if toItemData ~= nil then
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
RemoveItem(src, toItemData.name, toAmount, toSlot)
AddItem(src, toItemData.name, toAmount, fromSlot, toItemData.info)
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount.. "**")
end
end
AddItem(src, fromItemData.name, fromAmount, toSlot, fromItemData.info, fromItemData["created"])
elseif QBCore.Shared.SplitStr(toInventory, "-")[1] == "otherplayer" then
local playerId = tonumber(QBCore.Shared.SplitStr(toInventory, "-")[2])
local OtherPlayer = QBCore.Functions.GetPlayer(playerId)
local toItemData = OtherPlayer.PlayerData.items[toSlot]
local itemDataTest = OtherPlayer.Functions.GetItemBySlot(toSlot)
RemoveItem(src, fromItemData.name, fromAmount, fromSlot)
TriggerClientEvent("inventory:client:CheckWeapon", src, fromItemData.name)
if toItemData ~= nil then
local itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if itemDataTest.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
OtherPlayer.Functions.RemoveItem(itemInfo["name"], toAmount, fromSlot)
Player.Functions.AddItem(toItemData.name, toAmount, fromSlot, toItemData.info)
TriggerEvent("qb-log:server:CreateLog", "robbing", "Swapped Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) swapped item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount.. "** with player: **".. GetPlayerName(OtherPlayer.PlayerData.source) .. "** (citizenid: *"..OtherPlayer.PlayerData.citizenid.."* | id: *"..OtherPlayer.PlayerData.source.."*)")
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) swapped item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount.. "** with player: **".. GetPlayerName(OtherPlayer.PlayerData.source) .. "** (citizenid: *"..OtherPlayer.PlayerData.citizenid.."* | id: *"..OtherPlayer.PlayerData.source.."*)")
end
else
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
TriggerEvent("qb-log:server:CreateLog", "robbing", "Dropped Item", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) dropped new item; name: **"..itemInfo["name"].."**, amount: **" .. fromAmount .. "** to player: **".. GetPlayerName(OtherPlayer.PlayerData.source) .. "** (citizenid: *"..OtherPlayer.PlayerData.citizenid.."* | id: *"..OtherPlayer.PlayerData.source.."*)")
end
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
AddItem(playerId, itemInfo["name"], fromAmount, toSlot, fromItemData.info, itemInfo["created"])
elseif QBCore.Shared.SplitStr(toInventory, "-")[1] == "trunk" then
local plate = QBCore.Shared.SplitStr(toInventory, "-")[2]
local toItemData = Trunks[plate].items[toSlot]
RemoveItem(src, fromItemData.name, fromAmount, fromSlot)
TriggerClientEvent("inventory:client:CheckWeapon", src, fromItemData.name)
if toItemData ~= nil then
local itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
RemoveFromTrunk(plate, fromSlot, itemInfo["name"], toAmount)
Player.Functions.AddItem(toItemData.name, toAmount, fromSlot, toItemData.info)
TriggerEvent("qb-log:server:CreateLog", "trunk", "Swapped Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount .. "** - plate: *" .. plate .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) swapped item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount.. "** - plate: *" .. plate .. "*")
end
else
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
TriggerEvent("qb-log:server:CreateLog", "trunk", "Dropped Item", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) dropped new item; name: **"..itemInfo["name"].."**, amount: **" .. fromAmount .. "** - plate: *" .. plate .. "*")
end
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
AddToTrunk(plate, toSlot, fromSlot, itemInfo["name"], fromAmount, fromItemData.info, itemInfo["created"])
elseif QBCore.Shared.SplitStr(toInventory, "-")[1] == "glovebox" then
local plate = QBCore.Shared.SplitStr(toInventory, "-")[2]
local toItemData = Gloveboxes[plate].items[toSlot]
RemoveItem(src, fromItemData.name, fromAmount, fromSlot)
TriggerClientEvent("inventory:client:CheckWeapon", src, fromItemData.name)
if toItemData ~= nil then
local itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
RemoveFromGlovebox(plate, fromSlot, itemInfo["name"], toAmount)
Player.Functions.AddItem(toItemData.name, toAmount, fromSlot, toItemData.info)
TriggerEvent("qb-log:server:CreateLog", "glovebox", "Swapped Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount .. "** - plate: *" .. plate .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) swapped item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount.. "** - plate: *" .. plate .. "*")
end
else
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
TriggerEvent("qb-log:server:CreateLog", "glovebox", "Dropped Item", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) dropped new item; name: **"..itemInfo["name"].."**, amount: **" .. fromAmount .. "** - plate: *" .. plate .. "*")
end
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
AddToGlovebox(plate, toSlot, fromSlot, itemInfo["name"], fromAmount, fromItemData.info, itemInfo["created"])
elseif QBCore.Shared.SplitStr(toInventory, "-")[1] == "stash" then
local stashId = QBCore.Shared.SplitStr(toInventory, "-")[2]
local toItemData = Stashes[stashId].items[toSlot]
RemoveItem(src, fromItemData.name, fromAmount, fromSlot)
TriggerClientEvent("inventory:client:CheckWeapon", src, fromItemData.name)
if toItemData ~= nil then
local itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
--RemoveFromStash(stashId, fromSlot, itemInfo["name"], toAmount)
RemoveFromStash(stashId, toSlot, itemInfo["name"], toAmount)
Player.Functions.AddItem(toItemData.name, toAmount, fromSlot, toItemData.info)
TriggerEvent("qb-log:server:CreateLog", "stash", "Swapped Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount .. "** - stash: *" .. stashId .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) swapped item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount.. "** - stash: *" .. stashId .. "*")
end
else
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
TriggerEvent("qb-log:server:CreateLog", "stash", "Dropped Item", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) dropped new item; name: **"..itemInfo["name"].."**, amount: **" .. fromAmount .. "** - stash: *" .. stashId .. "*")
end
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
AddToStash(stashId, toSlot, fromSlot, itemInfo["name"], fromAmount, fromItemData.info, itemInfo["created"])
elseif QBCore.Shared.SplitStr(toInventory, "-")[1] == "traphouse" then
-- Traphouse
local traphouseId = QBCore.Shared.SplitStr(toInventory, "_")[2]
local toItemData = exports['qb-traphouse']:GetInventoryData(traphouseId, toSlot)
local IsItemValid = exports['qb-traphouse']:CanItemBeSaled(fromItemData.name:lower())
if IsItemValid then
RemoveItem(src, fromItemData.name, fromAmount, fromSlot)
TriggerClientEvent("inventory:client:CheckWeapon", src, fromItemData.name)
if toItemData ~= nil then
local itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
exports['qb-traphouse']:RemoveHouseItem(traphouseId, fromSlot, itemInfo["name"], toAmount)
Player.Functions.AddItem(toItemData.name, toAmount, fromSlot, toItemData.info)
TriggerEvent("qb-log:server:CreateLog", "traphouse", "Swapped Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount .. "** - traphouse: *" .. traphouseId .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) swapped item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount.. "** - traphouse: *" .. traphouseId .. "*")
end
else
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
TriggerEvent("qb-log:server:CreateLog", "traphouse", "Dropped Item", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) dropped new item; name: **"..itemInfo["name"].."**, amount: **" .. fromAmount .. "** - traphouse: *" .. traphouseId .. "*")
end
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
exports['qb-traphouse']:AddHouseItem(traphouseId, toSlot, itemInfo["name"], fromAmount, fromItemData.info, src)
else
TriggerClientEvent('QBCore:Notify', src, "Du kan ikke sælge denne ting..", 'error')
end
else
-- drop
toInventory = tonumber(toInventory)
if toInventory == nil or toInventory == 0 then
CreateNewDrop(src, fromSlot, toSlot, fromAmount)
else
local toItemData = Drops[toInventory].items[toSlot]
RemoveItem(src, fromItemData.name, fromAmount, fromSlot)
TriggerClientEvent("inventory:client:CheckWeapon", src, fromItemData.name)
if toItemData ~= nil then
local itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
Player.Functions.AddItem(toItemData.name, toAmount, fromSlot, toItemData.info)
RemoveFromDrop(toInventory, fromSlot, itemInfo["name"], toAmount)
TriggerEvent("qb-log:server:CreateLog", "drop", "Swapped Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount .. "** - dropid: *" .. toInventory .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) swapped item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount.. "** - dropid: *" .. toInventory .. "*")
end
else
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
TriggerEvent("qb-log:server:CreateLog", "drop", "Dropped Item", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) dropped new item; name: **"..itemInfo["name"].."**, amount: **" .. fromAmount .. "** - dropid: *" .. toInventory .. "*")
end
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
AddToDrop(toInventory, toSlot, itemInfo["name"], fromAmount, fromItemData.info, itemInfo["created"])
if itemInfo["name"] == "radio" then
TriggerClientEvent('Radio.Set', src, false)
end
end
end
else
TriggerClientEvent("QBCore:Notify", src, "Du har ikke denne ting!", "error")
end
elseif QBCore.Shared.SplitStr(fromInventory, "-")[1] == "otherplayer" then
local playerId = tonumber(QBCore.Shared.SplitStr(fromInventory, "-")[2])
local OtherPlayer = QBCore.Functions.GetPlayer(playerId)
local fromItemData = OtherPlayer.PlayerData.items[fromSlot]
fromAmount = tonumber(fromAmount) or fromItemData.amount
if fromItemData and fromItemData.amount >= fromAmount then
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
if toInventory == "player" or toInventory == "hotbar" then
local toItemData = GetItemBySlot(src, toSlot)
RemoveItem(playerId, itemInfo["name"], fromAmount, fromSlot)
TriggerClientEvent("inventory:client:CheckWeapon", OtherPlayer.PlayerData.source, fromItemData.name)
if toItemData ~= nil then
itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
Player.Functions.RemoveItem(toItemData.name, toAmount, toSlot)
OtherPlayer.Functions.AddItem(itemInfo["name"], toAmount, fromSlot, toItemData.info)
TriggerEvent("qb-log:server:CreateLog", "robbing", "Swapped Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with item; **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** from player: **".. GetPlayerName(OtherPlayer.PlayerData.source) .. "** (citizenid: *"..OtherPlayer.PlayerData.citizenid.."* | *"..OtherPlayer.PlayerData.source.."*)")
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) swapped item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount.. "** with player: **".. GetPlayerName(OtherPlayer.PlayerData.source) .. "** (citizenid: *"..OtherPlayer.PlayerData.citizenid.."* | id: *"..OtherPlayer.PlayerData.source.."*)")
end
else
TriggerEvent("qb-log:server:CreateLog", "robbing", "Retrieved Item", "green", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) took item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount .. "** from player: **".. GetPlayerName(OtherPlayer.PlayerData.source) .. "** (citizenid: *"..OtherPlayer.PlayerData.citizenid.."* | *"..OtherPlayer.PlayerData.source.."*)")
end
AddItem(src, fromItemData.name, fromAmount, toSlot, fromItemData.info, fromItemData["created"])
else
local toItemData = OtherPlayer.PlayerData.items[toSlot]
local itemDataTest = OtherPlayer.Functions.GetItemBySlot(toSlot)
RemoveItem(playerId, itemInfo["name"], fromAmount, fromSlot)
if toItemData ~= nil then
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if itemDataTest.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
local itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
OtherPlayer.Functions.RemoveItem(itemInfo["name"], toAmount, toSlot)
OtherPlayer.Functions.AddItem(itemInfo["name"], toAmount, fromSlot, toItemData.info)
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) swapped item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** with name: **" .. fromItemData.name .. "**, amount: **" .. fromAmount.. "** with player: **".. GetPlayerName(OtherPlayer.PlayerData.source) .. "** (citizenid: *"..OtherPlayer.PlayerData.citizenid.."* | id: *"..OtherPlayer.PlayerData.source.."*)")
end
end
itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
AddItem(playerId, itemInfo["name"], fromAmount, toSlot, fromItemData.info, itemInfo["created"])
end
else
QBCore.Functions.Notify(src, "Ting findes ikke!", "error")
end
elseif QBCore.Shared.SplitStr(fromInventory, "-")[1] == "trunk" then
local plate = QBCore.Shared.SplitStr(fromInventory, "-")[2]
local fromItemData = Trunks[plate].items[fromSlot]
fromAmount = tonumber(fromAmount) or fromItemData.amount
if fromItemData and fromItemData.amount >= fromAmount then
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
if toInventory == "player" or toInventory == "hotbar" then
local toItemData = GetItemBySlot(src, toSlot)
RemoveFromTrunk(plate, fromSlot, itemInfo["name"], fromAmount)
if toItemData ~= nil then
itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
Player.Functions.RemoveItem(toItemData.name, toAmount, toSlot)
AddToTrunk(plate, fromSlot, toSlot, itemInfo["name"], toAmount, toItemData.info, itemInfo["created"])
TriggerEvent("qb-log:server:CreateLog", "trunk", "Swapped Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** plate: *" .. plate .. "*")
else
TriggerEvent("qb-log:server:CreateLog", "trunk", "Stacked Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) stacked item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** from plate: *" .. plate .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with name: **" .. itemInfo["name"] .. "**, amount: **" .. toAmount.. "** plate: *" .. plate .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "trunk", "Received Item", "green", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) received item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount.. "** plate: *" .. plate .. "*")
end
AddItem(src, fromItemData.name, fromAmount, toSlot, fromItemData.info, fromItemData["created"])
else
local toItemData = Trunks[plate].items[toSlot]
RemoveFromTrunk(plate, fromSlot, itemInfo["name"], fromAmount)
if toItemData ~= nil then
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
local itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
RemoveFromTrunk(plate, toSlot, itemInfo["name"], toAmount)
AddToTrunk(plate, fromSlot, toSlot, itemInfo["name"], toAmount, toItemData.info, itemInfo["created"])
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with name: **" .. itemInfo["name"] .. "**, amount: **" .. toAmount.. "** plate: *" .. plate .. "*")
end
end
itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
AddToTrunk(plate, toSlot, fromSlot, itemInfo["name"], fromAmount, fromItemData.info, itemInfo["created"])
end
else
QBCore.Functions.Notify(src, Lang:t("notify.itemexist"), "error")
end
elseif QBCore.Shared.SplitStr(fromInventory, "-")[1] == "glovebox" then
local plate = QBCore.Shared.SplitStr(fromInventory, "-")[2]
local fromItemData = Gloveboxes[plate].items[fromSlot]
fromAmount = tonumber(fromAmount) or fromItemData.amount
if fromItemData and fromItemData.amount >= fromAmount then
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
if toInventory == "player" or toInventory == "hotbar" then
local toItemData = GetItemBySlot(src, toSlot)
RemoveFromGlovebox(plate, fromSlot, itemInfo["name"], fromAmount)
if toItemData ~= nil then
itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
Player.Functions.RemoveItem(toItemData.name, toAmount, toSlot)
AddToGlovebox(plate, fromSlot, toSlot, itemInfo["name"], toAmount, toItemData.info, itemInfo["created"])
TriggerEvent("qb-log:server:CreateLog", "glovebox", "Swapped", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src..")* swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with item; name: **"..itemInfo["name"].."**, amount: **" .. toAmount .. "** plate: *" .. plate .. "*")
else
TriggerEvent("qb-log:server:CreateLog", "glovebox", "Stacked Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) stacked item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** from plate: *" .. plate .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with name: **" .. itemInfo["name"] .. "**, amount: **" .. toAmount.. "** plate: *" .. plate .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "glovebox", "Received Item", "green", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) received item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount.. "** plate: *" .. plate .. "*")
end
AddItem(src, fromItemData.name, fromAmount, toSlot, fromItemData.info, fromItemData["created"])
else
local toItemData = Gloveboxes[plate].items[toSlot]
RemoveFromGlovebox(plate, fromSlot, itemInfo["name"], fromAmount)
if toItemData ~= nil then
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
local itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
RemoveFromGlovebox(plate, toSlot, itemInfo["name"], toAmount)
AddToGlovebox(plate, fromSlot, toSlot, itemInfo["name"], toAmount, toItemData.info, itemInfo["created"])
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with name: **" .. itemInfo["name"] .. "**, amount: **" .. toAmount.. "** plate: *" .. plate .. "*")
end
end
itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
AddToGlovebox(plate, toSlot, fromSlot, itemInfo["name"], fromAmount, fromItemData.info, itemInfo["created"])
end
else
QBCore.Functions.Notify(src, Lang:t("notify.itemexist"), "error")
end
elseif QBCore.Shared.SplitStr(fromInventory, "-")[1] == "stash" then
local stashId = QBCore.Shared.SplitStr(fromInventory, "-")[2]
local fromItemData = Stashes[stashId].items[fromSlot]
fromAmount = tonumber(fromAmount) or fromItemData.amount
if fromItemData and fromItemData.amount >= fromAmount then
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
if toInventory == "player" or toInventory == "hotbar" then
local toItemData = GetItemBySlot(src, toSlot)
RemoveFromStash(stashId, fromSlot, itemInfo["name"], fromAmount)
if toItemData ~= nil then
itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
Player.Functions.RemoveItem(toItemData.name, toAmount, toSlot)
AddToStash(stashId, fromSlot, toSlot, itemInfo["name"], toAmount, toItemData.info, itemInfo["created"])
TriggerEvent("qb-log:server:CreateLog", "stash", "Swapped Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount .. "** stash: *" .. stashId .. "*")
else
TriggerEvent("qb-log:server:CreateLog", "stash", "Stacked Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) stacked item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** from stash: *" .. stashId .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount .. "** stash: *" .. stashId .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "stash", "Received Item", "green", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) received item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount.. "** stash: *" .. stashId .. "*")
end
SaveStashItems(stashId, Stashes[stashId].items)
AddItem(src, fromItemData.name, fromAmount, toSlot, fromItemData.info, fromItemData["created"])
else
local toItemData = Stashes[stashId].items[toSlot]
RemoveFromStash(stashId, fromSlot, itemInfo["name"], fromAmount)
if toItemData ~= nil then
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
local itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
RemoveFromStash(stashId, toSlot, itemInfo["name"], toAmount)
AddToStash(stashId, fromSlot, toSlot, itemInfo["name"], toAmount, toItemData.info, itemInfo["created"])
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount .. "** stash: *" .. stashId .. "*")
end
end
itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
AddToStash(stashId, toSlot, fromSlot, itemInfo["name"], fromAmount, fromItemData.info, itemInfo["created"])
end
else
QBCore.Functions.Notify(src, Lang:t("notify.itemexist"), "error")
end
elseif QBCore.Shared.SplitStr(fromInventory, "-")[1] == "traphouse" then
local traphouseId = QBCore.Shared.SplitStr(fromInventory, "_")[2]
local fromItemData = exports['qb-traphouse']:GetInventoryData(traphouseId, fromSlot)
fromAmount = tonumber(fromAmount) or fromItemData.amount
if fromItemData and fromItemData.amount >= fromAmount then
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
if toInventory == "player" or toInventory == "hotbar" then
local toItemData = GetItemBySlot(src, toSlot)
exports['qb-traphouse']:RemoveHouseItem(traphouseId, fromSlot, itemInfo["name"], fromAmount)
if toItemData ~= nil then
itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
Player.Functions.RemoveItem(toItemData.name, toAmount, toSlot)
exports['qb-traphouse']:AddHouseItem(traphouseId, fromSlot, itemInfo["name"], toAmount, toItemData.info, src)
TriggerEvent("qb-log:server:CreateLog", "stash", "Swapped Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount .. "** stash: *" .. traphouseId .. "*")
else
TriggerEvent("qb-log:server:CreateLog", "stash", "Stacked Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) stacked item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** from stash: *" .. traphouseId .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount .. "** stash: *" .. traphouseId .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "stash", "Received Item", "green", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) received item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount.. "** stash: *" .. traphouseId .. "*")
end
AddItem(src, fromItemData.name, fromAmount, toSlot, fromItemData.info, fromItemData["created"])
else
local toItemData = exports['qb-traphouse']:GetInventoryData(traphouseId, toSlot)
exports['qb-traphouse']:RemoveHouseItem(traphouseId, fromSlot, itemInfo["name"], fromAmount)
if toItemData ~= nil then
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
local itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
exports['qb-traphouse']:RemoveHouseItem(traphouseId, toSlot, itemInfo["name"], toAmount)
exports['qb-traphouse']:AddHouseItem(traphouseId, fromSlot, itemInfo["name"], toAmount, toItemData.info, src)
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount .. "** stash: *" .. traphouseId .. "*")
end
end
itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
exports['qb-traphouse']:AddHouseItem(traphouseId, toSlot, itemInfo["name"], fromAmount, fromItemData.info, src)
end
else
QBCore.Functions.Notify(src, "Ting findes ikke??", "error")
end
elseif QBCore.Shared.SplitStr(fromInventory, "-")[1] == "itemshop" then
local shopType = QBCore.Shared.SplitStr(fromInventory, "-")[2]
local itemData = ShopItems[shopType].items[fromSlot]
local itemInfo = QBCore.Shared.Items[itemData.name:lower()]
local bankBalance = Player.PlayerData.money["bank"]
local price = tonumber((itemData.price*fromAmount))
if QBCore.Shared.SplitStr(shopType, "_")[1] == "Dealer" then
if QBCore.Shared.SplitStr(itemData.name, "_")[1] == "weapon" then
price = tonumber(itemData.price)
if Player.Functions.RemoveMoney("cash", price, "dealer-item-bought") then
itemData.info.serie = tostring(QBCore.Shared.RandomInt(2) .. QBCore.Shared.RandomStr(3) .. QBCore.Shared.RandomInt(1) .. QBCore.Shared.RandomStr(2) .. QBCore.Shared.RandomInt(3) .. QBCore.Shared.RandomStr(4))
itemData.info.quality = 100
AddItem(src, itemData.name, 1, toSlot, itemData.info)
TriggerClientEvent('qb-drugs:client:updateDealerItems', src, itemData, 1)
QBCore.Functions.Notify(src, itemInfo["label"] .. " købt!", "success")
TriggerEvent("qb-log:server:CreateLog", "dealers", "Dealer item bought", "green", "**"..GetPlayerName(src) .. "** bought a " .. itemInfo["label"] .. " for $"..price)
else
QBCore.Functions.Notify(src, "Du har ikke nok penge..", "error")
end
else
if Player.Functions.RemoveMoney("cash", price, "dealer-item-bought") then
AddItem(src, itemData.name, fromAmount, toSlot, itemData.info)
TriggerClientEvent('qb-drugs:client:updateDealerItems', src, itemData, fromAmount)
QBCore.Functions.Notify(src, itemInfo["label"] .. " købt!", "success")
TriggerEvent("qb-log:server:CreateLog", "dealers", "Dealer item bought", "green", "**"..GetPlayerName(src) .. "** bought a " .. itemInfo["label"] .. " for $"..price)
else
QBCore.Functions.Notify(src, "Du har ikke nok penge..", "error")
end
end
elseif QBCore.Shared.SplitStr(shopType, "_")[1] == "Itemshop" then
if Player.Functions.RemoveMoney("cash", price, "itemshop-bought-item") then
if QBCore.Shared.SplitStr(itemData.name, "_")[1] == "weapon" then
itemData.info.serie = tostring(QBCore.Shared.RandomInt(2) .. QBCore.Shared.RandomStr(3) .. QBCore.Shared.RandomInt(1) .. QBCore.Shared.RandomStr(2) .. QBCore.Shared.RandomInt(3) .. QBCore.Shared.RandomStr(4))
itemData.info.quality = 100
end
local serial = itemData.info.serie
local imageurl = ("https://cfx-nui-ps-inventory/html/images/%s.png"):format(itemData.name)
local notes = "Purchased at Ammunation"
local owner = Player.PlayerData.charinfo.firstname .. " " .. Player.PlayerData.charinfo.lastname
local weapClass = 1
local weapModel = QBCore.Shared.Items[itemData.name].label
AddItem(src, itemData.name, fromAmount, toSlot, itemData.info)
TriggerClientEvent('qb-shops:client:UpdateShop', src, QBCore.Shared.SplitStr(shopType, "_")[2], itemData, fromAmount)
QBCore.Functions.Notify(src, itemInfo["label"] .. " købt!", "success")
exports['ps-mdt']:CreateWeaponInfo(serial, imageurl, notes, owner, weapClass, weapModel)
TriggerEvent("qb-log:server:CreateLog", "shops", "Shop item bought", "green", "**"..GetPlayerName(src) .. "** bought a " .. itemInfo["label"] .. " for $"..price)
elseif bankBalance >= price then
Player.Functions.RemoveMoney("bank", price, "itemshop-bought-item")
if QBCore.Shared.SplitStr(itemData.name, "_")[1] == "weapon" then
itemData.info.serie = tostring(QBCore.Shared.RandomInt(2) .. QBCore.Shared.RandomStr(3) .. QBCore.Shared.RandomInt(1) .. QBCore.Shared.RandomStr(2) .. QBCore.Shared.RandomInt(3) .. QBCore.Shared.RandomStr(4))
itemData.info.quality = 100
end
local serial = itemData.info.serie
local imageurl = ("https://cfx-nui-ps-inventory/html/images/%s.png"):format(itemData.name)
local notes = "Purchased at Ammunation"
local owner = Player.PlayerData.charinfo.firstname .. " " .. Player.PlayerData.charinfo.lastname
local weapClass = 1
local weapModel = QBCore.Shared.Items[itemData.name].label
AddItem(src, itemData.name, fromAmount, toSlot, itemData.info)
TriggerClientEvent('qb-shops:client:UpdateShop', src, QBCore.Shared.SplitStr(shopType, "_")[2], itemData, fromAmount)
QBCore.Functions.Notify(src, itemInfo["label"] .. " købt!", "success")
exports['ps-mdt']:CreateWeaponInfo(serial, imageurl, notes, owner, weapClass, weapModel)
TriggerEvent("qb-log:server:CreateLog", "shops", "Shop item bought", "green", "**"..GetPlayerName(src) .. "** bought a " .. itemInfo["label"] .. " for $"..price)
else
QBCore.Functions.Notify(src, "Du har ikke nok penge..", "error")
end
else
if Player.Functions.RemoveMoney("cash", price, "unkown-itemshop-bought-item") then
AddItem(src, itemData.name, fromAmount, toSlot, itemData.info)
QBCore.Functions.Notify(src, itemInfo["label"] .. " købt!", "success")
TriggerEvent("qb-log:server:CreateLog", "shops", "Shop item bought", "green", "**"..GetPlayerName(src) .. "** bought a " .. itemInfo["label"] .. " for $"..price)
elseif bankBalance >= price then
Player.Functions.RemoveMoney("bank", price, "unkown-itemshop-bought-item")
AddItem(src, itemData.name, fromAmount, toSlot, itemData.info)
QBCore.Functions.Notify(src, itemInfo["label"] .. " købt!", "success")
TriggerEvent("qb-log:server:CreateLog", "shops", "Shop item bought", "green", "**"..GetPlayerName(src) .. "** bought a " .. itemInfo["label"] .. " for $"..price)
else
TriggerClientEvent('QBCore:Notify', src, "Du har ikke nok penge..", "error")
end
end
elseif fromInventory == "crafting" then
local itemData = Config.CraftingItems[fromSlot]
if hasCraftItems(src, itemData.costs, fromAmount) then
TriggerClientEvent("inventory:client:CraftItems", src, itemData.name, itemData.costs, fromAmount, toSlot, itemData.points)
else
TriggerClientEvent("inventory:client:UpdatePlayerInventory", src, true)
TriggerClientEvent('QBCore:Notify', src, "Du har ikke de rigtige ting..", "error")
end
elseif fromInventory == "attachment_crafting" then
local itemData = Config.AttachmentCrafting[fromSlot]
if hasCraftItems(src, itemData.costs, fromAmount) then
TriggerClientEvent("inventory:client:CraftAttachment", src, itemData.name, itemData.costs, fromAmount, toSlot, itemData.points)
else
TriggerClientEvent("inventory:client:UpdatePlayerInventory", src, true)
TriggerClientEvent('QBCore:Notify', src, "Du har ikke de rigtige ting..", "error")
end
else
-- drop
fromInventory = tonumber(fromInventory)
local fromItemData = Drops[fromInventory].items[fromSlot]
fromAmount = tonumber(fromAmount) or fromItemData.amount
if fromItemData and fromItemData.amount >= fromAmount then
local itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
if toInventory == "player" or toInventory == "hotbar" then
local toItemData = GetItemBySlot(src, toSlot)
RemoveFromDrop(fromInventory, fromSlot, itemInfo["name"], fromAmount)
if toItemData ~= nil then
toAmount = tonumber(toAmount) and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
Player.Functions.RemoveItem(toItemData.name, toAmount, toSlot)
AddToDrop(fromInventory, toSlot, itemInfo["name"], toAmount, toItemData.info, itemInfo["created"])
if itemInfo["name"] == "radio" then
TriggerClientEvent('Radio.Set', src, false)
end
TriggerEvent("qb-log:server:CreateLog", "drop", "Swapped Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount .. "** - dropid: *" .. fromInventory .. "*")
else
TriggerEvent("qb-log:server:CreateLog", "drop", "Stacked Item", "orange", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) stacked item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** - from dropid: *" .. fromInventory .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount .. "** - dropid: *" .. fromInventory .. "*")
end
else
TriggerEvent("qb-log:server:CreateLog", "drop", "Received Item", "green", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) received item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount.. "** - dropid: *" .. fromInventory .. "*")
end
AddItem(src, fromItemData.name, fromAmount, toSlot, fromItemData.info, fromItemData["created"])
else
toInventory = tonumber(toInventory)
local toItemData = Drops[toInventory].items[toSlot]
RemoveFromDrop(fromInventory, fromSlot, itemInfo["name"], fromAmount)
if toItemData ~= nil then
local toAmount = tonumber(toAmount) ~= nil and tonumber(toAmount) or toItemData.amount
if toItemData.amount >= toAmount then
if toItemData.name ~= fromItemData.name then
local itemInfo = QBCore.Shared.Items[toItemData.name:lower()]
RemoveFromDrop(toInventory, toSlot, itemInfo["name"], toAmount)
AddToDrop(fromInventory, fromSlot, itemInfo["name"], toAmount, toItemData.info, itemInfo["created"])
if itemInfo["name"] == "radio" then
TriggerClientEvent('Radio.Set', src, false)
end
end
else
TriggerEvent("qb-log:server:CreateLog", "anticheat", "Dupe log", "red", "**".. GetPlayerName(src) .. "** (citizenid: *"..Player.PlayerData.citizenid.."* | id: *"..src.."*) swapped item; name: **"..toItemData.name.."**, amount: **" .. toAmount .. "** with item; name: **"..fromItemData.name.."**, amount: **" .. fromAmount .. "** - dropid: *" .. fromInventory .. "*")
end
end
itemInfo = QBCore.Shared.Items[fromItemData.name:lower()]
AddToDrop(toInventory, toSlot, itemInfo["name"], fromAmount, fromItemData.info, itemInfo["created"])
if itemInfo["name"] == "radio" then
TriggerClientEvent('Radio.Set', src, false)
end
end
else
QBCore.Functions.Notify(src, "Ting findes ikke??", "error")
end
end
end)
RegisterNetEvent('ps-inventory:server:SaveStashItems', function(stashId, items)
MySQL.Async.insert('INSERT INTO stashitems (stash, items) VALUES (:stash, :items) ON DUPLICATE KEY UPDATE items = :items', {
['stash'] = stashId,
['items'] = json.encode(items)
})
end)
RegisterServerEvent("inventory:server:GiveItem", function(target, name, amount, slot)
local src = source
local Player = QBCore.Functions.GetPlayer(src)
target = tonumber(target)
local OtherPlayer = QBCore.Functions.GetPlayer(target)
local dist = #(GetEntityCoords(GetPlayerPed(src))-GetEntityCoords(GetPlayerPed(target)))
if Player == OtherPlayer then return QBCore.Functions.Notify(src, "Du kan ikke give dig selv ting?") end
if dist > 2 then return QBCore.Functions.Notify(src, "Du er for langt væk!") end
local item = GetItemBySlot(src, slot)
if not item then QBCore.Functions.Notify(src, "Tingen du prøvede at give væk findes ikke!"); return end
if item.name ~= name then QBCore.Functions.Notify(src, "Forkert ting, prøv igen!"); return end
if amount <= item.amount then
if amount == 0 then
amount = item.amount
end
if RemoveItem(src, item.name, amount, item.slot) then
if AddItem(target, item.name, amount, false, item.info, item.created) then
TriggerClientEvent('inventory:client:ItemBox',target, QBCore.Shared.Items[item.name], "add")
QBCore.Functions.Notify(target, "Du fik "..amount..' '..item.label.." fra "..Player.PlayerData.charinfo.firstname.." "..Player.PlayerData.charinfo.lastname)
TriggerClientEvent("inventory:client:UpdatePlayerInventory", target, true)
TriggerClientEvent('inventory:client:ItemBox',src, QBCore.Shared.Items[item.name], "remove")
QBCore.Functions.Notify(src, "Du gav " .. OtherPlayer.PlayerData.charinfo.firstname.." "..OtherPlayer.PlayerData.charinfo.lastname.. " " .. amount .. " " .. item.label .."!")
TriggerClientEvent("inventory:client:UpdatePlayerInventory", src, true)
TriggerClientEvent('ps-inventory:client:giveAnim', src)
TriggerClientEvent('ps-inventory:client:giveAnim', target)
else
AddItem(src, item.name, amount, item.slot, item.info, item.created)
QBCore.Functions.Notify(src, "Personens inventar er fyldt!", "error")
QBCore.Functions.Notify(target, "Personens inventar er fyldt!", "error")
TriggerClientEvent("inventory:client:UpdatePlayerInventory", src, false)
TriggerClientEvent("inventory:client:UpdatePlayerInventory", target, false)
end
else
TriggerClientEvent('QBCore:Notify', src, "Du har ikke nok ting", "error")
end
else
TriggerClientEvent('QBCore:Notify', src, "Du har ikke nok ting at overfører")
end
end)
RegisterNetEvent('inventory:server:snowball', function(action)
if action == "add" then
AddItem(source, "weapon_snowball")
elseif action == "remove" then
RemoveItem(source, "weapon_snowball")
end
end)
-- callback
QBCore.Functions.CreateCallback('ps-inventory:server:GetStashItems', function(source, cb, stashId)
cb(GetStashItems(stashId))
end)
QBCore.Functions.CreateCallback('inventory:server:GetCurrentDrops', function(_, cb)
cb(Drops)
end)
QBCore.Functions.CreateCallback('QBCore:HasItem', function(source, cb, items, amount)
print("^3QBCore:HasItem is deprecated, please use QBCore.Functions.HasItem, it can be used on both server- and client-side and uses the same arguments.^0")
local retval = false
local Player = QBCore.Functions.GetPlayer(source)
if not Player then return cb(false) end
local isTable = type(items) == 'table'
local isArray = isTable and table.type(items) == 'array' or false
local totalItems = #items
local count = 0
local kvIndex = 2
if isTable and not isArray then
totalItems = 0
for _ in pairs(items) do totalItems += 1 end
kvIndex = 1
end
if isTable then
for k, v in pairs(items) do
local itemKV = {k, v}
local item = GetItemByName(source, itemKV[kvIndex])
if item and ((amount and item.amount >= amount) or (not amount and not isArray and item.amount >= v) or (not amount and isArray)) then
count += 1
end
end
if count == totalItems then
retval = true
end
else -- Single item as string
local item = GetItemByName(source, items)
if item and not amount or (item and amount and item.amount >= amount) then
retval = true
end
end
cb(retval)
end)
-- command
QBCore.Commands.Add("resetinv", "Nulstil inventar (Admin)", {{name="type", help="stash/trunk/glovebox"},{name="id/nummerplade", help="ID på stash eller nummerplade"}}, true, function(source, args)
local invType = args[1]:lower()
table.remove(args, 1)
local invId = table.concat(args, " ")
if invType and invId then
if invType == "trunk" then
if Trunks[invId] then
Trunks[invId].isOpen = false
end
elseif invType == "glovebox" then
if Gloveboxes[invId] then
Gloveboxes[invId].isOpen = false
end
elseif invType == "stash" then
if Stashes[invId] then
Stashes[invId].isOpen = false
end
else
TriggerClientEvent('QBCore:Notify', source, "Ikke gyldig type..", "error")
end
else
TriggerClientEvent('QBCore:Notify', source, "Du har ikke fyldt alt ud..", "error")
end
end, "admin")
QBCore.Commands.Add("rob", "Røv spiller", {}, false, function(source, args)
TriggerClientEvent("police:client:RobPlayer", source)
end)
QBCore.Commands.Add("giveitem", "Giv ting (Admin Only)", {{name="id", help="Spiller ID"},{name="genstand", help="Objekt-navnet på genstanden (Ikke label)"}, {name="mængde", help="Antal du vil give"}}, false, function(source, args)
local id = tonumber(args[1])
local Player = QBCore.Functions.GetPlayer(id)
local amount = tonumber(args[3]) or 1
local itemData = QBCore.Shared.Items[tostring(args[2]):lower()]
if Player then
if itemData then
-- check iteminfo
local info = {}
if itemData["name"] == "id_card" then
info.citizenid = Player.PlayerData.citizenid
info.firstname = Player.PlayerData.charinfo.firstname
info.lastname = Player.PlayerData.charinfo.lastname
info.birthdate = Player.PlayerData.charinfo.birthdate
info.gender = Player.PlayerData.charinfo.gender
info.nationality = Player.PlayerData.charinfo.nationality
elseif itemData["name"] == "driver_license" then
info.firstname = Player.PlayerData.charinfo.firstname
info.lastname = Player.PlayerData.charinfo.lastname
info.birthdate = Player.PlayerData.charinfo.birthdate
info.type = "B Kørekort"
elseif itemData["type"] == "weapon" then
amount = 1
info.serie = tostring(QBCore.Shared.RandomInt(2) .. QBCore.Shared.RandomStr(3) .. QBCore.Shared.RandomInt(1) .. QBCore.Shared.RandomStr(2) .. QBCore.Shared.RandomInt(3) .. QBCore.Shared.RandomStr(4))
info.quality = 100
elseif itemData["name"] == "harness" then
info.uses = 20
elseif itemData["name"] == "markedbills" then
info.worth = math.random(5000, 10000)
elseif itemData["name"] == "labkey" then
info.lab = exports["qb-methlab"]:GenerateRandomLab()
elseif itemData["name"] == "printerdocument" then
info.url = "https://cdn.discordapp.com/attachments/870094209783308299/870104331142189126/Logo_-_Display_Picture_-_Stylized_-_Red.png"
elseif QBCore.Shared.Items[itemData["name"]]["decay"] and QBCore.Shared.Items[itemData["name"]]["decay"] > 0 then
info.quality = 100
end
if AddItem(id, itemData["name"], amount, false, info) then
QBCore.Functions.Notify(source, "Du hav " ..Player.PlayerData.charinfo.firstname.." "..Player.PlayerData.charinfo.lastname.." "..amount.." "..itemData["name"].. "", "success")
else
QBCore.Functions.Notify(source, "Du kan ikke give ting!", "error")
end
else
QBCore.Functions.Notify(source, "Dette item findes ikke", "error")
end
else
QBCore.Functions.Notify(source, "Spilleren er offline", "error")
end
end, "admin")
QBCore.Commands.Add("randomitems", "Giv tilfældige ting (God)", {}, false, function(source, _)
local filteredItems = {}
for k, v in pairs(QBCore.Shared.Items) do
if QBCore.Shared.Items[k]["type"] ~= "weapon" then
filteredItems[#filteredItems+1] = v
end
end
for _ = 1, 10, 1 do
local randitem = filteredItems[math.random(1, #filteredItems)]
local amount = math.random(1, 10)
if randitem["unique"] then
amount = 1
end
if AddItem(source, randitem["name"], amount) then
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items[randitem["name"]], 'add')
Wait(500)
end
end
end, "god")
QBCore.Commands.Add('clearinv', 'Nulstil spillers inventar (Admin)', { { name = 'id', help = 'Spillerens ID' } }, false, function(source, args)
local playerId = args[1] ~= '' and tonumber(args[1]) or source
local Player = QBCore.Functions.GetPlayer(playerId)
if Player then
ClearInventory(playerId)
else
QBCore.Functions.Notify(source, "Spilleren er ikke online", 'error')
end
end, 'admin')
-- item
-- QBCore.Functions.CreateUseableItem("snowball", function(source, item)
-- local Player = QBCore.Functions.GetPlayer(source)
-- local itemData = Player.Functions.GetItemBySlot(item.slot) -- --- DID THIS GET PUT ELSEWHERE?? IDK
-- if Player.Functions.GetItemBySlot(item.slot) then
-- TriggerClientEvent("inventory:client:UseSnowball", source, itemData.amount)
-- end
-- end)
CreateUsableItem("driver_license", function(source, item)
local playerPed = GetPlayerPed(source)
local playerCoords = GetEntityCoords(playerPed)
local players = QBCore.Functions.GetPlayers()
for _, v in pairs(players) do
local targetPed = GetPlayerPed(v)
local dist = #(playerCoords - GetEntityCoords(targetPed))
if dist < 3.0 then
TriggerClientEvent('chat:addMessage', v, {
template = '<div class="chat-message advert"><div class="chat-message-body"><strong>{0}:</strong><br><br> <strong>Fornavn:</strong> {1} <br><strong>Efternavn:</strong> {2} <br><strong>Fødselsdato:</strong> {3} <br><strong>Type:</strong> {4}</div></div>',
args = {
"Kørekort",
item.info.firstname,
item.info.lastname,
item.info.birthdate,
item.info.type
}
}
)
end
end
end)
CreateUsableItem("id_card", function(source, item)
local playerPed = GetPlayerPed(source)
local playerCoords = GetEntityCoords(playerPed)
local players = QBCore.Functions.GetPlayers()
for _, v in pairs(players) do
local targetPed = GetPlayerPed(v)
local dist = #(playerCoords - GetEntityCoords(targetPed))
if dist < 3.0 then
local gender = "Mand"
if item.info.gender == 1 then
gender = "Kvinde"
end
TriggerClientEvent('chat:addMessage', v, {
template = '<div class="chat-message advert"><div class="chat-message-body"><strong>{0}:</strong><br><br> <strong>Borger ID:</strong> {1} <br><strong>Fornavn:</strong> {2} <br><strong>Efternavn:</strong> {3} <br><strong>Fødselsdato:</strong> {4} <br><strong>Køn:</strong> {5} <br><strong>Nationalitet:</strong> {6}</div></div>',
args = {
"ID Kort",
item.info.citizenid,
item.info.firstname,
item.info.lastname,
item.info.birthdate,
gender,
item.info.nationality
}
}
)
end
end
end)
CreateThread(function()
while true do
for k, v in pairs(Drops) do
if v and (v.createdTime + Config.CleanupDropTime < os.time()) and not Drops[k].isOpen then
Drops[k] = nil
TriggerClientEvent("inventory:client:RemoveDropItem", -1, k)
end
end
Wait(60 * 1000)
end
end)
-- Decay System
local TimeAllowed = 60 * 60 * 24 * 1 -- Maths for 1 day dont touch its very important and could break everything
function ConvertQuality(item)
local StartDate = item.created
local DecayRate = QBCore.Shared.Items[item.name:lower()]["decay"] ~= nil and QBCore.Shared.Items[item.name:lower()]["decay"] or 0.0
if DecayRate == nil then
DecayRate = 0
end
local TimeExtra = math.ceil((TimeAllowed * DecayRate))
local percentDone = 100 - math.ceil((((os.time() - StartDate) / TimeExtra) * 100))
if DecayRate == 0 then
percentDone = 100
end
if percentDone < 0 then
percentDone = 0
end
return percentDone
end
QBCore.Functions.CreateCallback('inventory:server:ConvertQuality', function(source, cb, inventory, other)
local src = source
local data = {}
local Player = QBCore.Functions.GetPlayer(src)
for _, item in pairs(inventory) do
if item.created then
if QBCore.Shared.Items[item.name:lower()]["decay"] ~= nil or QBCore.Shared.Items[item.name:lower()]["decay"] ~= 0 then
if item.info then
if type(item.info) == "string" then
item.info = {}
end
if item.info.quality == nil then
item.info.quality = 100
end
else
local info = {quality = 100}
item.info = info
end
local quality = ConvertQuality(item)
if item.info.quality then
if quality < item.info.quality then
item.info.quality = quality
end
else
item.info = {quality = quality}
end
else
if item.info then
item.info.quality = 100
else
local info = {quality = 100}
item.info = info
end
end
end
end
if other then
local inventoryType = QBCore.Shared.SplitStr(other.name, "-")[1]
local uniqueId = QBCore.Shared.SplitStr(other.name, "-")[2]
if inventoryType == "trunk" then
for _, item in pairs(other.inventory) do
if item.created then
if QBCore.Shared.Items[item.name:lower()]["decay"] ~= nil or QBCore.Shared.Items[item.name:lower()]["decay"] ~= 0 then
if item.info then
if item.info.quality == nil then
item.info.quality = 100
end
else
local info = {quality = 100}
item.info = info
end
local quality = ConvertQuality(item)
if item.info.quality then
if quality < item.info.quality then
item.info.quality = quality
end
else
item.info = {quality = quality}
end
else
if item.info then
item.info.quality = 100
else
local info = {quality = 100}
item.info = info
end
end
end
end
Trunks[uniqueId].items = other.inventory
TriggerClientEvent("inventory:client:UpdateOtherInventory", Player.PlayerData.source, other.inventory, false)
elseif inventoryType == "glovebox" then
for _, item in pairs(other.inventory) do
if item.created then
if QBCore.Shared.Items[item.name:lower()]["decay"] ~= nil or QBCore.Shared.Items[item.name:lower()]["decay"] ~= 0 then
if item.info then
if item.info.quality == nil then
item.info.quality = 100
end
else
local info = {quality = 100}
item.info = info
end
local quality = ConvertQuality(item)
if item.info.quality then
if quality < item.info.quality then
item.info.quality = quality
end
else
item.info = {quality = quality}
end
else
if item.info then
item.info.quality = 100
else
local info = {quality = 100}
item.info = info
end
end
end
end
Gloveboxes[uniqueId].items = other.inventory
TriggerClientEvent("inventory:client:UpdateOtherInventory", Player.PlayerData.source, other.inventory, false)
elseif inventoryType == "stash" then
for _, item in pairs(other.inventory) do
if item.created then
if QBCore.Shared.Items[item.name:lower()]["decay"] ~= nil or QBCore.Shared.Items[item.name:lower()]["decay"] ~= 0 then
if item.info then
if type(item.info) == "string" then
item.info = {}
end
if item.info.quality == nil then
item.info.quality = 100
end
else
local info = {quality = 100}
item.info = info
end
local quality = ConvertQuality(item)
if item.info.quality then
if quality < item.info.quality then
item.info.quality = quality
end
else
item.info = {quality = quality}
end
else
if item.info then
item.info.quality = 100
else
local info = {quality = 100}
item.info = info
end
end
end
end
Stashes[uniqueId].items = other.inventory
TriggerClientEvent("inventory:client:UpdateOtherInventory", Player.PlayerData.source, other.inventory, false)
end
end
Player.Functions.SetInventory(inventory)
TriggerClientEvent("inventory:client:UpdatePlayerInventory", Player.PlayerData.source, false)
data.inventory = inventory
data.other = other
cb(data)
end)
-- Warning Messages
RegisterNetEvent('inventory:server:addTrunkItems', function()
print('inventory:server:addTrunkItems has been deprecated please use exports[\'ps-inventory\']:addTrunkItems(plate, items)')
end)
RegisterNetEvent('inventory:server:addGloveboxItems', function()
print('inventory:server:addGloveboxItems has been deprecated please use exports[\'ps-inventory\']:addGloveboxItems(plate, items)')
end)