Documentação › Lua
Eventos do jogo
Um evento chama uma função sua quando algo acontece: alguém fala no chat, aparece um efeito na tela, você aperta uma tecla, o CaveBot chega num label. Assim o script reage na hora, sem ficar checando em loop.
Como registrar#
Game.registerEvent(evento, função) liga a função ao evento e devolve a própria função. Game.unregisterEvent(evento, função) desliga. Guarde a função numa variável se quiser desligar depois. Um script pode ter várias funções no mesmo evento: todas são chamadas, na ordem em que foram registradas.
-- Registra, usa e desliga um evento
local function aoFalar(nome, level, modo, x, y, z, texto)
print(nome .. ": " .. texto)
end
Game.registerEvent(Game.Events.TALK, aoFalar)
-- 60 s depois, para de ouvir o chat
Timer.new("parar", function()
Game.unregisterEvent(Game.Events.TALK, aoFalar)
destroyTimer("parar")
end, 60000)-- O mesmo código roda no ZeroBot e no DrenoxBot.
-- Aqui wait() não trava os eventos: eles continuam chegando durante a espera.
Game.registerEvent(Game.Events.TEXT_MESSAGE, function(msg)
if msg.messageType == Enums.MessageTypes.MESSAGE_LOOT then
print(msg.text)
end
end)
while true do
wait(1000)
endComo os eventos chegam#
- Cada script roda na sua própria thread. Os eventos entram numa fila e rodam nessa thread, um de cada vez, então dois eventos do mesmo script nunca rodam ao mesmo tempo.
- O bot só manda um evento para o script que tem função registrada nele. Os eventos de clique em HUD e em janela vão só para o script que criou o HUD ou a janela.
- Um erro dentro da função aparece no Console como
event <número>: <erro>e o script continua rodando. wait(ms)não bloqueia os eventos: enquanto o script espera, os eventos e timers da fila continuam rodando.
Resumo#
| Evento | Número | Quando dispara |
|---|---|---|
TALK | 0 | Alguém fala (Default, canais, PM, NPC) |
MAGIC_EFFECT | 1 | Um efeito mágico aparece num piso |
HUD_CLICK | 2 | Você clica num HUD do script |
HOTKEY_SHORTCUT_PRESS | 3 | Você aperta uma tecla com o cliente em foco |
TEXT_MESSAGE | 4 | O servidor manda uma mensagem de texto (loot, dano, avisos...) |
MODAL_WINDOW | 5 | O servidor abre uma janela com botões |
CUSTOM_MODAL_WINDOW_BUTTON_CLICK | 6 | Você clica num botão de uma janela do script |
QUEST_LOG | 9 | Chega a lista de quests |
QUEST_LINES | 10 | Chegam as missões de uma quest |
DISTANCE_SHOOT_EFFECT | 11 | Um projétil voa de um piso a outro |
LABEL | 13 | O CaveBot chega num waypoint Label |
OPEN_STASH | 14 | O servidor manda o conteúdo do stash |
HUD_DRAG | 15 | Você arrasta um HUD do script |
ALARM | 20 | Um alarme da aba Tools dispara |
CREATURE_HEALTH | 100 | A vida de uma criatura muda (extra do DrenoxBot) |
PLAYER_DATA | 101 | Chegam seus dados de vida e mana (extra do DrenoxBot) |
TALK#
Dispara a cada mensagem de fala que o servidor manda: Default, yell, whisper, canais, PMs e falas de NPC.
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | nome | texto | Quem falou (vazio se o servidor não mandar) |
| 2 | level | número | Level de quem falou (0 se não vier) |
| 3 | modo | número | Tipo da fala, como em Enums.TalkTypes |
| 4 | x | número | Posição de quem falou (0 quando a fala não tem posição, como PM e canal) |
| 5 | y | número | |
| 6 | z | número | |
| 7 | texto | texto | O que foi dito |
| 8 | canal | número | Id do canal (0 fora de canal) |
-- Pisca a janela quando alguém fala o seu nome
Game.registerEvent(Game.Events.TALK, function(nome, level, modo, x, y, z, texto)
if texto:lower():find(Player.getName():lower(), 1, true) then
print(nome .. " (" .. level .. "): " .. texto)
Client.flashWindow()
end
end)MAGIC_EFFECT#
Dispara para cada efeito mágico (não projétil) que o servidor desenha num piso.
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | id | número | Id do efeito |
| 2 | x | número | Posição do efeito |
| 3 | y | número | |
| 4 | z | número |
-- Mostra no Console os efeitos em volta de você
Game.registerEvent(Game.Events.MAGIC_EFFECT, function(id, x, y, z)
local p = Player.getPosition()
if z == p.z and math.abs(x - p.x) <= 1 and math.abs(y - p.y) <= 1 then
print("efeito " .. id .. " em " .. x .. "," .. y)
end
end)HUD_CLICK#
Dispara quando você clica num HUD criado pelo script. Só o script dono do HUD recebe. Antes das funções registradas, o bot chama o callback do próprio HUD (hud:setCallback), se houver.
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | hudId | número | Id do HUD clicado (o mesmo de hud:getId()) |
local botao = HUD.new(20, 100, "[ CaveBot ]")
Game.registerEvent(Game.Events.HUD_CLICK, function(hudId)
if hudId == botao:getId() then
Engine.enableCaveBot(not Engine.isCaveBotEnabled())
end
end)HOTKEY_SHORTCUT_PRESS#
Dispara quando uma tecla é apertada (não quando é segurada) e a janela do cliente está em foco. Teclas modificadoras sozinhas (Ctrl, Alt, Shift, Win, Num Lock) não disparam: elas entram só na máscara.
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | tecla | número | Código virtual da tecla no Windows (A = 65, F1 = 112...) |
| 2 | modificadores | número | Soma de Enums.FlagModifiers: Ctrl 1, Alt 2, Shift 4, Num Lock ligado 8 |
local ok, mods, tecla = HotkeyManager.parseKeyCombination("Ctrl+F5")
Game.registerEvent(Game.Events.HOTKEY_SHORTCUT_PRESS, function(k, m)
if k == tecla and bit.band(m, 7) == mods then
Engine.enableTargeting(not Engine.isTargetingEnabled())
end
end)TEXT_MESSAGE#
Dispara a cada mensagem de texto do servidor: loot, dano, cura, experiência, avisos em verde e vermelho, look.
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | mensagem | tabela | Os campos abaixo |
| Campo | Tipo | Descrição |
|---|---|---|
messageType | número | Tipo da mensagem, como em Enums.MessageTypes |
text | texto | O texto |
channelId | número | Canal da mensagem |
position | tabela ou nil | {x, y, z} quando a mensagem tem posição (dano, cura) |
value | número | Primeiro valor (dano, cura, xp) |
secondValue | número | Segundo valor |
color | número | Cor do primeiro valor |
secondColor | número | Cor do segundo valor |
-- Soma o dano recebido
local total = 0
Game.registerEvent(Game.Events.TEXT_MESSAGE, function(msg)
if msg.messageType == Enums.MessageTypes.MESSAGE_DAMAGE_RECEIVED then
total = total + (msg.value or 0)
print("dano total: " .. total)
end
end)MODAL_WINDOW#
Dispara quando o servidor abre uma janela com botões e escolhas (NPCs, quests, sistemas do OT). Responda com Game.modalWindowAnswer.
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | janela | tabela | Os campos abaixo |
| Campo | Tipo | Descrição |
|---|---|---|
id | número | Id da janela, para Game.modalWindowAnswer |
title | texto | Título |
message | texto | Texto da janela |
buttons | lista | Botões {id, text} |
choices | lista | Opções da lista {id, text} |
defaultEnterButton | número | Botão do Enter |
defaultEscapeButton | número | Botão do Esc |
priority | booleano | Se a janela tem prioridade |
-- Aperta "Yes" em toda janela que tiver esse botão
Game.registerEvent(Game.Events.MODAL_WINDOW, function(janela)
for _, b in ipairs(janela.buttons) do
if b.text == "Yes" then
Game.modalWindowAnswer(janela.id, b.id, 0)
end
end
end)CUSTOM_MODAL_WINDOW_BUTTON_CLICK#
Dispara quando você clica num botão de uma janela criada pelo script com CustomModalWindow. A janela fecha com o clique. Só o script dono recebe, e o callback da janela (setCallback) é chamado antes.
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | janelaId | número | Id da janela (janela:getId()) |
| 2 | botão | número | Índice do botão, começando em 0, na ordem do addButton |
local janela = CustomModalWindow.new("Refill", "Voltar para a cidade?")
janela:addButton("Sim") -- 0
janela:addButton("Não") -- 1
Game.registerEvent(Game.Events.CUSTOM_MODAL_WINDOW_BUTTON_CLICK, function(id, botao)
if id == janela:getId() and botao == 0 then
CaveBot.GoTo("refill")
end
end)QUEST_LOG#
Dispara quando o servidor manda a lista de quests, por exemplo depois de Game.requestQuestLog().
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | quests | lista | Uma tabela por quest: id, name, completed (booleano) e state (1 completa, 0 pendente, como Enums.QuestState) |
Game.registerEvent(Game.Events.QUEST_LOG, function(quests)
for _, q in ipairs(quests) do
if not q.completed then print("pendente: " .. q.name) end
end
end)
Game.requestQuestLog()QUEST_LINES#
Dispara quando o servidor manda as missões de uma quest, por exemplo depois de Game.requestQuestLines(id).
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | questId | número | Id da quest |
| 2 | missões | lista | Uma tabela por missão: id, name, description |
Game.registerEvent(Game.Events.QUEST_LINES, function(questId, missoes)
for _, m in ipairs(missoes) do
print(m.name .. ": " .. m.description)
end
end)DISTANCE_SHOOT_EFFECT#
Dispara para cada projétil (flecha, runa, magia à distância) que o servidor desenha.
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | id | número | Id do projétil |
| 2 | deX | número | Posição de saída |
| 3 | deY | número | |
| 4 | deZ | número | |
| 5 | paraX | número | Posição de chegada |
| 6 | paraY | número | |
| 7 | paraZ | número |
-- Avisa quando um projétil cai no seu piso
Game.registerEvent(Game.Events.DISTANCE_SHOOT_EFFECT, function(id, fx, fy, fz, tx, ty, tz)
local p = Player.getPosition()
if tx == p.x and ty == p.y and tz == p.z then
print("projétil " .. id .. " em você")
end
end)LABEL#
Dispara quando o CaveBot chega num waypoint do tipo Label, e só se algum script tiver função registrada nesse evento. O CaveBot pausa antes de mandar o evento e fica parado até um script chamar CaveBot.pause(0). Se o script que registrou o evento parar, a pausa acaba sozinha.
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | índice | número | Posição do waypoint na rota, começando em 0 |
| 2 | label | texto | Texto do label |
-- No label "checar": sem 50 mana potions, vai para o label "refill"
Game.registerEvent(Game.Events.LABEL, function(indice, label)
if label == "checar" and Game.getItemCount(268) < 50 then -- 268 = mana potion
CaveBot.GoTo("refill")
end
CaveBot.pause(0) -- solta a rota
end)OPEN_STASH#
Dispara quando o servidor manda o conteúdo do seu stash (supply stash).
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | stash | tabela | stashItems: lista de {itemId, count}; freeSlots: espaços livres |
Game.registerEvent(Game.Events.OPEN_STASH, function(stash)
for _, item in ipairs(stash.stashItems) do
print(item.itemId .. " x" .. item.count)
end
end)HUD_DRAG#
Dispara quando você solta um HUD arrastável (hud:setDraggable(true)) do script numa nova posição. A posição do HUD já está atualizada quando o evento chega.
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | hudId | número | Id do HUD |
| 2 | x | número | Nova posição x |
| 3 | y | número | Nova posição y |
local hud = HUD.new(20, 60, "Arraste-me")
hud:setDraggable(true)
Game.registerEvent(Game.Events.HUD_DRAG, function(id, x, y)
if id == hud:getId() then print("HUD agora em " .. x .. ", " .. y) end
end)ALARM#
Dispara junto com um alarme da aba Tools (o mesmo que aparece no Console como [ALARM]). Se os alarmes estiverem desligados com Engine.allAlarmsEnable(false), o evento também não dispara.
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | tipo | número | Qual alarme, como em Enums.AlarmType |
| Tipo | Quando |
|---|---|
DISCONNECTED (0) | Você desconectou |
DAMAGE_TAKEN (1) | Você levou dano (no máximo a cada 3 s) |
LOW_HEALTH (2) | A vida ficou abaixo do limite configurado |
PRIVATE_MESSAGE (3) | Chegou uma PM |
MONSTER_DETECTED / MONSTER_ON_SCREEN (4 / 5) | Um monstro apareceu no mapa / no seu andar |
PLAYER_ATTACK (6) | Um player atacou você |
PLAYER_DETECTED / PLAYER_ON_SCREEN (7 / 8) | Um player fora da party apareceu |
PLAYER_STUCK (9) | O CaveBot está ligado e você não saiu do lugar |
SKULL_DETECTED / SKULL_ON_SCREEN (10 / 11) | Um player com skull apareceu |
ENEMY_DETECTED / ENEMY_ON_SCREEN (12 / 13) | Um inimigo (guild ou lista) apareceu |
GM_DETECTED (14) | Um GM apareceu |
LOW_CAP (15) | A cap ficou abaixo do limite |
PLAYER_IDLE (16) | Você ficou parado sem ganhar xp pelo tempo configurado |
Game.registerEvent(Game.Events.ALARM, function(tipo)
if tipo == Enums.AlarmType.PLAYER_ON_SCREEN then
Engine.enableCaveBot(false)
Sound.play("alarm.wav", true)
end
end)CREATURE_HEALTH#
Extra do DrenoxBot (não existe no ZeroBot). Dispara quando o servidor manda a nova vida de uma criatura.
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | creatureId | número | Id da criatura |
| 2 | hp | número | Vida em porcentagem (0 a 100) |
local hud = HUD.new(20, 60, "Alvo: -")
Game.registerEvent(Game.Events.CREATURE_HEALTH, function(id, hp)
if id == Player.getTargetId() then
hud:setText(Creature.new(id):getName() .. " " .. hp .. "%")
end
end)PLAYER_DATA#
Extra do DrenoxBot (não existe no ZeroBot). Dispara sempre que o servidor manda o pacote com seus dados de status (vida, mana, cap, level...).
| # | Parâmetro | Tipo | Descrição |
|---|---|---|---|
| 1 | vida | número | Vida atual |
| 2 | vidaMáx | número | Vida máxima |
| 3 | mana | número | Mana atual |
| 4 | manaMáx | número | Mana máxima |
Game.registerEvent(Game.Events.PLAYER_DATA, function(hp, maxHp, mana, maxMana)
if hp < maxHp * 0.3 then
Client.showMessage("Vida baixa!")
end
end)Eventos do ZeroBot que ainda não disparam#
Game.Events tem todos os nomes do ZeroBot, então registrar os eventos abaixo não dá erro. Mas o DrenoxBot ainda não dispara nenhum deles: a função fica registrada e nunca é chamada.
| Evento | Número |
|---|---|
IMBUEMENT_DATA | 7 |
IMBUEMENT_OPEN_WINDOW | 8 |
PARTY_HUNT | 12 |
STORE_CATEGORIES | 16 |
STORE_OFFERS | 17 |
OPEN_DAILY_REWARD | 18 |
DAILY_REWARD_DAYS_DATA | 19 |
TASK_HUNTING_DATA | 21 |
TASK_BOARD_DATA | 22 |
Veja também: Scripting e a referência de funções.
Comentários
para comentar.