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
playerTu 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")skillsTus skills: magic, fist, club, sword, axe, distance y shielding, cada una con level y percent.
Ejemplo
log(skills.magic && skills.magic.level)
experienceTu experiencia total.
Ejemplo
log(experience)
moneyEl 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
creaturesTodo 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))
targetLa 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
containersTus 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)
equipmentLo que llevas puesto: ring, amulet, boots, rightHand, leftHand y ammo (null cuando está vacío).
Ejemplo
if (!equipment.ring) warn("no ring on")hotbarLos 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)depotEl 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
tradeLa 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
})cavebotEl 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")storageUn objeto que guarda sus valores entre corridas, hasta que edites el script o recargues el juego.
Ejemplo
storage.kills = (storage.kills || 0) + 1
nowEl reloj del juego, en milisegundos.
Ejemplo
if (now - (storage.last || 0) > 60000) storage.last = now