API de scripts

Todo lo que un script del módulo Scripts puede leer y hacer, en una sola página. Empieza por “Cómo corre un script” y luego busca las funciones que necesitas: cada una dice qué hace y trae un ejemplo para copiar.

¿Quieres scripts listos para empezar? Ver los ejemplos

Cómo corre un script

Dónde corre

Los scripts están en el módulo Scripts del bot. Cada uno corre de nuevo cada tantos segundos (tú eliges, desde 0,1 s) mientras su interruptor y el módulo Scripts estén encendidos. “Correr ahora” lo corre una vez, aunque esté apagado. Un script encendido no se edita: apágalo antes.

Leer el juego

Lo que el bot ve está listo para leer: player, monsters(), players(), target, containers, depot, equipment, hotbar, skills, trade y messages(). Los valores se actualizan al empezar cada corrida y después de cada await, así que un script que espera siempre ve el juego como está ahora.

const close = monsters().filter((m) => distance(m) <= 1)
if (close.length >= 3) warn("Surrounded by", close.length, "monsters")

Hacer cosas

Las funciones de acción (cast, useItem, attack, walk, say, buy…) devuelven true cuando el bot lo hizo y false cuando no pudo; why() dice el motivo (mana, cooldown, no-item…). Cada script hace una acción de juego por tick, así que pon await wait(ms) entre los pasos de una secuencia. Ítems, caminar, depot y tiendas necesitan Direct Controls (página General), que viene encendido.

if (!cast("exura vita")) log("no heal:", why())

Esperar

await wait(ms) pausa el script, await waitUntil(check, ms) espera hasta que algo sea verdad y await goTo(x, y, z) camina hasta allí. Escribe siempre await antes de ellas. Un script nunca corre dos veces al mismo tiempo: la siguiente corrida empieza solo cuando esta termina.

say("hi")
await wait(1500)
say("trade")
if (!(await waitUntil(() => trade, 4000))) warn("the shop did not open")

Memoria entre corridas

storage guarda valores de una corrida a la siguiente, hasta que edites el script o recargues el juego. now es el reloj del juego en milisegundos: úsalo para hacer algo cada tantos minutos.

if (now - (storage.last || 0) > 60000) {
  storage.last = now
  log("one more minute")
}

La consola

log() y warn() escriben en la consola del script, debajo del código (pulsa Editar). Los errores también aparecen ahí, con el número de línea.

Con el Cavebot

El waypoint Script del Cavebot corre uno de tus scripts una vez y espera a que termine. Dentro de él, gotoLabel("Nombre") hace que el Cavebot salte a un label, y cavebot.label, cavebot.index y cavebot.status dicen dónde está la ruta. turnOn() y turnOff() cambian el interruptor de un módulo; pause() detiene un módulo solo mientras el script está encendido.

if (itemCount("life fluid") < 100) gotoLabel("City")
else gotoLabel("Hunt")

Reglas del Target y del Loot

onAttack((monster) => …) decide a quién ataca el Target: devuelve false para saltar un monstruo o un número para subir su prioridad. onLoot((item) => …) decide qué toma el Loot: true lo toma, false lo deja.

onAttack((m) => {
  if (m.name === "Rat") return false
  if (m.hpPercent !== null && m.hpPercent < 30) return 10
})

Límites y seguridad

Cada corrida tiene 50 ms de trabajo (esperar no cuenta); un script que se pasa varias veces seguidas se detiene. Los scripts corren en una caja cerrada: no ven la página del juego, tus contraseñas ni internet. Los scripts que llegan en el perfil de otra persona vienen bloqueados hasta que los permitas.

Funciones y valores

Agrupados como en el panel Funciones del bot. Los ejemplos son trozos cortos: ponlos dentro de tu script.

Tu personaje

player

Tu personaje: 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.

Ejemplo

if (player.hpPercent < 50) cast("exura vita")
skills

Tus skills: magic, fist, club, sword, axe, distance y shielding, cada una con level y percent.

Ejemplo

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

Tu experiencia total.

Ejemplo

log(experience)
money

El gold que llevas (monedas de gold, platinum y crystal en gold). null cuando no se sabe.

Ejemplo

if (money !== null && money < 1000) warn("low on gold")

Criaturas y el mundo

creatures

Todo lo visible menos tú: monstruos, jugadores y NPCs. Cada uno tiene id, name, type, hpPercent, x, y, z, distance (sqm), sameFloor, skull, party, level, vocation, summon, attackingMe e isTarget.

Ejemplo

for (const c of creatures) log(c.name, c.type, c.distance)
monsters()

Solo los monstruos de tu piso.

Ejemplo

if (monsters().length >= 3) cast("exevo gran mas vis")
players()

Solo los jugadores de tu piso.

Ejemplo

if (players().length > 0) pause("cavebot")
npcs()

Solo los NPCs de tu piso.

Ejemplo

log(npcs().map((n) => n.name))
target

La criatura que estás atacando, o null.

Ejemplo

if (target && target.hpPercent < 20) useOnTarget(3155)
findCreature(name)

La primera criatura de tu piso con ese nombre (las mayúsculas no importan), o null.

Ejemplo

const bob = findCreature("Bob")
distance(a, b?)

Distancia en sqm (la mayor diferencia entre x e y). Con un argumento, mide desde ti. Otro piso = Infinity.

Ejemplo

if (target && distance(target) > 4) chaseMode("chase")
messages()

Las líneas nuevas desde la última llamada: mensajes del servidor, respuestas de NPC, habla de monstruos, loot y mensajes privados (solo el remitente).

Ejemplo

for (const m of messages()) if (m.type === "npc") log(m.from, m.text)

Ítems

containers

Tus mochilas abiertas: index, name, size, free e items (id, name, count, slot, fluid, bag = true cuando el ítem es una backpack).

Ejemplo

for (const bp of containers) log(bp.name, bp.items.length)
equipment

Lo que llevas puesto: ring, amulet, boots, rightHand, leftHand y ammo (null cuando está vacío).

Ejemplo

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

Los slots de tu hotbar: slot, key, words, itemId y mode (spell, self, target, crosshair, equip…).

Ejemplo

log(hotbar.map((h) => h.slot + ":" + (h.words || h.itemId)))
item(name)

Encuentra cualquier ítem del juego por su nombre y da su id, fluid y nombre, o null. Toda función de ítem también acepta el nombre entre comillas directo, como useItem("mana fluid"); el panel Funciones tiene un buscador que muestra los ids.

Ejemplo

const fluid = item("life fluid")
log(fluid.name, fluid.id, fluid.fluid)
depot

El depot cuando está abierto, o null: index, size, free, items (id, name, count, slot, bag…) y bags (las backpacks del depot que abriste, con sus ítems y slots libres).

Ejemplo

if (depot) log(depot.items.length, "items in the depot")
openDepot()

Abre el depot: usa el locker libre más cercano (hasta 7 sqm; el juego camina hasta él). Necesita Direct Controls.

Ejemplo

openDepot()
await waitUntil(() => depot, 5000)
openItem(item)

Abre una backpack que está dentro de un container abierto, como una backpack del depot. Necesita Direct Controls.

Ejemplo

openItem(depot.items[1])
await waitUntil(() => depot.bags.length > 0, 3000)
moveItem(item, to, count?)

Mueve un ítem (de las containers o del depot) a un container (su primer slot libre), dentro de una backpack o a "backpack" (tu backpack principal). count es opcional: todo por defecto. Necesita Direct Controls.

Ejemplo

moveItem(containers[0].items[0], depot.bags[0])
closeContainer(container)

Cierra un container abierto: una de tus backpacks, una backpack del depot o el depot.

Ejemplo

closeContainer(depot)
itemCount(item, fluid?)

Cuántos de ese ítem llevas, por nombre ("life fluid") o por id. Cuenta mochilas cerradas cuando el ítem está en la hotbar. Por id, los fluids comparten el id de vial 2874: indica el fluid (7 mana, 10 life).

Ejemplo

if (itemCount("mana fluid") < 20) alarm()
findItem(name)

El primer ítem con ese nombre en tus mochilas abiertas, o null. Usa su id en las otras funciones.

Ejemplo

const sd = findItem("sudden death rune")

Acciones (true cuando el bot la hace)

cast(words)

Lanza un hechizo de tu vocación. Usa su tecla de la hotbar cuando la tiene; si no, lo escribe. Revisa level, mana y cooldown antes.

Ejemplo

cast("utani hur")
canCast(words)

true cuando cast(words) funcionaría ahora.

Ejemplo

if (canCast("exura vita")) cast("exura vita")
say(text)

Dice un texto en el canal Default: palabras de NPC, hechizos de casa, lo que sea.

Ejemplo

say("hi")
useItem(id, fluid?)

Usa un ítem en ti (comida, fluid, runa), por nombre o por id: useItem("mana fluid"). Usa su tecla de la hotbar en modo Self cuando la tiene; si no, la mochila.

Ejemplo

if (player.manaPercent < 40) useItem(2874, 7)
useItemOn(id, creatureOrSqm)

Usa un ítem (runa, cuerda, pala) en una criatura o en un sqm {x, y, z}. Necesita Direct Controls.

Ejemplo

useItemOn(3160, findCreature("Bob"))
useOnTarget(id)

Usa una runa en la criatura que estás atacando.

Ejemplo

useOnTarget(3155)
useHotbar(slot)

Presiona un slot de la hotbar. Los números de los slots están en la lista hotbar.

Ejemplo

useHotbar(4)
attack(creature)

Ataca una criatura (el objeto, su id o su nombre). El módulo Target puede elegir otra en su turno.

Ejemplo

attack(monsters()[0])
stopAttack()

Deja de atacar.

Ejemplo

if (player.hpPercent < 30) stopAttack()
walk(direction)

Un paso: north, south, east, west, north-east, north-west, south-east o south-west.

Ejemplo

walk("north")
walkTo(x, y, z)

Camina hasta un sqm de tu piso, como un clic en el mapa. Necesita Direct Controls.

Ejemplo

walkTo(32369, 32241, 7)
await goTo(x, y, z, timeoutMs?)

Camina hasta un sqm de tu piso y espera llegar (true) o que se acabe el tiempo (false, 30 s por defecto). Pausa el Cavebot antes para que no camine a otro lado. Necesita Direct Controls.

Ejemplo

pause("cavebot")
if (await goTo(32369, 32241, 7)) useTile(32369, 32240, 7)
resume("cavebot")
turn(direction)

Gira sin caminar: north, south, east o west.

Ejemplo

turn("west")
useTile(x, y, z)

Usa un sqm a tu lado: puerta, palanca, escalera de mano.

Ejemplo

useTile(player.x + 1, player.y, player.z)
dropItem(id, count?, x?, y?, z?)

Tira un ítem de tu mochila al suelo (debajo de ti cuando no indicas el sqm). Necesita Direct Controls.

Ejemplo

dropItem(3031, 10)
fightMode(mode)

Cambia el modo de lucha: attack, balanced o defense.

Ejemplo

fightMode("defense")
chaseMode(mode)

Cambia el modo de persecución: stand, chase o aggressive.

Ejemplo

chaseMode("stand")
logout()

Sale del juego (el juego no deja mientras estás en batalla).

Ejemplo

if (player.hpPercent < 15 && !player.inBattle) logout()
alarm()

Toca el sonido de alarma y hace parpadear la ventana del bot.

Ejemplo

if (player.cap < 50) alarm()

NPCs y tiendas

trade

La ventana de la tienda del NPC, o null cuando está cerrada: npcName, tab, gold y offers (id, name, price, side buy/sell).

Ejemplo

if (trade) log(trade.npcName, trade.offers.length, trade.gold)
await buy(id, count, fluid?)

Compra en la tienda abierta, en lotes de hasta 100, y espera que pase cada lote. Abre la tienda antes (di hi y luego trade). Necesita Direct Controls.

Ejemplo

say("hi")
await wait(1500)
say("trade")
await waitUntil(() => trade, 3000)
await buy(3155, 50)
closeTrade()
await sell(id, count, fluid?)

Vende en la tienda abierta, como buy.

Ejemplo

await sell(3031, itemCount(3031))
closeTrade()

Cierra la ventana de la tienda.

Ejemplo

closeTrade()

Módulos del bot

onAttack((monster) => …)

Una regla para el módulo Target: le pregunta a tu función por cada monstruo en pantalla. false = nunca atacarlo, un número = prioridad (mayor primero, por encima del orden de tu lista), nada = como siempre. Target tiene que estar encendido.

Ejemplo

onAttack((m) => {
  if (m.name === "Rat") return false
  if (m.hpPercent !== null && m.hpPercent < 30) return 10
})
onLoot((item) => …)

Una regla para el módulo Loot: pregunta por cada ítem de un cuerpo abierto. false = nunca tomarlo, true = tomarlo siempre, nada = deciden las opciones de Loot. Loot tiene que estar encendido.

Ejemplo

onLoot((item) => {
  if (item.value !== null && item.value < 50) return false
  if (item.name === "dragon ham") return true
})
cavebot

El Cavebot ahora: status (walking, paused:monster, script…), label (la label de la parte de la ruta en que está, como "Hunt"), index (el número del waypoint), waypoint (su tipo), stuck (true después de 3 saltos seguidos) e inWaypoint (true cuando un waypoint Script empezó esta corrida). null con el Cavebot apagado.

Ejemplo

if (cavebot && cavebot.label === "Hunt") log("hunting, waypoint", cavebot.index)
gotoLabel(label)

Hace que el Cavebot salte a un label. En una corrida que empezó un waypoint Script salta cuando el script termina; en cualquier otro script, enseguida.

Ejemplo

if (player.cap < 100) gotoLabel("Refill")
turnOn(module)

Enciende un módulo, como su interruptor (target, attack, loot, cavebot, healing…). Queda encendido hasta que algo lo apague.

Ejemplo

turnOn("target")
turnOff(module)

Apaga un módulo, como su interruptor. A diferencia de pause(), queda apagado cuando el script termina.

Ejemplo

turnOff("target")
pause(module)

Retiene un módulo (cavebot, target, attack, healing, loot, rune-maker, hunt-follow…) mientras este script está encendido. Apagar el script lo suelta.

Ejemplo

pause("cavebot")
resume(module)

Suelta un módulo retenido por pause().

Ejemplo

resume("cavebot")
isOn(module)

true cuando el interruptor de ese módulo está encendido.

Ejemplo

if (isOn("cavebot")) log("walking")

Herramientas del script

await wait(ms)

Espera y luego sigue con la línea siguiente. Escribe await antes.

Ejemplo

say("hi")
await wait(1500)
say("trade")
await waitUntil(check, timeoutMs?)

Espera hasta que la comprobación devuelva true (true) o se acabe el tiempo (false, 5 s por defecto). La comprobación corre cada 0,1 s.

Ejemplo

await waitUntil(() => player.manaPercent > 90, 60000)
why()

Por qué la última acción devolvió false: mana, cooldown, no-item, chat-busy, one-action-per-tick…

Ejemplo

if (!cast("exura")) log(why())
log(...values)

Escribe una línea en la consola de este script, debajo del código.

Ejemplo

log("HP", player.hp, "of", player.maxHp)
warn(...values)

Como log, marcado en amarillo.

Ejemplo

warn("no mana fluids")
storage

Un objeto que guarda sus valores entre corridas, hasta que edites el script o recargues el juego.

Ejemplo

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

El reloj del juego, en milisegundos.

Ejemplo

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