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

player

Seu 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")
skills

Suas skills: magic, fist, club, sword, axe, distance e shielding, cada uma com level e percent.

Exemplo

log(skills.magic && skills.magic.level)
experience

Sua experiência total.

Exemplo

log(experience)
money

O 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

creatures

Tudo 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))
target

A 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

containers

Suas 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)
equipment

O que você está usando: ring, amulet, boots, rightHand, leftHand e ammo (null quando vazio).

Exemplo

if (!equipment.ring) warn("no ring on")
hotbar

Os 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)
depot

O 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

trade

A 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
})
cavebot

O 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")
storage

Um objeto que guarda os valores entre as rodadas, até você editar o script ou recarregar o jogo.

Exemplo

storage.kills = (storage.kills || 0) + 1
now

O relógio do jogo, em milissegundos.

Exemplo

if (now - (storage.last || 0) > 60000) storage.last = now