# Minecraft бот (mineflayer) Бот для Minecraft на JavaScript. Подключается к серверу, ходит, следует за игроком и отвечает на команды в чате. Есть автопереподключение. ## Запуск ```bash npm install npm start ``` По умолчанию подключается к `localhost:25565` с ником `Bot` в offline-режиме. ## Настройка Меняй параметры в [config.js](config.js) или через переменные окружения: ```bash MC_HOST=play.example.com MC_PORT=25565 MC_USER=MyBot MC_AUTH=offline npm start ``` | Переменная | Значение по умолчанию | Описание | |--------------|-----------------------|-------------------------------------------| | `MC_HOST` | `localhost` | Адрес сервера | | `MC_PORT` | `25565` | Порт | | `MC_USER` | `Bot` | Ник бота | | `MC_AUTH` | `offline` | `offline` или `microsoft` (лицензия) | | `MC_VERSION` | авто | Версия игры (обычно не нужна) | | `MC_MASTER` | пусто | Ник игрока, чьи команды слушать (пусто — всех) | ## Плагины - **mineflayer-web-inventory** — веб-просмотр инвентаря бота в реальном времени. Открывается на `http://localhost:3000` (порт — `webInventoryPort` в config). Команда `веб` печатает ссылку. Стартует после захода на сервер, закрывается при отключении. - **prismarine-viewer** — 3D-обзор мира вокруг бота в браузере (вид от третьего лица). Открывается на `http://localhost:3001` (порт — `viewerPort` в config, `VIEWER_PORT=...`). Команда `обзор` (или `3d`) печатает ссылку. Стартует после захода на сервер и закрывается при отключении (освобождает порт к реконнекту). Server-side рендер атласа текстур тянет нативный `canvas` (как и панорама), поэтому 3D-обзор работает **только через `npm run start:pano`** (Node 20); под Node 26 он мягко отключается. - **mineflayer-auto-auth** — авто-вход на серверах с `/login` (AuthMe). Включается, если задан `authPassword` в config (или `MC_PASSWORD=... npm start`). Иначе выключен. - **Панорама** (`панорама`/`фото`) — своя реализация в [src/panorama.js](src/panorama.js): рендерит 4 стороны света на уровне глаз (fov 90°) и склеивает в **одну ленту 360°** с ровным горизонтом, сохраняет JPG в `panoramaDir`. (Готовая сборка из mineflayer-panorama давала кубическую развёртку 3×2 с пустой гранью и заваленным горизонтом — заменено своим рендером.) Графика тянет нативный `gl`/`canvas`, которые **не работают на Node 26** — они уже собраны под локальный Node 20, поэтому панорама доступна только через `npm run start:pano`. ## Запуск ```bash npm start # обычный запуск (Node 26). Панорама и 3D-обзор отключены. npm run start:pano # запуск под встроенным Node 20 — с панорамой и 3D-обзором мира. ``` ### Почему два режима `mineflayer-panorama` зависит от нативного `gl` (headless-gl), который **не собирается на Node 26** (системный GCC 16 ломает старый код ANGLE, нет prebuild-бинарей). Поэтому в проект положен локальный **Node 20** (папка `.node20/`, в git не коммитится), под которым `gl` и `canvas` уже собраны и работают. - `npm start` — под системным Node 26: бот работает полностью, кроме панорамы и 3D-обзора (они мягко отключаются, бот пишет об этом в консоль). - `npm run start:pano` — под `.node20/bin/node`: панорама и 3D-обзор (prismarine-viewer) тоже работают — у обоих нативный `canvas`, собранный под Node 20. `mineflayer-panorama` вынесен в `optionalDependencies`, поэтому обычный `npm install` на Node 26 не падает, даже если `gl` не соберётся. Если папку `.node20/` удалить — `npm start` продолжит работать (без панорамы). Чтобы снова собрать панораму, нужен Node 18/20 (через `.nvmrc` + fnm/nvm) и `npm install`. ## Консоль управления (TUI) Все команды ниже можно слать **прямо из терминала**, где запущен бот, не заходя в игру. При запуске появляется строка ввода `бот»`: ``` бот» добудь железо 5 бот» атакуй Steve бот» стой ``` - **обычная строка** — команда бота (тот же список, что и в игровом чате: `иди`, `стой`, `помощь` и т.д.). Из консоли бот действует от имени мастера (`MC_MASTER`), поэтому «иди»/«за мной»/«kit pvp» работают; если мастер не задан — берётся ближайший игрок. - **строка с `/`** — уходит на сервер как есть: `/tp`, `/gamemode creative`, `/say привет`. - **`выход`** или **Ctrl-C** — закрыть бота. Ответы бота и весь чат печатаются над строкой ввода, не сбивая набор. Консоль переживает переподключения. При запуске не в терминале (вывод в файл/пайп) TUI не включается — бот работает как раньше. ## Команды в чате Напиши в игровом чате (или в консоли, см. выше): - `помощь` — список команд - `иди` — бот идёт к тебе - `за мной` — следует за тобой - `стой` — остановиться - `прыгай` — подпрыгнуть - `координаты` — назвать свои координаты - `инвентарь` — показать содержимое инвентаря - `выкинуть <предмет> [N]` — выбросить предмет из инвентаря. Без `N` выкидывает все этого вида. Имя — по minecraft-id (точное или частичное совпадение), напр. `выкинуть cobblestone 32`, `выкинуть rotten_flesh` - `сортировка` (или `sort`) — слить неполные стопки и отсортировать рюкзак по имени. - `автосорт` — вкл/выкл авто-сортировку (по умолчанию **включено**): бот сам сортирует инвентарь через пару секунд после подбора предметов (но не во время боя, другой задачи или когда открыт сундук/печь). Сортируется только рюкзак (слоты 9–35), хотбар/броня не трогаются. ### Добыча и ферма - `добудь еды [N]` — бот охотится на ближайших животных (корова, свинья, курица, овца, кролик) и собирает мясо. `N` — сколько животных (по умолчанию 3, максимум 64). Пример: `добудь еды 6` - `добудь <руду> [N]` — находит, доходит и копает указанную руду нужной киркой. `N` — сколько блоков (по умолчанию 5, максимум 64). Пример: `добудь алмаз 10` Поддерживает: `уголь`, `железо`, `медь`, `золото`, `редстоун`, `лазурит`, `алмаз`, `изумруд`, `кварц` (есть и английские названия). Учитывает deepslate-варианты. - `следи` (за огородом) — фоновый режим: бот ходит по грядкам, собирает спелые культуры (пшеница, морковь, картофель, свёкла) и пересаживает семена обратно. - `приготовь` (или `пожарь`/`cook`) — бот находит ближайшую печь/коптильню (или ставит свою, если печь есть в инвентаре), кладёт всё сырое мясо и топливо, ждёт прожарки и забирает готовое. Топливо выбирает само (уголь/уголёк → дерево → прочее). - `автоеда` — вкл/выкл авто-питание (по умолчанию **включено**): бот следит за сытостью. Приоритет: сначала **готовая** еда → если её нет, а есть сырьё — **жарит в печи и ест** → если еды совсем нет и он сильно голоден, идёт на охоту, жарит добычу и ест. Сырое мясо съедает только как фолбэк (если жарить негде/нечем). Не отвлекается на еду во время боя; не ест ценное (золотые яблоки/морковь) и вредное (гнильё, ядовитый картофель и т.п.). - `броня` — надеть лучшую броню из инвентаря прямо сейчас. - `автоброня` — вкл/выкл авто-броню (по умолчанию **включено**): бот сам надевает лучшую по материалу броню (незерит → алмаз → железо → кольчуга/панцирь → золото → кожа) при спавне и каждый раз, когда что-то поднимает. Не снимает уже надетую лучшую. Прервать любую из этих задач: `стой`. ### Бой (PvP/PvE) - `атакуй <ник>` — атаковать игрока по нику - `мобы` — атаковать ближайшего враждебного моба - `охрана` — вкл/выкл режим охраны (бот сам бьёт враждебных мобов рядом) - `не` — прекратить бой и выключить охрану - `стой` — тоже останавливает бой Перед атакой бот сам надевает лучшее оружие (меч приоритетнее топора). При нападении поблизости бот огрызается и даёт сдачи. - `кристалл <ник> [N]` (или `crystal`) — **Crystal PvP**: бот подходит к игроку, ставит энд-кристалл на обсидиан/бедрок рядом с целью и тут же взрывает его, повторяя до `N` раз (по умолчанию 10). Нужны `end_crystal` в инвентаре (и `obsidian`, если рядом нет основы). В левую руку сам берёт тотем бессмертия, если есть. Прервать — `стой`. - `булава <ник> [N]` (или `mace`/`элитра`/`мейс`) — **Elytra-Mace** (техника 1.21): бот надевает элитры, взлетает на фейерверках над целью и пикирует с булавой. **На подлёте (≈8 блоков до цели) бот сбрасывает элитры и надевает нагрудник** — срывается в свободное падение и бьёт уже в броне, иначе элитры в полёте срезают смэш-урон булавы. Делает `N` заходов (по умолчанию 1, максимум 16). Нужны в инвентаре: `elytra`, `mace`, `firework_rocket` (взлёт/разгон) и **металлический нагрудник** (`*_chestplate` — для свапа и полного урона; без него бьёт прямо в элитрах ослабленно). Полёт считается локальной физикой, без `pathfinder`. Прервать — `стой`. ### Kit PvP (дуэль) — нужны права OP у бота - `kit pvp` — сохраняет инвентари игрока и бота, очищает их и выдаёт обоим PvP-кит (бот сам надевает броню и берёт меч/щит). Кит настраивается в [config.js](config.js) → `pvpKit`. - `kit end` — возвращает сохранённые инвентари обоим. Как это работает: бот не передаёт NBT-инвентаря через чат (там лимит 256 символов), а копирует его **на стороне сервера** в data-storage командой `/data modify storage … set from entity …`, и возвращает обратно тем же способом. Поэтому фича требует OP и сервер с поддержкой data-storage (Minecraft 1.16+). (Английские варианты: `come`, `follow`, `stop`, `jump`, `pos`, `inv`, `attack`, `mobs`, `guard`, `ceasefire`, `kit pvp`, `kit end`.) ## Как проверить без своего сервера Поставь локальный сервер (например [PaperMC](https://papermc.io/)) с `online-mode=false` в `server.properties`, запусти его, затем `npm start`.