Files
testin/README.md
T

190 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`.