Inicio › Documentación › Hooks de servidor · origen_inventory

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.


API

registerHook(event, callback, options?) → string (id)

Registra un hook de servidor. Devuelve el hookId interno para que puedas eliminarlo más tarde.

lua
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).

Filtros (options)

lua
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?) → void

Elimina 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.

lua
exports.origen_inventory:removeHooks(hookId) -- single hook
exports.origen_inventory:removeHooks()        -- every hook from this resource

Los hooks también se limpian automáticamente en onResourceStop, así que solo necesitas llamar a removeHooks en los registros que cambies en caliente.


Contrato de cancelación

La mayoría de los hooks de servidor respetan un contrato de cancelación:

La única excepción es createItem, que es mutante: debes devolver la tabla metadata (modificada, si quieres).


Referencia de hooks

createItem

Se 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.
lua
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.


itemCreated

Se 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.
lua
exports.origen_inventory:registerHook('itemCreated', function(payload)
    print(('Item %s x%s added to %s'):format(payload.item.name, payload.count, payload.inventoryId))
end)

itemUsed

Se 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.
lua
exports.origen_inventory:registerHook('itemUsed', function(payload)
    if payload.item.name == 'lockpick' then
        -- log lockpick usage
    end
end)

useSlot

Se 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.
lua
exports.origen_inventory:registerHook('useSlot', function(payload)
    if payload.item.name == 'weapon_pistol' and IsRestrictedZone(payload.source) then
        return false -- cancel use
    end
end)

swapItems

Se 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.
lua
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)

createDrop

Se 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.
lua
exports.origen_inventory:registerHook('createDrop', function(payload)
    if Config.NoDropZones[GetZoneAtCoords(payload.coords)] then
        return false
    end
end)

buyItem

Se 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).
lua
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)

openInventory

Se 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.
lua
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)

clearInventory

Se 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.
lua
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)

itemExpired

Se 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.
lua
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)

Notas de rendimiento


Véase también