Accueil › Documentation › Hooks serveur · origen_inventory
Les hooks permettent à d’autres ressources de s’abonner aux événements de l’inventaire côté serveur et, soit de consulter les données, soit de les modifier ou d’annuler l’action en renvoyant false.
Le système de hooks est exposé via deux exports, registerHook et removeHooks, et il est symétrique avec l’API de hooks côté client.
Tous les hooks de cette page s’exécutent côté serveur. Pour les hooks client (points du monde, événements d’interface), consulte Custom · Hooks client.
registerHook(event, callback, options?) → string (id)Enregistre un hook serveur. Renvoie le hookId interne afin que tu puisses le supprimer plus tard.
local hookId = exports.origen_inventory:registerHook('createItem', function(payload)
return payload.metadata
end)| Paramètre | Type | Description |
|---|---|---|
event |
string |
Nom de l’événement du hook (voir la liste ci-dessous). |
callback |
function |
Appelé avec les données du hook. |
options |
table? |
Filtres facultatifs (itemFilter, inventoryFilter, typeFilter, debugger). |
options)exports.origen_inventory:registerHook('swapItems', function(payload)
-- only fires for these inventories / items / types
end, {
itemFilter = { tosti = true, water_bottle = true },
inventoryFilter = { '^stash%-', '^trunk%-' },
typeFilter = { player = true, stash = true },
debugger = true, -- prints execution time and resource origin
})| Filtre | Type | Description |
|---|---|---|
itemFilter |
table<string, true> |
Ne se déclenche que si le nom de l’objet concerné figure dans cet ensemble. |
inventoryFilter |
string[] |
Motifs Lua comparés à l’id de l’inventaire source ou cible. |
typeFilter |
table<string, true> |
Limite à certains types d’inventaire ou de boutique (player, stash, shop, drop, ...). |
debugger |
boolean |
Journalise chaque appel du hook (ressource, événement, slot, temps d’exécution). |
removeHooks(id?) → voidSupprime les hooks appartenant à la ressource appelante. Passe un id pour supprimer un seul hook, ou omets-le pour supprimer tous les hooks enregistrés par la ressource.
exports.origen_inventory:removeHooks(hookId) -- single hook
exports.origen_inventory:removeHooks() -- every hook from this resourceLes hooks sont aussi nettoyés automatiquement lors de onResourceStop ; tu n’as donc besoin d’appeler removeHooks que pour les enregistrements que tu modifies à chaud.
La plupart des hooks serveur respectent un contrat d’annulation :
false → l’inventaire abandonne l’action (l’objet n’est pas ajouté, échangé, acheté, etc.).La seule exception est createItem, qui est mutant : tu dois renvoyer la table metadata (éventuellement modifiée).
createItemDéclenché lorsqu’un objet est ajouté à un inventaire et que ses métadonnées sont en cours d’initialisation. Mutant : doit renvoyer metadata.
Données reçues
| Champ | Type | Description |
|---|---|---|
inventoryId |
number|string |
Inventaire qui reçoit l’objet (src du joueur, id du stash, plaque, ...). |
inventoryType |
string |
player, stash, trunk, glovebox, ... |
item |
table |
Définition de l’objet en cours de création. |
count |
number |
Quantité ajoutée. |
metadata |
table |
Table de métadonnées modifiable. |
exports.origen_inventory:registerHook('createItem', function(payload)
if payload.item.name == 'paperbag' and not payload.metadata.bagId then
payload.metadata.bagId = math.random(1000, 9999)
end
return payload.metadata -- MUST return metadata
end)Si tu oublies de renvoyer metadata, l’objet sera créé avec une table de métadonnées vide.
itemCreatedDéclenché après l’ajout d’un objet à un inventaire. Lecture seule / observation : la valeur renvoyée est ignorée.
Données reçues
| Champ | Type | Description |
|---|---|---|
inventoryId |
number|string |
Id de l’inventaire. |
inventoryType |
string |
Type d’inventaire. |
item |
table |
Le slot de l’objet qui vient d’être créé (avec slot, count, metadata). |
count |
number |
Quantité ajoutée. |
exports.origen_inventory:registerHook('itemCreated', function(payload)
print(('Item %s x%s added to %s'):format(payload.item.name, payload.count, payload.inventoryId))
end)itemUsedDéclenché après l’utilisation réussie d’un slot. Uniquement pour l’observation.
Données reçues
| Champ | Type | Description |
|---|---|---|
source |
number |
Id serveur du joueur. |
inventoryId |
number|string |
Inventaire auquel appartient le slot. |
inventoryType |
string |
Type d’inventaire. |
item |
table |
Le slot de l’objet utilisé. |
slot |
number |
Id du slot. |
exports.origen_inventory:registerHook('itemUsed', function(payload)
if payload.item.name == 'lockpick' then
-- log lockpick usage
end
end)useSlotDéclenché avant l’utilisation d’un slot. Renvoie false pour annuler l’utilisation.
Données reçues
| Champ | Type | Description |
|---|---|---|
source |
number |
Id serveur du joueur. |
inventoryId |
number|string |
Id de l’inventaire. |
inventoryType |
string |
Type d’inventaire. |
item |
table |
Le slot sur le point d’être utilisé. |
slot |
number |
Id du slot. |
exports.origen_inventory:registerHook('useSlot', function(payload)
if payload.item.name == 'weapon_pistol' and IsRestrictedZone(payload.source) then
return false -- cancel use
end
end)swapItemsDéclenché avant tout déplacement / échange / fractionnement / don entre deux inventaires (de joueur à joueur, transferts de stash, coffre, drops, etc.). Renvoie false pour annuler le transfert.
Données reçues
| Champ | Type | Description |
|---|---|---|
source |
number? |
Id serveur du joueur (le cas échéant). |
action |
string |
move, swap, split, give. |
fromInventory |
string|number |
Id de l’inventaire source. |
fromType |
string |
Type de l’inventaire source (player, stash, ...). |
fromSlot |
table |
Données du slot déplacé. |
toInventory |
string|number |
Id de l’inventaire de destination. |
toType |
string |
Type de l’inventaire de destination. |
toSlot |
table? |
Données du slot échangé (uniquement lors d’un échange ou d’une fusion). |
count |
number |
Quantité déplacée. |
exports.origen_inventory:registerHook('swapItems', function(payload)
-- block moving illegal items into a public trunk
if payload.toType == 'trunk' and payload.fromSlot.name == 'weapon_rpg' then
return false
end
end)createDropDéclenché avant la création d’un drop au sol. Renvoie false pour le bloquer.
Données reçues
| Champ | Type | Description |
|---|---|---|
source |
number |
Joueur qui crée le drop. |
coords |
vector3 |
Coordonnées du drop. |
item |
table |
Données du slot jeté. |
count |
number |
Quantité jetée. |
exports.origen_inventory:registerHook('createDrop', function(payload)
if Config.NoDropZones[GetZoneAtCoords(payload.coords)] then
return false
end
end)buyItemDéclenché avant la validation d’un achat en boutique. Renvoie false pour annuler l’achat.
Données reçues
| Champ | Type | Description |
|---|---|---|
source |
number |
Id serveur de l’acheteur. |
shopType |
string |
Id de la boutique (p. ex. barber_supplies). |
item |
table |
Objet acheté. |
count |
number |
Quantité. |
price |
number |
Prix unitaire. |
currency |
string? |
Monnaie alternative facultative (cash, bank, personnalisée). |
exports.origen_inventory:registerHook('buyItem', function(payload)
-- block restricted weapons from being bought outside police stations
if payload.item.type == 'weapon' and not IsAtPoliceStation(payload.source) then
return false
end
end)openInventoryDéclenché avant l’ouverture d’un stash ou d’une boutique. Renvoie false pour refuser l’accès.
Données reçues
| Champ | Type | Description |
|---|---|---|
source |
number |
Id serveur du joueur. |
inventoryId |
string|number |
Id du stash ou de la boutique. |
inventoryType |
string |
stash, shop, trunk, glovebox. |
exports.origen_inventory:registerHook('openInventory', function(payload)
if payload.inventoryType == 'stash' and payload.inventoryId:match('^faction%-') then
return PlayerHasFactionAccess(payload.source, payload.inventoryId)
end
end)clearInventoryDéclenché avant qu’un inventaire soit vidé. Renvoie false pour annuler le vidage.
Données reçues
| Champ | Type | Description |
|---|---|---|
inventoryId |
string|number |
Inventaire sur le point d’être vidé. |
inventoryType |
string |
Type d’inventaire. |
exports.origen_inventory:registerHook('clearInventory', function(payload)
if payload.inventoryType == 'stash' and IsAuditedStash(payload.inventoryId) then
return false -- audited stashes cannot be wiped
end
end)itemExpiredDéclenché lorsqu’un objet avec decay arrive à expiration. Renvoie false pour conserver malgré tout l’objet dans le slot (rare : en général, on le laisse être supprimé).
Données reçues
| Champ | Type | Description |
|---|---|---|
inventoryId |
string|number |
Inventaire qui contient l’objet. |
inventoryType |
string |
Type d’inventaire. |
item |
table |
Le slot de l’objet expiré. |
slot |
number |
Id du slot. |
exports.origen_inventory:registerHook('itemExpired', function(payload)
if payload.item.name == 'sealed_evidence' then
return false -- evidence does not decay even if config says so
end
end)pcall. Les erreurs survenant dans ton hook sont isolées et ne feront pas planter l’inventaire.itemFilter / inventoryFilter / typeFilter dès que possible : elles court-circuitent la boucle de dispatch et sont bien moins coûteuses qu’un filtrage dans ton callback.