Бот это второй твой аккаунт, который заходит на сервер в том же окне игры. У него свой мир, свой игрок и свои включённые модули, а переключаешься ты между ним и собой удержанием бинда в модуле Bots. Скрипту боты доступны через объект bots: можно смотреть, что с ними происходит, поднимать и отключать их, а главное - делать им то же самое, что ты делаешь себе.
Сессия зовётся ником, тем же, который виден при переключении. Снимок сессии приходит обычным словарём, поэтому его просто читают по ключам.
for session in bots.list():
kind = "ты" if session["main"] else "бот"
client.msg("%s: %s, %.0f hp" % (kind, session["name"], session.get("health", 0)))
client.msg("играешь за " + bots.current())| Ключ | Что означает |
|---|---|
name | Ник сессии. Им её и зовут во всех методах |
main | Это ты сам, а не бот |
ready | Бот зашёл в мир: им можно играть и командовать |
playing | Именно этой сессией ты играешь прямо сейчас |
health, max_health, food, level | Состояние игрока сессии |
x, y, z | Где он стоит |
server | Адрес сервера из заготовки бота |
Главное в этом объекте - bots.session(ник). Пока эта область открыта, клиент стоит на боте: mc.player это он, world - его мир, а inventory, aura, newton и target работают с ним. Отдельных методов вида "сделай боту то-то" нет и не нужно: пиши обычный код, только внутри области.
x, y, z = mc.player.getX(), mc.player.getY(), mc.player.getZ()
for session in bots.list():
if session["main"] or not session["ready"]:
continue
with bots.session(session["name"]):
mc.player.sendChatMessage("иду к тебе")
newton.goto(x, y, z)Координаты здесь взяты до области намеренно: внутри неё mc.player уже другой. То же самое одним вызовом делает bots.run(ник, функция) - он возвращает то, что вернула функция.
Обработчик события по умолчанию слушает ту сессию, которой ты играешь - так скрипт и работал всегда, пока игрок был один. Чтобы обработчик срабатывал и в тике бота, пока ты играешь собой, добавь session.
@events.tick
def me(e):
# Только та сессия, которой ты играешь.
pass
@events.tick(session="*")
def anyone(e):
# Любая сессия, включая фоновых ботов. Чья именно - bots.current().
if not bots.is_main() and mc.player.getHealth() <= 6:
mc.player.sendChatMessage("/spawn")
@events.tick(session="Miner")
def miner(e):
# Только этот бот, даже если ты сейчас играешь им сам.
passВнутри такого обработчика mc.player и world уже принадлежат той сессии, чей это тик, - область открывать не нужно. Уточнение session понимают все события.
| Событие | Когда приходит |
|---|---|
bot_connected | Бот зашёл в мир. У события есть getName() |
bot_disconnected | Бот пропал: getName() и getReason() |
bot_switched | Ты перешёл в другую сессию: getName() и isMain() |
Скрипт может поднимать ботов сам. Заготовки (ник и адрес сервера) те же, что в менеджере ботов: bots.profiles() показывает их все, включая неподключённых.
bots.connect("Miner") # поднять сохранённую заготовку
bots.connect("Miner", "mc.funtime.su") # завести заготовку, если её нет, и поднять
bots.disconnect("Miner") # отключить, заготовка останется
bots.switch("Miner") # играть этим ботом
bots.main() # вернуться к себе| Метод | Что делает |
|---|---|
bots.list() | Снимки всех сессий, твоя первой |
bots.names() | Только ники |
bots.get(ник) | Один снимок или None |
bots.ready(ник) | Бот зашёл в мир |
bots.current() | Ник сессии, которой играешь |
bots.is_main() | Играешь собой, а не ботом |
bots.installed() | Хотя бы один бот поднят |
bots.profiles() | Заготовки: name, server, connected, ready, status |
bots.session(ник) | Область "делай это ботом" |
bots.run(ник, функция) | То же одним вызовом, возвращает результат функции |
bots.switch(ник) | Перейти в сессию |
bots.main() | Вернуться к себе |
bots.connect(ник[, адрес]) | Поднять бота |
bots.disconnect(ник) | Отключить бота |