Jump to content
LOOKING FOR ROBLOX ASSETS? VISIT ROBLOXBAY.COM! ×
THE BEST DISCORD BACKUP BOT | PRESERVE YOUR DISCORD SERVER! ×

RobloxBay

Visit Site

FiveSecured

 

Stop shipping plaintext. FiveSecured encrypts, obfuscates, and licenses your Lua resources so customers run your work without ever holding your source.

Try for Free
  • 5decrypt-banner-v1.thumb.png.262b7992a5a4de66fd6633bf48af6c1c.png

ak47_qb_inventory 1.0.0

   (0 reviews)

1 Screenshot

About This File

DOES NOT WORK !

Edited by yoladdd

  • Nice 1

User Feedback

Recommended Comments

yoladdd

Posted

@PhilAccioyee bro upto you i dont know how delete stuff of here haha ill just change the description

 

elly01

Posted

definitely not working

inventory.PNG

Rodolforaw

Posted

--correção
local
inventories = {}
local drops = {}
local tempInventories = {}
local openInventories = {}
local saveQueue = {}
 
-- Initialize global variables
Inventories = inventories
Drops = drops
TempInventories = tempInventories
OpenInventories = openInventories
SaveQueue = saveQueue
 
-- Error handler function
local function pError(errorMessage)
   print(errorMessage)
end
 
-- AddItemInternal function to add an item to an inventory
local function AddItemInternal(inventoryIdentifier, item, amount, slot, itemInfo, weight, expireTime)
  local invokedResource = GetInvokingResource()
 
  local itemTemplate = Config.Shared.Items[item]
  if not itemTemplate then
    return false, "invitem" -- If item is invalid
  end
 
  local identifier = ActivePlayersBySource[inventoryIdentifier] or inventoryIdentifier
  local inventory = inventories[identifier]
 
  if not inventory then
    return false, "noinv"
  end
 
  amount = tonumber(amount) or 1
 
  -- Check weight limit
  if (itemTemplate.weight * amount) + inventory.weight > inventory.maxWeight then
    if ActivePlayersByIdentifier[identifier] then
      TriggerClientEvent("ak47_inventory:notify", ActivePlayersByIdentifier[identifier], _U("invfull"), "error")
    end
    return false, "weight"
  end
 
  -- Check item limit
  if itemTemplate.limit and inventory.type == "playerinventory" then
    local has = GetAmount(identifier, item)
    if has + amount > itemTemplate.limit then
      if ActivePlayersByIdentifier[identifier] then
        TriggerClientEvent("ak47_inventory:notify", ActivePlayersByIdentifier[identifier], _U("maxlimit"), "error")
      end
      return false, "limit"
    end
  end
 
  -- Prepare item info
  slot = tonumber(slot)
  itemInfo = itemInfo or {}
  if itemTemplate.durability then
    itemInfo.quality = itemInfo.quality or 100
    if not expireTime then
      expireTime = os.time() + (itemTemplate.durability * 3600)
    end
  end
  if itemTemplate.type == "weapon" then
    itemInfo.quality = itemInfo.quality or 100
    if not itemTemplate.throwable then
      itemInfo.ammo = itemInfo.ammo or Config.SpawnWithAmmo[item:lower()] or 0
      itemInfo.components = itemInfo.components or {}
      itemInfo.tint = itemInfo.tint or 0
      itemInfo.uid = itemInfo.uid or itemInfo.serial or itemInfo.serie or generateRandomUid(4, 4)
    end
  end
 
  -- Function to add amount to a slot
  local function AddAmountToSlot(slot, amount)
    if not inventory.items[slot].name then
      inventory.items[slot] = cleanItemProp(table.deepclone(itemTemplate))
      inventory.items[slot].slot = slot
      inventory.items[slot].amount = 0
      inventory.items[slot].count = 0
      inventory.items[slot].info = itemInfo
 
      if Config.ProtectedItems[item] then
        inventory.items[slot].info.protected = 1
      end
 
      -- Handle backpack items
      local backpackItem = isBackpackItem(item)
      if backpackItem then
        if not inventory.items[slot].info.identifier then
          local uniqueId = item .. ":" .. generateRandomUid(4, 4)
          inventory.items[slot].info.identifier = uniqueId
          inventory.items[slot].info.slots = backpackItem.slots
          inventory.items[slot].info.maxWeight = backpackItem.maxWeight
          inventory.items[slot].info.type = "backpack"
          inventory.items[slot].info.type2 = backpackItem.type2
          CreateInventory(uniqueId, {
            label = inventory.items[slot].label,
            maxWeight = backpackItem.maxWeight,
            slots = backpackItem.slots,
            type = inventory.items[slot].info.type,
            type2 = backpackItem.type2,
            whitelist = backpackItem.whitelist,
            blacklist = backpackItem.blacklist,
          })
        end
      end
    end
 
    local addable = amount
    if itemTemplate.stacksize then
      local space = itemTemplate.stacksize - inventory.items[slot].amount
      addable = math.min(amount, space)
    end
 
    inventory.items[slot].amount = inventory.items[slot].amount + addable
    inventory.items[slot].count = inventory.items[slot].amount
 
    if weight then
      inventory.items[slot].weight = weight
    end
    if expireTime then
      inventory.items[slot].expiretime = expireTime
    end
 
    inventory.weight = inventory.weight + inventory.items[slot].weight * addable
 
    SendLog("additem", {
      identifier = inventory.identifier,
      invLabel = inventory.label,
      itemLabel = itemTemplate.label,
      amount = addable,
      invoked = invokedResource,
    })
 
    if ActivePlayersByIdentifier[identifier] then
      onAddItem(ActivePlayersByIdentifier[identifier], item, addable, slot, GetAmount(identifier, item))
    end
 
    return amount - addable
  end
 
  -- Logic for items with stacksize
  if itemTemplate.stacksize then
    -- Check if enough slots are available
    local remainingAmount = amount
    local totalFreeSpace = 0
    local partiallyFilledSlots = {}
 
    -- Fill existing partially filled slots first
    for i = 1, #inventory.items do
      local slotItem = inventory.items[i]
      if slotItem and slotItem.name == item and table.matches(slotItem.info, itemInfo) then
        local availableSpace = itemTemplate.stacksize - slotItem.amount
        if availableSpace > 0 then
          totalFreeSpace = totalFreeSpace + availableSpace
          table.insert(partiallyFilledSlots, { slot = i, availableSpace = availableSpace })
          if totalFreeSpace >= remainingAmount then
            break
          end
        end
      end
    end
 
    -- Check if there are enough empty slots to accommodate the remaining items
    local neededSlots = 0
    if totalFreeSpace < remainingAmount then
      remainingAmount = remainingAmount - totalFreeSpace
      neededSlots = math.ceil(remainingAmount / itemTemplate.stacksize)
      local freeSlots = GetEmptySlotCount(identifier)
      if neededSlots > freeSlots then
        if ActivePlayersByIdentifier[identifier] then
          TriggerClientEvent("ak47_inventory:notify", source, _U("invfull"), "error")
        end
        return false, "noslot"
      end
    end
 
    -- Attempt to add to the specified slot first, if provided
    if slot then
      if slot > inventory.slots then
        print(("^3Failed to add item into slot %s.\nMax slot of this inventory[%s] is %s^0"😞format(slot, inventory.identifier, inventory.slots))
        return false, "overslot"
      end
      -- Check if the specified slot is suitable
      if
        inventory.items[slot]
        and inventory.items[slot].name
      then
        if
          inventory.items[slot].name == item
          and table.matches(inventory.items[slot].info, itemInfo)
          and inventory.items[slot].amount < itemTemplate.stacksize
          and (not Config.LockedSlots[slot] or not Config.LockedSlotBlacklistedItems[item])
        then
          -- Try to add the item to this slot if it has the same item and there's space
          amount = AddAmountToSlot(slot, amount)
          if amount <= 0 then
            saveQueue[identifier] = not tempInventories[identifier]
            return true, slot
          end
        else
          -- Specified slot has a different item or is full
          slot = nil -- Reset slot to fall back to regular slot-finding logic
        end
      elseif not inventory.items[slot].name and (not Config.LockedSlots[slot] or not Config.LockedSlotBlacklistedItems[item]) then
        -- Slot is empty, so add the item here
        amount = AddAmountToSlot(slot, amount)
        if amount <= 0 then
          saveQueue[identifier] = not tempInventories[identifier]
          return true, slot
        end
      end
    end
 
    -- Process partially filled slots
    for _, slotData in ipairs(partiallyFilledSlots) do
      amount = AddAmountToSlot(slotData.slot, amount)
      if amount <= 0 then
        saveQueue[identifier] = not tempInventories[identifier]
        return true, slotData.slot
      end
    end
 
    -- Process slot assignment and adding items
    local safetyCounter = 0 -- Add a safety counter to prevent infinite loops
    local maxAttempts = #inventory.items * 2 -- Max attempts to find a slot
 
    while amount > 0 and safetyCounter < maxAttempts do
      slot = findFirstEmptySlot(inventory.items)
      if not slot then
        -- No empty slots available
        if ActivePlayersByIdentifier[identifier] then
          TriggerClientEvent("ak47_inventory:notify", ActivePlayersByIdentifier[identifier], _U("invfull"), "error")
        end
        return false, "noslot"
      end
      if Config.LockedSlots[slot] and Config.LockedSlotBlacklistedItems[item] then
        if ActivePlayersByIdentifier[identifier] then
          TriggerClientEvent("ak47_inventory:notify", ActivePlayersByIdentifier[identifier], _U("lockedblacklisteditem"), "error")
        end
        return false, "lockedblacklisteditem"
      end
      amount = AddAmountToSlot(slot, amount)
      safetyCounter = safetyCounter + 1 -- Increment the safety counter
    end
 
    if safetyCounter >= maxAttempts then
      -- Handle case where the loop exceeded the max attempts, indicating a potential issue
      print("^1ERROR: AddItem function exceeded maximum attempts to find a valid slot.^0")
      return false, "infinite_loop_prevention"
    end
  else
    -- Logic for items without stacksize
    if slot then
      if slot > inventory.slots then
        print(("^3Failed to add item into slot %s.\nMax slot of this inventory[%s] is %s^0"😞format(slot, inventory.identifier, inventory.slots))
        return false, "overslot"
      end
      if Config.LockedSlots[slot] and Config.LockedSlotBlacklistedItems[item] then
        if ActivePlayersByIdentifier[identifier] then
          TriggerClientEvent("ak47_inventory:notify", ActivePlayersByIdentifier[identifier], _U("lockedblacklisteditem"), "error")
        end
        return false, "lockedblacklisteditem"
      end
      -- If slot is specified and empty, add item there
      if not inventory.items[slot] or not inventory.items[slot].name then
        inventory.items[slot] = cleanItemProp(table.deepclone(itemTemplate))
        inventory.items[slot].slot = slot
        inventory.items[slot].amount = amount
        inventory.items[slot].count = amount
        inventory.items[slot].info = itemInfo
 
        if Config.ProtectedItems[item] then
          inventory.items[slot].info.protected = 1
        end
 
        -- Handle backpack items
        local backpackItem = isBackpackItem(item)
        if backpackItem then
          if not inventory.items[slot].info.identifier then
            local uniqueId = item .. ":" .. generateRandomUid(4, 4)
            inventory.items[slot].info.identifier = uniqueId
            inventory.items[slot].info.slots = backpackItem.slots
            inventory.items[slot].info.maxWeight = backpackItem.maxWeight
            inventory.items[slot].info.type = "backpack"
            inventory.items[slot].info.type2 = backpackItem.type2
            CreateInventory(uniqueId, {
              label = inventory.items[slot].label,
              maxWeight = backpackItem.maxWeight,
              slots = backpackItem.slots,
              type = inventory.items[slot].info.type,
              type2 = backpackItem.type2,
              whitelist = backpackItem.whitelist,
              blacklist = backpackItem.blacklist,
            })
          end
        end
 
        if weight then
          inventory.items[slot].weight = weight
        end
        if expireTime then
          inventory.items[slot].expiretime = expireTime
        end
        inventory.weight = inventory.weight + inventory.items[slot].weight * amount
        SendLog("additem", {
          identifier = inventory.identifier,
          invLabel = inventory.label,
          itemLabel = itemTemplate.label,
          amount = amount,
          invoked = invokedResource,
        })
        if ActivePlayersByIdentifier[identifier] then
          onAddItem(ActivePlayersByIdentifier[identifier], item, amount, slot, GetAmount(identifier, item))
        end
        saveQueue[identifier] = not tempInventories[identifier]
        return true, slot
      end
    end
 
    -- If no slot specified, find the first empty slot
    slot = findFirstItemSlot(inventory.items, item, itemInfo) or findFirstEmptySlot(inventory.items)
    if not slot then
      if ActivePlayersByIdentifier[identifier] then
        TriggerClientEvent("ak47_inventory:notify", ActivePlayersByIdentifier[identifier], _U("invfull"), "error")
      end
      return false, "noslot"
    end
 
    if Config.LockedSlots[slot] and Config.LockedSlotBlacklistedItems[item] then
      if slot >= inventory.slots then
        if ActivePlayersByIdentifier[identifier] then
          TriggerClientEvent("ak47_inventory:notify", ActivePlayersByIdentifier[identifier], _U("lockedblacklisteditem"), "error")
        end
        return false, "lockedblacklisteditem"
      else
        slot = findNextUnlockedSlot(inventory.items, slot)
        if not slot then
          if ActivePlayersByIdentifier[identifier] then
            TriggerClientEvent("ak47_inventory:notify", ActivePlayersByIdentifier[identifier], _U("invfull"), "error")
          end
          return false, "noslot"
        end
      end
    end
 
    -- if slot is empty then inilize new item
    if not inventory.items[slot].name then
      inventory.items[slot] = cleanItemProp(table.deepclone(itemTemplate))
      inventory.items[slot].slot = slot
      inventory.items[slot].amount = 0
      inventory.items[slot].count = 0
      inventory.items[slot].info = itemInfo
 
      if Config.ProtectedItems[item] then
        inventory.items[slot].info.protected = 1
      end
 
      -- Handle backpack items
      local backpackItem = isBackpackItem(item)
      if backpackItem then
        if not inventory.items[slot].info.identifier then
          local uniqueId = item .. ":" .. generateRandomUid(4, 4)
          inventory.items[slot].info.identifier = uniqueId
          inventory.items[slot].info.slots = backpackItem.slots
          inventory.items[slot].info.maxWeight = backpackItem.maxWeight
          inventory.items[slot].info.type = "backpack"
          inventory.items[slot].info.type2 = backpackItem.type2
          CreateInventory(uniqueId, {
            label = inventory.items[slot].label,
            maxWeight = backpackItem.maxWeight,
            slots = backpackItem.slots,
            type = inventory.items[slot].info.type,
            type2 = backpackItem.type2,
            whitelist = backpackItem.whitelist,
            blacklist = backpackItem.blacklist,
          })
        end
      end
    end
    inventory.items[slot].amount = inventory.items[slot].amount + amount
    inventory.items[slot].count = inventory.items[slot].amount
    if weight then
      inventory.items[slot].weight = weight
    end
    if expireTime then
      inventory.items[slot].expiretime = expireTime
    end
    inventory.weight = inventory.weight + inventory.items[slot].weight * amount
    SendLog("additem", {
      identifier = inventory.identifier,
      invLabel = inventory.label,
      itemLabel = itemTemplate.label,
      amount = amount,
      invoked = invokedResource,
    })
    if ActivePlayersByIdentifier[identifier] then
      onAddItem(ActivePlayersByIdentifier[identifier], item, amount, slot, GetAmount(identifier, item))
    end
    saveQueue[identifier] = not tempInventories[identifier]
    return true, slot
  end
 
  saveQueue[identifier] = not tempInventories[identifier]
  return true, slot
end
 
-- Load the AddItemInternal function
local function LoadAddItemInternal()
  local loadFunction = load
  local addItemInternalCode = [[
AddItemInternal = function(inv, item, amount, slot, info, weight, expiretime)
    local invoked = GetInvokingResource()
 
    local itemTemplate = Config.Shared.Items[item]
    if not itemTemplate then return false, 'invitem' end -- If item is invalid
 
    local identifier = ActivePlayersBySource[inv] or inv
    local inventory = Inventories[identifier]
 
    if not inventory then return false, 'noinv' end
 
    amount = tonumber(amount) or 1
 
    -- Check weight limit
    if (itemTemplate.weight * amount) + inventory.weight > inventory.maxWeight then
        if ActivePlayersByIdentifier[identifier] then
            TriggerClientEvent('ak47_inventory:notify', ActivePlayersByIdentifier[identifier], _U('invfull'), 'error')
        end
        return false, 'weight'
    end
 
    -- Check item limit
    if itemTemplate.limit and inventory.type == 'playerinventory' then
        local has = GetAmount(identifier, item)
        if has + amount > itemTemplate.limit then
            if ActivePlayersByIdentifier[identifier] then
                TriggerClientEvent('ak47_inventory:notify', ActivePlayersByIdentifier[identifier], _U('maxlimit'), 'error')
            end
            return false, 'limit'
        end
    end
 
    -- Prepare item info
    slot = tonumber(slot)
    info = info or {}
    if itemTemplate.durability then
        info.quality = info.quality or 100
        if not expiretime then
            expiretime = os.time() + (itemTemplate.durability * 3600)
        end
    end
    if itemTemplate.type == 'weapon' then
        info.quality = info.quality or 100
        if not itemTemplate.throwable then
            info.ammo = info.ammo or Config.SpawnWithAmmo[item:lower()] or 0
            info.components = info.components or {}
            info.tint = info.tint or 0
            info.uid = info.uid or info.serial or info.serie or generateRandomUid(4, 4)
        end
    end
 
    -- Function to add amount to a slot
    local function addAmountToSlot(slot, amount)
        if not inventory.items[slot].name then
            inventory.items[slot] = cleanItemProp(table.deepclone(itemTemplate))
            inventory.items[slot].slot = slot
            inventory.items[slot].amount = 0
            inventory.items[slot].count = 0
            inventory.items[slot].info = info
 
            if Config.ProtectedItems[item] then
                inventory.items[slot].info.protected = 1
            end
 
            -- Handle backpack items
            local backpackItem = isBackpackItem(item)
            if backpackItem then
                if not inventory.items[slot].info.identifier then
                    local uid = item..':'..generateRandomUid(4, 4)
                    inventory.items[slot].info.identifier = uid
                    inventory.items[slot].info.slots = backpackItem.slots
                    inventory.items[slot].info.maxWeight = backpackItem.maxWeight
                    inventory.items[slot].info.type = 'backpack'
                    inventory.items[slot].info.type2 = backpackItem.type2
                    CreateInventory(uid, {label = inventory.items[slot].label, maxWeight = backpackItem.maxWeight, slots = backpackItem.slots, type = inventory.items[slot].info.type, type2 = backpackItem.type2, whitelist = backpackItem.whitelist, blacklist = backpackItem.blacklist})
                end
            end
        end
 
        local addable = amount
        if itemTemplate.stacksize then
            local space = itemTemplate.stacksize - inventory.items[slot].amount
            addable = math.min(amount, space)
        end
 
        inventory.items[slot].amount = inventory.items[slot].amount + addable
        inventory.items[slot].count = inventory.items[slot].amount
 
        if weight then
            inventory.items[slot].weight = weight
        end
        if expiretime then
            inventory.items[slot].expiretime = expiretime
        end
 
        inventory.weight += inventory.items[slot].weight * addable
 
        SendLog('additem', {
            identifier = inventory.identifier,
            invLabel = inventory.label,
            itemLabel = itemTemplate.label,
            amount = addable,
            invoked = invoked,
        })
 
        if ActivePlayersByIdentifier[identifier] then
            onAddItem(ActivePlayersByIdentifier[identifier], item, addable, slot, GetAmount(identifier, item))
        end
 
        return amount - addable
    end
 
    -- Logic for items with stacksize
    if itemTemplate.stacksize then
        -- Check if enough slots are available
        local remainingAmount = amount
        local totalFreeSpace = 0
        local partiallyFilledSlots = {}
 
        -- Fill existing partially filled slots first
        for i = 1, #inventory.items do
            local slotItem = inventory.items[i]
            if slotItem and slotItem.name == item and table.matches(slotItem.info, info) then
                local availableSpace = itemTemplate.stacksize - slotItem.amount
                if availableSpace > 0 then
                    totalFreeSpace = totalFreeSpace + availableSpace
                    table.insert(partiallyFilledSlots, {slot = i, availableSpace = availableSpace})
                    if totalFreeSpace >= remainingAmount then
                        break
                    end
                end
            end
        end
 
        -- Check if there are enough empty slots to accommodate the remaining items
        local neededSlots = 0
        if totalFreeSpace < remainingAmount then
            remainingAmount = remainingAmount - totalFreeSpace
            neededSlots = math.ceil(remainingAmount / itemTemplate.stacksize)
            local freeSlots = GetEmptySlotCount(identifier)
            if neededSlots > freeSlots then
                if ActivePlayersByIdentifier[identifier] then
                    TriggerClientEvent('ak47_inventory:notify', source, _U('invfull'), 'error')
                end
                return false, 'noslot'
            end
        end
 
        -- Attempt to add to the specified slot first, if provided
        if slot then
            if slot > inventory.slots then
                print(("^3Failed to add item into slot %s.\nMax slot of this inventory[%s] is %s^0"):format(slot, inventory.identifier, inventory.slots))
                return false, 'overslot'
            end
            -- Check if the specified slot is suitable
            if inventory.items[slot] and inventory.items[slot].name then
                if inventory.items[slot].name == item and
                table.matches(inventory.items[slot].info, info) and
                (inventory.items[slot].amount < itemTemplate.stacksize) and
                (not Config.LockedSlots[slot] or not Config.LockedSlotBlacklistedItems[item]) then
                    -- Try to add the item to this slot if it has the same item and there's space
                    amount = addAmountToSlot(slot, amount)
                    if amount <= 0 then
                        SaveQueue[identifier] = not TempInventories[identifier]
                        return true, slot
                    end
                else
                    -- Specified slot has a different item or is full
                    slot = nil  -- Reset slot to fall back to regular slot-finding logic
                end
            elseif not inventory.items[slot].name and
            (not Config.LockedSlots[slot] or not Config.LockedSlotBlacklistedItems[item]) then
                -- Slot is empty, so add the item here
                amount = addAmountToSlot(slot, amount)
                if amount <= 0 then
                    SaveQueue[identifier] = not TempInventories[identifier]
                    return true, slot
                end
            end
        end
 
        -- Process partially filled slots
        for _, slotData in ipairs(partiallyFilledSlots) do
            amount = addAmountToSlot(slotData.slot, amount)
            if amount <= 0 then
                SaveQueue[identifier] = not TempInventories[identifier]
                return true, slotData.slot
            end
        end
 
        -- Process slot assignment and adding items
        local safetyCounter = 0  -- Add a safety counter to prevent infinite loops
        local maxAttempts = #inventory.items * 2  -- Max attempts to find a slot
 
        while amount > 0 and safetyCounter < maxAttempts do
            slot = findFirstEmptySlot(inventory.items)
            if not slot then
                -- No empty slots available
                if ActivePlayersByIdentifier[identifier] then
                    TriggerClientEvent('ak47_inventory:notify', ActivePlayersByIdentifier[identifier], _U('invfull'), 'error')
                end
                return false, 'noslot'
            end
            if (Config.LockedSlots[slot] and Config.LockedSlotBlacklistedItems[item]) then
                if ActivePlayersByIdentifier[identifier] then
                    TriggerClientEvent('ak47_inventory:notify', ActivePlayersByIdentifier[identifier], _U('lockedblacklisteditem'), 'error')
                end
                return false, 'lockedblacklisteditem'
            end
            amount = addAmountToSlot(slot, amount)
            safetyCounter = safetyCounter + 1  -- Increment the safety counter
        end
 
        if safetyCounter >= maxAttempts then
            -- Handle case where the loop exceeded the max attempts, indicating a potential issue
            print("^1ERROR: AddItem function exceeded maximum attempts to find a valid slot.^0")
            return false, 'infinite_loop_prevention'
        end
    else
        -- Logic for items without stacksize
        if slot then
            if slot > inventory.slots then
                print(("^3Failed to add item into slot %s.\nMax slot of this inventory[%s] is %s^0"):format(slot, inventory.identifier, inventory.slots))
                return false, 'overslot'
            end
            if (Config.LockedSlots[slot] and Config.LockedSlotBlacklistedItems[item]) then
                if ActivePlayersByIdentifier[identifier] then
                    TriggerClientEvent('ak47_inventory:notify', ActivePlayersByIdentifier[identifier], _U('lockedblacklisteditem'), 'error')
                end
                return false, 'lockedblacklisteditem'
            end
            -- If slot is specified and empty, add item there
            if not inventory.items[slot] or not inventory.items[slot].name then
                inventory.items[slot] = cleanItemProp(table.deepclone(itemTemplate))
                inventory.items[slot].slot = slot
                inventory.items[slot].amount = amount
                inventory.items[slot].count = amount
                inventory.items[slot].info = info
 
                if Config.ProtectedItems[item] then
                    inventory.items[slot].info.protected = 1
                end
 
                -- Handle backpack items
                local backpackItem = isBackpackItem(item)
                if backpackItem then
                    if not inventory.items[slot].info.identifier then
                        local uid = item..':'..generateRandomUid(4, 4)
                        inventory.items[slot].info.identifier = uid
                        inventory.items[slot].info.slots = backpackItem.slots
                        inventory.items[slot].info.maxWeight = backpackItem.maxWeight
                        inventory.items[slot].info.type = 'backpack'
                        inventory.items[slot].info.type2 = backpackItem.type2
                        CreateInventory(uid, {label = inventory.items[slot].label, maxWeight = backpackItem.maxWeight, slots = backpackItem.slots, type = inventory.items[slot].info.type, type2 = backpackItem.type2, whitelist = backpackItem.whitelist, blacklist = backpackItem.blacklist})
                    end
                end
 
                if weight then
                    inventory.items[slot].weight = weight
                end
                if expiretime then
                    inventory.items[slot].expiretime = expiretime
                end
                inventory.weight += inventory.items[slot].weight * amount
                SendLog('additem', {
                    identifier = inventory.identifier,
                    invLabel = inventory.label,
                    itemLabel = itemTemplate.label,
                    amount = amount,
                    invoked = invoked,
                })
                if ActivePlayersByIdentifier[identifier] then
                    onAddItem(ActivePlayersByIdentifier[identifier], item, amount, slot, GetAmount(identifier, item))
                end
                SaveQueue[identifier] = not TempInventories[identifier]
                return true, slot
            end
        end
 
        -- If no slot specified, find the first empty slot
        slot = findFirstItemSlot(inventory.items, item, info) or findFirstEmptySlot(inventory.items)
        if not slot then
            if ActivePlayersByIdentifier[identifier] then
                TriggerClientEvent('ak47_inventory:notify', ActivePlayersByIdentifier[identifier], _U('invfull'), 'error')
            end
            return false, 'noslot'
        end
 
        if (Config.LockedSlots[slot] and Config.LockedSlotBlacklistedItems[item]) then
            if slot >= inventory.slots then
                if ActivePlayersByIdentifier[identifier] then
                    TriggerClientEvent('ak47_inventory:notify', ActivePlayersByIdentifier[identifier], _U('lockedblacklisteditem'), 'error')
                end
                return false, 'lockedblacklisteditem'
            else
                slot = findNextUnlockedSlot(inventory.items, slot)
                if not slot then
                    if ActivePlayersByIdentifier[identifier] then
                        TriggerClientEvent('ak47_inventory:notify', ActivePlayersByIdentifier[identifier], _U('invfull'), 'error')
                    end
                    return false, 'noslot'
                end
            end
        end
 
        -- if slot is empty then inilize new item
        if not inventory.items[slot].name then
            inventory.items[slot] = cleanItemProp(table.deepclone(itemTemplate))
            inventory.items[slot].slot = slot
            inventory.items[slot].amount = 0
            inventory.items[slot].count = 0
            inventory.items[slot].info = info
 
            if Config.ProtectedItems[item] then
                inventory.items[slot].info.protected = 1
            end
 
            -- Handle backpack items
            local backpackItem = isBackpackItem(item)
            if backpackItem then
                if not inventory.items[slot].info.identifier then
                    local uid = item..':'..generateRandomUid(4, 4)
                    inventory.items[slot].info.identifier = uid
                    inventory.items[slot].info.slots = backpackItem.slots
                    inventory.items[slot].info.maxWeight = backpackItem.maxWeight
                    inventory.items[slot].info.type = 'backpack'
                    inventory.items[slot].info.type2 = backpackItem.type2
                    CreateInventory(uid, {label = inventory.items[slot].label, maxWeight = backpackItem.maxWeight, slots = backpackItem.slots, type = inventory.items[slot].info.type, type2 = backpackItem.type2, whitelist = backpackItem.whitelist, blacklist = backpackItem.blacklist})
                end
            end
        end
        inventory.items[slot].amount += amount
        inventory.items[slot].count = inventory.items[slot].amount
        if weight then
            inventory.items[slot].weight = weight
        end
        if expiretime then
            inventory.items[slot].expiretime = expiretime
        end
        inventory.weight += inventory.items[slot].weight * amount
        SendLog('additem', {
            identifier = inventory.identifier,
            invLabel = inventory.label,
            itemLabel = itemTemplate.label,
            amount = amount,
            invoked = invoked,
        })
        if ActivePlayersByIdentifier[identifier] then
            onAddItem(ActivePlayersByIdentifier[identifier], item, amount, slot, GetAmount(identifier, item))
        end
        SaveQueue[identifier] = not TempInventories[identifier]
        return true, slot
    end
 
    SaveQueue[identifier] = not TempInventories[identifier]
    return true, slot
end
]]
  loadFunction = loadFunction(addItemInternalCode)
  loadFunction()
end
 
xpcall(LoadAddItemInternal, pError)
 
-- AddItem function to add an item to an inventory or a drop
local function LoadAddItem()
  local loadFunction = load
  local addItemCode = [[
AddItem = function(inv, item, amount, slot, info, weight, expiretime, invoked)
    local amount = math.floor(amount)
    if not AddItemInternal(inv, item, amount, slot, info, weight, expiretime) then
        if ActivePlayersBySource[inv] then
            local dropIdentifier, coords = lib.callback.await('ak47_inventory:getclosestdrop', tonumber(inv))
            if not dropIdentifier then
                dropIdentifier = 'drop:'..string.format('(%.2f)', coords.x)..string.format('(%.2f)', coords.y)
                CreateInventory(dropIdentifier, {label = dropIdentifier:upper(), maxWeight = Config.DropWeight, slots = Config.DropSlots, type = 'drop', temp = true})
                TriggerClientEvent('ak47_inventory:setDrop', -1, dropIdentifier, coords)
                Drops[dropIdentifier] = coords
            end
            return AddItemInternal(dropIdentifier, item, amount, slot, info, weight, expiretime, invoked)
        end
        return false
    end
    return true
end
exports('AddItem', AddItem)
exportHandler('AddItem', AddItem)
]]
  loadFunction = loadFunction(addItemCode)
  loadFunction()
end
 
xpcall(LoadAddItem, pError)
 
-- RemoveItem function to remove an item from an inventory
local function LoadRemoveItem()
  local loadFunction = load
  local removeItemCode = [[
RemoveItem = function(inv, item, amount, slot)
    local invoked = GetInvokingResource()
 
    local amount = math.floor(amount)
   
    local itemTemplate = Config.Shared.Items[item]
    if not itemTemplate then return false, 'invitem' end -- If item is invalid
   
    local identifier = ActivePlayersBySource[inv] or inv
    local inventory = Inventories[identifier]
   
    if not inventory then return false, 'noinv' end
   
    -- Find the slot with the item
    if slot then
        if inventory.items[slot] and inventory.items[slot].name == item then
            local removeAmount = math.min(amount, inventory.items[slot].amount)
            inventory.items[slot].amount = inventory.items[slot].amount - removeAmount
            inventory.items[slot].count = inventory.items[slot].amount
           
            if inventory.items[slot].amount <= 0 then
                inventory.items[slot] = {}
            end
           
            inventory.weight = inventory.weight - (itemTemplate.weight * removeAmount)
            SaveQueue[identifier] = not TempInventories[identifier]
           
            SendLog('removeitem', {
                identifier = inventory.identifier,
                invLabel = inventory.label,
                itemLabel = itemTemplate.label,
                amount = removeAmount,
                invoked = invoked,
            })
           
            if ActivePlayersByIdentifier[identifier] then
                onRemoveItem(ActivePlayersByIdentifier[identifier], item, removeAmount, slot, GetAmount(identifier, item))
            end
           
            return true, removeAmount
        end
    else
        local totalRemoved = 0
        for i = 1, #inventory.items do
            if inventory.items[i] and inventory.items[i].name == item then
                local removeAmount = math.min(amount - totalRemoved, inventory.items[i].amount)
                inventory.items[i].amount = inventory.items[i].amount - removeAmount
                inventory.items[i].count = inventory.items[i].amount
                totalRemoved = totalRemoved + removeAmount
               
                if inventory.items[i].amount <= 0 then
                    inventory.items[i] = {}
                end
               
                if totalRemoved >= amount then
                    break
                end
            end
        end
       
        if totalRemoved > 0 then
            inventory.weight = inventory.weight - (itemTemplate.weight * totalRemoved)
            SaveQueue[identifier] = not TempInventories[identifier]
           
            SendLog('removeitem', {
                identifier = inventory.identifier,
                invLabel = inventory.label,
                itemLabel = itemTemplate.label,
                amount = totalRemoved,
                invoked = invoked,
            })
           
            if ActivePlayersByIdentifier[identifier] then
                onRemoveItem(ActivePlayersByIdentifier[identifier], item, totalRemoved, nil, GetAmount(identifier, item))
            end
           
            return true, totalRemoved
        end
    end
   
    return false, 'noitem'
end
exports('RemoveItem', RemoveItem)
exportHandler('RemoveItem', RemoveItem)
]]
  loadFunction = loadFunction(removeItemCode)
  loadFunction()
end
 
xpcall(LoadRemoveItem, pError)

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.


×
×
  • Create New...

Important Information

By continuing on Launcherleaks.net, you agree to our Terms of Use, Guidelines & Privacy Policy