Documentação › Lua

Scripting

Quando as abas não bastam, escreva um script. O DrenoxBot roda scripts Lua com a sua própria API: eventos, timers, HUD na tela do jogo e janelas próprias. Scripts escritos para o ZeroBot também rodam, sem adaptação.

Aba Scripting com a lista de scripts

Onde ficam os scripts#

Cada script é um arquivo .lua na pasta scripts/, ao lado do bot.json. Sons usados pelos scripts ficam em scripts/sounds/. Dentro de um script, Engine.getScriptsDirectory() devolve o caminho da pasta.

Na aba Scripting você gerencia tudo:

ControleO que faz
AtivoLiga ou desliga o script. Os ligados voltam sozinhos quando o bot abre
NovoCria scripts/<nome>.lua e abre no editor
Editar (ou duplo clique)Abre o editor, com Salvar e Salvar & ativar
Importar DrenoxBot / ZeroBotCopia um .lua, ou todos os .lua de uma pasta (com subpastas), para scripts/. Um script diferente com o mesmo nome não é sobrescrito
Recarregar tudoReinicia todos os scripts ligados
ApagarDesliga e apaga o arquivo

A coluna Status mostra se o script está rodando ou o erro que o parou.

Como um script roda#

  • Cada script roda na sua própria thread, sem travar o bot nem os outros scripts.
  • O código de cima roda uma vez. Depois, o script continua vivo recebendo eventos e rodando timers.
  • wait(ms) pausa o script, mas eventos e timers continuam chegando durante a espera. Scripts no estilo while true do ... wait(100) end funcionam.
  • Um erro dentro de um evento ou timer é mostrado e o script continua rodando.
  • print() vai para a aba Console como [nome] texto. Erros aparecem como [lua:nome] ....

Outros jeitos de rodar Lua#

  • Console: lua <código> roda um trecho na hora, por exemplo lua print(Player.getHealth()). O comando script também gerencia arquivos: script list, script on <nome>, script off <nome>, script reload [nome], script delete <nome> e script import <.lua ou pasta>.
  • Waypoint Script do CaveBot: o código do waypoint roda e a rota espera até ele terminar (sem timers nem eventos registrados). Dentro dele, CaveBot.GoTo("label") pula para o label e encerra o script.

A API#

Referência completa, módulo por módulo: Referência de funções. Abaixo, as mais usadas.

As funções ficam em tabelas por módulo. Posições são passadas como x, y, z separados e devolvidas como tabela {x, y, z}. Slots de inventário começam em 1 (Enums.InventorySlot); slots de container começam em 0.

FunçãoParâmetrosO que faz
Player.getHealth() / getMana()HP e mana atuais (também getMaxHealth, getMaxMana, getHealthPercent, getManaPercent)
Player.getPosition()Sua posição {x, y, z}
Player.getLevel() / getCapacity()Level e cap livre
Player.getTargetId()Id da criatura atacada (0 = nenhuma)
Player.getState(estado)Enums.States.Xtrue se você está com o estado (paralyze, haste...)
Player.isInPz() / isInCombat()Em protection zone / em combate
Player.getSkills()Tabela com skills, magic level e porcentagens
Game.talk(texto, modo)texto, modo opcionalFala no Default (modo 1 = say)
Game.talkPrivate(texto, nome)Manda PM
Game.walk(direção)Enums.Directions.XDá um passo
Game.attack(id) / Game.follow(id)id da criaturaAtaca (0 para de atacar) / segue
Game.useItem(itemId)Usa o item como uma hotkey
Game.useItemWithCreature(itemId, id)Usa o item (runa, poção) na criatura
Game.useItemOnGround(itemId, x, y, z)Usa o item num piso
Game.getItemCount(itemId)Quantos você tem (bag e equipamento)
Game.equipItem(itemId)Equipa o item
Map.getCreatureIds(mesmoAndar, sóPlayers)booleanosIds das criaturas visíveis
Map.goTo(x, y, z)Anda até a posição
Map.isTileWalkable(x, y, z)Se dá para pisar
Creature.new(id)Objeto com getName, getHealthPercent, getPosition, getDistance, isOnScreen, getType, getSkull...
Container.new(índice)Container aberto: getName, getItems, useItem, moveItemToContainer...
Spells.getIdByWords(palavras)Id da magia (-1 se não existe)
Spells.isInCooldown(id)Se a magia está em cooldown
Npc.buy(id, qtd) / Npc.sell(id, qtd)Compra e vende na janela de trade aberta
Engine.enableHealing(bool)Liga/desliga módulos: também enableTargeting, enableCaveBot, enableMagicShooter, enableEquipment, enableBot e os isXEnabled
Engine.healingSwitchProfile(n)Troca de perfil do módulo (também Targeting, Equipment, MagicShooter)
CaveBot.GoTo(label)Pula a rota para o label
CaveBot.pause(ms)Pausa a rota (0 retoma)
CaveBot.getWaypoints()Lista de waypoints {x, y, z, type, data}
Client.showMessage(texto)Texto no meio da tela por 3 s
Client.isKeyPressed(tecla)código da teclaSe a tecla está apertada
HUD.new(x, y, texto ou itemId)Texto ou ícone na tela do jogo: setText, setColor(r, g, b), setPos, setCallback, destroy...
CustomModalWindow.new(título, texto)Janela com botões: addButton, setCallback(fn(botão))
Timer.new(nome, fn, ms)4º parâmetro false = não iniciarRoda fn a cada ms: start, stop, isActive. destroyTimer(nome) apaga
wait(ms)Espera sem perder eventos
JSON.encode(t) / JSON.decode(s)Converte tabela e texto JSON
Sound.play(arquivo, padrão)true = procura em scripts/soundsToca um .wav
Mais funções disponíveis
  • Player: getName, getId, getSoulPoints, getStamina, getExperience, getLevelPercent, getSpeed, getVocation, getInventorySlot(slot), getContainers, getMagicShield, getBlessingState, isPremium, getUnjustifiedData, getDusts, getTotalGoldBalance, getHuntingPoints, getPreyWildcards, funções de party (inviteParty, joinParty, leaveParty, enableSharedExpParty, passLeadershipParty).
  • Game: turn, talkChannel, openChannel, getChannelsHistory, getInventoryItems, useItemOnInventory, useItemFromGround, lootCorpse, autoLoot, modalWindowAnswer, requestQuestLog, requestQuestLines, writeTextWindow, stashRetrieve, hunting tasks e task board, store, daily reward, forge e imbuements.
  • Map: getTiles, getThings, getThingsCount, getTopItemId, getTopCreatureId, getAllPositionsWithTopItemId, getPlayerOnScreen, moveItemToInventory, moveItemToContainer, moveItemToGround, moveCreatureToGround, useItemWithInventory, useItemWithContainer, lookAt, browseField, collectRewardChest, canWalk.
  • Inventory: useItem, lookAt, moveItemToGround, moveItemToContainer, stowContainer.
  • CaveBot: adicionar, inserir, trocar e apagar waypoints, selectWaypoint, saveFile, loadFile, listas de sell e refill, ajustes de lure, áreas especiais e modo de andar.
  • Client: isConnected, logout, login, XLog, focus, flashWindow, setWindowTitle, sendHotkey, getFightMode / setFightMode, getChaseMode / setChaseMode, getVersion, getAllItems, getAllMonsters, getLootBlackWhitelist / setLootBlackWhitelist.
  • Engine: loadScript, unloadScript, reloadScript, isScriptLoaded, loadConfig, alarmes (setAlarm, isAlarmEnabled, allAlarmsEnable), holdTargetEnable, antiPushEnable, autoSSAEnable, autoMightRingEnable, runeMaxEnable, reconnectEnable.
  • Enums e HotkeyManager.parseKeyCombination("Ctrl+F5").

Eventos#

Registre com Game.registerEvent(Game.Events.X, função) e remova com Game.unregisterEvent. Cada evento, com parâmetros e exemplo, está em Eventos do jogo.

EventoArgumentos
TALKnome, level, modo, x, y, z, texto, canal
TEXT_MESSAGEtabela {messageType, text, channelId, position, value, ...}
MAGIC_EFFECTid, x, y, z
DISTANCE_SHOOT_EFFECTid, de x, y, z, para x, y, z
HOTKEY_SHORTCUT_PRESStecla, modificadores (só com o cliente em foco)
HUD_CLICK / HUD_DRAGid do HUD (e x, y no arraste)
MODAL_WINDOWtabela com id, title, message, buttons, choices
CUSTOM_MODAL_WINDOW_BUTTON_CLICKid da janela, botão
LABELíndice e texto do waypoint label (o CaveBot pausa até você chamar CaveBot.pause(0))
ALARMtipo (Enums.AlarmType)
QUEST_LOG / QUEST_LINESlista de quests / id e lista de missões
OPEN_STASHtabela com o stash
CREATURE_HEALTHid da criatura, HP % (extra do DrenoxBot)
PLAYER_DATAHP, HP máx, mana, mana máx (extra do DrenoxBot)

Exemplos#

lua
-- HP do alvo num HUD na tela
local hud = HUD.new(20, 60, "Alvo: -")
hud:setColor(35, 213, 255)

Game.registerEvent(Game.Events.CREATURE_HEALTH, function(id, hp)
  if id ~= Player.getTargetId() then return end
  local alvo = Creature.new(id)
  if alvo:isOnScreen() then
    hud:setText(alvo:getName() .. "  " .. hp .. "%")
  end
end)

Compartilhar e baixar scripts#

A área de Downloads da comunidade tem scripts Lua, cavebots e presets enviados pelos jogadores. Pela aba DrenoxCommunity dentro do jogo, cada download tem Instalar e Instalar + ligar, e você compartilha os seus scripts com um clique. Antes de ligar um script de outra pessoa, leia o código: ele roda com o seu personagem.

Dúvidas sobre um script? Poste no fórum de suporte com o código e a mensagem de erro do Console.