Como os scripts em Lua dos bots clássicos de Tibia, só que em JavaScript. Escreva algumas linhas na aba Scripts e o bot roda elas a cada poucos segundos: lê o seu personagem e a tela, solta magia, usa item, ataca, anda, fala com NPC e compra, ou decide quem o Target ataca e o que o Loot pega.
Como funciona
- Abra o bot, vá em Scripts e toque em + Novo script, ou comece por um dos exemplos abaixo.
- Cada script roda de novo no intervalo que você escolher (a partir de 0,1 s). Ligue o interruptor dele e ligue o módulo Scripts. Com o script ligado, o código fica só para leitura: desligue para editar. O que o log() escreve aparece no Console, embaixo do código (Editar).
- Os scripts ficam salvos no seu perfil: quando você compartilha, manda ou vende um perfil, os scripts vão junto, e quem recebe pode ler e editar. Scripts que chegam num perfil de outra pessoa vêm desligados e bloqueados: não rodam de jeito nenhum (nem sozinhos, nem com Rodar agora, nem por um waypoint Script do Cavebot) até você tocar em Permitir… no módulo Scripts. Cuidado: um script malicioso pode vender ou jogar fora os seus itens, levar o personagem até os monstros, deslogar ou falar por você. Leia o código (Editar) e só permita scripts que você entende, de quem você confia.
- Uma ação devolve true quando o bot faz e false quando não dá; why() diz o porquê. Cada script faz uma ação de jogo por tick: coloque await wait(ms) entre os passos de uma sequência.
Seguro por natureza
Os scripts rodam numa caixa fechada dentro do bot e só usam as funções desta página. Não veem a página do jogo, suas senhas nem a internet, e um script preso num laço é parado sozinho. Toda ação passa pelos mesmos caminhos do resto do bot.
Seu primeiro script
Curar abaixo de 60% de vida, pôr o magic shield quando aparece um player e escrever no console do script o que está acontecendo:
if (player.hpPercent < 60) cast("exura vita")
if (players().length > 0 && !player.magicShield) cast("utamo vita")
log("HP", player.hp, "monsters", monsters().length)Eles também estão no bot: Scripts → + A partir de um exemplo.
Treinar magic level (utevo lux)
roda a cada 2 s
if (player.manaPercent >= 95 && !player.inPz && monsters().length === 0) {
cast("utevo lux")
}Magic shield quando aparece um PK
roda a cada 0.5 s
const pk = players().find((p) => p.skull === "white" || p.skull === "red" || p.skull === "black")
if (pk && !player.magicShield) {
cast("utamo vita")
}Curar um amigo com exura sio
roda a cada 0.5 s
const friend = findCreature("Friend Name")
if (friend && friend.hpPercent < 60 && distance(friend) <= 7) {
cast('exura sio "' + friend.name + '"')
}Alarme com pouca capacidade
roda a cada 5 s
if (player.cap !== null && player.cap < 50) {
alarm()
log("Capacity:", player.cap)
}Atacar o monstro mais fraco
roda a cada 0.5 s
const weakest = monsters()
.filter((m) => m.distance <= 6 && m.hpPercent !== null)
.sort((a, b) => a.hpPercent - b.hpPercent)[0]
if (weakest && (!target || target.id !== weakest.id)) {
attack(weakest)
}Haste quando não há monstro por perto
roda a cada 1 s
if (!player.hasted && !player.inPz && monsters().length === 0) {
cast("utani hur")
}Pausar o Cavebot com poucos mana fluids
roda a cada 2 s
const VIAL = 2874
const MANA = 7
if (itemCount(VIAL, MANA) < 20) {
pause("cavebot")
warn("Few mana fluids:", itemCount(VIAL, MANA))
} else {
resume("cavebot")
}Falar com um NPC (passo a passo)
roda a cada 60 s
say("hi")
await wait(2000)
say("trade")
await wait(1500)
log("Trade window should be open now")Target: pular alguns, fracos primeiro
roda a cada 60 s
const NEVER = ["Rabbit", "Deer"]
onAttack((monster) => {
if (NEVER.includes(monster.name)) return false
if (monster.hpPercent !== null && monster.hpPercent < 30) return 10
if (monster.attackingMe) return 5
})Loot: pular baratos, pegar alguns
roda a cada 60 s
const ALWAYS = ["dragon ham", "platinum coin"]
onLoot((item) => {
if (ALWAYS.includes(item.name)) return true
if (item.value !== null && item.value < 50) return false
})Ir ao refil com poucos suprimentos
roda a cada 60 s
const MANA_FLUIDS = itemCount(2874, 7)
if (player.cap < 100 || MANA_FLUIDS < 50) {
log("Going to refill. Cap:", player.cap, "mana fluids:", MANA_FLUIDS)
gotoLabel("Refill")
}Comprar mana fluids até 100
roda a cada 60 s
const WANT = 100
const have = itemCount(2874, 7)
if (have >= WANT) return
say("hi")
await wait(1500)
say("trade")
if (!(await waitUntil(() => trade, 3000))) {
warn("The shop did not open")
return
}
if (!(await buy(2874, WANT - have, 7))) warn("Could not buy:", why())
closeTrade()Vender loot ao NPC
roda a cada 60 s
const SELL = ["plate armor", "battle shield", "dwarven shield"]
say("hi")
await wait(1500)
say("trade")
if (!(await waitUntil(() => trade, 3000))) {
warn("The shop did not open")
return
}
for (const name of SELL) {
const item = findItem(name)
if (!item) continue
if (!(await sell(item.id, itemCount(item.id)))) warn("Could not sell", name + ":", why())
}
closeTrade()Parar a caça e sair depois de 2 h
roda a cada 10 s
const HOURS = 2
storage.start = storage.start || now
if (now - storage.start >= HOURS * 3600000) {
pause("cavebot")
pause("target")
if (!storage.warned) {
warn("Hunt time is over")
alarm()
storage.warned = true
}
if (!player.inBattle && !player.pzLocked) logout()
}Alarme com mensagem privada
roda a cada 1 s
for (const m of messages()) {
if (m.type === "private") {
alarm()
warn("Private message from", m.from)
}
}Pausar o Cavebot perto de players
roda a cada 1 s
const near = players().filter((p) => p.distance <= 4 && !p.party)
if (near.length > 0) {
pause("cavebot")
} else {
resume("cavebot")
}Kills por hora
roda a cada 60 s
storage.start = storage.start || now
storage.kills = storage.kills || 0
for (const m of messages()) {
if (m.type === "loot") storage.kills += 1
}
const hours = (now - storage.start) / 3600000
log("Kills:", storage.kills, "per hour:", hours > 0 ? Math.round(storage.kills / hours) : 0)Magia de área com 3 monstros em volta
roda a cada 0.5 s
const SPELL = "exori"
const close = monsters().filter((m) => m.distance <= 1)
if (close.length >= 3 && canCast(SPELL)) {
cast(SPELL)
}