> For the complete documentation index, see [llms.txt](https://docs.gkshop.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.gkshop.org/gksphone-v2/configuration/custom-inventory.md).

# Custom inventory

{% hint style="warning" %}
This guide requires coding experience. We will not assist you in adding custom inventories.
{% endhint %}

{% hint style="info" %}
Replace `CustomInventory` with the name of your inventory
{% endhint %}

## Add to Config.lua

```lua
Config.CustomInventory = GetResourceState("CustomInventory") == 'started'
```

## Create files <a href="#create-files" id="create-files"></a>

Create `CustomInventory.lua` file in `gksphone/server/inventory` and `gksphone/client/inventory` folders

{% tabs %}
{% tab title="client" %}

* When the phone item is deleted, the "`gksphone:client:ItemRemoved`" trigger must be fired. ( If your inventory does not support this feature, check other inventory files. )
* When the phone item is added, the "`gksphone:client:ItemAdded`" trigger must be fired. (If your inventory doesn't support this feature, check other inventory files.)
* It should work when the "`UsePhoneItem`" export phone element is used
* — If there is no export support in the inventory, you can run it using server-side framework structures. ( Use `RegisterUsableItem` in ESX and `CreateUseableItem` in Qb-core  )

```lua
if not Config.CustomInventory then return end

RegisterNetEvent("gksphone:client:ItemRemoved", function(item)
    Wait(500)
    if PhoneUniqueId and lastItemData and lastItemData.name == item then
        ItemPhoneDeleted()
    end
end)

RegisterNetEvent("gksphone:client:ItemAdded", function(item)
    Wait(500)
    if Config.AutoOpen and PhoneUniqueId == nil then
        ForceLoadPhone(item)
    end
end)

exports("UsePhoneItem", function(data, itemData)
    --data = {name = 'phone', label = 'Phone', slot = 1, count = 1}
    --itemData = {name = 'phone', slot = 1, metadata = {phoneID = 'GKS202501HM1D', eSIMNumber = '28946041', phoneLang = 'en'}}
    TriggerEvent("gksphone:client:usePhone", data.name, itemData)
end)
```

{% endtab %}

{% tab title="server" %}
{% hint style="danger" %}
In the server section, `ox_invetory` examples are given in the export section. Integrate the exports of the `CustomInventory` into this section.
{% endhint %}

```lua
if not Config.CustomInventory then return end

-- Required if meta is active
function SetItemData(source, item, data)
    local src = source
    exports.ox_inventory:SetMetadata(src, item.slot, data)
    return true
end

-- Required if meta is active
function UpdateItemData(source, item, datatype, data)
    local src = source
    local metadata = item.metadata or item.info
    metadata[datatype] = data
    exports.ox_inventory:SetMetadata(src, item.slot, metadata)
end

--- Searches the player's inventory for the specified item.
function SearchPhoneItems(source)
    local src = source
    local Player = Config.Core.GetPlayerFromId(src)
    local itemData = {}
    if Player then
        for k, _ in pairs(Config.ItemName) do
            itemData = exports.ox_inventory:Search(src, 'slots', k)
            if #itemData > 0 then
                break
            end
        end
        if #itemData > 0 then
            return itemData
        end
    end
    return itemData
end
```

If you do not have an export as an opening function in your inventory, you can use the following functions

```lua

-- ESX
for index, _ in pairs(Config.ItemName) do
    Config.Core.RegisterUsableItem(index, function(source, item, data)
        debugprint("Item Check", source, item, data)
        TriggerClientEvent('gksphone:client:usePhone', source, index, data)
    end)
end

-- Qb
for index in pairs(Config.ItemName) do
    Config.Core.Functions.CreateUseableItem(index, function(source, item)
        TriggerClientEvent('gksphone:client:usePhone', source, item)
    end)
end
```

{% endtab %}
{% endtabs %}
