Skrypty

Skrypty: naucz bota nowych rzeczy w JavaScript

Jak skrypty w Lua z klasycznych botów do Tibii, ale w JavaScript. Napisz kilka linii w zakładce Scripts, a bot uruchamia je co kilka sekund: czyta twoją postać i ekran, rzuca czary, używa przedmiotów, atakuje, chodzi, rozmawia z NPC i kupuje albo decyduje, kogo atakuje Target i co bierze Loot.

Jak to działa

  1. Otwórz bota, wejdź w Scripts i naciśnij + Nowy skrypt albo zacznij od jednego z przykładów poniżej.
  2. Każdy skrypt uruchamia się ponownie co wybrany czas (od 0,1 s). Włącz jego przełącznik i włącz moduł Scripts. Gdy skrypt jest włączony, kod jest tylko do odczytu: wyłącz go, aby edytować. To, co zapisuje log(), widać w konsoli pod kodem (Edytuj).
  3. Skrypty zapisują się w profilu: gdy udostępniasz, wysyłasz albo sprzedajesz profil, skrypty idą razem z nim, a odbiorca może je czytać i edytować. Skrypty, które przychodzą w profilu od kogoś innego, są wyłączone i zablokowane: nie działają w żaden sposób (ani same, ani przez Uruchom teraz, ani z waypointu Script w Cavebot), dopóki nie naciśniesz Zezwól… w module Scripts. Uważaj: złośliwy skrypt może sprzedać albo wyrzucić twoje przedmioty, zaprowadzić postać do potworów, wylogować cię albo mówić za ciebie. Przeczytaj kod (Edytuj) i zezwalaj tylko na skrypty, które rozumiesz, od osób, którym ufasz.
  4. Akcja zwraca true, gdy bot ją wykona, i false, gdy nie może; why() mówi dlaczego. Każdy skrypt wykonuje jedną akcję w grze na tick: między krokami sekwencji wstaw await wait(ms).

Bezpieczne z założenia

Skrypty działają w zamkniętym pudełku w bocie i używają tylko funkcji z tej strony. Nie widzą strony gry, twoich haseł ani internetu, a skrypt, który utknie w pętli, zatrzymuje się sam. Każda akcja idzie tymi samymi drogami co reszta bota.

Twój pierwszy skrypt

Lecz się poniżej 60% życia, włącz magic shield, gdy pojawi się gracz, i zapisuj w konsoli skryptu, co się dzieje:

if (player.hpPercent < 60) cast("exura vita")
if (players().length > 0 && !player.magicShield) cast("utamo vita")
log("HP", player.hp, "monsters", monsters().length)

Gotowe przykłady

Są też w bocie: Scripts → + Z przykładu.

Trening magic level (utevo lux)

uruchamia się co 2 s

if (player.manaPercent >= 95 && !player.inPz && monsters().length === 0) {
  cast("utevo lux")
}

Magic shield, gdy pojawi się PK

uruchamia się co 0.5 s

const pk = players().find((p) => p.skull === "white" || p.skull === "red" || p.skull === "black")
if (pk && !player.magicShield) {
  cast("utamo vita")
}

Lecz przyjaciela przez exura sio

uruchamia się co 0.5 s

const friend = findCreature("Friend Name")
if (friend && friend.hpPercent < 60 && distance(friend) <= 7) {
  cast('exura sio "' + friend.name + '"')
}

Alarm przy małej pojemności

uruchamia się co 5 s

if (player.cap !== null && player.cap < 50) {
  alarm()
  log("Capacity:", player.cap)
}

Atakuj najsłabszego potwora

uruchamia się co 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, gdy w pobliżu nie ma potworów

uruchamia się co 1 s

if (!player.hasted && !player.inPz && monsters().length === 0) {
  cast("utani hur")
}

Wstrzymaj Cavebot, mało mana fluidów

uruchamia się co 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")
}

Rozmowa z NPC (krok po kroku)

uruchamia się co 60 s

say("hi")
await wait(2000)
say("trade")
await wait(1500)
log("Trade window should be open now")

Target: pomiń niektóre, słabe najpierw

uruchamia się co 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: pomiń tanie, bierz wybrane

uruchamia się co 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
})

Idź po zapasy, gdy się kończą

uruchamia się co 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")
}

Kup mana fluidy do 100

uruchamia się co 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()

Sprzedaj loot u NPC

uruchamia się co 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()

Koniec huntu i wyloguj po 2 h

uruchamia się co 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()
}

Alarm przy prywatnej wiadomości

uruchamia się co 1 s

for (const m of messages()) {
  if (m.type === "private") {
    alarm()
    warn("Private message from", m.from)
  }
}

Wstrzymaj Cavebot przy playerach

uruchamia się co 1 s

const near = players().filter((p) => p.distance <= 4 && !p.party)
if (near.length > 0) {
  pause("cavebot")
} else {
  resume("cavebot")
}

Zabójstwa na godzinę

uruchamia się co 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)

Czar obszarowy na 3 potwory obok

uruchamia się co 0.5 s

const SPELL = "exori"
const close = monsters().filter((m) => m.distance <= 1)
if (close.length >= 3 && canCast(SPELL)) {
  cast(SPELL)
}