# Events & Commands

{% hint style="warning" %}
All exports listed are SERVER only unless specified
{% endhint %}

## Basic Events / Triggers

Open Stash:

```lua
TriggerServerEvent("inventory:server:OpenInventory", "stash", "myCustomStash", {slots = 15, maxweight = 70000})
TriggerEvent("inventory:client:SetCurrentStash", "myCustomStash")
```

{% hint style="info" %}
Client Sided Event
{% endhint %}

Open Shops:

```lua
local ShopItems = {} 
ShopItems.label = "myCustomShop"
ShopItems.items =  {
            [1] = { name = "baggy_empty2", price = 32, amount = 50, info = {}, type = "item", slot = 1, },
            [2] = { name = "plantpot", price = 542, amount = 50, info = {}, type = "item", slot = 2, },
            [3] = { name = "watering_can", price = 42, amount = 50, info = {}, type = "item", slot = 3, },
            [4] = { name = "drug_fertilizer", price = 54, amount = 50, info = {}, type = "item", slot = 4, },
            [5] = { name = "rainbowbelts_seed", price = 454, amount = 50, info = {}, type = "item", slot = 5, },
            [6] = { name = "cocaine_seed", price = 532, amount = 50, info = {}, type = "item", slot = 6, },
            [7] = { name = "watering_can_high", price = 72, amount = 50, info = {}, type = "item", slot = 7, },
            [8] = { name = "drug_fertilizer_high", price = 94, amount = 50, info = {}, type = "item", slot = 8, },
}
ShopItems.slots = #ShopItems.items
ShopItems.coords = GetEntityCoords(PlayerPedId())
        
TriggerServerEvent("inventory:server:OpenInventory", "shop", "myCustomShop", ShopItems)
TriggerEvent("inventory:client:SetCurrentStash", "myCustomShop") 
```

{% hint style="info" %}
Client Sided Event
{% endhint %}

### Item Info <a href="#item-info" id="item-info"></a>

You can use SetItemData to achieve this

Items support additional information that can be added to them via an `info` attribute. This information will display on the item when the player hovers over it in a key,value pair format

**Example:**

Copy

```lua
RegisterCommand('addItemWithInfo', function(source, args)
    local itemName = args[1]
    if not itemName then return end
    local info = {
        uniqueData1 = 'uniqueData1',
        uniqueData2 = 'uniqueData2',
        uniqueData3 = 'uniqueData3',
        uniqueData4 = 'uniqueData4',
    }
    exports['jpr-inventory']:AddItem(source, itemName, 1, false, info, 'jpr-inventory:testAdd')
end, true)

RegisterCommand('editItemWithInfo', function(source)
    local Player = QBCore.Functions.GetPlayer(source)
    if not Player then return end
    local items = Player.PlayerData.items
    local itemInfo = items[1]
    print(json.encode(itemInfo, { indent = true }))
    itemInfo.info = {
        newInfo = 'New Info'
    }
    print(json.encode(itemInfo, { indent = true }))
    items[1] = itemInfo
    Player.Functions.SetPlayerData('items', items)
end, true)
```

### LoadInventory <a href="#loadinventory" id="loadinventory"></a>

This function will retrieve the players inventory from the database via their unique identifier aka `citizenid`

Copy

```lua
exports['jpr-inventory']:LoadInventory(source, citizenid)
```

* source: `number`
* citizenid: `string`
* returns: `table`

Copy

```lua
RegisterCommand('getInv', function(source)
    local Player = QBCore.Functions.GetPlayer(source)
    local citizenId = Player.PlayerData.citizenid
    local items = exports['jpr-inventory']:LoadInventory(source, citizenid)
    print(json.encode(items, { indent = true }))
end)
```

### SaveInventory <a href="#saveinventory" id="saveinventory"></a>

This function saves the players current items to the database

Copy

```lua
exports['jpr-inventory']:SaveInventory(source, offline)
```

* source: `number`
* offline: `boolean`

**Example:**

Copy

```lua
RegisterCommand('saveInv', function(source)
    exports['jpr-inventory']:SaveInventory(source, false)
end)
```

### ClearInventory <a href="#clearinventory" id="clearinventory"></a>

Copy

```lua
exports['jpr-inventory']:ClearInventory(source, filterItems)
```

* source: `number`
* filterItems: `string | table`

Example:

Copy

```lua
RegisterCommand('clearInventoryExcludeItem', function(source, args)
    local filterItem = args[1]
    if not filterItem then return end
    exports['jpr-inventory']:ClearInventory(source, filterItem)
    print('Inventory cleared for player '..source..', excluding item: '..filterItem)
end, true)

RegisterCommand('clearInventoryExcludeItems', function(source)
    local filterItems = {'item1', 'item2'}
    exports['jpr-inventory']:ClearInventory(source, filterItems)
    print('Inventory cleared for player '..source..', excluding items: '..table.concat(filterItems, ', '))
end, true)
```

### CloseInventory <a href="#closeinventory" id="closeinventory"></a>

Copy

```lua
exports['jpr-inventory']:CloseInventory(source, identifier)
```

* source: `number`
* identifier: `string`

Example:

Copy

```lua
RegisterCommand('closeInventory', function(source)
    exports['jpr-inventory']:CloseInventory(source)
    print('Inventory closed for player '..source)
end, true)

RegisterCommand('closeInventoryByName', function(source, identifier)
    exports['jpr-inventory']:CloseInventory(source, identifier)
    print('Inventory closed for player '..source..' and inventory '..identifier..' set to closed')
end, true)
```

### OpenInventory <a href="#openinventory" id="openinventory"></a>

Copy

```lua
exports['jpr-inventory']:OpenInventory(source, identifier, data)
```

* source: `number`
* identifier: `string | optional`
* data: `table | optional`

**Example:**

Copy

```lua
RegisterCommand('openinv', function(source)
    exports['jpr-inventory']:OpenInventory(source)
end, true)

RegisterCommand('openinvbyname', function(source, args)
    local inventoryName = args[1]
    exports['jpr-inventory']:OpenInventory(source, inventoryName)
end, true)

RegisterCommand('openinvbynamewithdata', function(source, args)
    local inventoryName = args[1]
    local data = { label = 'Custom Stash', maxweight = 400000, slots = 500 }
    exports['jpr-inventory']:OpenInventory(source, inventoryName, data)
end, true)
```

### OpenInventoryById <a href="#openinventorybyid" id="openinventorybyid"></a>

Copy

```lua
exports['jpr-inventory']:OpenInventoryById(source, playerId)
```

* source: `number`
* playerId: `number`

**Example:**

Copy

```lua
RegisterCommand('openplayerinv', function(source, args)
    local playerId = tonumber(args[1])
    exports['jpr-inventory']:OpenInventoryById(source, playerId)
end, true)
```

`OpenInventoryById` will close the target players inventory (if open) and lock it via state. It will then unlock when the opening player closes it

### CreateShop <a href="#createshop" id="createshop"></a>

Copy

```lua
exports['jpr-inventory']:CreateShop(shopData)
```

* shopData: `table`

Copy

```lua
local items = {
    { name = 'sandwich', amount = 10, price = 5 }
}

RegisterCommand('createShop', function(source)
    local playerPed = GetPlayerPed(source)
    local playerCoords = GetEntityCoords(playerPed)
    exports['jpr-inventory']:CreateShop({
        name = 'testShop',
        label = 'Test Shop',
        coords = playerCoords, -- optional
        slots = #items,
        items = items
    })
end, true)
```

Coords being passed to `createShop` will be checked against the player's current coords when `OpenShop`is called if coords were provided during `createShop`

### OpenShop <a href="#openshop" id="openshop"></a>

Copy

```lua
exports['jpr-inventory']:OpenShop(source, name)
```

* source: `number`
* name: `string`

Copy

```lua
RegisterCommand('openShop', function(source)
    exports['jpr-inventory']:OpenShop(source, 'testShop')
end)
```

### AddItem <a href="#additem" id="additem"></a>

Copy

```lua
exports['jpr-inventory']:AddItem(identifier, item, amount, slot, info, reason)
```

* identifier: `number`
* item: `string`
* amount: `number`
* slot: `number | boolean`
* info: `table | boolean`
* reason: `string`
* returns: `boolean`

**Example:**

Copy

```lua
RegisterCommand('addItem', function(source, args)
    local itemName = args[1]
    if not itemName then return end
    exports['jpr-inventory']:AddItem(source, itemName, 1, false, false, 'jpr-inventory:testAdd')
end, true)
```

### RemoveItem <a href="#removeitem" id="removeitem"></a>

Copy

```lua
exports['jpr-inventory']:RemoveItem(identifier, item, amount, slot, reason)
```

* identifier: `number`
* item: `string`
* amount: `number`
* slot: `number | boolean`
* reason: `string`
* returns: `boolean`

Copy

```lua
RegisterCommand('removeItem', function(source, args)
    local itemName = args[1]
    if not itemName then return end
    exports['jpr-inventory']:RemoveItem(source, itemName, 1, false, 'jpr-inventory:testRemove')
end, true)
```

### SetInventory <a href="#setinventory" id="setinventory"></a>

Copy

```lua
exports['jpr-inventory']:SetInventory(source, items)
```

* source: `number`
* items: `table`

Example:

Copy

```lua
RegisterCommand('setInventory', function(source)
    local items = {
        {
            name = 'sandwich',
            amount = 10,
            type = 'item',
            info = {},
            slot = 1
        },
        {
            name = 'water_bottle',
            amount = 10,
            type = 'item',
            info = {},
            slot = 2
        }
    }
    exports['jpr-inventory']:SetInventory(source, items)
end, true)
```

### SetItemData <a href="#setitemdata" id="setitemdata"></a>

This function uses GetItemByName to find the itemName being passed

Copy

```lua
exports['jpr-inventory']:SetItemData(source, itemName, key, val)
```

* source: `number`
* itemName: `string`
* key: `string`
* val: `string | table`
* returns: `boolean`

Example:

Copy

```lua
RegisterCommand('setItemData', function(source, args)
    local itemName = args[1]
    local key = args[2]
    local val = args[3]
    if not itemName or not key or not val then return end
    local success = exports['jpr-inventory']:SetItemData(source, itemName, key, val)
    if success then
        print('Set data for item '..itemName..': '..key..' = '..val)
    else
        print('Failed to set data for item '..itemName)
    end
end, true)
```

**Item Info Example:**

Copy

```lua
RegisterCommand('setItemData', function(source)
    local itemName = 'markedbills'
    local key = 'info'
    local val = { worth = 1000 }
    if not itemName or not key or not val then return end
    local success = exports['jpr-inventory']:SetItemData(source, itemName, key, val)
    if success then
        print('Set data for item '..itemName..': '..key..' = '..json.encode(val, { indent = true }))
    else
        print('Failed to set data for item '..itemName)
    end
end, true)
```

### UseItem <a href="#useitem" id="useitem"></a>

Copy

```lua
exports['jpr-inventory']:UseItem(itemName, ...)
```

* itemName: `string`
* . . . : `function`

Example:

Copy

```lua
RegisterCommand('useItem', function(source, args)
    local itemName = args[1]
    if not itemName then return end
    exports['jpr-inventory']:Useitem(itemName, function()
        print('Used item with the name of '..itemName)
    end)
end, true)
```

### HasItem <a href="#hasitem" id="hasitem"></a>

This export is also available to use on the client

Copy

```lua
exports['jpr-inventory']:HasItem(source, items, amount)
```

* source: `number`
* items: `string | table`
* amount: `number`
* returns: `boolean`

Example:

Copy

```lua
RegisterCommand('hasSingleItem', function(source)
    local item = 'item1'
    local amount = 5
    local hasItem = exports['jpr-inventory']:HasItem(source, item, amount)
    if hasItem then
        print('Player '..source..' has '..amount..' of '..item)
    else
        print('Player '..source..' does not have '..amount..' of '..item)
    end
end, true)

RegisterCommand('hasMultipleItems', function(source)
    local items = {'item1', 'item2'}
    local amount = 5
    local hasItems = exports['jpr-inventory']:HasItem(source, items, amount)
    if hasItems then
        print('Player '..source..' has '..amount..' of each item: '..table.concat(items, ', '))
    else
        print('Player '..source..' does not have '..amount..' of each item: '..table.concat(items, ', '))
    end
end, true)

RegisterCommand('hasMultipleItemsWithAmounts', function(source)
    local itemsWithAmounts = {item1 = 5, item2 = 10}
    local hasItemsWithAmounts = exports['jpr-inventory']:HasItem(source, itemsWithAmounts)
    if hasItemsWithAmounts then
        print('Player '..source..' has the specified items with their amounts')
    else
        print('Player '..source..' does not have the specified items with their amounts')
    end
end, true)
```

### GetSlotsByItem <a href="#getslotsbyitem" id="getslotsbyitem"></a>

Copy

```lua
exports['jpr-inventory']:GetSlotsByItem(items, itemName)
```

* items: `table`
* itemName: `string`
* returns: `table`

Example:

Copy

```lua
RegisterCommand('getSlots', function(source, args)
    local itemName = args[1]
    if not itemName then return end
    local Player = QBCore.Functions.GetPlayer(source)
    local items = Player.PlayerData.Items
    local slots = exports['jpr-inventory']:GetSlotsByItem(items, itemName)
    for _, slot in ipairs(slots) do
        print(slot)
    end
end, true)
```

### GetFirstSlotByItem <a href="#getfirstslotbyitem" id="getfirstslotbyitem"></a>

Copy

```lua
exports['jpr-inventory']:GetFirstSlotByItem(items, itemName)
```

* items: `table`
* itemName: `string`
* returns: `number`

Example:

Copy

```lua
RegisterCommand('getFirstSlot', function(source, args)
    local itemName = args[1]
    if not itemName then return end
    local Player = QBCore.Functions.GetPlayer(source)
    local items = Player.PlayerData.Items
    local slot = exports['jpr-inventory']:GetFirstSlotByItem(items, itemName)
    if slot then
        print('First slot containing item '..itemName..' is: '..slot)
    else
        print('No slot found containing item '..itemName)
    end
end, true)
```

### GetItemBySlot <a href="#getitembyslot" id="getitembyslot"></a>

Copy

```lua
exports['jpr-inventory']:GetItemBySlot(source, slot)
```

* source: `number`
* slot: `number`
* returns: `table`

Example:

Copy

```lua
RegisterCommand('getItem', function(source, args)
    local slot = tonumber(args[1])
    if not slot then return end
    local item = exports['jpr-inventory']:GetItemBySlot(source, slot)
    if item then
        print('Item in slot '..slot..' is: '..item.name)
    else
        print('No item found in slot '..slot)
    end
end, true)
```

### GetItemByName <a href="#getitembyname" id="getitembyname"></a>

Copy

```lua
exports['jpr-inventory']:GetItemByName(source, item)
```

* source: `number`
* item: `string`
* returns: `table`

Example:

Copy

```lua
RegisterCommand('getItemByName', function(source, args)
    local itemName = args[1]
    if not itemName then return end
    local item = exports['jpr-inventory']:GetItemByName(source, itemName)
    if item then
        print('First occurrence of item '..itemName..' is in slot: '..item.slot)
    else
        print('No item found with name '..itemName)
    end
end, true)
```

### GetItemsByName <a href="#getitemsbyname" id="getitemsbyname"></a>

Copy

```lua
exports['jpr-inventory']:GetItemsByName(source, item)
```

* source: `number`
* item: `string`
* returns: `table`

Example:

Copy

```lua
RegisterCommand('getItemsByName', function(source, args)
    local itemName = args[1]
    if not itemName then return end
    local items = exports['jpr-inventory']:GetItemsByName(source, itemName)
    if #items > 0 then
        print('Items named '..itemName..' found in slots:')
        for _, item in ipairs(items) do
            print(item.slot)
        end
    else
        print('No items found with name '..itemName)
    end
end, true)
```

### SetUsage <a href="#getitemsbyname" id="getitemsbyname"></a>

Copy

```lua
exports["jpr-inventory"]:SetUsage(state)
```

* state: `bool`

Example:

Copy

```lua
Block inventory usage:
exports["jpr-inventory"]:SetUsage(false)

Allow inventory usage:
exports["jpr-inventory"]:SetUsage(true)
```

### GetUsageState <a href="#getitemsbyname" id="getitemsbyname"></a>

Copy

```lua
exports["jpr-inventory"]:GetUsageState()
```

* return: `bool`

Example:

Copy

```lua
Check inventory usage state:
exports["jpr-inventory"]:GetUsageState()

If returns true, means you can use inventory, 
if returns false, means you cant use inventory 
and should use the "Allow inventory usage" export to return inventory functions.
```

### GetInventory <a href="#getitemsbyname" id="getitemsbyname"></a>

Copy

```lua
exports["jpr-inventory"]:GetInventory(source)
```

* source: `number`
* returns: `table`

Example:

Copy

```lua
exports["jpr-inventory"]:GetInventory(1)
```

### CanAddItem <a href="#getitemsbyname" id="getitemsbyname"></a>

Copy

```lua
exports["jpr-inventory"]:CanAddItem(source, item, count)
```

* source: `number`
* item: `string`
* count: `number`
* returns: `bool`

Example:

Copy

```lua
exports["jpr-inventory"]:CanAddItem(1, "phone", 1)
```

### GetStashItems <a href="#getitemsbyname" id="getitemsbyname"></a>

Copy

```lua
exports["jpr-inventory"]:GetStashItems(stashID)
```

* stashID: `string`
* returns: `table`

Example:

Copy

```lua
exports["jpr-inventory"]:GetStashItems("myStash")
```

### GetItemDecayHealth <a href="#getitemsbyname" id="getitemsbyname"></a>

Copy

```lua
exports["jpr-inventory"]:GetItemDecayHealth(itemData)
```

* itemData: `table`
* returns: `number`

Example:

Copy

```lua
local Player = QBCore.Functions.GetPlayer(source)
local itemData = Player.Functions.GetItemBySlot(1)

exports["jpr-inventory"]:GetItemDecayHealth(itemData)
```

### GetItemList <a href="#getitemsbyname" id="getitemsbyname"></a>

Copy

```lua
exports["jpr-inventory"]:GetItemList()
```

* returns: `table`

Example:

Copy

```lua
local itemList = exports["jpr-inventory"]:GetItemList()
```

## EXCLUSIVE EXPORTS JUST FOR ESX!

*<mark style="color:yellow;">**We need this exports because ESX inventory system, by default, is very simple ( non slots based inventory ), so we need futher mods to it work perfect.**</mark>*

### SetPlayerData <a href="#getitemsbyname" id="getitemsbyname"></a>

Copy

```lua
exports["jpr-inventory"]:SetPlayerData(key, param, source)
```

* key: `string ("craftingrep", "items")`&#x20;
* param: `table`
* source: `number`

Example:

Copy

```lua
local Inventory = exports["jpr-inventory"]:GetInventory(src)
Inventory[ItemData.slot] = {}

exports["jpr-inventory"]:SetPlayerData("items", Inventory, src)
```

### GetItemLabel <a href="#getitemsbyname" id="getitemsbyname"></a>

Copy

```lua
exports["jpr-inventory"]:GetItemLabel(itemName)
```

* itemName: `string`
* returns: `string`

Example:

Copy

```lua
local itemLabel = exports["jpr-inventory"]:GetItemLabel("phone")
```

### CraftLevel <a href="#getitemsbyname" id="getitemsbyname"></a>

Copy

```lua
exports["jpr-inventory"]:CraftLevel()
```

* returns: `number`

Example:

Copy

```lua
local myCraftLevel = exports["jpr-inventory"]:CraftLevel()
```

{% hint style="info" %}
Client Sided Export
{% endhint %}

### GetInventoryOldFormat <a href="#getitemsbyname" id="getitemsbyname"></a>

Copy

```lua
exports["jpr-inventory"]:GetInventoryOldFormat()
```

* returns: `DEFAULT_ESX_INVENTORY_TABLE_(converted from jpr to esx format)`  &#x20;

Example:

Copy

```lua
local myDefaultESXScript = exports["jpr-inventory"]:GetInventoryOldFormat()
```

{% hint style="info" %}
Client Sided Export
{% endhint %}


---

# 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://joaos-organization-3.gitbook.io/jpresources-documentation/installation/inventory/events-and-commands.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.
