Início › Documentação › Hooks · origen_ilegalv2
O runner expõe um conjunto de hooks que te permitem injetar lógica própria no ciclo de vida do laboratório sem modificar os ficheiros do núcleo. Todos os hooks são opcionais: passa-os como terceiro argumento de LabProcessRunner.Register() no cliente, ou usa as funções independentes do servidor descritas mais abaixo.
Os hooks passam-se como uma tabela ao registar o laboratório:
LabProcessRunner.Register('heroin', Config.LabHeroin, {
onEnter = function(labType) ... end,
onExit = function(labType) ... end,
onReset = function() ... end,
onStageComplete = function(stageId, result) ... end,
})onEnter(labType)É chamado imediatamente depois de o runner criar todos os pontos de interação, sempre que um jogador entra num laboratório deste tipo.
Casos de uso:
onEnter = function(labType)
-- Ask the server which plants are already taken
local takenPlants = lib.callback.await('origen_gang:labs:weed:getTakenPlants', false)
for _, idx in ipairs(takenPlants or {}) do
RemovePlantProp(idx) -- your custom function
end
end,onExit(labType)É chamado depois de o runner remover todos os pontos de interação e reiniciar o estado de produção, sempre que um jogador sai de um laboratório deste tipo.
Casos de uso:
onEnteronExit = function(labType)
DeleteCustomProps()
StopMyThread()
end,onReset()O runner chama-o sempre que o ciclo de produção é reiniciado à força: ao sair, ao descarregar o jogador (origen:Client:OnPlayerUnload) e ao parar o recurso.
Casos de uso:
grab_tray)onReset = function()
if trayPropEntity and DoesEntityExist(trayPropEntity) then
DetachEntity(trayPropEntity, true, true)
DeleteEntity(trayPropEntity)
trayPropEntity = nil
end
end,onReset é sempre chamado antes de onExit. O estado de produção (stage, runTimers, etc.) já está limpo quando o teu hook é executado.
onStageComplete(stageId, result)É chamado depois de o runner terminar de processar uma fase (barra de progresso concluída, callback do servidor com sucesso, items entregues). Executa-se em todas as fases, incluindo a última.
| Argumento | Tipo | Descrição |
|---|---|---|
stageId |
string | O ID da fase que acabou de ser concluída |
result |
table | A resposta original do callback do servidor para esta fase |
Campos de result (o que o servidor devolveu):
| Campo | Presente em | Descrição |
|---|---|---|
success |
sempre | true |
timers |
só na primeira fase | Temporizadores efetivos após os modificadores de melhorias |
modifiers |
só na primeira fase | { process_time_mult, output_bonus_pct } |
outputs |
última fase | Items finais entregues (com o bónus aplicado) |
bonus_triggered |
última fase | true se o bónus de saída foi ativado |
Casos de uso:
onStageComplete = function(stageId, result)
if stageId == 'grab_tray' then
-- Attach the tray prop to the player's hand
AttachTrayToHand()
elseif stageId == 'smash' then
-- Detach and delete the tray
DetachTrayFromHand()
end
end,O runner escuta automaticamente estes eventos ao nível do recurso para cada laboratório registado. Também os podes escutar a partir dos teus próprios ficheiros de laboratório para acrescentar lógica personalizada:
| Evento | Quando é disparado |
|---|---|
origen:Lab:OnEnter |
O jogador é teletransportado para o interior do laboratório (arg: labType) |
origen:Lab:OnExit |
O jogador sai do laboratório (arg: labType) |
origen:Client:OnPlayerUnload |
O jogador desliga-se / o personagem é descarregado |
-- Example: custom logic on any weed lab entry
AddEventHandler('origen:Lab:OnEnter', function(labType)
if labType ~= 'weed' then return end
print('Player entered a weed lab!')
end)O servidor não tem um parâmetro de tabela de hooks; em vez disso expõe funções e exports que podes chamar a partir de outros scripts:
LabProcessRunner.ResetPlayerState(labType, source)Reinicia à força o estado de produção de um único jogador para um tipo de laboratório concreto. Usa-o quando um script interrompe a produção a partir de fora (p. ex. a expulsão por uma rusga).
-- From another resource via export
exports['origen_ilegalv2']:MethLabResetPlayerState(source)
-- From inside origen_ilegalv2
LabProcessRunner.ResetPlayerState('meth', source)LabProcessRunner.ResetAllForSource(source)Limpa o estado de produção de um jogador em todos os tipos de laboratório registados. É chamado automaticamente ao sair e em playerDropped; usa-o se expulsares um jogador por código.
LabProcessRunner.ResetAllForSource(source)LabProcessRunner.GetPlayerState(labType, source) → table | nilDevolve o estado de produção atual em memória de um jogador para um tipo de laboratório concreto:
local state = LabProcessRunner.GetPlayerState('meth', source)
-- state = { stage, lab_id, timers, modifiers, last_done }
-- nil if not in production| Campo | Descrição |
|---|---|
stage |
ID da fase atual, ou nil se estiver entre ciclos |
lab_id |
ID na base de dados da instância do laboratório em que o jogador está |
timers |
Temporizadores efetivos (após os modificadores) calculados no início do ciclo |
modifiers |
{ process_time_mult, output_bonus_pct } |
last_done |
os.time() do momento em que o último ciclo foi concluído (usado para o cooldown) |
exports('GetPlayerLabState', ...) → table | nilDevolve em que laboratório está atualmente um jogador (definido pelos callbacks de entrada/saída em server/labs.lua):
local labState = exports['origen_ilegalv2']:GetPlayerLabState(source)
-- { lab_id, lab_type, bucket, world_exit }
-- nil if the player is not inside any labÉ o que todos os ficheiros de servidor dos laboratórios usam para validar que «o jogador está mesmo no laboratório certo».
Cada laboratório integrado regista o seu próprio export de reinício com nome, por compatibilidade externa:
| Export | Laboratório |
|---|---|
MethLabResetPlayerState(source) |
Meta |
WeedLabResetPlayerState(source) |
Erva |
CokeLabResetPlayerState(source) |
Cocaína |
Os laboratórios personalizados que adicionares devem seguir o mesmo padrão:
exports('HeroinLabResetPlayerState', function(source)
LabProcessRunner.ResetPlayerState('heroin', source)
end)O laboratório de meta usa onStageComplete e onReset para prender um prop físico de tabuleiro à mão do jogador entre as fases grab_tray e smash:
local trayProp = nil
local function attachTray(ped)
local hash = GetHashKey('bkr_prop_meth_tray_02a')
RequestModel(hash)
while not HasModelLoaded(hash) do Wait(50) end
trayProp = CreateObject(hash, 0, 0, 0, true, true, true)
AttachEntityToEntity(trayProp, ped, GetPedBoneIndex(ped, 28422),
0.01, -0.2, -0.2, 20.0, 0.0, 0.0, true, true, false, true, 1, true)
SetModelAsNoLongerNeeded(hash)
end
local function detachTray()
if trayProp and DoesEntityExist(trayProp) then
DetachEntity(trayProp, true, true)
DeleteEntity(trayProp)
trayProp = nil
end
end
LabProcessRunner.Register('meth', Config.LabMeth, {
onStageComplete = function(stageId, result)
if stageId == 'grab_tray' then
attachTray(PlayerPedId())
elseif stageId == 'smash' then
detachTray()
end
end,
onReset = function()
detachTray()
end,
})