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ć
playerTwoja 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")skillsTwoje skille: magic, fist, club, sword, axe, distance i shielding, każdy z level i percent.
Przykład
log(skills.magic && skills.magic.level)
experienceTwoje całe doświadczenie.
Przykład
log(experience)
moneyGold, 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
creaturesWszystko, 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))
targetStworzenie, 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
containersTwoje 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)
equipmentCo masz na sobie: ring, amulet, boots, rightHand, leftHand i ammo (null, gdy puste).
Przykład
if (!equipment.ring) warn("no ring on")hotbarSloty 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)depotDepot, 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
tradeOkno 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
})cavebotCavebot 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")storageObiekt, 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
nowZegar gry w milisekundach.
Przykład
if (now - (storage.last || 0) > 60000) storage.last = now