Início › Documentação › Hooks de servidor · origen_inventory

Hooks de servidor · origen_inventory

Os hooks permitem que outros recursos se subscrevam aos eventos do inventário no servidor e, ou consultem os dados, ou os modifiquem ou cancelem a ação devolvendo false.

O sistema de hooks é exposto através de dois exports, registerHook e removeHooks, e é simétrico com a API de hooks do cliente.

Todos os hooks desta página são executados no servidor. Para os hooks de cliente (pontos do mundo, eventos de interface) consulta Custom · Hooks de cliente.


API

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

Regista um hook de servidor. Devolve o hookId interno para que o possas remover mais tarde.

lua
local hookId = exports.origen_inventory:registerHook('createItem', function(payload)
    return payload.metadata
end)
Parâmetro Tipo Descrição
event string Nome do evento do hook (consulta a lista mais abaixo).
callback function É invocado com os dados do hook.
options table? Filtros opcionais (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 Descrição
itemFilter table<string, true> Só dispara quando o nome do item envolvido está neste conjunto.
inventoryFilter string[] Padrões de Lua que são comparados com o id do inventário de origem ou de destino.
typeFilter table<string, true> Restringe a tipos concretos de inventário ou loja (player, stash, shop, drop, ...).
debugger boolean Regista cada chamada ao hook (recurso, evento, slot, tempo de execução).

removeHooks(id?) → void

Remove os hooks que pertencem ao recurso que faz a chamada. Passa um id para remover um único hook, ou omite-o para remover todos os hooks registados pelo recurso.

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

Os hooks também são limpos automaticamente em onResourceStop, por isso só precisas de chamar removeHooks nos registos que alteres a quente.


Contrato de cancelamento

A maioria dos hooks de servidor respeita um contrato de cancelamento:

A única exceção é createItem, que é mutante: tens de devolver a tabela metadata (modificada, se quiseres).


Referência de hooks

createItem

É disparado quando um item é adicionado a um inventário e os metadados estão a ser inicializados. Mutante: tem de devolver metadata.

Dados recebidos

Campo Tipo Descrição
inventoryId number|string Inventário que recebe o item (src do jogador, id do stash, matrícula, ...).
inventoryType string player, stash, trunk, glovebox, ...
item table Definição do item que está a ser criado.
count number Quantidade que é adicionada.
metadata table Tabela de metadados modificável.
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)

Se te esqueceres de devolver metadata, o item será criado com uma tabela de metadados vazia.


itemCreated

É disparado depois de um item ser adicionado a um inventário. Apenas leitura / observação: o valor devolvido é ignorado.

Dados recebidos

Campo Tipo Descrição
inventoryId number|string Id do inventário.
inventoryType string Tipo de inventário.
item table O slot do item acabado de criar (com slot, count, metadata).
count number Quantidade adicionada.
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

É disparado depois de um slot ser usado com sucesso. É apenas de observação.

Dados recebidos

Campo Tipo Descrição
source number Id de servidor do jogador.
inventoryId number|string Inventário a que o slot pertence.
inventoryType string Tipo de inventário.
item table O slot do item usado.
slot number Id do slot.
lua
exports.origen_inventory:registerHook('itemUsed', function(payload)
    if payload.item.name == 'lockpick' then
        -- log lockpick usage
    end
end)

useSlot

É disparado antes de um slot ser usado. Devolve false para cancelar a utilização.

Dados recebidos

Campo Tipo Descrição
source number Id de servidor do jogador.
inventoryId number|string Id do inventário.
inventoryType string Tipo de inventário.
item table O slot que vai ser usado.
slot number Id do 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

É disparado antes de qualquer movimento / troca / divisão / entrega entre dois inventários (de jogador para jogador, transferências de stash, porta-bagagens, drops, etc.). Devolve false para cancelar a transferência.

Dados recebidos

Campo Tipo Descrição
source number? Id de servidor do jogador (quando aplicável).
action string move, swap, split, give.
fromInventory string|number Id do inventário de origem.
fromType string Tipo do inventário de origem (player, stash, ...).
fromSlot table Dados do slot que é movido.
toInventory string|number Id do inventário de destino.
toType string Tipo do inventário de destino.
toSlot table? Dados do slot com que se troca (apenas em troca ou fusão).
count number Quantidade que é movida.
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

É disparado antes de criar um drop no chão. Devolve false para o bloquear.

Dados recebidos

Campo Tipo Descrição
source number Jogador que cria o drop.
coords vector3 Coordenadas do drop.
item table Dados do slot que é largado.
count number Quantidade que é largada.
lua
exports.origen_inventory:registerHook('createDrop', function(payload)
    if Config.NoDropZones[GetZoneAtCoords(payload.coords)] then
        return false
    end
end)

buyItem

É disparado antes de confirmar uma compra numa loja. Devolve false para cancelar a compra.

Dados recebidos

Campo Tipo Descrição
source number Id de servidor do comprador.
shopType string Id da loja (p. ex. barber_supplies).
item table Item que é comprado.
count number Quantidade.
price number Preço unitário.
currency string? Moeda 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

É disparado antes de abrir um stash ou uma loja. Devolve false para negar o acesso.

Dados recebidos

Campo Tipo Descrição
source number Id de servidor do jogador.
inventoryId string|number Id do stash ou da loja.
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

É disparado antes de esvaziar um inventário. Devolve false para cancelar o esvaziamento.

Dados recebidos

Campo Tipo Descrição
inventoryId string|number Inventário que vai ser esvaziado.
inventoryType string Tipo de inventário.
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

É disparado quando um item com decay chega ao fim da validade. Devolve false para manter o item no slot mesmo assim (é raro: o normal é deixar que seja removido).

Dados recebidos

Campo Tipo Descrição
inventoryId string|number Inventário que contém o item.
inventoryType string Tipo de inventário.
item table O slot do item expirado.
slot number Id do 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 desempenho


Ver também