Início › Documentação › 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.
registerHook(event, callback, options?) → string (id)Regista um hook de servidor. Devolve o hookId interno para que o possas remover mais tarde.
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). |
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 | 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?) → voidRemove 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.
exports.origen_inventory:removeHooks(hookId) -- single hook
exports.origen_inventory:removeHooks() -- every hook from this resourceOs hooks também são limpos automaticamente em onResourceStop, por isso só precisas de chamar removeHooks nos registos que alteres a quente.
A maioria dos hooks de servidor respeita um contrato de cancelamento:
false → o inventário aborta a ação (o item não é adicionado, trocado, comprado, etc.).A única exceção é createItem, que é mutante: tens de devolver a tabela metadata (modificada, se quiseres).
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. |
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. |
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. |
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. |
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. |
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. |
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). |
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. |
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. |
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. |
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. Os erros dentro do teu hook ficam isolados e não deitam o inventário abaixo.itemFilter / inventoryFilter / typeFilter sempre que possível: cortam o ciclo de despacho e são muito mais baratas do que filtrar dentro do teu callback.