Загрузить файлы в «/»

This commit is contained in:
2026-08-23 10:24:46 +07:00
parent 5b08a3e117
commit 326f127c5f
4 changed files with 4380 additions and 2 deletions
+188 -2
View File
@@ -1,3 +1,189 @@
# testin # Minecraft бот (mineflayer)
test Бот для 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`.
+50
View File
@@ -0,0 +1,50 @@
// Настройки подключения бота.
// Можно переопределить через переменные окружения, например:
// MC_HOST=play.example.com MC_PORT=25565 MC_USER=MyBot npm start
export const config = {
host: process.env.MC_HOST || '127.0.0.1', // адрес сервера
port: Number(process.env.MC_PORT) || 42623 , // порт сервера
username: process.env.MC_USER || 'Diamond_Miner', // ник бота
// 'offline' — для пиратских/локальных серверов,
// 'microsoft' — для лицензии (потребует вход в браузере при первом запуске)
auth: process.env.MC_AUTH || 'offline',
// версию обычно лучше оставить пустой — mineflayer определит сам.
version: process.env.MC_VERSION || false,
// игрок, которому бот доверяет команды (пусто — слушает всех)
master: process.env.MC_MASTER || '',
// Набор предметов, выдаваемый по команде "kit pvp".
// Формат строки: "<предмет>" или "<предмет> <количество>" (без префикса minecraft:).
// Брони достаточно положить в инвентарь — бот наденет её сам.
pvpKit: [
'diamond_helmet',
'diamond_chestplate',
'diamond_leggings',
'diamond_boots',
'diamond_sword',
'shield',
'bow',
'arrow 64',
'golden_apple 8',
'cooked_beef 64',
'ender_pearl 8',
],
// Namespace серверного storage, куда бот сохраняет инвентари (set from).
kitStorage: 'botpvp:kits',
// Веб-инвентарь (mineflayer-web-inventory): открывается на http://localhost:<порт>
webInventoryPort: Number(process.env.WEB_INV_PORT) || 3000,
// 3D-обзор мира (prismarine-viewer): открывается на http://localhost:<порт>.
// Требует нативный canvas (собран под Node 20) — работает через "npm run start:pano".
viewerPort: Number(process.env.VIEWER_PORT) || 3001,
// Пароль для авто-входа (mineflayer-auto-auth) на серверах с /login (AuthMe).
// Пусто — авто-вход выключен.
authPassword: process.env.MC_PASSWORD || '',
// Куда сохранять панорамы (mineflayer-panorama). Папка должна существовать.
panoramaDir: process.env.PANORAMA_DIR || '.',
};
+4120
View File
File diff suppressed because it is too large Load Diff
+22
View File
@@ -0,0 +1,22 @@
{
"name": "botplay",
"version": "1.0.0",
"description": "Minecraft бот на mineflayer",
"type": "module",
"main": "src/index.js",
"scripts": {
"start": "node src/index.js",
"start:pano": "./.node20/bin/node src/index.js"
},
"dependencies": {
"mineflayer": "^4.20.0",
"mineflayer-auto-auth": "^2.0.0",
"mineflayer-pathfinder": "^2.4.5",
"mineflayer-pvp": "^1.3.2",
"mineflayer-web-inventory": "^1.8.5"
},
"optionalDependencies": {
"mineflayer-panorama": "^0.0.1",
"prismarine-viewer": "^1.33.0"
}
}