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.

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

Como 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#

EventoNúmeroQuando dispara
TALK0Alguém fala (Default, canais, PM, NPC)
MAGIC_EFFECT1Um efeito mágico aparece num piso
HUD_CLICK2Você clica num HUD do script
HOTKEY_SHORTCUT_PRESS3Você aperta uma tecla com o cliente em foco
TEXT_MESSAGE4O servidor manda uma mensagem de texto (loot, dano, avisos...)
MODAL_WINDOW5O servidor abre uma janela com botões
CUSTOM_MODAL_WINDOW_BUTTON_CLICK6Você clica num botão de uma janela do script
QUEST_LOG9Chega a lista de quests
QUEST_LINES10Chegam as missões de uma quest
DISTANCE_SHOOT_EFFECT11Um projétil voa de um piso a outro
LABEL13O CaveBot chega num waypoint Label
OPEN_STASH14O servidor manda o conteúdo do stash
HUD_DRAG15Você arrasta um HUD do script
ALARM20Um alarme da aba Tools dispara
CREATURE_HEALTH100A vida de uma criatura muda (extra do DrenoxBot)
PLAYER_DATA101Chegam 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âmetroTipoDescrição
1nometextoQuem falou (vazio se o servidor não mandar)
2levelnúmeroLevel de quem falou (0 se não vier)
3modonúmeroTipo da fala, como em Enums.TalkTypes
4xnúmeroPosição de quem falou (0 quando a fala não tem posição, como PM e canal)
5ynúmero
6znúmero
7textotextoO que foi dito
8canalnúmeroId do canal (0 fora de canal)
lua
-- 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âmetroTipoDescrição
1idnúmeroId do efeito
2xnúmeroPosição do efeito
3ynúmero
4znúmero
lua
-- 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âmetroTipoDescrição
1hudIdnúmeroId do HUD clicado (o mesmo de hud:getId())
lua
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âmetroTipoDescrição
1teclanúmeroCódigo virtual da tecla no Windows (A = 65, F1 = 112...)
2modificadoresnúmeroSoma de Enums.FlagModifiers: Ctrl 1, Alt 2, Shift 4, Num Lock ligado 8
lua
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âmetroTipoDescrição
1mensagemtabelaOs campos abaixo
CampoTipoDescrição
messageTypenúmeroTipo da mensagem, como em Enums.MessageTypes
texttextoO texto
channelIdnúmeroCanal da mensagem
positiontabela ou nil{x, y, z} quando a mensagem tem posição (dano, cura)
valuenúmeroPrimeiro valor (dano, cura, xp)
secondValuenúmeroSegundo valor
colornúmeroCor do primeiro valor
secondColornúmeroCor do segundo valor
lua
-- 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)

Dispara quando o servidor abre uma janela com botões e escolhas (NPCs, quests, sistemas do OT). Responda com Game.modalWindowAnswer.

#ParâmetroTipoDescrição
1janelatabelaOs campos abaixo
CampoTipoDescrição
idnúmeroId da janela, para Game.modalWindowAnswer
titletextoTítulo
messagetextoTexto da janela
buttonslistaBotões {id, text}
choiceslistaOpções da lista {id, text}
defaultEnterButtonnúmeroBotão do Enter
defaultEscapeButtonnúmeroBotão do Esc
prioritybooleanoSe a janela tem prioridade
lua
-- 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âmetroTipoDescrição
1janelaIdnúmeroId da janela (janela:getId())
2botãonúmeroÍndice do botão, começando em 0, na ordem do addButton
lua
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âmetroTipoDescrição
1questslistaUma tabela por quest: id, name, completed (booleano) e state (1 completa, 0 pendente, como Enums.QuestState)
lua
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âmetroTipoDescrição
1questIdnúmeroId da quest
2missõeslistaUma tabela por missão: id, name, description
lua
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âmetroTipoDescrição
1idnúmeroId do projétil
2deXnúmeroPosição de saída
3deYnúmero
4deZnúmero
5paraXnúmeroPosição de chegada
6paraYnúmero
7paraZnúmero
lua
-- 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âmetroTipoDescrição
1índicenúmeroPosição do waypoint na rota, começando em 0
2labeltextoTexto do label
lua
-- 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âmetroTipoDescrição
1stashtabelastashItems: lista de {itemId, count}; freeSlots: espaços livres
lua
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âmetroTipoDescrição
1hudIdnúmeroId do HUD
2xnúmeroNova posição x
3ynúmeroNova posição y
lua
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âmetroTipoDescrição
1tiponúmeroQual alarme, como em Enums.AlarmType
TipoQuando
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
lua
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âmetroTipoDescrição
1creatureIdnúmeroId da criatura
2hpnúmeroVida em porcentagem (0 a 100)
lua
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âmetroTipoDescrição
1vidanúmeroVida atual
2vidaMáxnúmeroVida máxima
3mananúmeroMana atual
4manaMáxnúmeroMana máxima
lua
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.

EventoNúmero
IMBUEMENT_DATA7
IMBUEMENT_OPEN_WINDOW8
PARTY_HUNT12
STORE_CATEGORIES16
STORE_OFFERS17
OPEN_DAILY_REWARD18
DAILY_REWARD_DAYS_DATA19
TASK_HUNTING_DATA21
TASK_BOARD_DATA22

Veja também: Scripting e a referência de funções.