Inicio › Documentación › Hooks de servidor · origen_inventory
Los hooks permiten que otros recursos se suscriban a los eventos del inventario en el servidor y, o bien consulten los datos, o bien los modifiquen o cancelen la acción devolviendo false.
El sistema de hooks se expone mediante dos exports, registerHook y removeHooks, y es simétrico con la API de hooks de cliente.
Todos los hooks de esta página se ejecutan en el servidor. Para los hooks de cliente (puntos del mundo, eventos de interfaz) consulta Custom · Hooks de cliente.
registerHook(event, callback, options?) → string (id)Registra un hook de servidor. Devuelve el hookId interno para que puedas eliminarlo más tarde.
local hookId = exports.origen_inventory:registerHook('createItem', function(payload)
return payload.metadata
end)| Parámetro | Tipo | Descripción |
|---|---|---|
event |
string |
Nombre del evento del hook (consulta la lista más abajo). |
callback |
function |
Se invoca con los datos del hook. |
options |
table? |
Filtros opcionales (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
})| Filtro | Tipo | Descripción |
|---|---|---|
itemFilter |
table<string, true> |
Solo se dispara cuando el nombre del objeto implicado está en este conjunto. |
inventoryFilter |
string[] |
Patrones de Lua que se comparan con el id del inventario de origen o destino. |
typeFilter |
table<string, true> |
Restringe a tipos concretos de inventario o tienda (player, stash, shop, drop, ...). |
debugger |
boolean |
Registra cada llamada al hook (recurso, evento, slot, tiempo de ejecución). |
removeHooks(id?) → voidElimina los hooks que pertenecen al recurso que hace la llamada. Pasa un id para eliminar un único hook, u omítelo para eliminar todos los hooks registrados por el recurso.
exports.origen_inventory:removeHooks(hookId) -- single hook
exports.origen_inventory:removeHooks() -- every hook from this resourceLos hooks también se limpian automáticamente en onResourceStop, así que solo necesitas llamar a removeHooks en los registros que cambies en caliente.
La mayoría de los hooks de servidor respetan un contrato de cancelación:
false → el inventario aborta la acción (el objeto no se añade, intercambia, compra, etc.).La única excepción es createItem, que es mutante: debes devolver la tabla metadata (modificada, si quieres).
createItemSe dispara cuando se añade un objeto a un inventario y se están inicializando los metadatos. Mutante: debe devolver metadata.
Datos recibidos
| Campo | Tipo | Descripción |
|---|---|---|
inventoryId |
number|string |
Inventario que recibe el objeto (src del jugador, id del stash, matrícula, ...). |
inventoryType |
string |
player, stash, trunk, glovebox, ... |
item |
table |
Definición del objeto que se está creando. |
count |
number |
Cantidad que se añade. |
metadata |
table |
Tabla de metadatos modificable. |
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 olvidas devolver metadata, el objeto se creará con una tabla de metadatos vacía.
itemCreatedSe dispara después de añadir un objeto a un inventario. Solo lectura / observación: el valor devuelto se ignora.
Datos recibidos
| Campo | Tipo | Descripción |
|---|---|---|
inventoryId |
number|string |
Id del inventario. |
inventoryType |
string |
Tipo de inventario. |
item |
table |
El slot del objeto recién creado (con slot, count, metadata). |
count |
number |
Cantidad añadida. |
exports.origen_inventory:registerHook('itemCreated', function(payload)
print(('Item %s x%s added to %s'):format(payload.item.name, payload.count, payload.inventoryId))
end)itemUsedSe dispara después de usar un slot correctamente. Es solo de observación.
Datos recibidos
| Campo | Tipo | Descripción |
|---|---|---|
source |
number |
Id de servidor del jugador. |
inventoryId |
number|string |
Inventario al que pertenece el slot. |
inventoryType |
string |
Tipo de inventario. |
item |
table |
El slot del objeto usado. |
slot |
number |
Id del slot. |
exports.origen_inventory:registerHook('itemUsed', function(payload)
if payload.item.name == 'lockpick' then
-- log lockpick usage
end
end)useSlotSe dispara antes de usar un slot. Devuelve false para cancelar el uso.
Datos recibidos
| Campo | Tipo | Descripción |
|---|---|---|
source |
number |
Id de servidor del jugador. |
inventoryId |
number|string |
Id del inventario. |
inventoryType |
string |
Tipo de inventario. |
item |
table |
El slot que se va a usar. |
slot |
number |
Id del 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)swapItemsSe dispara antes de cualquier movimiento / intercambio / división / entrega entre dos inventarios (de jugador a jugador, transferencias de stash, maletero, drops, etc.). Devuelve false para cancelar la transferencia.
Datos recibidos
| Campo | Tipo | Descripción |
|---|---|---|
source |
number? |
Id de servidor del jugador (cuando corresponda). |
action |
string |
move, swap, split, give. |
fromInventory |
string|number |
Id del inventario de origen. |
fromType |
string |
Tipo del inventario de origen (player, stash, ...). |
fromSlot |
table |
Datos del slot que se mueve. |
toInventory |
string|number |
Id del inventario de destino. |
toType |
string |
Tipo del inventario de destino. |
toSlot |
table? |
Datos del slot con el que se intercambia (solo en intercambio o fusión). |
count |
number |
Cantidad que se mueve. |
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)createDropSe dispara antes de crear un drop en el suelo. Devuelve false para bloquearlo.
Datos recibidos
| Campo | Tipo | Descripción |
|---|---|---|
source |
number |
Jugador que crea el drop. |
coords |
vector3 |
Coordenadas del drop. |
item |
table |
Datos del slot que se tira. |
count |
number |
Cantidad que se tira. |
exports.origen_inventory:registerHook('createDrop', function(payload)
if Config.NoDropZones[GetZoneAtCoords(payload.coords)] then
return false
end
end)buyItemSe dispara antes de confirmar una compra en una tienda. Devuelve false para cancelar la compra.
Datos recibidos
| Campo | Tipo | Descripción |
|---|---|---|
source |
number |
Id de servidor del comprador. |
shopType |
string |
Id de la tienda (p. ej. barber_supplies). |
item |
table |
Objeto que se compra. |
count |
number |
Cantidad. |
price |
number |
Precio unitario. |
currency |
string? |
Moneda alternativa opcional (cash, bank, personalizada). |
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)openInventorySe dispara antes de abrir un stash o una tienda. Devuelve false para denegar el acceso.
Datos recibidos
| Campo | Tipo | Descripción |
|---|---|---|
source |
number |
Id de servidor del jugador. |
inventoryId |
string|number |
Id del stash o de la tienda. |
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)clearInventorySe dispara antes de vaciar un inventario. Devuelve false para cancelar el vaciado.
Datos recibidos
| Campo | Tipo | Descripción |
|---|---|---|
inventoryId |
string|number |
Inventario que se va a vaciar. |
inventoryType |
string |
Tipo de inventario. |
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)itemExpiredSe dispara cuando un objeto con decay llega a su caducidad. Devuelve false para mantener el objeto en el slot de todos modos (es raro: lo normal es dejar que se elimine).
Datos recibidos
| Campo | Tipo | Descripción |
|---|---|---|
inventoryId |
string|number |
Inventario que contiene el objeto. |
inventoryType |
string |
Tipo de inventario. |
item |
table |
El slot del objeto caducado. |
slot |
number |
Id del 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. Los errores dentro de tu hook quedan aislados y no harán caer el inventario.itemFilter / inventoryFilter / typeFilter siempre que puedas: cortan el bucle de despacho y son mucho más baratas que filtrar dentro de tu callback.