# QB-CORE

## Server

```lua
if Config.Framework ~= 'qb-core' then
    return
end

local QBCore = exports['qb-core']:GetCoreObject()

Framework = {}

---@param identifier integer
---@return boolean
Framework.canAccesMenu = function(identifier)
    if identifier then
        -- your custom functions to open menu (coma status/handcuff etc)
        return true;
    end
    return false;
end


---@param source integer
---@return integer?nil
Framework.getPlayerIdentifier = function(source)
    local Player = QBCore.Functions.GetPlayer(source)
    if Player then
        return tonumber(Player.PlayerData.citizenid)
    end
    return nil
end

---@param identifier integer
---@return integer
Framework.getIdentifierSource = function(identifier)
    local players = QBCore.Functions.GetPlayers()
    for _, src in pairs(players) do
        local Player = QBCore.Functions.GetPlayer(src)
        if Player and tonumber(Player.PlayerData.citizenid) == identifier then
            return src
        end
    end
    return nil
end

---@param identifier string
---@return table
Framework.getPlayerIdentity = function(identifier)
    local src = Framework.getIdentifierSource(identifier)
    local Player = QBCore.Functions.GetPlayer(src)
    if Player then
        return {
            firstname = Player.PlayerData.charinfo.firstname,
            secondname = Player.PlayerData.charinfo.lastname,
            phone_numner = Player.PlayerData.charinfo.phone
        }
    end
    return nil
end

---@param identifier integer
---@param price integer
---@return boolean
Framework.tryPaymentPlan = function(identifier, price)
    local src = Framework.getIdentifierSource(identifier)
    local Player = QBCore.Functions.GetPlayer(src)
    if Player and Player.Functions.RemoveMoney("bank", price, "octastore-plan") then
        return true
    end
    return false
end


---@param identifier integer
---@param price integer
---@return boolean
Framework.tryPayProductsOnline = function(identifier, price)
    local src = Framework.getIdentifierSource(identifier)
    local Player = QBCore.Functions.GetPlayer(src)
    if Player and Player.Functions.RemoveMoney("bank", price, "octastore-plan") then
        return true
    end
    return false
end

---@param identifier integer
---@param amount integer
---@return boolean
Framework.paySeller = function(identifier, amount)
    if identifier then
        local src = Framework.getIdentifierSource(identifier)
        local Player = QBCore.Functions.GetPlayer(src)
        if Player then
            Player.Functions.AddMoney("bank", amount, "octastore-sell")
        else
            exports[Config.Sql]:execute(
            "UPDATE players SET money = JSON_SET(money, '$.bank', JSON_EXTRACT(money, '$.bank') + @amount) WHERE citizenid = @citizenid",
                {
                    ['@amount'] = amount,
                    ['@citizenid'] = identifier
                })
        end
    end
end

---@param item string
---@param callback function
Framework.createItem = function(item, callback)
    print("[OctaStore] createItem function should be handled by item registration")
end

---@param identifier integer
---@param item string
---@param amount integer?nil
---@return boolean
Framework.hasItem = function(identifier, item, amount)
    if Config.Inventory == 'qb-core' then
        local src = Framework.getIdentifierSource(identifier)
        local Player = QBCore.Functions.GetPlayer(src)
        if Player then
            local itemData = Player.Functions.GetItemByName(item)
            if itemData then
                if amount ~= nil then
                    return itemData.amount >= amount
                else
                    return itemData.amount > 0
                end
            end
        end
        return false
    else
        print('ERRROR: Please edit your custom hasItem function (server/framework/qb-core.lua)')
    end
end


---@param identifier integer
---@return table?nil
Framework.getPlayerItems = function(identifier)
    if Config.Inventory == 'qb-core' then
        local src = Framework.getIdentifierSource(identifier)
        local Player = QBCore.Functions.GetPlayer(src)
        local items = {}
        if Player then
            for k, v in pairs(Player.PlayerData.items) do
                if v and v.name and not Config.blacklistedItems[v.name] then
                    items[v.name] = {
                        amount = v.amount,
                        img = exports.axr_octastore:getItemImagePath(v.name),
                        name = v.label or v.name
                    }
                end
            end
        end
        return items
    else
        print('ERRROR: Please edit your custom getPlayerItems function (server/framework/qb-core.lua)')
    end
end


---@param identifier integer
---@param items table --{index: {name:'',item:'',amount:''}}
---@return boolean
Framework.hasSpaceForItems = function(identifier, items)
    if identifier then
        if Config.Inventory == 'qb-core' then
            local src = Framework.getIdentifierSource(identifier)
            return true
        else
            print('ERRROR: Please edit your custom hasSpaceForItems  function (server/framework/qb-core.lua)')
        end
    end
end

---@param identifier integer
---@param item string
---@param amount integer
Framework.giveInventoryItem = function(identifier, item, amount)
    if identifier then
        if Config.Inventory == 'qb-core' then
            local src = Framework.getIdentifierSource(identifier)
            local Player = QBCore.Functions.GetPlayer(src)
            if Player then
                Player.Functions.AddItem(item, amount, false, false)
            end
        else
            print('ERRROR: Please edit your custom giveInventoryItem  function (server/framework/qb-core.lua)')
        end
    end
end

---@param identifier integer
---@param item string
---@param amount integer
Framework.removeInventoryItem = function(identifier, item, amount)
    if identifier then
        if Config.Inventory == 'qb-core' then
            local src = Framework.getIdentifierSource(identifier)
            local Player = QBCore.Functions.GetPlayer(src)
            if Player then
                Player.Functions.RemoveItem(item, amount, false)
            end
        else
            print('ERRROR: Please edit your custom removeInventoryItem  function (server/framework/qb-core.lua)')
        end
    end
end

---@param item string
---@return string
Framework.getItemName = function(item)
    if item then
        if Config.Inventory == 'qb-core' then
            local info = QBCore.Shared.Items[item]
            return info and info.label or item
        end
    end
    return 'unknown'
end


---@param identifier integer
---@param lockerItems table  --{index: {name:'',item:'',amount:''}}
Framework.giveLockerItems = function(identifier, lockerItems)
    local source = Framework.getIdentifierSource(identifier);
    if identifier and source then
        if Framework.hasSpaceForItems(identifier, lockerItems) then
            for index, itemData in pairs(lockerItems) do
                Framework.giveInventoryItem(identifier, itemData.item, itemData.amount);
            end
            Framework.notify(source, Lang.notify['receive_locker_product'].message,
                Lang.notify['receive_locker_product'].type)
        else
            Framework.notify(source, Lang.notify['no_inventory_weight'].message, Lang.notify['no_inventory_weight'].type)
        end
    end
end


---@param source integer
---@param notify string
---@param type string
Framework.notify = function(source, notify, type)
    if Config.notifySystem == 'qb-core' then
        TriggerClientEvent('QBCore:Notify', source, notify, type)
    else
        print('ERRROR: Please edit your custom notify system (server/framework/qb-core.lua)')
    end
end


Framework.playerSpawn = function()
    AddEventHandler('QBCore:Client:OnPlayerLoaded', function()
        local src = source
        local Player = QBCore.Functions.GetPlayer(src)
        if Player and tonumber(Player.PlayerData.citizenid) > 0 and exports.axr_octastore:getPlayerPlan(tonumber(Player.PlayerData.citizenid)) > 0 then
            exports.axr_octastore:checkPlayerRemaningTimePlan(tonumber(Player.PlayerData.citizenid))
        end
    end)
end

-- Do not remove this line if you want the plans to expire monthly
Framework.playerSpawn();

```

## Client

```lua
if Config.Framework ~= 'qb-core' then
    return
end

```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://axero-scripts.gitbook.io/axr-documentation/resources/axr_octastore/functions/qb-core.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
