API skryptów

Wszystko, co skrypt z modułu Scripts może odczytać i zrobić, na jednej stronie. Zacznij od „Jak działa skrypt”, a potem znajdź potrzebne funkcje: każda ma opis i przykład do skopiowania.

Chcesz gotowe skrypty na start? Zobacz przykłady

Jak działa skrypt

Gdzie działa

Skrypty są w module Scripts bota. Każdy uruchamia się ponownie co kilka sekund (ty wybierasz, od 0,1 s), dopóki jego przełącznik i moduł Scripts są włączone. „Uruchom teraz” uruchamia go raz, nawet gdy jest wyłączony. Włączonego skryptu nie da się edytować: najpierw go wyłącz.

Odczyt gry

To, co widzi bot, jest gotowe do odczytu: player, monsters(), players(), target, containers, depot, equipment, hotbar, skills, trade i messages(). Wartości odświeżają się na początku każdego uruchomienia i po każdym await, więc skrypt, który czeka, zawsze widzi grę taką, jaka jest teraz.

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

Działania

Funkcje akcji (cast, useItem, attack, walk, say, buy…) zwracają true, gdy bot to zrobił, i false, gdy się nie udało; why() mówi dlaczego (mana, cooldown, no-item…). Każdy skrypt wykonuje jedną akcję w grze na tick, więc między krokami sekwencji wstaw await wait(ms). Przedmioty, chodzenie, depot i sklepy wymagają Direct Controls (strona General), które są domyślnie włączone.

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

Czekanie

await wait(ms) zatrzymuje skrypt, await waitUntil(check, ms) czeka, aż coś będzie prawdą, a await goTo(x, y, z) idzie w to miejsce. Zawsze pisz przed nimi await. Skrypt nigdy nie działa dwa razy naraz: następne uruchomienie zaczyna się dopiero, gdy to się skończy.

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

Pamięć między uruchomieniami

storage przechowuje wartości od jednego uruchomienia do następnego, dopóki nie zmienisz skryptu albo nie przeładujesz gry. now to zegar gry w milisekundach: użyj go, żeby robić coś co kilka minut.

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

Konsola

log() i warn() piszą w konsoli skryptu, pod kodem (kliknij Edytuj). Tam pojawiają się też błędy, z numerem linii.

Z Cavebotem

Waypoint Script w Cavebocie uruchamia jeden z twoich skryptów raz i czeka, aż się skończy. W nim gotoLabel("Nazwa") każe Cavebotowi przeskoczyć do labela, a cavebot.label, cavebot.index i cavebot.status mówią, gdzie jest trasa. turnOn() i turnOff() przełączają moduł; pause() wstrzymuje moduł tylko na czas, gdy skrypt jest włączony.

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

Reguły dla Target i Loot

onAttack((monster) => …) decyduje, kogo atakuje Target: zwróć false, żeby pominąć potwora, albo liczbę, żeby podnieść jego priorytet. onLoot((item) => …) decyduje, co bierze Loot: true bierze, false zostawia.

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

Limity i bezpieczeństwo

Każde uruchomienie ma 50 ms pracy (czekanie się nie liczy); skrypt, który ciągle przekracza limit, zostaje zatrzymany. Skrypty działają w zamkniętym pudełku: nie widzą strony gry, twoich haseł ani internetu. Skrypty z profilu innej osoby przychodzą zablokowane, dopóki ich nie zezwolisz.

Funkcje i wartości

Pogrupowane jak w panelu Functions bota. Przykłady to krótkie fragmenty: wstaw je do swojego skryptu.

Twoja postać

player

Twoja postać: 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.

Przykład

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

Twoje skille: magic, fist, club, sword, axe, distance i shielding, każdy z level i percent.

Przykład

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

Twoje całe doświadczenie.

Przykład

log(experience)
money

Gold, który nosisz (monety gold, platinum i crystal w przeliczeniu na gold). null, gdy nie wiadomo.

Przykład

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

Stworzenia i świat

creatures

Wszystko, co widać, oprócz ciebie: potwory, gracze i NPC. Każde ma id, name, type, hpPercent, x, y, z, distance (sqm), sameFloor, skull, party, level, vocation, summon, attackingMe i isTarget.

Przykład

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

Tylko potwory na twoim piętrze.

Przykład

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

Tylko gracze na twoim piętrze.

Przykład

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

Tylko NPC na twoim piętrze.

Przykład

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

Stworzenie, które atakujesz, albo null.

Przykład

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

Pierwsze stworzenie na twoim piętrze o tej nazwie (wielkość liter nie ma znaczenia) albo null.

Przykład

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

Odległość w sqm (większa z różnic x i y). Z jednym argumentem liczy od ciebie. Inne piętro = Infinity.

Przykład

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

Nowe linie od ostatniego wywołania: wiadomości serwera, odpowiedzi NPC, mowa potworów, loot i prywatne wiadomości (tylko nadawca).

Przykład

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

Przedmioty

containers

Twoje otwarte plecaki: index, name, size, free i items (id, name, count, slot, fluid, bag = true, gdy przedmiot to backpack).

Przykład

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

Co masz na sobie: ring, amulet, boots, rightHand, leftHand i ammo (null, gdy puste).

Przykład

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

Sloty twojego hotbar: slot, key, words, itemId i mode (spell, self, target, crosshair, equip…).

Przykład

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

Znajduje dowolny przedmiot z gry po nazwie i podaje jego id, fluid i nazwę albo null. Każda funkcja przedmiotów przyjmuje też samą nazwę w cudzysłowie, np. useItem("mana fluid"); panel Funkcje ma wyszukiwarkę, która pokazuje id.

Przykład

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

Depot, gdy jest otwarty, albo null: index, size, free, items (id, name, count, slot, bag…) i bags (otwarte backpacki depotu z przedmiotami i wolnymi slotami).

Przykład

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

Otwiera depot: używa najbliższego wolnego lockera (do 7 sqm; gra do niego podchodzi). Wymaga Direct Controls.

Przykład

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

Otwiera backpack, który jest w otwartym kontenerze, np. backpack w depocie. Wymaga Direct Controls.

Przykład

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

Przenosi przedmiot (z kontenerów albo z depotu) do kontenera (pierwszy wolny slot), do środka backpacka albo do "backpack" (twój główny backpack). count jest opcjonalny: domyślnie wszystko. Wymaga Direct Controls.

Przykład

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

Zamyka otwarty kontener: jeden z twoich backpacków, backpack z depotu albo depot.

Przykład

closeContainer(depot)
itemCount(item, fluid?)

Ile sztuk przedmiotu nosisz, po nazwie ("life fluid") albo po id. Liczy zamknięte plecaki, gdy przedmiot jest na hotbar. Po id fluidy mają wspólne id fiolki 2874: podaj fluid (7 mana, 10 life).

Przykład

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

Pierwszy przedmiot o tej nazwie w otwartych plecakach albo null. Użyj jego id w innych funkcjach.

Przykład

const sd = findItem("sudden death rune")

Akcje (true, gdy bot je wykona)

cast(words)

Rzuca czar twojej profesji. Używa klawisza z hotbar, jeśli tam jest, inaczej go wpisuje. Najpierw sprawdza level, manę i cooldown.

Przykład

cast("utani hur")
canCast(words)

true, gdy cast(words) zadziałałoby teraz.

Przykład

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

Mówi tekst na kanale Default: słowa do NPC, czary domu, cokolwiek.

Przykład

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

Używa przedmiotu na sobie (jedzenie, fluid, runa), po nazwie albo po id: useItem("mana fluid"). Używa klawisza z hotbar w trybie Self, jeśli jest, inaczej plecaka.

Przykład

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

Używa przedmiotu (runa, lina, łopata) na stworzeniu albo na sqm {x, y, z}. Wymaga Direct Controls.

Przykład

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

Używa runy na stworzeniu, które atakujesz.

Przykład

useOnTarget(3155)
useHotbar(slot)

Naciska slot hotbar. Numery slotów są na liście hotbar.

Przykład

useHotbar(4)
attack(creature)

Atakuje stworzenie (obiekt, jego id albo nazwę). Moduł Target może wybrać inne w swojej kolejce.

Przykład

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

Przestaje atakować.

Przykład

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

Jeden krok: north, south, east, west, north-east, north-west, south-east albo south-west.

Przykład

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

Idzie do sqm na twoim piętrze, jak kliknięcie na mapie. Wymaga Direct Controls.

Przykład

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

Idzie do sqm na twoim piętrze i czeka, aż dojdzie (true) albo skończy się czas (false, domyślnie 30 s). Najpierw wstrzymaj Cavebot, żeby nie szedł gdzie indziej. Wymaga Direct Controls.

Przykład

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

Obraca się bez chodzenia: north, south, east albo west.

Przykład

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

Używa sqm obok ciebie: drzwi, dźwignia, drabina.

Przykład

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

Wyrzuca przedmiot z plecaka na ziemię (pod ciebie, gdy nie podasz sqm). Wymaga Direct Controls.

Przykład

dropItem(3031, 10)
fightMode(mode)

Zmienia tryb walki: attack, balanced albo defense.

Przykład

fightMode("defense")
chaseMode(mode)

Zmienia tryb pościgu: stand, chase albo aggressive.

Przykład

chaseMode("stand")
logout()

Wylogowuje (gra nie pozwala w trakcie walki).

Przykład

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

Odtwarza dźwięk alarmu i miga oknem bota.

Przykład

if (player.cap < 50) alarm()

NPC i sklepy

trade

Okno sklepu NPC albo null, gdy jest zamknięte: npcName, tab, gold i offers (id, name, price, side buy/sell).

Przykład

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

Kupuje w otwartym sklepie, partiami do 100, i czeka, aż każda partia przejdzie. Najpierw otwórz sklep (powiedz hi, potem trade). Wymaga Direct Controls.

Przykład

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

Sprzedaje w otwartym sklepie, jak buy.

Przykład

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

Zamyka okno sklepu.

Przykład

closeTrade()

Moduły bota

onAttack((monster) => …)

Reguła dla modułu Target: pyta twoją funkcję o każdego potwora na ekranie. false = nigdy go nie atakuj, liczba = priorytet (wyższy pierwszy, przed kolejnością z listy), nic = jak zwykle. Target musi być włączony.

Przykład

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

Reguła dla modułu Loot: pyta o każdy przedmiot z otwartego ciała. false = nigdy nie bierz, true = zawsze bierz, nic = decydują ustawienia Loot. Loot musi być włączony.

Przykład

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

Cavebot teraz: status (walking, paused:monster, script…), label (label części trasy, na której jest, np. "Hunt"), index (numer waypointu), waypoint (jego typ), stuck (true po 3 pominięciach z rzędu) i inWaypoint (true, gdy to uruchomienie zaczął waypoint Script). null przy wyłączonym Cavebot.

Przykład

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

Każe Cavebot skoczyć do labela. W uruchomieniu zaczętym przez waypoint Script skacze, gdy skrypt się kończy; w każdym innym skrypcie od razu.

Przykład

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

Włącza moduł, jak jego przełącznik (target, attack, loot, cavebot, healing…). Zostaje włączony, aż coś go wyłączy.

Przykład

turnOn("target")
turnOff(module)

Wyłącza moduł, jak jego przełącznik. W przeciwieństwie do pause() zostaje wyłączony po końcu skryptu.

Przykład

turnOff("target")
pause(module)

Wstrzymuje moduł (cavebot, target, attack, healing, loot, rune-maker, hunt-follow…), dopóki ten skrypt jest włączony. Wyłączenie skryptu go zwalnia.

Przykład

pause("cavebot")
resume(module)

Zwalnia moduł wstrzymany przez pause().

Przykład

resume("cavebot")
isOn(module)

true, gdy przełącznik tego modułu jest włączony.

Przykład

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

Narzędzia skryptu

await wait(ms)

Czeka, a potem przechodzi do następnej linii. Napisz przed nim await.

Przykład

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

Czeka, aż sprawdzenie zwróci true (true) albo skończy się czas (false, domyślnie 5 s). Sprawdzenie działa co 0,1 s.

Przykład

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

Dlaczego ostatnia akcja zwróciła false: mana, cooldown, no-item, chat-busy, one-action-per-tick…

Przykład

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

Pisze linię w konsoli tego skryptu, pod kodem.

Przykład

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

Jak log, oznaczone na żółto.

Przykład

warn("no mana fluids")
storage

Obiekt, który trzyma wartości między uruchomieniami, dopóki nie edytujesz skryptu albo nie przeładujesz gry.

Przykład

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

Zegar gry w milisekundach.

Przykład

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