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.
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:
| Controle | O que faz |
|---|---|
| Ativo | Liga ou desliga o script. Os ligados voltam sozinhos quando o bot abre |
| Novo | Cria scripts/<nome>.lua e abre no editor |
| Editar (ou duplo clique) | Abre o editor, com Salvar e Salvar & ativar |
| Importar DrenoxBot / ZeroBot | Copia um .lua, ou todos os .lua de uma pasta (com subpastas), para scripts/. Um script diferente com o mesmo nome não é sobrescrito |
| Recarregar tudo | Reinicia todos os scripts ligados |
| Apagar | Desliga 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 estilowhile true do ... wait(100) endfuncionam.- 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 exemplolua print(Player.getHealth()). O comandoscripttambém gerencia arquivos:script list,script on <nome>,script off <nome>,script reload [nome],script delete <nome>escript 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ção | Parâmetros | O 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.X | true 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 opcional | Fala no Default (modo 1 = say) |
Game.talkPrivate(texto, nome) | Manda PM | |
Game.walk(direção) | Enums.Directions.X | Dá um passo |
Game.attack(id) / Game.follow(id) | id da criatura | Ataca (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) | booleanos | Ids 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 tecla | Se 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 iniciar | Roda 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/sounds | Toca 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.
| Evento | Argumentos |
|---|---|
TALK | nome, level, modo, x, y, z, texto, canal |
TEXT_MESSAGE | tabela {messageType, text, channelId, position, value, ...} |
MAGIC_EFFECT | id, x, y, z |
DISTANCE_SHOOT_EFFECT | id, de x, y, z, para x, y, z |
HOTKEY_SHORTCUT_PRESS | tecla, modificadores (só com o cliente em foco) |
HUD_CLICK / HUD_DRAG | id do HUD (e x, y no arraste) |
MODAL_WINDOW | tabela com id, title, message, buttons, choices |
CUSTOM_MODAL_WINDOW_BUTTON_CLICK | id da janela, botão |
LABEL | índice e texto do waypoint label (o CaveBot pausa até você chamar CaveBot.pause(0)) |
ALARM | tipo (Enums.AlarmType) |
QUEST_LOG / QUEST_LINES | lista de quests / id e lista de missões |
OPEN_STASH | tabela com o stash |
CREATURE_HEALTH | id da criatura, HP % (extra do DrenoxBot) |
PLAYER_DATA | HP, HP máx, mana, mana máx (extra do DrenoxBot) |
Exemplos#
-- 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)-- A cada 5 s: cap baixa mostra aviso e toca scripts/sounds/alarm.wav
Timer.new("cap", function()
local cap = Player.getCapacity()
if cap < 100 then
Client.showMessage("Cap baixa: " .. cap)
Sound.play("alarm.wav", true)
end
end, 5000)-- Ctrl+F5 liga e desliga o CaveBot
local ok, mods, key = HotkeyManager.parseKeyCombination("Ctrl+F5")
Game.registerEvent(Game.Events.HOTKEY_SHORTCUT_PRESS, function(k, m)
-- bit 8 = Num Lock ligado: ignore
if k == key and bit.band(m, 7) == mods then
local on = not Engine.isCaveBotEnabled()
Engine.enableCaveBot(on)
Client.showMessage("CaveBot " .. (on and "ligado" or "desligado"))
end
end)-- No label "checar": sem 50 mana potions, vai para o label "refill"
Game.registerEvent(Game.Events.LABEL, function(index, label)
if label == "checar" and Game.getItemCount(268) < 50 then -- 268 = mana potion
CaveBot.GoTo("refill")
end
CaveBot.pause(0) -- a rota fica parada até aqui
end)-- Loga no Console quem falou 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)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.
Comentários
para comentar.