API de scripts
Tudo o que um script do módulo Scripts pode ler e fazer, numa página só. Comece por “Como um script roda” e depois procure as funções de que precisa: cada uma diz o que faz e traz um exemplo para copiar.
Quer scripts prontos para começar? Ver os exemplos
Como um script roda
Onde ele roda
Os scripts ficam no módulo Scripts do bot. Cada um roda de novo a cada tantos segundos (você escolhe, a partir de 0,1 s) enquanto o interruptor dele e o módulo Scripts estão ligados. “Rodar agora” roda uma vez, mesmo desligado. Script ligado não se edita: desligue antes.
Lendo o jogo
O que o bot vê está pronto para ler: player, monsters(), players(), target, containers, depot, equipment, hotbar, skills, trade e messages(). Os valores são atualizados no começo de cada rodada e depois de cada await, então um script que espera sempre vê o jogo como ele está agora.
const close = monsters().filter((m) => distance(m) <= 1)
if (close.length >= 3) warn("Surrounded by", close.length, "monsters")Fazendo coisas
As funções de ação (cast, useItem, attack, walk, say, buy…) devolvem true quando o bot fez e false quando não deu; why() diz o motivo (mana, cooldown, no-item…). Cada script faz uma ação de jogo por tick, então ponha await wait(ms) entre os passos de uma sequência. Itens, andar, depot e lojas precisam do Direct Controls (página General), que vem ligado.
if (!cast("exura vita")) log("no heal:", why())Esperando
await wait(ms) pausa o script, await waitUntil(check, ms) espera até algo ser verdade e await goTo(x, y, z) anda até lá. Escreva sempre await antes delas. Um script nunca roda duas vezes ao mesmo tempo: a próxima rodada só começa quando esta termina.
say("hi")
await wait(1500)
say("trade")
if (!(await waitUntil(() => trade, 4000))) warn("the shop did not open")Memória entre rodadas
storage guarda valores de uma rodada para a outra, até você editar o script ou recarregar o jogo. now é o relógio do jogo em milissegundos: use para fazer algo a cada tantos minutos.
if (now - (storage.last || 0) > 60000) {
storage.last = now
log("one more minute")
}O console
log() e warn() escrevem no console do script, embaixo do código (clique em Editar). Os erros aparecem ali também, com o número da linha.
Com o Cavebot
O waypoint Script do Cavebot roda um dos seus scripts uma vez e espera ele terminar. Dentro dele, gotoLabel("Nome") faz o Cavebot pular para um label, e cavebot.label, cavebot.index e cavebot.status dizem onde a rota está. turnOn() e turnOff() mexem no interruptor de um módulo; pause() segura um módulo só enquanto o script está ligado.
if (itemCount("life fluid") < 100) gotoLabel("City")
else gotoLabel("Hunt")Regras do Target e do Loot
onAttack((monster) => …) decide quem o Target ataca: devolva false para pular um monstro ou um número para subir a prioridade dele. onLoot((item) => …) decide o que o Loot pega: true pega, false deixa.
onAttack((m) => {
if (m.name === "Rat") return false
if (m.hpPercent !== null && m.hpPercent < 30) return 10
})Limites e segurança
Cada rodada tem 50 ms de trabalho (esperar não conta); um script que passa disso seguidas vezes é parado. Os scripts rodam numa caixa fechada: não veem a página do jogo, suas senhas nem a internet. Scripts que chegam num perfil de outra pessoa vêm bloqueados até você permitir.
Funções e valores
Agrupados como no painel Funções do bot. Os exemplos são trechos curtos: coloque dentro do seu script.
Seu personagem
playerSeu personagem: hp, maxHp, hpPercent, mana, maxMana, manaPercent, cap, soul, level, vocation, name, x, y, z, direction, skull, inPz, inBattle, pzLocked, hasted, paralyzed, poisoned, magicShield, invisible, hungry, moving, targetId.
Exemplo
if (player.hpPercent < 50) cast("exura vita")skillsSuas skills: magic, fist, club, sword, axe, distance e shielding, cada uma com level e percent.
Exemplo
log(skills.magic && skills.magic.level)
experienceSua experiência total.
Exemplo
log(experience)
moneyO gold que você carrega (moedas de gold, platinum e crystal em gold). null quando não se sabe.
Exemplo
if (money !== null && money < 1000) warn("low on gold")Criaturas e o mundo
creaturesTudo que está visível menos você: monstros, players e NPCs. Cada um tem id, name, type, hpPercent, x, y, z, distance (sqm), sameFloor, skull, party, level, vocation, summon, attackingMe e isTarget.
Exemplo
for (const c of creatures) log(c.name, c.type, c.distance)
monsters()Só os monstros do seu andar.
Exemplo
if (monsters().length >= 3) cast("exevo gran mas vis")players()Só os players do seu andar.
Exemplo
if (players().length > 0) pause("cavebot")npcs()Só os NPCs do seu andar.
Exemplo
log(npcs().map((n) => n.name))
targetA criatura que você está atacando, ou null.
Exemplo
if (target && target.hpPercent < 20) useOnTarget(3155)
findCreature(name)A primeira criatura do seu andar com esse nome (maiúscula não importa), ou null.
Exemplo
const bob = findCreature("Bob")distance(a, b?)Distância em sqm (a maior diferença entre x e y). Com um argumento, mede a partir de você. Outro andar = Infinity.
Exemplo
if (target && distance(target) > 4) chaseMode("chase")messages()As linhas novas desde a última chamada: mensagens do servidor, respostas de NPC, fala de monstro, loot e mensagens privadas (só quem mandou).
Exemplo
for (const m of messages()) if (m.type === "npc") log(m.from, m.text)
Itens
containersSuas mochilas abertas: index, name, size, free e items (id, name, count, slot, fluid, bag = true quando o item é uma backpack).
Exemplo
for (const bp of containers) log(bp.name, bp.items.length)
equipmentO que você está usando: ring, amulet, boots, rightHand, leftHand e ammo (null quando vazio).
Exemplo
if (!equipment.ring) warn("no ring on")hotbarOs slots da sua hotbar: slot, key, words, itemId e mode (spell, self, target, crosshair, equip…).
Exemplo
log(hotbar.map((h) => h.slot + ":" + (h.words || h.itemId)))
item(name)Acha qualquer item do jogo pelo nome e devolve o id, o fluid e o nome, ou null. Toda função de item também aceita o nome entre aspas direto, como useItem("mana fluid"); o painel Funções tem uma busca que mostra os ids.
Exemplo
const fluid = item("life fluid")
log(fluid.name, fluid.id, fluid.fluid)depotO depot quando está aberto, ou null: index, size, free, items (id, name, count, slot, bag…) e bags (as backpacks do depot que você abriu, com os itens e os slots livres).
Exemplo
if (depot) log(depot.items.length, "items in the depot")
openDepot()Abre o depot: usa o locker livre mais perto de você (até 7 sqm; o jogo anda até ele). Precisa do Direct Controls.
Exemplo
openDepot() await waitUntil(() => depot, 5000)
openItem(item)Abre uma backpack que está dentro de um container aberto, como uma backpack do depot. Precisa do Direct Controls.
Exemplo
openItem(depot.items[1]) await waitUntil(() => depot.bags.length > 0, 3000)
moveItem(item, to, count?)Move um item (das containers ou do depot) para um container (o primeiro slot livre), para dentro de uma backpack ou para "backpack" (a sua backpack principal). count é opcional: tudo por padrão. Precisa do Direct Controls.
Exemplo
moveItem(containers[0].items[0], depot.bags[0])
closeContainer(container)Fecha um container aberto: uma das suas backpacks, uma backpack do depot ou o depot.
Exemplo
closeContainer(depot)
itemCount(item, fluid?)Quantos itens desse você carrega, pelo nome ("life fluid") ou pelo id. Conta mochilas fechadas quando o item está na hotbar. Pelo id, os fluids usam o mesmo id de vial 2874: informe o fluid (7 mana, 10 life).
Exemplo
if (itemCount("mana fluid") < 20) alarm()findItem(name)O primeiro item com esse nome nas suas mochilas abertas, ou null. Use o id dele nas outras funções.
Exemplo
const sd = findItem("sudden death rune")Ações (true quando o bot faz)
cast(words)Solta uma magia da sua vocação. Usa a tecla da hotbar quando ela está lá, senão digita. Confere level, mana e cooldown antes.
Exemplo
cast("utani hur")canCast(words)true quando cast(words) funcionaria agora.
Exemplo
if (canCast("exura vita")) cast("exura vita")say(text)Fala um texto no canal Default: palavras de NPC, magias de casa, qualquer coisa.
Exemplo
say("hi")useItem(id, fluid?)Usa um item em você (comida, fluid, runa), pelo nome ou pelo id: useItem("mana fluid"). Usa a tecla da hotbar em modo Self quando existe, senão a mochila.
Exemplo
if (player.manaPercent < 40) useItem(2874, 7)
useItemOn(id, creatureOrSqm)Usa um item (runa, corda, pá) numa criatura ou num sqm {x, y, z}. Precisa do Direct Controls.
Exemplo
useItemOn(3160, findCreature("Bob"))useOnTarget(id)Usa uma runa na criatura que você está atacando.
Exemplo
useOnTarget(3155)
useHotbar(slot)Aperta um slot da hotbar. Os números dos slots estão na lista hotbar.
Exemplo
useHotbar(4)
attack(creature)Ataca uma criatura (o objeto, o id ou o nome). O módulo Target pode escolher outra na vez dele.
Exemplo
attack(monsters()[0])
stopAttack()Para de atacar.
Exemplo
if (player.hpPercent < 30) stopAttack()
walk(direction)Um passo: north, south, east, west, north-east, north-west, south-east ou south-west.
Exemplo
walk("north")walkTo(x, y, z)Anda até um sqm do seu andar, como um clique no mapa. Precisa do Direct Controls.
Exemplo
walkTo(32369, 32241, 7)
await goTo(x, y, z, timeoutMs?)Anda até um sqm do seu andar e espera chegar (true) ou o tempo acabar (false, padrão 30 s). Pause o Cavebot antes para ele não andar para outro lado. Precisa do Direct Controls.
Exemplo
pause("cavebot")
if (await goTo(32369, 32241, 7)) useTile(32369, 32240, 7)
resume("cavebot")turn(direction)Vira sem andar: north, south, east ou west.
Exemplo
turn("west")useTile(x, y, z)Usa um sqm ao seu lado: porta, alavanca, escada de mão.
Exemplo
useTile(player.x + 1, player.y, player.z)
dropItem(id, count?, x?, y?, z?)Joga um item da mochila no chão (embaixo de você quando não informa o sqm). Precisa do Direct Controls.
Exemplo
dropItem(3031, 10)
fightMode(mode)Troca o modo de luta: attack, balanced ou defense.
Exemplo
fightMode("defense")chaseMode(mode)Troca o modo de perseguir: stand, chase ou aggressive.
Exemplo
chaseMode("stand")logout()Sai do jogo (o jogo recusa enquanto você está em batalha).
Exemplo
if (player.hpPercent < 15 && !player.inBattle) logout()
alarm()Toca o som do alarme e pisca a janela do bot.
Exemplo
if (player.cap < 50) alarm()
NPCs e lojas
tradeA janela da loja do NPC, ou null quando está fechada: npcName, tab, gold e offers (id, name, price, side buy/sell).
Exemplo
if (trade) log(trade.npcName, trade.offers.length, trade.gold)
await buy(id, count, fluid?)Compra pela loja aberta, em lotes de até 100, e espera cada lote passar. Abra a loja antes (diga hi e depois trade). Precisa do Direct Controls.
Exemplo
say("hi")
await wait(1500)
say("trade")
await waitUntil(() => trade, 3000)
await buy(3155, 50)
closeTrade()await sell(id, count, fluid?)Vende pela loja aberta, como o buy.
Exemplo
await sell(3031, itemCount(3031))
closeTrade()Fecha a janela da loja.
Exemplo
closeTrade()
Módulos do bot
onAttack((monster) => …)Uma regra para o módulo Target: pergunta à sua função sobre cada monstro na tela. false = nunca atacar, um número = prioridade (maior primeiro, acima da ordem da sua lista), nada = como sempre. O Target precisa estar ligado.
Exemplo
onAttack((m) => {
if (m.name === "Rat") return false
if (m.hpPercent !== null && m.hpPercent < 30) return 10
})onLoot((item) => …)Uma regra para o módulo Loot: pergunta sobre cada item de um corpo aberto. false = nunca pegar, true = sempre pegar, nada = as opções do Loot decidem. O Loot precisa estar ligado.
Exemplo
onLoot((item) => {
if (item.value !== null && item.value < 50) return false
if (item.name === "dragon ham") return true
})cavebotO Cavebot agora: status (walking, paused:monster, script…), label (a label do trecho da rota em que ele está, como "Hunt"), index (o número do waypoint), waypoint (o tipo dele), stuck (true depois de 3 pulos seguidos) e inWaypoint (true quando um waypoint Script começou esta rodada). null com o Cavebot desligado.
Exemplo
if (cavebot && cavebot.label === "Hunt") log("hunting, waypoint", cavebot.index)gotoLabel(label)Faz o Cavebot pular para um label. Numa rodada começada por um waypoint Script ele pula quando o script termina; em qualquer outro script, na hora.
Exemplo
if (player.cap < 100) gotoLabel("Refill")turnOn(module)Liga um módulo, como o interruptor dele (target, attack, loot, cavebot, healing…). Fica ligado até alguém desligar.
Exemplo
turnOn("target")turnOff(module)Desliga um módulo, como o interruptor dele. Diferente do pause(), continua desligado depois que o script termina.
Exemplo
turnOff("target")pause(module)Segura um módulo (cavebot, target, attack, healing, loot, rune-maker, hunt-follow…) enquanto este script está ligado. Desligar o script solta o módulo.
Exemplo
pause("cavebot")resume(module)Solta um módulo segurado por pause().
Exemplo
resume("cavebot")isOn(module)true quando o interruptor desse módulo está ligado.
Exemplo
if (isOn("cavebot")) log("walking")Ferramentas do script
await wait(ms)Espera e depois segue para a próxima linha. Escreva await antes.
Exemplo
say("hi")
await wait(1500)
say("trade")await waitUntil(check, timeoutMs?)Espera até a checagem devolver true (true) ou o tempo acabar (false, padrão 5 s). A checagem roda a cada 0,1 s.
Exemplo
await waitUntil(() => player.manaPercent > 90, 60000)
why()Por que a última ação devolveu false: mana, cooldown, no-item, chat-busy, one-action-per-tick…
Exemplo
if (!cast("exura")) log(why())log(...values)Escreve uma linha no console deste script, embaixo do código.
Exemplo
log("HP", player.hp, "of", player.maxHp)warn(...values)Como o log, marcado em amarelo.
Exemplo
warn("no mana fluids")storageUm objeto que guarda os valores entre as rodadas, até você editar o script ou recarregar o jogo.
Exemplo
storage.kills = (storage.kills || 0) + 1
nowO relógio do jogo, em milissegundos.
Exemplo
if (now - (storage.last || 0) > 60000) storage.last = now