From 2adcd0ac3f1a43ad986982b4e89505704a114590 Mon Sep 17 00:00:00 2001 From: FurnyGo <68079109+FurnyGo@users.noreply.github.com> Date: Fri, 1 Sep 2023 00:48:24 +0400 Subject: [PATCH 1/9] Updating existing russian docs --- docs/ru/FAQ_RU.md | 124 ++- docs/ru/README_RU.md | 191 ++-- docs/ru/api_ru.md | 1920 ++++++++++++++++++++++++------------ docs/ru/unstable_api_ru.md | 6 +- 4 files changed, 1469 insertions(+), 772 deletions(-) diff --git a/docs/ru/FAQ_RU.md b/docs/ru/FAQ_RU.md index dae0818f0..6da593e96 100644 --- a/docs/ru/FAQ_RU.md +++ b/docs/ru/FAQ_RU.md @@ -2,9 +2,17 @@ Это документ с часто задаваемыми вопросами, предназначен для помощи людям в самых распространенных вещах. +### Выдаёт ошибку при попытке войти в систему через аккаунт Microsoft. + +Убедитесь, что адрес электронной почты, который вы ввели в поле username в createBot, можно использовать для входа на `minecraft.net` используя кнопку «Войти с помощью Microsoft». +Убедитесь, что у вас прописана опция `auth: 'microsoft'` в настройках вашего createBot. + +Когда вы получите сообщение об ошибке, в котором говорится что-то о недопустимых учетных данных или «Владеет ли эта учетная запись Minecraft?», попробуйте удалить поле пароля в параметрах `createBot` и повторите попытку. + ### Как скрыть ошибки? -Используйте `hideErrors: true` в параметрах createBot. Вы также можете добавить эти слушатели: +Используйте `hideErrors: true` в параметрах createBot. +Вы также можете добавить эти слушатели: ```js client.on('error', () => {}) client.on('end', () => {}) @@ -13,12 +21,48 @@ client.on('end', () => {}) ### Я не получаю событие чата на сервере, как я могу это решить? Сервера Spigot, в частности некоторые плагины, используют разные форматы чата, вам необходимо проанализировать его с помощью регулярного выражения/парсера. -Посмотрите и измените скрипт [chatAddPattern.js](https://github.com/PrismarineJS/mineflayer/blob/master/examples/chatAddPattern.js), чтобы он работал для вашего плагина чата, -также прочтите http://prismarinejs.github.io/mineflayer/#/tutorial?id=custom-chat. +Посмотрите и измените скрипт [chat_parsing.js](https://github.com/PrismarineJS/mineflayer/blob/master/examples/chat_parsing.js), чтобы он работал для вашего плагина на чат, также прочтите http://prismarinejs.github.io/mineflayer/#/tutorial?id=custom-chat + +### Как я могу собрать информацию из плагина в чате? -### Как я могу отправлять команды серверу? +Большинство майнкрафт серверов поддерживают плагины, и многие из этих плагинов выводят что-то в чат, когда что-то происходит. Если это всего лишь одно сообщение, лучше использовать решение, описанное выше, но когда эти сообщения разбиты на множество небольших сообщений, другим вариантом является использование события `"messagestr"`, поскольку оно позволяет легко анализировать многострочные сообщения. -Используйте метод `bot.chat()`. +**Пример:** + +Сообщение в чате выглядит следующим образом: +``` +(!) U9G выйграл в /jackpot и получил +$26,418,402,450! Он купил 2,350,000 (76.32%) билета(ов) из +3,079,185 проданных билета(ов)! +``` +```js +const regex = { + first: /\(!\) (.+) выйграл в \/jackpot и получил +/, + second: /\$(.+)! Он купил (.+) \((.+)%\) билета\(ов\) из /, + third: /(.+) проданных билета\(ов\)!/ +} + +let jackpot = {} +bot.on('messagestr', msg => { + if (regex.first.test(msg)) { + const username = msg.match(regex.first)[1] + jackpot.username = username + } else if (regex.second.test(msg)) { + const [, moneyWon, boughtTickets, winPercent] = msg.match(regex.second) + jackpot.moneyWon = parseInt(moneyWon.replace(/,/g, '')) + jackpot.boughtTickets = parseInt(boughtTickets.replace(/,/g, '')) + jackpot.winPercent = parseFloat(winPercent) + } else if (regex.third.test(msg)) { + const totalTickets = msg.match(regex.third)[1] + jackpot.totalTickets = parseInt(totalTickets.replace(/,/g, '')) + onDone(jackpot) + jackpot = {} + } +}) +``` +### Как я могу отправлять команды? + +Используйте `bot.chat()`. Пример: @@ -32,7 +76,7 @@ bot.chat('/give @p diamond') ### Как заставить бота выбросить все вещи их инвентаря? -`bot.inventory.items()` возвращает массив элементов бота. Вы можете использовать рекурсивную функцию, чтобы перебрать их и выбросить каждый элемент используя `bot.toss()`. Нажмите [здесь](https://gist.github.com/dada513/3d88f772be4224b40f9e5d1787bd63e9), чтобы посмотреть пример +`bot.inventory.items()` возвращает массив предметов в инвентаре бота. Вы можете использовать рекурсивную функцию, чтобы перебрать их и выбросить каждый элемент используя `bot.toss()`. Нажмите [здесь](https://gist.github.com/dada513/3d88f772be4224b40f9e5d1787bd63e9), чтобы посмотреть пример ### Как проверить отправленные/полученные пакеты? @@ -40,21 +84,20 @@ bot.chat('/give @p diamond') ### Я хочу избежать отключения бота от сервера даже в случае задержки сервера, как мне этого добиться? -Один из способов - увеличить параметр [checkTimeoutInterval](https://github.com/PrismarineJS/node-minecraft-protocol/blob/master/docs/API.md#mccreateclientoptions) (передаваемый в createBot) к более высокому значению (Например `300*1000`, что составляет 5 минут. Вместо значения по умолчанию в 30 сек.). Если вы все еще сталкиваетесь с данной проблемой, вы можете автоматически переподключиться, используя что-то вроде этого примера https://github.com/PrismarineJS/mineflayer/blob/master/examples/reconnector.js +Один из способов - увеличить параметр [checkTimeoutInterval](https://github.com/PrismarineJS/node-minecraft-protocol/blob/master/docs/API.md#mccreateclientoptions) (передаваемый в createBot) к более высокому значению (Например `300*1000`, что составляет 5 минут вместо обычных 30 сек.). Если вы всё ещё сталкиваетесь с данной проблемой, вы можете автоматически переподключиться, используя что-то вроде этого примера https://github.com/PrismarineJS/mineflayer/blob/master/examples/reconnector.js ### Как получить описание/текст предмета? Вы можете использовать свойство `item.nbt`. Также рекомендуем использовать библиотеку `prismarine-nbt`. Метод `nbt.simplify()` может быть полезен. -Пример: - +**Пример:** ```js function getLore (item) { let message = '' if (item.nbt == null) return message const nbt = require('prismarine-nbt') - const ChatMessage = require('prismarine-chat')(bot.registry) + const ChatMessage = require('prismarine-chat')(bot.version) const data = nbt.simplify(item.nbt) const display = data.display @@ -62,12 +105,9 @@ function getLore (item) { const lore = display.Lore if (lore == null) return message - for (const line of lore) { - for (const group of JSON.parse(line)) { - message += new ChatMessage(group).toString() - message += '\n' - } + message += new ChatMessage(line).toString() + message += '\n' } return message @@ -76,10 +116,60 @@ function getLore (item) { ### Как я могу отправить сообщение из консоли на сервер? -Вы можете использовать библиотеку, такую как `repl`, чтобы прочитать ввод консоли и использовать `bot.chat` для его отправки. Вы можете найти пример [здесь](https://github.com/PrismarineJS/mineflayer/blob/master/examples/repl.js). +Вы можете использовать библиотеку, такую как `repl`, чтобы прочитать ввод консоли и использовать `bot.chat()` для его отправки. Вы можете найти пример [здесь](https://github.com/PrismarineJS/mineflayer/blob/master/examples/repl.js). ### Как я могу использовать другой плагин в качестве зависимости при создании своего плагина? -В функции `inject()` вашего плагина вы можете безопасно вызвать `bot.loadPlugin(другой плагин)`, чтобы убедиться, что плагин загружен. Если плагин уже был загружен ранее, ничего не произойдет. +В функции `inject()` вашего плагина вы можете безопасно вызвать `bot.loadPlugin(anotherPlugin)`, чтобы убедиться, что плагин загружен. Если плагин уже был загружен ранее, ничего не произойдет. Обратите внимание, что порядок в котором загружаются плагины является динамическим, поэтому вы никогда не должны вызывать другой плагин в своей функции `inject()`. + +### Как я могу использовать прокси socks5? + +В объекте с настройками для `mineflayer.createBot(options)` удалите опцию `host`, объявите переменные `PROXY_IP, PROXY_PORT, PROXY_USERNAME, PROXY_PASSWORD, MC_SERVER_ADDRESS, MC_SERVER_PORT`, затем добавьте это в свой объект с настройками: +```js +connect: (client) => { + socks.createConnection({ + proxy: { + host: PROXY_IP, + port: PROXY_PORT, + type: 5, + userId: PROXY_USERNAME, + password: PROXY_PASSWORD + }, + command: 'connect', + destination: { + host: MC_SERVER_ADDRESS, + port: MC_SERVER_PORT + } + }, (err, info) => { + if (err) { + console.log(err) + return + } + client.setSocket(info.socket) + client.emit('connect') + }) + } + ``` + `socks` объявляется с помощью `const socks = require('socks').SocksClient` и использует [эту](https://www.npmjs.com/package/socks) библиотеку. + Некоторые серверы могут отклонить соединение. Если это произойдет, попробуйте добавить `fakeHost: MC_SERVER_ADDRESS` в настройки. + +# Частые ошибки + +### `UnhandledPromiseRejectionWarning: Error: Failed to read asymmetric key` + +Эта ошибка означает, что вы ввели неправильную версию сервера, либо mineflayer обнаруживает её неправильно. + +### `TypeError: Cannot read property '?' of undefined` + +Возможно, вы пытаетесь использовать что-то в объекте бота, чего еще нет, попробуйте вызвать инструкцию после события `spawn` + +### `SyntaxError: Unexpected token '?'` + +Обновите node.js + +### Бот не может ломать/ставить блоки или открывать сундуки + +Убедитесь, что защита спавна не мешает боту + diff --git a/docs/ru/README_RU.md b/docs/ru/README_RU.md index 9f59cd8c5..1dc7938c2 100644 --- a/docs/ru/README_RU.md +++ b/docs/ru/README_RU.md @@ -1,34 +1,33 @@ # Mineflayer -[![Версия NPM](https://badge.fury.io/js/mineflayer.svg)](http://badge.fury.io/js/mineflayer) -[![Последние изменения](https://github.com/PrismarineJS/mineflayer/workflows/CI/badge.svg)](https://github.com/PrismarineJS/mineflayer/actions?query=workflow%3A%22CI%22) -[![Discord](https://img.shields.io/badge/chat-on%20discord-brightgreen.svg)](https://discord.gg/GsEFRM8) -[![Gitter](https://img.shields.io/badge/chat-on%20gitter-brightgreen.svg)](https://gitter.im/PrismarineJS/general) -[![Irc](https://img.shields.io/badge/chat-on%20irc-brightgreen.svg)](https://irc.gitter.im/) -[![Issue Hunt](https://github.com/BoostIO/issuehunt-materials/blob/master/v1/issuehunt-shield-v1.svg)](https://issuehunt.io/r/PrismarineJS/mineflayer) +[![Версия NPM](https://img.shields.io/npm/v/mineflayer.svg?color=success&label=npm%20package&logo=npm)](https://www.npmjs.com/package/mineflayer) +[![Последние изменения](https://img.shields.io/github/actions/workflow/status/PrismarineJS/mineflayer/ci.yml.svg?label=CI&logo=github&logoColor=lightgrey)](https://github.com/PrismarineJS/mineflayer/actions?query=workflow%3A%22CI%22) +[![Попробуйте на gitpod](https://img.shields.io/static/v1.svg?label=try&message=on%20gitpod&color=brightgreen&logo=gitpod)](https://gitpod.io/#https://github.com/PrismarineJS/mineflayer) +[![Открыть в Colab](https://img.shields.io/static/v1.svg?label=open&message=on%20colab&color=blue&logo=google-colab)](https://colab.research.google.com/github/PrismarineJS/mineflayer/blob/master/docs/mineflayer.ipynb) +[![Спонсоры GitHub](https://img.shields.io/github/sponsors/PrismarineJS)](https://github.com/sponsors/PrismarineJS) -[![Попробуйте на gitpod](https://img.shields.io/badge/try-on%20gitpod-brightgreen.svg)](https://gitpod.io/#https://github.com/PrismarineJS/mineflayer) +[![Официальный дискорд](https://img.shields.io/static/v1.svg?label=OFFICIAL&message=DISCORD&color=blue&logo=discord&style=for-the-badge)](https://discord.gg/GsEFRM8) | EN [English](../README.md) | RU [русский](../ru/README_RU.md) | ES [Español](../es/README_ES.md) | FR [Français](../fr/README_FR.md) | TR [Türkçe](../tr/README_TR.md) | ZH [中文](../zh/README_ZH_CN.md) | |-------------------------|----------------------------|----------------------------|----------------------------|----------------------------|----------------------------| -Создавайте ботов Minecraft с помощью мощного, стабильного и высокоуровневого JavaScript [API](api.md), также можете использовать Python +Создавайте ботов Minecraft с помощью мощного, стабильного и высокоуровневого JavaScript [API](api_ru.md), также можете использовать Python. -Первый раз используете Node.js? Начните с [этого](tutorial.md). Любите гонять змею? Зацените [Python примеры](https://github.com/PrismarineJS/mineflayer/tree/master/examples/python) и попробуйте колабнуться в [Mineflayer Google коллабе](https://colab.research.google.com/github/PrismarineJS/mineflayer/blob/master/docs/mineflayer.ipynb). +Первый раз используете Node.js? Начните с [этого](tutorial_ru.md). Знаете Python? Посмотрите [примеры на Python](https://github.com/PrismarineJS/mineflayer/tree/master/examples/python) и попробуйте [Mineflayer в Google Colab](https://colab.research.google.com/github/PrismarineJS/mineflayer/blob/master/docs/mineflayer.ipynb). ## Возможности - * Поддержка 1.8, 1.9, 1.10, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19 и 1.20 - * Поддержка энтити и их отслеживание - * Вы можете полностью взаимодействовать с миром. Миллисекунды на поиск любого блока - * Физика и управление - * Атака энтити и использование транспортных средств - * Взаимодействие с инвентарем - * Взаимодействие с крафтингом, сундуками, раздатчиками и чаровальными столами - * Вы можете копать и строить - * Мелкие функции, такие как отслеживание здоровья и прочие - * Активация блоков и использование предметов - * Взаимодействие с чатом + * Поддержка 1.8, 1.9, 1.10, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19 и 1.20. + * Поддержка энтити и их отслеживание. + * Вы можете полностью взаимодействовать с миром. Миллисекунды на поиск любого блока. + * Физика и управление. + * Атака энтити и использование транспортных средств. + * Взаимодействие с инвентарем. + * Взаимодействие с крафтом, сундуками, раздатчиками и чаровальными столами. + * Вы можете копать и строить. + * Мелкие функции, такие как отслеживание здоровья и погоды. + * Активация блоков и использование предметов. + * Взаимодействие с чатом. ### Наши цели @@ -36,24 +35,26 @@ ## Установка -Сначало установите nodejs >= 14 из [nodejs.org](https://nodejs.org/) затем выполните: +Сначала установите Node.js >= 14 из [nodejs.org](https://nodejs.org/), затем выполните: `npm install mineflayer` +Чтобы обновить пакет mineflayer (или любой Node.js) и его зависимости, используйте `npm update --depth 9999` + ## Документация | Ссылка | Описание | | -------------------------------------------------------------------------- | ------------------------------------- | | [Обучение](tutorial.md) | Знакомство с Node.js и Mineflayer | -| [FAQ](FAQ_RU.md) | Появился вопрос? Найдите ответ здесь. | -| [Нестабильное API](unstable_api_ru.md) | Нестабильные методы API | +| [ЧАВО](FAQ_RU.md) | Появился вопрос? Найдите ответ здесь. | +| **[api_ru.md](api_ru.md)**
[unstable_api.md](unstable_api_ru.md) | Полное описание API | | [Обновления](history.md) | Список изменений в обновлениях | | [Примеры](https://github.com/PrismarineJS/mineflayer/tree/master/examples) | Примеры использования Mineflayer | ## Сделать вклад в развитие Mineflayer -Прочитайте [CONTRIBUTING.md](CONTRIBUTING.md) и [prismarine-contribute](https://github.com/PrismarineJS/prismarine-contribute) +Прочитайте [CONTRIBUTING_RU.md](CONTRIBUTING_RU.md) и [prismarine-contribute](https://github.com/PrismarineJS/prismarine-contribute) ## Использование @@ -61,7 +62,7 @@ Обучающее видео, объясняющее базовый процесс настройки бота, можно найти [здесь](https://www.youtube.com/watch?v=ltWosy4Z0Kw) -Если Вы хотите узнать больше, посмотрите другие видео [здесь](https://www.youtube.com/playlist?list=PLh_alXmxHmzGy3FKbo95AkPp5D8849PEV), а также посмотреть их [исходный код](https://github.com/TheDudeFromCI/Mineflayer-Youtube-Tutorials) +Если Вы хотите узнать больше, посмотрите другие видео [здесь](https://www.youtube.com/playlist?list=PLh_alXmxHmzGy3FKbo95AkPp5D8849PEV), а также посмотреть [исходный код ботов](https://github.com/TheDudeFromCI/Mineflayer-Youtube-Tutorials) [tutorial 1](https://www.youtube.com/watch?v=ltWosy4Z0Kw) [tutorial 2](https://www.youtube.com/watch?v=UWGSf08wQSc) @@ -70,40 +71,40 @@ **Перед запуском** -Если версия не указана она будет выбрана автоматически исходя из поддерживаемых сервером версиях. -Например: `version: "1.8"`. +Если версия не указана, она будет выбрана автоматически, исходя из поддерживаемых сервером версии. +Без указания `auth` будет выбран вход через mojang. ### Простой пример ```js const mineflayer = require('mineflayer') const bot = mineflayer.createBot({ - host: 'localhost', // optional - port: 25565, // optional - username: 'email@example.com', // E-mail и пароль используются для - password: '12345678', // лицензионных серверов - version: false, // При установленном значении false версия будет выбрана автоматически, используйте пример выше чтобы выбрать нужную версию - auth: 'mojang' // Необязательное поле. По умолчанию используется mojang, если используется учетная запись microsoft, установите значение «microsoft» + host: 'localhost', // айпи майнкрафт сервера + username: 'email@example.com', // ник бота + auth: 'microsoft' // для пираток нужно заменить на 'offline' + // port: 25565, // прописывайте, если порт не 25565 + // version: false, // прописывайте, если нужна конкретная версия или снапшот (например: "1.8.9" или "1.16.5"), иначе версия будет выбрана автоматически + // password: '12345678' // прописывайте, если хотите использовать аутентификацию через пароль (может быть ненадёжно) }) -bot.on('chat', function (username, message) { +bot.on('chat', (username, message) => { if (username === bot.username) return bot.chat(message) }) -// Прослушивание ошибок и причин отключения от сервера: -bot.on('kicked', (reason, loggedIn) => console.log(reason, loggedIn)) -bot.on('error', err => console.log(err)) +// Логирование ошибок и причин отключения от сервера: +bot.on('kicked', console.log) +bot.on('error', console.log) ``` ### Смотрите, что делает бот -Спасибо репозиторию [prismarine-viewer](https://github.com/PrismarineJS/prismarine-viewer), с помощью которого можно увидеть от лица бота, что на данный момент происходит на сервере. -Установите [prismarine-viewer](https://github.com/PrismarineJS/prismarine-viewer) c помощью `npm install prismarine-viewer` и добавьте это в Ваш код: +Спасибо репозиторию [prismarine-viewer](https://github.com/PrismarineJS/prismarine-viewer), с помощью которого можно через браузер увидеть, что делает бот. +Установите его через `npm install prismarine-viewer` и добавьте это в код: ```js -const mineflayerViewer = require('prismarine-viewer').mineflayer +const { mineflayer: mineflayerViewer } = require('prismarine-viewer') bot.once('spawn', () => { - mineflayerViewer(bot, { port: 3007, firstPerson: true }) + mineflayerViewer(bot, { port: 3007, firstPerson: true }) // port - это порт сервера майнкрафт, если значение firstPerson: false, вы получите вид с высоты птичьего полета }) ``` После запуска, вы в прямом эфире сможете наблюдать за происходящим: @@ -112,22 +113,25 @@ bot.once('spawn', () => { #### Больше примеров -| Пример | Описание | -| ------------------------------------------------------------------------------------------ | --------------------------------------------------------------- | -| [viewer](https://github.com/PrismarineJS/mineflayer/tree/master/examples/viewer) | Отобразить через браузер вид от лица бота | -| [pathfinder](https://github.com/Karang/mineflayer-pathfinder/blob/master/examples/test.js) | Передвижение бота по координатам и не только | -| [chest](https://github.com/PrismarineJS/mineflayer/blob/master/examples/chest.js) | Использование сундуков, печек, раздатчиков и чаровальных столов | -| [digger](https://github.com/PrismarineJS/mineflayer/blob/master/examples/digger.js) | Пример для создания бота-шахтёра | -| [discord](https://github.com/PrismarineJS/mineflayer/blob/master/examples/discord.js) | Создайте Discord бота | -| [jumper](https://github.com/PrismarineJS/mineflayer/blob/master/examples/jumper.js) | Научите бота передвигатся, прыгать, использовать средства пережвижения, а также атаковать | +| Пример | Описание | +| ----------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| [viewer](https://github.com/PrismarineJS/mineflayer/tree/master/examples/viewer) | Отобразить через браузер вид от лица бота | +| [pathfinder](https://github.com/PrismarineJS/mineflayer/tree/master/examples/pathfinder) | Передвижение бота по координатам и не только | +| [chest](https://github.com/PrismarineJS/mineflayer/blob/master/examples/chest.js) | Использование сундуков, печек, раздатчиков и чаровальных столов | +| [digger](https://github.com/PrismarineJS/mineflayer/blob/master/examples/digger.js) | Пример для создания бота-шахтёра | +| [discord](https://github.com/PrismarineJS/mineflayer/blob/master/examples/discord.js) | Создайте Discord бота | +| [jumper](https://github.com/PrismarineJS/mineflayer/blob/master/examples/jumper.js) | Научите бота передвигатся, прыгать, использовать средства пережвижения, а также атаковать | +| [ansi](https://github.com/PrismarineJS/mineflayer/blob/master/examples/ansi.js) | Отобразите чат вашего бота со всеми цветами, отображаемыми в вашем терминале | +| [guard](https://github.com/PrismarineJS/mineflayer/blob/master/examples/guard.js) | Заставьте бота охранять определенную область от мобов | +| [multiple-from-file](https://github.com/PrismarineJS/mineflayer/blob/master/examples/multiple_from_file.js) | Добавьте текстовый файл с аккаунтами для запуска нескольких ботов | -И много других примеров в данной [папке](https://github.com/PrismarineJS/mineflayer/tree/master/examples) +Множество других примеров в [данной папке](https://github.com/PrismarineJS/mineflayer/tree/master/examples) ### Модули Большая часть разработки происходит внутри небольших пакетов npm, которые используются mineflayer. -Модули, из которых состоит Mineflayer +Модули, из которых состоит Mineflayer: | Модуль | Описание | | ----------------------------------------------------------------------------- |---------------------------------------------------------------------------------------- | @@ -137,7 +141,7 @@ bot.once('spawn', () => { | [prismarine-chunk](https://github.com/PrismarineJS/prismarine-chunk) | Хранение чанков Minecraft | | [node-vec3](https://github.com/PrismarineJS/node-vec3) | Векторная обработка координат | | [prismarine-block](https://github.com/PrismarineJS/prismarine-block) | Взаимодействие с блоками и их данными | -| [prismarine-chat](https://github.com/PrismarineJS/prismarine-chat) | Парсер чата Minecraft (вырезана из Mineflayer) | +| [prismarine-chat](https://github.com/PrismarineJS/prismarine-chat) | Парсер чата Minecraft (вырезано из Mineflayer) | | [node-yggdrasil](https://github.com/PrismarineJS/node-yggdrasil) | Библиотека для взаимодействия с системой аутентификации Mojang, известная как Yggdrasil | | [prismarine-world](https://github.com/PrismarineJS/prismarine-world) | Реализация миров для prismarine | | [prismarine-windows](https://github.com/PrismarineJS/prismarine-windows) | Взаимодействие с GUI | @@ -156,7 +160,7 @@ bot.once('spawn', () => { DEBUG="minecraft-protocol" node [...] ``` -На OC Windows : +В Windows: ``` set DEBUG=minecraft-protocol node your_script.js @@ -164,74 +168,69 @@ node your_script.js ## Cторонние плагины: -Mineflayer поддерживает сторонние плагины. С помощью них Вы можете -добавить новые методы API: +Mineflayer поддерживает сторонние плагины. Любой желающий может создать плагин, который добавляет API ещё более высокого уровня поверх Mineflayer. + +Наиболее обновлённые и полезные: - * [pathfinder](https://github.com/Karang/mineflayer-pathfinder) - Поиск пути с помощью координат - * [prismarine-viewer](https://github.com/PrismarineJS/prismarine-viewer) - Простой web клиент для отслеживания активного чанка - * [web-inventory](https://github.com/ImHarvol/mineflayer-web-inventory) - Веб клиент для взаимодействия с инвентарем - * [statemachine](https://github.com/TheDudeFromCI/mineflayer-statemachine) - API с более сложной структурой для ботов - * [Armor Manager](https://github.com/G07cha/MineflayerArmorManager) - Автоматическое взаимодействие с экипировкой - * [Collect Block](https://github.com/TheDudeFromCI/mineflayer-collectblock) - Простой способ для подбора блоков + * [pathfinder](https://github.com/Karang/mineflayer-pathfinder) - Продвинутый A* поиск пути с множеством настраиваемых функций + * [prismarine-viewer](https://github.com/PrismarineJS/prismarine-viewer) - Простой web клиент для просмотра чанков + * [web-inventory](https://github.com/ImHarvol/mineflayer-web-inventory) - Веб клиент для взаимодействия с инвентарём + * [statemachine](https://github.com/PrismarineJS/mineflayer-statemachine) - API для более сложного поведения бота + * [Armor Manager](https://github.com/G07cha/MineflayerArmorManager) - Автоматическое взаимодействие с бронёй * [Dashboard](https://github.com/wvffle/mineflayer-dashboard) - Панель управления для бота + * [PVP](https://github.com/PrismarineJS/mineflayer-pvp) - Простой API для базовых PVP и PVE сражений + * [Auto Eat](https://github.com/link-discord/mineflayer-auto-eat) - Автоматическое поедание пищи + * [Auto Crystal](https://github.com/link-discord/mineflayer-autocrystal) - Автоматическое размещение и взрыв кристалов края + * [Tool](https://github.com/TheDudeFromCI/mineflayer-tool) - Утилита для автоматического выбора инструмента/оружия с высокоуровневым API + * [Hawkeye](https://github.com/sefirosweb/minecraftHawkEye) - Утилита для использования автоматического прицеливания из луков + * [GUI](https://github.com/firejoust/mineflayer-GUI) - Взаимодействие с окнами по типу инвентаря, используя async/await + * [Projectile](https://github.com/firejoust/mineflayer-projectile) - Получение необходимого угола запуска снарядов + * [Movement](https://github.com/firejoust/mineflayer-movement) - Плавные и реалистичные движения игрока, лучше всего подходящие для PvP + * [Collect Block](https://github.com/PrismarineJS/mineflayer-collectblock) - API для простого способа для подбора блоков - Также Вы можете изучить: +Вы также можете изучить: - * [navigate](https://github.com/andrewrk/mineflayer-navigate/) - Управление, передвижение бота [YouTube Demo](https://www.youtube.com/watch?v=O6lQdmRz8eE) * [radar](https://github.com/andrewrk/mineflayer-radar/) - Веб радар, созданный с помощью - canvas и socket.io. [YouTube Demo](https://www.youtube.com/watch?v=FjDmAfcVulQ) - * [blockfinder](https://github.com/Darthfett/mineflayer-blockFinder) - Поиск блоков в мире - * [scaffold](https://github.com/andrewrk/mineflayer-scaffold) - Добратся до цели минуя препятствия [YouTube Demo](http://youtu.be/jkg6psMUSE0) * [auto-auth](https://github.com/G07cha/MineflayerAutoAuth) - Аутентификация на пиратских серверах * [Bloodhound](https://github.com/Nixes/mineflayer-bloodhound) - Отслеживание получаемого урона в пределах видимости - * [tps](https://github.com/SiebeDW/mineflayer-tps) - Получить TPS сервера + * [tps](https://github.com/SiebeDW/mineflayer-tps) - Получение TPS сервера + * [panorama](https://github.com/IceTank/mineflayer-panorama) - Создание панорамных снимков вашего мира + * [player-death-event](https://github.com/tuanzisama/mineflayer-death-event) - Создание события смерти игрока в Mineflayer. ## Проекты, созданные с помощью Mineflayer + * [Voyager](https://github.com/MineDojo/Voyager) - Открытый агент с большими языковыми моделями * [rom1504/rbot](https://github.com/rom1504/rbot) - [YouTube - постройка спиральной лестницы](https://www.youtube.com/watch?v=UM1ZV5200S0) - [YouTube - дублирование постройки](https://www.youtube.com/watch?v=0cQxg9uDnzA) * [Darthfett/Helperbot](https://github.com/Darthfett/Helperbot) - * [vogonistic/voxel](https://github.com/vogonistic/mineflayer-voxel) - визуализация от первого лица бота, - созданная с помощью voxel.js - * [JonnyD/Skynet](https://github.com/JonnyD/Skynet) - отслеживание действий с собственным API - * [MinecraftChat](https://github.com/rom1504/MinecraftChat) (последняя версия с открытым исходным кодом, созданная с помощью AlexKvazos) - Веб чат сервера Minecraft + * [vogonistic/voxel](https://github.com/vogonistic/mineflayer-voxel) - Визуализация от первого лица бота, созданная с помощью voxel.js + * [JonnyD/Skynet](https://github.com/JonnyD/Skynet) - Логирование активности игрока в онлайн-API + * [MinecraftChat](https://github.com/rom1504/MinecraftChat) (последняя версия с открытым исходным кодом, созданная AlexKvazos) - Веб чат майнкрафт сервера * [Cheese Bot](https://github.com/Minecheesecraft/Cheese-Bot) - Плагин с чистым GUI. Создан с помощью Node-Webkit. http://bot.ezcha.net/ - * [Chaoscraft](https://github.com/schematical/chaoscraft) - Бот Minecraft, использующий генетические алгоритмы, - посмотрите [эти видео](https://www.youtube.com/playlist?list=PLLkpLgU9B5xJ7Qy4kOyBJl5J6zsDIMceH) - * [hexatester/minetelegram](https://github.com/hexatester/minetelegram) - Мост между Minecraft и Telegram, создан при помощи Mineflayer & Telegraf. - * [и многие другие](https://github.com/PrismarineJS/mineflayer/network/dependents) - Все проекты, в которых используется Mineflayer + * [Chaoscraft](https://github.com/schematical/chaoscraft) - Бот Minecraft, использующий генетические алгоритмы, посмотрите [эти видео](https://www.youtube.com/playlist?list=PLLkpLgU9B5xJ7Qy4kOyBJl5J6zsDIMceH) + * [hexatester/minetelegram](https://github.com/hexatester/minetelegram) - Мост между Minecraft и Telegram, созданный при помощи Mineflayer & Telegraf + * [PrismarineJS/mineflayer-builder](https://github.com/PrismarineJS/mineflayer-builder) - Строит схемы в режиме выживания, сохраняя направление + * [и многие другие](https://github.com/PrismarineJS/mineflayer/network/dependents) - Все проекты, обнаруженные GitHub, в которых используется Mineflayer ## Тестирование -Настройка перед запуском бота - -### Установка - -Чтобы все тесты прошли успешно, вы должны: - -1. Создайть папку для хранения сервера -2. Установить переменную окружения `MC_SERVER_JAR_DIR` с путём на эту папку - -Например: - -1. `mkdir server_jars` -2. `export MC_SERVER_JAR_DIR=/полный/путь/до/сервера` +### Тестирование всего -Где "/полный/путь/до/сервера" - это путь к папке, в которой расположен сервер +Просто запустите: `npm test` -### Финальное тестирование +### Тестирование определённой версии +Запустите `npm run mocha_test -- -g `, где `` означает версию, таких как `1.12`, `1.15.2`... -Запустите: `npm test` +### Тестирование определённой функции +Запустите `npm run mocha_test -- -g `, где `` означает название проверки, таких как `bed`, `useChests`, `rayTrace`... -### Тестирование с определенной версии: -Выполните: `npm test -- -g `, где `` это версия Minecraft `1.12`, `1.15.2`... +### Пример -### Тестирование конкретного теста -Выполните: `npm test -- -g `, где `` любое название скрипта, по типу `bed`, `useChests`, `rayTrace`... +`npm run mocha_test -- -g "1.18.1.*BlockFinder"` запустит тест BlockFinder на версии 1.18.1 ## Лицензия -[MIT](LICENCE) +[MIT](../../LICENSE) diff --git a/docs/ru/api_ru.md b/docs/ru/api_ru.md index 964214a8a..185dab421 100644 --- a/docs/ru/api_ru.md +++ b/docs/ru/api_ru.md @@ -16,69 +16,57 @@ - [vec3](#vec3) - [mineflayer.Location](#mineflayerlocation) - [Entity](#entity) + - [Player Skin Data](#player-skin-data) - [Block](#block) - [Biome](#biome) - [Item](#item) - [windows.Window (base class)](#windowswindow-base-class) + - [window.deposit(itemType, metadata, count, nbt)](#windowdeposititemtype-metadata-count-nbt) + - [window.withdraw(itemType, metadata, count, nbt)](#windowwithdrawitemtype-metadata-count-nbt) + - [window.close()](#windowclose) - [Recipe](#recipe) - - [mineflayer.Chest](#mineflayerchest) - - [chest.window](#chestwindow) - - [chest "open"](#chest-open) - - [chest "close"](#chest-close) - - [chest "updateSlot" (oldItem, newItem)](#chest-updateslot-olditem-newitem) - - [chest.close()](#chestclose) - - [chest.deposit(itemType, metadata, count, [callback])](#chestdeposititemtype-metadata-count-callback) - - [chest.withdraw(itemType, metadata, count, [callback])](#chestwithdrawitemtype-metadata-count-callback) - - [chest.count(itemType, [metadata])](#chestcountitemtype-metadata) - - [chest.items()](#chestitems) + - [mineflayer.Container](#mineflayercontainer) - [mineflayer.Furnace](#mineflayerfurnace) - - [furnace "open"](#furnace-open) - - [furnace "close"](#furnace-close) - [furnace "update"](#furnace-update) - - [furnace "updateSlot" (oldItem, newItem)](#furnace-updateslot-olditem-newitem) - - [furnace.close()](#furnaceclose) - - [furnace.takeInput([callback])](#furnacetakeinputcallback) - - [furnace.takeFuel([callback])](#furnacetakefuelcallback) - - [furnace.takeOutput([callback])](#furnacetakeoutputcallback) - - [furnace.putInput(itemType, metadata, count, [cb])](#furnaceputinputitemtype-metadata-count-cb) - - [furnace.putFuel(itemType, metadata, count, [cb])](#furnaceputfuelitemtype-metadata-count-cb) + - [furnace.takeInput()](#furnacetakeinput) + - [furnace.takeFuel()](#furnacetakefuel) + - [furnace.takeOutput()](#furnacetakeoutput) + - [furnace.putInput(itemType, metadata, count)](#furnaceputinputitemtype-metadata-count) + - [furnace.putFuel(itemType, metadata, count)](#furnaceputfuelitemtype-metadata-count) - [furnace.inputItem()](#furnaceinputitem) - [furnace.fuelItem()](#furnacefuelitem) - [furnace.outputItem()](#furnaceoutputitem) - [furnace.fuel](#furnacefuel) - [furnace.progress](#furnaceprogress) - - [mineflayer.Dispenser](#mineflayerdispenser) - - [dispenser "open"](#dispenser-open) - - [dispenser "close"](#dispenser-close) - - [dispenser "updateSlot" (oldItem, newItem)](#dispenser-updateslot-olditem-newitem) - - [dispenser.close()](#dispenserclose) - - [dispenser.items()](#dispenseritems) - - [dispenser.deposit(itemType, metadata, count, [callback])](#dispenserdeposititemtype-metadata-count-callback) - - [dispenser.withdraw(itemType, metadata, count, [callback])](#dispenserwithdrawitemtype-metadata-count-callback) - - [dispenser.count(itemType, [metadata])](#dispensercountitemtype-metadata) - [mineflayer.EnchantmentTable](#mineflayerenchantmenttable) - - [enchantmentTable "open"](#enchantmenttable-open) - - [enchantmentTable "close"](#enchantmenttable-close) - - [enchantmentTable "updateSlot" (oldItem, newItem)](#enchantmenttable-updateslot-olditem-newitem) - [enchantmentTable "ready"](#enchantmenttable-ready) - - [enchantmentTable.close()](#enchantmenttableclose) - [enchantmentTable.targetItem()](#enchantmenttabletargetitem) + - [enchantmentTable.xpseed](#enchantmenttablexpseed) - [enchantmentTable.enchantments](#enchantmenttableenchantments) - - [enchantmentTable.enchant(choice, [callback])](#enchantmenttableenchantchoice-callback) - - [enchantmentTable.takeTargetItem([callback])](#enchantmenttabletaketargetitemcallback) - - [enchantmentTable.putTargetItem(item, [callback])](#enchantmenttableputtargetitemitem-callback) - - [mineflayer.Villager](#mineflayervillager) - - [villager "open"](#villager-open) - - [villager "close"](#villager-close) - - [villager "updateSlot" (oldItem, newItem)](#villager-updateslot-olditem-newitem) + - [enchantmentTable.enchant(choice)](#enchantmenttableenchantchoice) + - [enchantmentTable.takeTargetItem()](#enchantmenttabletaketargetitem) + - [enchantmentTable.putTargetItem(item)](#enchantmenttableputtargetitemitem) + - [enchantmentTable.putLapis(item)](#enchantmenttableputlapisitem) + - [mineflayer.anvil](#mineflayeranvil) + - [anvil.combine(itemOne, itemTwo[, name])](#anvilcombineitemone-itemtwo-name) + - [anvil.combine(item[, name])](#anvilcombineitem-name) - [villager "ready"](#villager-ready) - - [villager.close()](#villagerclose) - [villager.trades](#villagertrades) + - [villager.trade(tradeIndex, [times])](#villagertradetradeindex-times) - [mineflayer.ScoreBoard](#mineflayerscoreboard) - [ScoreBoard.name](#scoreboardname) - [ScoreBoard.title](#scoreboardtitle) - [ScoreBoard.itemsMap](#scoreboarditemsmap) - [ScoreBoard.items](#scoreboarditems) + - [mineflayer.Team](#mineflayerteam) + - [Team.name](#teamname) + - [Team.friendlyFire](#teamfriendlyfire) + - [Team.nameTagVisibility](#teamnametagvisibility) + - [Team.collisionRule](#teamcollisionrule) + - [Team.color](#teamcolor) + - [Team.prefix](#teamprefix) + - [Team.suffix](#teamsuffix) + - [Team.members](#teammembers) - [mineflayer.BossBar](#mineflayerbossbar) - [BossBar.title](#bossbartitle) - [BossBar.health](#bossbarhealth) @@ -88,42 +76,76 @@ - [BossBar.isDragonBar](#bossbarisdragonbar) - [BossBar.createFog](#bossbarcreatefog) - [BossBar.color](#bossbarcolor) + - [mineflayer.Particle](#mineflayerparticle) + - [Particle.id](#particleid) + - [Particle.name](#particlename) + - [Particle.position](#particleposition) + - [Particle.offset](#particleoffset) + - [Particle.longDistanceRender](#particlelongdistancerender) + - [Particle.count](#particlecount) + - [Particle.movementSpeed](#particlemovementspeed) - [Bot](#bot) - [mineflayer.createBot(options)](#mineflayercreatebotoptions) - [Properties](#properties) + - [bot.registry](#botregistry) + - [bot.world](#botworld) + - [world "blockUpdate" (oldBlock, newBlock)](#world-blockupdate-oldblock-newblock) + - [world "blockUpdate:(x, y, z)" (oldBlock, newBlock)](#world-blockupdatex-y-z-oldblock-newblock) - [bot.entity](#botentity) - [bot.entities](#botentities) - [bot.username](#botusername) - [bot.spawnPoint](#botspawnpoint) + - [bot.heldItem](#bothelditem) + - [bot.usingHeldItem](#botusinghelditem) - [bot.game.levelType](#botgameleveltype) - [bot.game.dimension](#botgamedimension) - [bot.game.difficulty](#botgamedifficulty) - [bot.game.gameMode](#botgamegamemode) - [bot.game.hardcore](#botgamehardcore) - [bot.game.maxPlayers](#botgamemaxplayers) - - [bot.player](#botplayer) + - [bot.game.serverBrand](#botgameserverbrand) + - [bot.game.minY](#botgameminy) + - [bot.game.height](#botgameheight) + - [bot.physicsEnabled](#botphysicsenabled) + - [bot.player](#botplayer) - [bot.players](#botplayers) + - [bot.tablist](#bottablist) - [bot.isRaining](#botisraining) + - [bot.rainState](#botrainstate) + - [bot.thunderState](#botthunderstate) - [bot.chatPatterns](#botchatpatterns) - [bot.settings.chat](#botsettingschat) - [bot.settings.colorsEnabled](#botsettingscolorsenabled) - [bot.settings.viewDistance](#botsettingsviewdistance) - [bot.settings.difficulty](#botsettingsdifficulty) - - [bot.settings.skinParts.showCape](#botsettingsskinpartsshowcape) - - [bot.settings.skinParts.showJacket](#botsettingsskinpartsshowjacket) - - [bot.settings.skinParts.showLeftSleeve](#botsettingsskinpartsshowleftsleeve) - - [bot.settings.skinParts.showRightSleeve](#botsettingsskinpartsshowrightsleeve) - - [bot.settings.skinParts.showLeftPants](#botsettingsskinpartsshowleftpants) - - [bot.settings.skinParts.showRightPants](#botsettingsskinpartsshowrightpants) - - [bot.settings.skinParts.showHat](#botsettingsskinpartsshowhat) + - [bot.settings.skinParts](#botsettingsskinparts) + - [bot.settings.skinParts.showCape - boolean](#botsettingsskinpartsshowcape---boolean) + - [bot.settings.skinParts.showJacket - boolean](#botsettingsskinpartsshowjacket---boolean) + - [bot.settings.skinParts.showLeftSleeve - boolean](#botsettingsskinpartsshowleftsleeve---boolean) + - [bot.settings.skinParts.showRightSleeve - boolean](#botsettingsskinpartsshowrightsleeve---boolean) + - [bot.settings.skinParts.showLeftPants - boolean](#botsettingsskinpartsshowleftpants---boolean) + - [bot.settings.skinParts.showRightPants - boolean](#botsettingsskinpartsshowrightpants---boolean) + - [bot.settings.skinParts.showHat - boolean](#botsettingsskinpartsshowhat---boolean) + - [bot.settings.enableTextFiltering - boolean](#botsettingsenabletextfiltering---boolean) + - [bot.settings.enableServerListing - boolean](#botsettingsenableserverlisting---boolean) - [bot.experience.level](#botexperiencelevel) - [bot.experience.points](#botexperiencepoints) - [bot.experience.progress](#botexperienceprogress) - [bot.health](#bothealth) - [bot.food](#botfood) - [bot.foodSaturation](#botfoodsaturation) + - [bot.oxygenLevel](#botoxygenlevel) - [bot.physics](#botphysics) + - [bot.simpleClick.leftMouse (slot)](#botsimpleclickleftmouse-slot) + - [bot.simpleClick.rightMouse (slot)](#botsimpleclickrightmouse-slot) + - [bot.time.doDaylightCycle](#bottimedodaylightcycle) + - [bot.time.bigTime](#bottimebigtime) + - [bot.time.time](#bottimetime) + - [bot.time.timeOfDay](#bottimetimeofday) - [bot.time.day](#bottimeday) + - [bot.time.isDay](#bottimeisday) + - [bot.time.moonPhase](#bottimemoonphase) + - [bot.time.bigAge](#bottimebigage) - [bot.time.age](#bottimeage) - [bot.quickBarSlot](#botquickbarslot) - [bot.inventory](#botinventory) @@ -131,33 +153,51 @@ - [bot.isSleeping](#botissleeping) - [bot.scoreboards](#botscoreboards) - [bot.scoreboard](#botscoreboard) + - [bot.teams](#botteams) + - [bot.teamMap](#botteammap) - [bot.controlState](#botcontrolstate) - [Events](#events) - ["chat" (username, message, translate, jsonMsg, matches)](#chat-username-message-translate-jsonmsg-matches) - ["whisper" (username, message, translate, jsonMsg, matches)](#whisper-username-message-translate-jsonmsg-matches) - - ["actionBar" (jsonMsg)](#actionbar-jsonmsg) - - ["message" (jsonMsg, position)](#message-jsonmsg-position) + - ["actionBar" (jsonMsg, verified)](#actionbar-jsonmsg-verified) + - ["message" (jsonMsg, position, sender, verified)](#message-jsonmsg-position-sender-verified) + - ["messagestr" (message, messagePosition, jsonMsg, sender, verified)](#messagestr-message-messageposition-jsonmsg-sender-verified) + - ["inject_allowed"](#inject_allowed) - ["login"](#login) - ["spawn"](#spawn) - ["respawn"](#respawn) - ["game"](#game) + - ["resourcePack" (url, hash)](#resourcepack-url-hash) - ["title"](#title) - ["rain"](#rain) + - ["weatherUpdate"](#weatherupdate) - ["time"](#time) - ["kicked" (reason, loggedIn)](#kicked-reason-loggedin) - - ["end"](#end) + - ["end" (reason)](#end-reason) + - ["error" (err)](#error-err) - ["spawnReset"](#spawnreset) - ["death"](#death) - ["health"](#health) + - ["breath"](#breath) + - ["entityAttributes" (entity)](#entityattributes-entity) - ["entitySwingArm" (entity)](#entityswingarm-entity) - ["entityHurt" (entity)](#entityhurt-entity) + - ["entityDead" (entity)](#entitydead-entity) + - ["entityTaming" (entity)](#entitytaming-entity) + - ["entityTamed" (entity)](#entitytamed-entity) + - ["entityShakingOffWater" (entity)](#entityshakingoffwater-entity) + - ["entityEatingGrass" (entity)](#entityeatinggrass-entity) + - ["entityHandSwap" (entity)](#entityhandswap-entity) - ["entityWake" (entity)](#entitywake-entity) - ["entityEat" (entity)](#entityeat-entity) + - ["entityCriticalEffect" (entity)](#entitycriticaleffect-entity) + - ["entityMagicCriticalEffect" (entity)](#entitymagiccriticaleffect-entity) - ["entityCrouch" (entity)](#entitycrouch-entity) - ["entityUncrouch" (entity)](#entityuncrouch-entity) - - ["entityEquipmentChange" (entity)](#entityequipmentchange-entity) + - ["entityEquip" (entity)](#entityequip-entity) - ["entitySleep" (entity)](#entitysleep-entity) - ["entitySpawn" (entity)](#entityspawn-entity) + - ["itemDrop" (entity)](#itemdrop-entity) - ["playerCollect" (collector, collected)](#playercollect-collector-collected) - ["entityGone" (entity)](#entitygone-entity) - ["entityMoved" (entity)](#entitymoved-entity) @@ -167,18 +207,20 @@ - ["entityEffect" (entity, effect)](#entityeffect-entity-effect) - ["entityEffectEnd" (entity, effect)](#entityeffectend-entity-effect) - ["playerJoined" (player)](#playerjoined-player) + - ["playerUpdated" (player)](#playerupdated-player) - ["playerLeft" (player)](#playerleft-player) - ["blockUpdate" (oldBlock, newBlock)](#blockupdate-oldblock-newblock) - ["blockUpdate:(x, y, z)" (oldBlock, newBlock)](#blockupdatex-y-z-oldblock-newblock) + - ["blockPlaced" (oldBlock, newBlock)](#blockplaced-oldblock-newblock) - ["chunkColumnLoad" (point)](#chunkcolumnload-point) - ["chunkColumnUnload" (point)](#chunkcolumnunload-point) - ["soundEffectHeard" (soundName, position, volume, pitch)](#soundeffectheard-soundname-position-volume-pitch) - ["hardcodedSoundEffectHeard" (soundId, soundCategory, position, volume, pitch)](#hardcodedsoundeffectheard-soundid-soundcategory-position-volume-pitch) - ["noteHeard" (block, instrument, pitch)](#noteheard-block-instrument-pitch) - ["pistonMove" (block, isPulling, direction)](#pistonmove-block-ispulling-direction) - - ["chestLidMove" (block, isOpen)](#chestlidmove-block-isopen) - - ["blockBreakProgressObserved" (block, destroyStage)](#blockbreakprogressobserved-block-destroystage) - - ["blockBreakProgressEnd" (block)](#blockbreakprogressend-block) + - ["chestLidMove" (block, isOpen, block2)](#chestlidmove-block-isopen-block2) + - ["blockBreakProgressObserved" (block, destroyStage, entity)](#blockbreakprogressobserved-block-destroystage-entity) + - ["blockBreakProgressEnd" (block, entity)](#blockbreakprogressend-block-entity) - ["diggingCompleted" (block)](#diggingcompleted-block) - ["diggingAborted" (block)](#diggingaborted-block) - ["move"](#move) @@ -196,78 +238,111 @@ - ["scoreUpdated" (scoreboard, item)](#scoreupdated-scoreboard-item) - ["scoreRemoved" (scoreboard, item)](#scoreremoved-scoreboard-item) - ["scoreboardPosition" (position, scoreboard)](#scoreboardposition-position-scoreboard) + - ["teamCreated" (team)](#teamcreated-team) + - ["teamRemoved" (team)](#teamremoved-team) + - ["teamUpdated" (team)](#teamupdated-team) + - ["teamMemberAdded" (team)](#teammemberadded-team) + - ["teamMemberRemoved" (team)](#teammemberremoved-team) - ["bossBarCreated" (bossBar)](#bossbarcreated-bossbar) - ["bossBarDeleted" (bossBar)](#bossbardeleted-bossbar) - ["bossBarUpdated" (bossBar)](#bossbarupdated-bossbar) + - ["heldItemChanged" (heldItem)](#helditemchanged-helditem) + - ["physicsTick" ()](#physicstick-) + - ["chat:name" (matches)](#chatname-matches) + - ["particle"](#particle) - [Functions](#functions) - - [bot.blockAt(point)](#botblockatpoint) + - [bot.blockAt(point, extraInfos=true)](#botblockatpoint-extrainfostrue) + - [bot.waitForChunksToLoad()](#botwaitforchunkstoload) - [bot.blockInSight(maxSteps, vectorLength)](#botblockinsightmaxsteps-vectorlength) + - [bot.blockAtCursor(maxDistance=256)](#botblockatcursormaxdistance256) + - [bot.entityAtCursor(maxDistance=3.5)](#botentityatcursormaxdistance35) + - [bot.blockAtEntityCursor(entity=bot.entity, maxDistance=256)](#botblockatentitycursorentitybotentity-maxdistance256) - [bot.canSeeBlock(block)](#botcanseeblockblock) + - [bot.findBlocks(options)](#botfindblocksoptions) - [bot.findBlock(options)](#botfindblockoptions) - [bot.canDigBlock(block)](#botcandigblockblock) - [bot.recipesFor(itemType, metadata, minResultCount, craftingTable)](#botrecipesforitemtype-metadata-minresultcount-craftingtable) - [bot.recipesAll(itemType, metadata, craftingTable)](#botrecipesallitemtype-metadata-craftingtable) + - [bot.nearestEntity(match = (entity) => { return true })](#botnearestentitymatch--entity---return-true-) - [Methods](#methods) - - [bot.end()](#botend) + - [bot.end(reason)](#botendreason) - [bot.quit(reason)](#botquitreason) - - [bot.tabComplete(str, cb, [assumeCommand], [sendBlockInSight])](#bottabcompletestr-cb-assumecommand-sendblockinsight) + - [bot.tabComplete(str, [assumeCommand], [sendBlockInSight])](#bottabcompletestr-assumecommand-sendblockinsight) - [bot.chat(message)](#botchatmessage) - [bot.whisper(username, message)](#botwhisperusername-message) - [bot.chatAddPattern(pattern, chatType, description)](#botchataddpatternpattern-chattype-description) + - [bot.addChatPattern(name, pattern, chatPatternOptions)](#botaddchatpatternname-pattern-chatpatternoptions) + - [bot.addChatPatternSet(name, patterns, chatPatternOptions)](#botaddchatpatternsetname-patterns-chatpatternoptions) + - [bot.removeChatPattern(name)](#botremovechatpatternname) + - [bot.awaitMessage(...args)](#botawaitmessageargs) - [bot.setSettings(options)](#botsetsettingsoptions) - [bot.loadPlugin(plugin)](#botloadpluginplugin) - [bot.loadPlugins(plugins)](#botloadpluginsplugins) - - [bot.sleep(bedBlock, [cb])](#botsleepbedblock-cb) + - [bot.hasPlugin(plugin)](#bothaspluginplugin) + - [bot.sleep(bedBlock)](#botsleepbedblock) - [bot.isABed(bedBlock)](#botisabedbedblock) - - [bot.wake([cb])](#botwakecb) + - [bot.wake()](#botwake) - [bot.setControlState(control, state)](#botsetcontrolstatecontrol-state) + - [bot.getControlState(control)](#botgetcontrolstatecontrol) - [bot.clearControlStates()](#botclearcontrolstates) - - [bot.lookAt(point, [force], [callback])](#botlookatpoint-force-callback) - - [bot.look(yaw, pitch, [force], [callback])](#botlookyaw-pitch-force-callback) - - [bot.updateSign(block, text)](#botupdatesignblock-text) - - [bot.equip(item, destination, [callback])](#botequipitem-destination-callback) - - [bot.unequip(destination, [callback])](#botunequipdestination-callback) - - [bot.tossStack(item, [callback])](#bottossstackitem-callback) - - [bot.toss(itemType, metadata, count, [callback])](#bottossitemtype-metadata-count-callback) - - [bot.dig(block, [callback])](#botdigblock-callback) + - [bot.getExplosionDamages(entity, position, radius, [rawDamages])](#botgetexplosiondamagesentity-position-radius-rawdamages) + - [bot.lookAt(point, [force])](#botlookatpoint-force) + - [bot.look(yaw, pitch, [force])](#botlookyaw-pitch-force) + - [bot.updateSign(block, text, back = false)](#botupdatesignblock-text) + - [bot.equip(item, destination)](#botequipitem-destination) + - [bot.unequip(destination)](#botunequipdestination) + - [bot.tossStack(item)](#bottossstackitem) + - [bot.toss(itemType, metadata, count)](#bottossitemtype-metadata-count) + - [bot.dig(block, [forceLook = true], [digFace])](#botdigblock-forcelook--true-digface) - [bot.stopDigging()](#botstopdigging) - [bot.digTime(block)](#botdigtimeblock) - - [bot.placeBlock(referenceBlock, faceVector, cb)](#botplaceblockreferenceblock-facevector-cb) - - [bot.activateBlock(block, [callback])](#botactivateblockblock-callback) - - [bot.activateEntity(entity, [callback])](#botactivateentityentity-callback) - - [bot.consume(callback)](#botconsumecallback) - - [bot.fish(callback)](#botfishcallback) - - [bot.activateItem()](#botactivateitem) + - [bot.acceptResourcePack()](#botacceptresourcepack) + - [bot.denyResourcePack()](#botdenyresourcepack) + - [bot.placeBlock(referenceBlock, faceVector)](#botplaceblockreferenceblock-facevector) + - [bot.placeEntity(referenceBlock, faceVector)](#botplaceentityreferenceblock-facevector) + - [bot.activateBlock(block, direction?: Vec3, cursorPos?: Vec3)](#botactivateblockblock-direction-vec3-cursorpos-vec3) + - [bot.activateEntity(entity)](#botactivateentityentity) + - [bot.activateEntityAt(entity, position)](#botactivateentityatentity-position) + - [bot.consume()](#botconsume) + - [bot.fish()](#botfish) + - [bot.activateItem(offHand=false)](#botactivateitemoffhandfalse) - [bot.deactivateItem()](#botdeactivateitem) - [bot.useOn(targetEntity)](#botuseontargetentity) - - [bot.attack(entity)](#botattackentity) - - [bot.swingArm([hand])](#botswingarmhand) + - [bot.attack(entity, swing = true)](#botattackentity-swing--true) + - [bot.swingArm([hand], showHand)](#botswingarmhand-showhand) - [bot.mount(entity)](#botmountentity) - [bot.dismount()](#botdismount) - [bot.moveVehicle(left,forward)](#botmovevehicleleftforward) - [bot.setQuickBarSlot(slot)](#botsetquickbarslotslot) - - [bot.craft(recipe, count, craftingTable, [callback])](#botcraftrecipe-count-craftingtable-callback) - - [bot.writeBook(slot, pages, [callback])](#botwritebookslot-pages-callback) - - [bot.openChest(chestBlock or minecartchestEntity)](#botopenchestchestblock-or-minecartchestentity) + - [bot.craft(recipe, count, craftingTable)](#botcraftrecipe-count-craftingtable) + - [bot.writeBook(slot, pages)](#botwritebookslot-pages) + - [bot.openContainer(containerBlock or containerEntity, direction?, cursorPos?)](#botopencontainercontainerblock-or-containerentity-direction-cursorpos) + - [bot.openChest(chestBlock or minecartchestEntity, direction?, cursorPos?)](#botopenchestchestblock-or-minecartchestentity-direction-cursorpos) - [bot.openFurnace(furnaceBlock)](#botopenfurnacefurnaceblock) - [bot.openDispenser(dispenserBlock)](#botopendispenserdispenserblock) - [bot.openEnchantmentTable(enchantmentTableBlock)](#botopenenchantmenttableenchantmenttableblock) + - [bot.openAnvil(anvilBlock)](#botopenanvilanvilblock) - [bot.openVillager(villagerEntity)](#botopenvillagervillagerentity) - - [bot.trade(villagerInstance, tradeIndex, [times], [cb])](#bottradevillagerinstance-tradeindex-times-cb) - - [bot.setCommandBlock(pos, command, track_output)](#botsetcommandblockpos-command-track_output) - - [Методы инвентаря низкого уровня](#%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B8%D0%BD%D0%B2%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D1%8F-%D0%BD%D0%B8%D0%B7%D0%BA%D0%BE%D0%B3%D0%BE-%D1%83%D1%80%D0%BE%D0%B2%D0%BD%D1%8F) - - [bot.clickWindow(slot, mouseButton, mode, cb)](#botclickwindowslot-mousebutton-mode-cb) - - [bot.putSelectedItemRange(start, end, window, slot, cb)](#botputselecteditemrangestart-end-window-slot-cb) - - [bot.putAway(slot, cb)](#botputawayslot-cb) + - [bot.trade(villagerInstance, tradeIndex, [times])](#bottradevillagerinstance-tradeindex-times) + - [bot.setCommandBlock(pos, command, [options])](#botsetcommandblockpos-command-options) + - [bot.supportFeature(name)](#botsupportfeaturename) + - [bot.waitForTicks(ticks)](#botwaitforticksticks) + - [Lower level inventory methods](#lower-level-inventory-methods) + - [bot.clickWindow(slot, mouseButton, mode)](#botclickwindowslot-mousebutton-mode) + - [bot.putSelectedItemRange(start, end, window, slot)](#botputselecteditemrangestart-end-window-slot) + - [bot.putAway(slot)](#botputawayslot) - [bot.closeWindow(window)](#botclosewindowwindow) - - [bot.transfer(options, cb)](#bottransferoptions-cb) - - [bot.openBlock(block, Class)](#botopenblockblock-class) - - [bot.openEntity(entity, Class)](#botopenentityentity-class) - - [bot.moveSlotItem(sourceSlot, destSlot, cb)](#botmoveslotitemsourceslot-destslot-cb) + - [bot.transfer(options)](#bottransferoptions) + - [bot.openBlock(block, direction?: Vec3, cursorPos?: Vec3)](#botopenblockblock-direction-vec3-cursorpos-vec3) + - [bot.openEntity(entity)](#botopenentityentity) + - [bot.moveSlotItem(sourceSlot, destSlot)](#botmoveslotitemsourceslot-destslot) - [bot.updateHeldItem()](#botupdatehelditem) + - [bot.getEquipmentDestSlot(destination)](#botgetequipmentdestslotdestination) - [bot.creative](#botcreative) - - [bot.creative.setInventorySlot(slot, item, [callback])](#botcreativesetinventoryslotslot-item-callback) - - [bot.creative.flyTo(destination, [cb])](#botcreativeflytodestination-cb) + - [bot.creative.setInventorySlot(slot, item)](#botcreativesetinventoryslotslot-item) + - [bot.creative.clearSlot(slot)](#botcreativeclearslotslot) + - [bot.creative.clearInventory()](#botcreativeclearinventory) + - [bot.creative.flyTo(destination)](#botcreativeflytodestination) - [bot.creative.startFlying()](#botcreativestartflying) - [bot.creative.stopFlying()](#botcreativestopflying) @@ -277,64 +352,83 @@ ## Enums -Эти данные хранятся не внутри библиотеки Mineflayer [minecraft-data](https://github.com/PrismarineJS/minecraft-data) , +Эти данные хранятся независимо от проекта [minecraft-data](https://github.com/PrismarineJS/minecraft-data), и доступны через [node-minecraft-data](https://github.com/PrismarineJS/node-minecraft-data). ### minecraft-data -Данные доступны в модуле [node-minecraft-data](https://github.com/PrismarineJS/node-minecraft-data) -Используйте `require('minecraft-data')(bot.version)` +Данные доступны в модуле [node-minecraft-data](https://github.com/PrismarineJS/node-minecraft-data). + +Используйте `require('minecraft-data')(bot.version)`. ### mcdata.blocks -Идентификация блоков по ID + +Идентификация блоков по ID. ### mcdata.items -Идентификация предметов по ID + +Идентификация предметов по ID. ### mcdata.materials -Объект в качестве идентификатора элемента инструмента +Название материала и объект, который содержит информацию об инструментах и их эффективности разрушения.. ### mcdata.recipes -Идентификация крафтов по ID + +Идентификация крафтов по ID. ### mcdata.instruments -Идентификация инструментов по ID + +Идентификация инструментов по ID. ### mcdata.biomes -Идентификация биомов по ID + +Идентификация биомов по ID. ### mcdata.entities -Идентификация существ по ID + +Идентификация существ по ID. ## Classes ### vec3 -Смотрите [andrewrk/node-vec3](https://github.com/andrewrk/node-vec3) +Смотрите [andrewrk/node-vec3](https://github.com/andrewrk/node-vec3). -Все координаты библиотеки Mineflayer используют данный класс +Все координаты библиотеки Mineflayer используют данный класс. - * x - юг - * y - вверх - * z - запад + * `x` - Юг. + * `y` - Вверх. + * `z` - Запад. -Функции и методы, требующие точного аргумента, как правило, используют `Vec3`, -а также массив с тремя значениями "x", "y", "z" +Функции и методы, требующие точного аргумента позиции, как правило, используют `Vec3`, +а также массив с тремя значениями и объект с `x`, `y`, `z`. ### mineflayer.Location ### Entity -Существами являются игроки, мобы и объекты. Вы также можете получить доступ +Энтити (существо) - это игроки, мобы и объекты. Вы также можете получить доступ к своему существу, используя `bot.entity`. -Смотрите [prismarine-entity](https://github.com/PrismarineJS/prismarine-entity) +Смотрите [prismarine-entity](https://github.com/PrismarineJS/prismarine-entity). + +#### Player Skin Data + +Данные скина хранятся в свойстве `skinData` объекта игрока, если имеются. + +```js +// player.skinData +{ + url: 'http://textures.minecraft.net/texture/...', + model: 'slim' // или 'classic' +} +``` ### Block -Смотрите [prismarine-block](https://github.com/PrismarineJS/prismarine-block) +Смотрите [prismarine-block](https://github.com/PrismarineJS/prismarine-block). -`block.blockEntity` является дополнительным значением с данными объекта "Object" +`block.blockEntity` является дополнительным полем с данными блок-существ в виде `Object`. ```js // sign.blockEntity { @@ -351,201 +445,125 @@ ### Biome -Смотрите [prismarine-biome](https://github.com/PrismarineJS/prismarine-biome) +Смотрите [prismarine-biome](https://github.com/PrismarineJS/prismarine-biome). ### Item -Смотрите [prismarine-item](https://github.com/PrismarineJS/prismarine-item) +Смотрите [prismarine-item](https://github.com/PrismarineJS/prismarine-item). ### windows.Window (base class) -Смотрите [prismarine-windows](https://github.com/PrismarineJS/prismarine-windows) - -### Recipe - -Смотрите [prismarine-recipe](https://github.com/PrismarineJS/prismarine-recipe) - -### mineflayer.Chest - -Предоставляет сеанс взаимодействия с сундуками ( Открытие и закрытие ) -Смотрите `bot.openContainer(chestBlock or minecartchestEntity)`. - -#### chest.window - -Если сундук открыт, этим свойством является `ChestWindow`. -Если же сундук закрыт, этим свойством является `null`. - -#### chest "open" +Смотрите [prismarine-windows](https://github.com/PrismarineJS/prismarine-windows). -Срабатывает, когда сундук открыт +#### window.deposit(itemType, metadata, count, nbt) -#### chest "close" +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. -Срабатывает, когда сундук закрыт + * `itemType` - Числовой ID предмета. + * `metadata` - Числовое значение мета-данных. `null` означает любой вид. + * `count` - Сколько предметов класть. `null` будет равно `1`. + * `nbt` - Совпадение по нбт. `null` отключает это. -#### chest "updateSlot" (oldItem, newItem) +#### window.withdraw(itemType, metadata, count, nbt) -Срабатывает, когда в просматриваемом Вами сундуке обновляются слоты +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. Выдаёт ошибку, если нет места в инвентаре. -#### chest.close() + * `itemType` - Числовой ID предмета. + * `metadata` - Числовое значение мета-данных. `null` означает любой вид. + * `count` - Сколько предметов брать. `null` будет равно `1`. + * `nbt` - Совпадение по нбт. `null` отключает это. -#### chest.deposit(itemType, metadata, count, [callback]) +#### window.close() - * `itemType` - ID предмета - * `metadata` - числовое значение. `null` может совпадать с чем угодно. - * `count` - количество предметов. `null` является 1 предметом - * `callback(err)` - (необязательно) - Срабатывает при успешном действии +Закрывает окно. -#### chest.withdraw(itemType, metadata, count, [callback]) - - * `itemType` - ID предмета - * `metadata` - числовое значение. `null` может совпадать с чем угодно. - * `count` - количество предметов. `null` является 1 предметом - * `callback(err)` - (необязательно) - Срабатывает при успешном действии - -#### chest.count(itemType, [metadata]) - -Возвращает количество предметов разных типов +### Recipe - * `itemType` - ID предмета - * `metadata` - (необязательно) - Срабатывает при успешном действии +Смотрите [prismarine-recipe](https://github.com/PrismarineJS/prismarine-recipe). -#### chest.items() +### mineflayer.Container -Возвращает список предметов в `Item`, которые на момент вызова находились в сундуке. +Дополнение к `windows.Window` для сундуков, раздатчиков и прочих. +Смотрите `bot.openContainer(chestBlock или minecartchestEntity)`. ### mineflayer.Furnace +Дополнение к `windows.Window` для печки, плавильни и прочих. Смотрите `bot.openFurnace(furnaceBlock)`. -#### furnace "open" +#### furnace "update" -Срабатывает, когда печь открыта +Срабатывает при обновлении `furnace.fuel` и/или `furnace.progress`. -#### furnace "close" +#### furnace "updateSlot" (oldItem, newItem) -Срабатывает, когда печь закрыта +Срабатывает, когда в печи обновляется слот для плавки. -#### furnace "update" +#### furnace.takeInput() -Срабатывает при обновлении `furnace.fuel` и/или обновлении `furnace.progress`. +Эта функция возвращает `Promise` с `item` в качестве аргумента при завершении. -#### furnace "updateSlot" (oldItem, newItem) -Срабатывает, когда в печи обновился слот для плавки +#### furnace.takeFuel() -#### furnace.close() +Эта функция возвращает `Promise` с `item` в качестве аргумента при завершении. -#### furnace.takeInput([callback]) - * `callback(err, item)` +#### furnace.takeOutput() -#### furnace.takeFuel([callback]) +Эта функция возвращает `Promise` с `item` в качестве аргумента при завершении. - * `callback(err, item)` -#### furnace.takeOutput([callback]) +#### furnace.putInput(itemType, metadata, count) - * `callback(err, item)` +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. -#### furnace.putInput(itemType, metadata, count, [cb]) +#### furnace.putFuel(itemType, metadata, count) -#### furnace.putFuel(itemType, metadata, count, [cb]) +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. #### furnace.inputItem() -Возвращает предметы в `Item`, которые на момент вызова находились в печи. +Возвращает предмет, который плавится, в виде `Item`. #### furnace.fuelItem() -Возвращает предмет в `Item`, которые на момент вызова находились в слоте для топлива печи. +Возвращает топливо в виде `Item`. #### furnace.outputItem() -Возвращает предмет в `Item`, который на момент вызова был доступен для вывода +Возвращает результат плавки в виде `Item`. #### furnace.fuel -Возвращает количество топлива в печи +Возвращает количество оставшегося топлива от `0` до `1`. #### furnace.progress -Возвращает прогресс плавки предмета - -### mineflayer.Dispenser - -Смотрите `bot.openDispenser(dispenserBlock)`. - -#### dispenser "open" - -Срабатывает, когда раздатчик был открыт - -#### dispenser "close" - -Срабатывает, когда раздатчик был закрыт - -#### dispenser "updateSlot" (oldItem, newItem) - -Срабатывает, когда в раздатчик положили предмет - -#### dispenser.close() - -#### dispenser.items() - -Возвращает список предметов в `Item`, которые лежат в раздатчике. - -#### dispenser.deposit(itemType, metadata, count, [callback]) - - * `itemType` - ID предмета - * `metadata` - числовое значение. `null` может совпадать с чем угодно. - * `count` - количество предметов. `null` является 1 предметом - * `callback(err)` - (необязательно) - Срабатывает при успешном действии - -#### dispenser.withdraw(itemType, metadata, count, [callback]) - - * `itemType` - ID предмета - * `metadata` - числовое значение. `null` может совпадать с чем угодно. - * `count` - количество предметов. `null` является 1 предметом - * `callback(err)` - (необязательно) - Срабатывает при успешном действии - -#### dispenser.count(itemType, [metadata]) - -Возвращает число определенного предмета, находящегося в раздатчике. - - * `itemType` - numerical item id - * `metadata` - (optional) numerical value. `null` means match anything. +Возвращает прогресс плавки предмета от `0` до `1`. ### mineflayer.EnchantmentTable +Дополнение к `windows.Window` для стола зачарований. Смотрите `bot.openEnchantmentTable(enchantmentTableBlock)`. -#### enchantmentTable "open" - -Срабатывает, когда стол зачарований был открыт - -#### enchantmentTable "close" - -Срабатывает, когда стол зачарований был закрыт - -#### enchantmentTable "updateSlot" (oldItem, newItem) - -Срабатывает, когда в стол зачарований положили предмет - #### enchantmentTable "ready" -Срабатывает, когда `enchantmentTable.enchantments` готов к зачарованию и вы -можете зачаровать предмет, используя `enchantmentTable.enchant(choice)`. - -#### enchantmentTable.close() +Срабатывает, когда `enchantmentTable.enchantments` полностью заполнен, и вы +можете сделать выбор, вызвав `enchantmentTable.enchant(choice)`. #### enchantmentTable.targetItem() -Возвращает текущий предмет в столе зачарования. Этот метод может использоваться как для того чтобы положить предмет, так и для того, чтобы забрать его. +Возвращает текущий предмет в столе зачарования. Этот метод может использоваться, чтобы положить или забрать предмет. + +#### enchantmentTable.xpseed + +16-битный xpseed, отправленный сервером. #### enchantmentTable.enchantments -Возвращает массив из трёх зачарований, доступных для выбориа -`level` может являтся `null`, если сервер ещё не отправил данные. Это нормально. +Возвращает массив из трёх зачарований, доступных для выбора. +`level` может быть `-1`, если сервер ещё не отправил данные. Пример: @@ -563,44 +581,48 @@ ] ``` -#### enchantmentTable.enchant(choice, [callback]) +#### enchantmentTable.enchant(choice) - * `choice` - [0-2], индекс массива (уровня зачарования), который Вы можете выбрать - * `callback(err, item)` - (необязательно) Срабатывает, когда предмет зачарован +Возращает `Promise` с `item` в качестве аргумента после зачарования. -#### enchantmentTable.takeTargetItem([callback]) + * `choice` - [0-2], индекс зачарования, которое вы выбираете. - * `callback(err, item)` +#### enchantmentTable.takeTargetItem() -#### enchantmentTable.putTargetItem(item, [callback]) +Возращает `Promise` с `item` в качестве аргумента при завершении. - * `callback(err)` -### mineflayer.Villager +#### enchantmentTable.putTargetItem(item) -Смотрите `bot.openVillager(villagerEntity)`. +Возращает `Promise` с `void` в качестве аргумента при завершении. -#### villager "open" -Срабатывает, когда GUI торговли открыто +#### enchantmentTable.putLapis(item) -#### villager "close" +Возращает `Promise` с `void` в качестве аргумента при завершении. -Срабатывает, когда интерфейс торговли закрыт -#### villager "updateSlot" (oldItem, newItem) +### mineflayer.anvil -Срабатывает, когда предмет был положен в ячейку для торговли +Дополнение к `windows.Window` для наковальни. +Смотрите `bot.openAnvil(anvilBlock)`. -#### villager "ready" +#### anvil.combine(itemOne, itemTwo[, name]) -Возвращает, когда `villager.trades` был загружен +Возращает `Promise` с `void` в качестве аргумента при завершении. -#### villager.close() +#### anvil.combine(item[, name]) + +Возращает `Promise` с `void` в качестве аргумента при завершении. + + +#### villager "ready" + +Срабатывает, когда `villager.trades` был загружен. #### villager.trades -Массив вариантов торговли +Массив с вариантами торговли. Пример: @@ -636,19 +658,25 @@ ] ``` +#### villager.trade(tradeIndex, [times]) +Подобно [bot.trade(villagerInstance, tradeIndex, [times])](#bottradevillagerinstance-tradeindex-times) + ### mineflayer.ScoreBoard #### ScoreBoard.name -Имя скорборда +Имя скорборда. #### ScoreBoard.title -Название скорборда (может не совпадать с ScoreBoard.title) +Заголовок скорборда (может не совпадать с именем). #### ScoreBoard.itemsMap -Объект со всеми элементами скорборда +Объект со всеми элементами скорборда. + +Пример: + ```js { wvffle: { name: 'wvffle', value: 3 }, @@ -658,7 +686,10 @@ #### ScoreBoard.items -Массив со всеми отсортированными элементами скорборда +Массив со всеми отсортированными элементами скорборда. + +Пример: + ```js [ { name: 'dzikoysk', value: 6 }, @@ -666,83 +697,169 @@ ] ``` +### mineflayer.Team + +#### Team.name + +Название команды. + +#### Team.friendlyFire + +Определяет, включен ли огонь по своим. + +#### Team.nameTagVisibility + +Может быть `always`, `hideForOtherTeams`, `hideForOwnTeam`. + +#### Team.collisionRule + +Может быть `always`, `pushOtherTeams`, `pushOwnTeam`. + +#### Team.color + +Цвет (или форматирование) названия команды, например `dark_green`, `red`, `underlined`. + +#### Team.prefix + +Компонент чата, содержащий префикс команды. + +#### Team.suffix + +Компонент чата, содержащий суффикс команды. + +#### Team.members + +Массив с участниками команды. Ники игроков и UUID существ. + ### mineflayer.BossBar #### BossBar.title -Название боссбара, передается в `ChatMessage` +Название боссбара, передается в `ChatMessage`. #### BossBar.health -Количество здоровья от `0` до `1`. Пример: ( 0.9873 ) +Количество здоровья от `0` до `1`. #### BossBar.dividers -Количество ячеек, является одним числом из `0`, `6`, `10`, `12`, `20` +Количество ячеек, может быть `0`, `6`, `10`, `12`, `20`. #### BossBar.entityUUID -UIID босса +UUID существа, который определяется боссом. #### BossBar.shouldDarkenSky -Определяет, стоит ли затемнять небо +Определяет, стоит ли затемнять небо. #### BossBar.isDragonBar -Определяет, является ли боссбар - боссбаром Дракона Края +Определяет, является ли боссбар - боссбаром Дракона Края. #### BossBar.createFog -Определяет, стоит ли создават туман +Определяет, стоит ли создават туман. #### BossBar.color -Определяет цвет боссбара `pink`, `blue`, `red`, `green`, `yellow`, `purple`, `white` ("розовый", "голубой", "красный", "желтый", "фиолетовый", "белый") +Определяет цвет боссбара. Может быть `pink`, `blue`, `red`, `green`, `yellow`, `purple`, `white`. + +### mineflayer.Particle + +#### Particle.id + +Идентификатор частицы, который прописан в [протоколе](https://wiki.vg/Protocol#Particle). + +#### Particle.name + +Название частицы, которое прописано в [протоколе](https://wiki.vg/Protocol#Particle). + +#### Particle.position + +Расположение частицы в Vec3. + +#### Particle.offset + +Смещение частицы в Vec3. + +#### Particle.longDistanceRender + +Определяет, следует ли принудительно отображать частицу, несмотря на настройки частиц клиента, и увеличивает максимальную дальность прорисовки с 256 до 65536. + +#### Particle.count + +Количество созданных частиц. + +#### Particle.movementSpeed + +Скорость частиц в случайном направлении. ## Bot ### mineflayer.createBot(options) -Create and return an instance of the class bot. -`options` это объект, который содержит в себе : - * username : по умолчанию "Player" - * port : по умолчанию 25565 - * password : может быть пропущен, если подключение осуществляется к пиратскому серверу - * host : default to localhost - * version : по умолчанию установлен автоопределитель версии сервера. Пример использования : "1.12.2" - * clientToken : генерируется, если задан пароль - * accessToken : генерируется, если задан пароль - * logErrors : установлен по умолчанию, используется для отлова ошибок - * keepAlive : отправка пакета активности, по умолчанию активен - * checkTimeoutInterval : по умолчанию `30*1000` (30 сек.), не используется если не используется keepAlive - * loadInternalPlugins : по умолчанию активен - * plugins : объект : по умолчанию {} - - pluginName : false : не загружать плагин с заданным именем. `pluginName` - - pluginName : true : загрузить плагин с заданным именем. `pluginName` даже если loadInternalplugins отключен - - pluginName : external plugin inject function : загружает сторонний плагин, задает новое имя плагина при активном существущем - * [chat](bot.settings.chat) - * [colorsEnabled](bot.settings.colorsEnabled) - * [viewDistance](bot.settings.viewDistance) - * [difficulty](bot.settings.difficulty) - * [showCape](bot.settings.skinParts.showCape) - * [showJacket](bot.settings.skinParts.showJacket) - * [showLeftSleeve](bot.settings.skinParts.showLeftSleeve) - * [showRightSleeve](bot.settings.skinParts.showRightSleeve) - * [showLeftPants](bot.settings.skinParts.showLeftPants) - * [showRigthtPants](bot.settings.skinParts.showRightPants) - * [showHat](bot.settings.skinParts.showHat) - * chatLengthLimit : максимальное количество символов, отправляемое в чат. Если не установлено, будет установлено следующее: 100 в < 1.11 и 256 в >= 1.11. +Создаёт и возвращает экземпляр класса бота. +`options` - это объект, который содержит в себе : + * `username` : Ник игрока, по умолчанию `"Player"`. + * `port` : Порт сервера, по умолчанию `25565`. + * `password` : Пароль может быть пропущен, если подключение осуществляется к пиратскому серверу. + * `host` : Айпи сервера, по умолчанию `"localhost"`. + * `version` : По умолчанию версия сервера определяется автоматически. Пример использования : `"1.12.2"`. + * `auth` : Вид аутентификации, по умолчанию `"mojang"`, может быть `"microsoft"`. + * `clientToken` : Генерируется, если задан пароль. + * `accessToken` : Генерируется, если задан пароль. + * `logErrors` : По умолчанию включено, используется для отлова и логирования ошибок. + * `hideErrors` : По умолчанию включено, не логирует ошибки (даже если включен `logErrors`). + * `keepAlive` : Отправка пакета активности, по умолчанию включено. + * `checkTimeoutInterval` : По умолчанию `30*1000` (30 сек.), проверяет, получен ли пакет активности, иначе отключается. + * `loadInternalPlugins` : Загрузка плагинов, по умолчанию включено. + * `storageBuilder` : Необязательная функция, принимающая в качестве аргумента версию и название мира (`worldName`) и возвращающая экземпляр чего-либо с тем же API, что и `prismarine-provider-anvil`. Будет использовано для сохранения мира. + * `client` : Экземпляр `node-minecraft-protocol`, если не указан, mineflayer создает свой собственный клиент. Это может быть нужно для использования mineflayer через прокси многих клиентов или ванильного клиента и mineflayer клиента. + * `brand` : Название версии, которое будет использовать клиент. По умолчанию `vanilla`. Может использоваться для имитации пользовательских клиентов для серверов, которым это требуется. + * `respawn` : Отвечает за автоматическое возрождение бота, по умолчанию включено. + * `plugins` : Объект : По умолчанию `{}` + - `pluginName` : `false` : Не загружать плагин с заданным именем `pluginName`. + - `pluginName` : `true` : Загрузить плагин с заданным именем `pluginName`, даже если `loadInternalplugins` отключен. + - `pluginName` : Функция ввода внешнего плагина : загружает сторонний плагин, переопределяет внутренний плагин с заданным именем `pluginName`. + * `physicsEnabled` : По умолчанию включено. Должна ли физика влиять на бота? Можно изменить с помощью `bot.physicsEnabled`. + * [chat](#bot.settings.chat) + * [colorsEnabled](#bot.settings.colorsEnabled) + * [viewDistance](#bot.settings.viewDistance) + * [difficulty](#bot.settings.difficulty) + * [skinParts](#bot.settings.skinParts) + * [enableTextFiltering](#bot.settings.enableTextFiltering) + * [enableServerListing](#bot.settings.enableServerListing) + * `chatLengthLimit` : Максимальное количество символов, отправляемое в чат. Если не установлено, будет установлено следующее: 100 в < 1.11 и 256 в >= 1.11. + * `defaultChatPatterns`: По умолчанию включено, добавляет шаблоны, такие как общий чат и личные сообщения. ### Properties +#### bot.registry + +Экземпляр `minecraft-data` используемый ботом. Передайте это конструкторам, которые ожидают `minecraft-data`, таким как `prismarine-block`. + +#### bot.world + +Синхронное представление мира. Смотрите [prismarine-world](http://github.com/PrismarineJS/prismarine-world). + +##### world "blockUpdate" (oldBlock, newBlock) + +Срабатывает при обновлении блока. `oldBlock` и `newBlock` предоставляются для сравнения. +`oldBlock` может быть `null` при обычном обновлении блока. + +##### world "blockUpdate:(x, y, z)" (oldBlock, newBlock) + +Срабатывает в определенной точке. `oldBlock` и `newBlock` предоставляются для сравнения. Все слушатели получают `null` для `oldBlock` и `newBlock` и автоматически удаляются при выгрузке мира. +`oldBlock` может быть `null` при обычном обновлении блока. + #### bot.entity Ваше собственное существо. Смотрите `Entity`. #### bot.entities -Все ближайшие существа. +Все близлежащие существа. Этот объект представляет собой сопоставление `entityId` с `entity`. #### bot.username @@ -750,23 +867,59 @@ Create and return an instance of the class bot. #### bot.spawnPoint -Показывает координаты спавна бота +Показывает координаты спавна бота, на которые указывает компас. + +#### bot.heldItem + +Предмет, который держит бот. Представляет экземпляр [prismarine-item](https://github.com/PrismarineJS/prismarine-item), основанный на мета-данных, нбт-данных и т.д. + +#### bot.usingHeldItem + +Использует ли бот предмет, который он держит в руках, например, ест пищу или использует щит. #### bot.game.levelType +Тип генерации. + #### bot.game.dimension +Текущее измерение бота, может быть `overworld`, `the_end` или `the_nether`. + #### bot.game.difficulty +Сложность на сервере. + #### bot.game.gameMode +Игровой режим. + #### bot.game.hardcore +Включен ли режим хардкода. + #### bot.game.maxPlayers +#### bot.game.serverBrand + +Ядро сервера. + +#### bot.game.minY + +Минимальная высота Y в мире. + +#### bot.game.height + +Максимальная высота мира. + +#### bot.physicsEnabled + +Включает физику бота, по умолчанию `true`. + ### bot.player -Объект игрока +Объект игрока. + +Пример: ```js { username: 'player', @@ -777,111 +930,217 @@ Create and return an instance of the class bot. } ``` +Пинг игрока изначально равен `0`, нужно подождать, пока сервер отправит его пинг. + #### bot.players -Показывает всех игроков, которые находятся на сервере +Показывает всех игроков, которые находятся на сервере. + +#### bot.tablist + +Объект таблиста бота, содержит `header` и `footer`. + +Пример: +```js +{ + header: { toString: Function }, // Объект ChatMessage. + footer: { toString: Function } // Объект ChatMessage. +} +``` #### bot.isRaining +Определяет, идёт ли дождь. + +#### bot.rainState + +Число, указывающее текущий уровень дождя. Когда дождя нет, значение будет равно 0. Когда начнется дождь, значение будет постепенно увеличиваться до 1. Когда дождь прекращается, значение постепенно возвращается к 0. + +Каждый раз, когда изменяется `bot.rainState`, срабатывает событие `"weatherUpdate"`. + +#### bot.thunderState + +Число, указывающее текущий уровень грозы. Когда грозы нет, значение будет равно 0. Когда начнется гроза, значение будет постепенно увеличиваться до 1. Когда гроза прекращается, значение постепенно возвращается к 0. + +Каждый раз, когда изменяется `bot.thunderState`, срабатывает событие `"weatherUpdate"`. + +Это то же самое, что и `bot.rainState`, но для грозы. +Во время грозы изменяются значения `bot.rainState` и `bot.thunderState`. + #### bot.chatPatterns -Массив шаблонов следующего формата: -{ /regex/, "chattype", "description") - * /regex/ - шаблон регулярного выражения, который должен иметь как минимум две группы захвата - * 'chattype' - тип чата, который может является "chat" или "whisper" - * 'description' - описание шаблона, необязательно +Массив шаблонов следующего формата: [/regex/, "chattype", "description"] + + * `/regex/` - Шаблон регулярного выражения, который должен иметь как минимум две группы. + * `'chattype'` - Тип чата, который может является "chat" или "whisper". + * `'description'` - Описание шаблона, необязательно. #### bot.settings.chat Выбор: - * `enabled` (default) - * `commandsOnly` - * `disabled` + * `enabled` - Включен (по умолчанию). + * `commandsOnly` - Только команды. + * `disabled` - Выключен. #### bot.settings.colorsEnabled -По умолчанию активен, используется для отображения кодов цветов +По умолчанию активно, используется для отображения цветов в чате. #### bot.settings.viewDistance -Выбор: - * `far` (по умолчанию) - * `normal` - * `short` - * `tiny` +Выбор прорисовки: + * `far` - Дальняя (по умолчанию). + * `normal` - Нормальная. + * `short` - Малая. + * `tiny` - Минимальная. #### bot.settings.difficulty -Вернет то же, что и в server.properties. +Сложность. Вернет то же, что и в `server.properties`. + +#### bot.settings.skinParts + +Должны ли отображаться дополнительные детали скинов игроков. + +#### bot.settings.skinParts.showCape - boolean + +Отображение плаща. + +##### bot.settings.skinParts.showJacket - boolean + +Отображение куртки. -#### bot.settings.skinParts.showCape +##### bot.settings.skinParts.showLeftSleeve - boolean -Если у вас есть плащ, вы можете отключить его, установив для него значение false. +Отображение левого рукава. -#### bot.settings.skinParts.showJacket +##### bot.settings.skinParts.showRightSleeve - boolean -#### bot.settings.skinParts.showLeftSleeve +Отображение правого рукава. -#### bot.settings.skinParts.showRightSleeve +##### bot.settings.skinParts.showLeftPants - boolean -#### bot.settings.skinParts.showLeftPants +Отображение левой штанины. -#### bot.settings.skinParts.showRightPants +##### bot.settings.skinParts.showRightPants - boolean -#### bot.settings.skinParts.showHat +Отображение правой штанины. + +##### bot.settings.skinParts.showHat - boolean + +Отображение головного убора. + +#### bot.settings.enableTextFiltering - boolean + +Не используется. По умолчанию выключен в ванильном клиенте. + +#### bot.settings.enableServerListing - boolean + +Этот параметр отправляется на сервер, чтобы определить, должен ли игрок отображаться в списке серверов. #### bot.experience.level +Уровень опыта. + #### bot.experience.points Общее количество очков опыта. #### bot.experience.progress -От 0 до 1 - сумма для перехода на следующий уровень. +Значение от `0` до `1` - число для перехода на следующий уровень. #### bot.health -Число от 0 до 20. Каждое число является половиной ячейки здоровья в игре +Число от `0` до `20`. Каждое число является половиной ячейки здоровья в игре. #### bot.food -Число от 0 до 20. Каждое число является половиной ячейки голода в игре +Число от `0` до `20`. Каждое число является половиной ячейки голода в игре. #### bot.foodSaturation -Покажет насыщенность голода. Голод не уменьшается -если насыщенность больше нуля. Игроки, зашедшие на сервер, автоматически получают -насыщенность 5,0. Еда увеличивает как насыщенность так и голод +Показывает насыщенность. Голод не уменьшается, если насыщенность больше нуля. Игроки, зашедшие на сервер, автоматически получают насыщенность `5,0`. Еда увеличивает как насыщенность, так и голод. + +#### bot.oxygenLevel +Число от `0` до `20`. Каждое число отображает количество значков воды, известных как уровень кислорода. #### bot.physics -Изменение значений скорости, отдачи, скорости прыжка и т.д +Изменение значений скорости, отдачи, скорости прыжка и т.д. Изменяйте на свой страх и риск! -#### bot.time.day +#### bot.simpleClick.leftMouse (slot) + +То же, что и `bot.clickWindow(slot, 0, 0)`. + +#### bot.simpleClick.rightMouse (slot) + +То же, что и `bot.clickWindow(slot, 1, 0)`. + +#### bot.time.doDaylightCycle + +Отображает включено ли игровое правило `doDaylightCycle`. + +#### bot.time.bigTime + +Количество тиков с нулевого дня в мире. + +Это значение имеет тип `BigInt` и является точным даже при очень больших значениях (более 2^51 - 1 тиков). + +#### bot.time.time + +Количество тиков с нулевого дня в мире. + +Поскольку ограничение `Number` в Javascript составляет 2^51 - 1, значение `bot.time.time` становится неточным при превышении этого ограничения, рекомендуется использовать `bot.time.bigTime`. +Вероятно вам никогда не понадобится `bot.time.bigTime`, так как 2^51 - 1 тиков это примерно 14280821 настоящих лет. + +#### bot.time.timeOfDay Время суток в тиках. -Время основано на тиках, где каждую секунду происходит 20 тиков. 24000 в Майнкрафте -являются 20 минутам реальной игры +Время основано на тиках, где каждую секунду происходит 20 тиков. 24000 тиков - 1 игровой день, или же 20 реальных минут. + +Время суток основано на тиках. `0` - восход, `6000` - полдень, `12000` - закат, а `18000` - полночь. -Время суток основано на тиках. 0 - восход, 6000 -полдень, 12000 - закат, а 18000 - полночь. +#### bot.time.day + +Отображает, какой день в мире. + +#### bot.time.isDay + +Определяет, сейчас день (`true`) или ночь (`false`). + +Основано на времени между `13000` и `23000` тиками. + +#### bot.time.moonPhase + +Фаза луны. + +Значение от `0` до `7`, где `0` - полнолуние. + +#### bot.time.bigAge + +Возраст мира в тиках. + +Это значение имеет тип `BigInt` и является точным даже при очень больших значениях. (более 2^51 - 1 тиков) #### bot.time.age -Возраст мира в тиках +Возраст мира в тиках. + +Поскольку ограничение `Number` в Javascript составляет 2^51 - 1, значение `bot.time.age` становится неточным при превышении этого ограничения, рекомендуется использовать `bot.time.bigAge`. +Вероятно вам никогда не понадобится `bot.time.bigAge`, так как 2^51 - 1 тиков это примерно 14280821 настоящих лет. #### bot.quickBarSlot -Показывает, какой слот сейчас активен ( 0 - 8 ) +Показывает, какой слот сейчас выбран (0-8). #### bot.inventory -Является `Window`, отображающий ваш инвентарь. +Экземпляр [`Window`](https://github.com/PrismarineJS/prismarine-windows#windowswindow-base-class), который представляет ваш инвентарь. #### bot.targetDigBlock @@ -889,400 +1148,597 @@ Create and return an instance of the class bot. #### bot.isSleeping -Возвращает true или false, в зависимости от того, -лежите вы в кровати или нет +Возвращает `true` или `false`, в зависимости от того, +лежите вы в кровати или нет. #### bot.scoreboards -Показывает все известные скорборды +Показывает все скорборды в виде объекта: `name -> scoreboard`. #### bot.scoreboard -Показывает все скорборды в "Object" +Показывает все скорборды в виде объекта: `scoreboard displaySlot -> scoreboard`. + + * `belowName` - Cкорборд размещен снизу никнейма. + * `sidebar` - Cкорборд размещен на боковой панели. + * `list` - Cкорборд помещен в список игроков. + * `0-18` - Cлоты, определённые в [протоколе](https://wiki.vg/Protocol#Display_Scoreboard). + +#### bot.teams - * `belowName` - скорборд размещен снизу - * `sidebar` - скорборд размещен на боковой панели - * `list` - скорборд помещен в список - * `0-18` - слоты, определенные в [протоколе](https://wiki.vg/Protocol#Display_Scoreboard) +Все команды (Подобно `/team list`). + +#### bot.teamMap + +Список участников команды. Использует никнеймы для игроков и UUID для существ. #### bot.controlState -Обьект, который осуществляет управление ['forward', 'back', 'left', 'right', 'jump', 'sprint', 'sneak'] -Или же ['вперед', 'назад', 'влево', 'вправо', 'прыгнуть', 'бежать', 'сесть'] (Не использовать в методе) +Объект, состоящий из основных элементов управления: ['forward', 'back', 'left', 'right', 'jump', 'sprint', 'sneak']. -Подробнее [bot.setControlState](#botsetcontrolstatecontrol-state). +Установка значения для этого объекта вызовет [bot.setControlState](#botsetcontrolstatecontrol-state). ### Events #### "chat" (username, message, translate, jsonMsg, matches) -При обращении в чате +При получении сообщения в чате от игрока. - * `username` - имя отправителя (сравните с bot.username, если вы не хотите видет собственные сообщения) - * `message` - сообщение (очищенно от всех цветовых кодов) - * `translate` - Тип сообщение. В большинстве случаев является null - * `jsonMsg` - сообщение в JSON - * `matches` - массив совпадений в регулярных выражениях. Может являтся null + * `username` - Имя отправителя (сравните с `bot.username`, если вы не хотите видеть собственные сообщения). + * `message` - Сообщение, очищенное от всех цветовых кодов. + * `translate` - Тип сообщения. В большинстве случаев является `null`. + * `jsonMsg` - Сообщение в формате JSON. + * `matches` - Массив совпадений в регулярных выражениях. Может являться `null`. #### "whisper" (username, message, translate, jsonMsg, matches) -При обращении в ЛС - * `username` - имя отправителя - * `message` - сообщение (очищенно от всех цветовых кодов) - * `translate` - Тип сообщение. В большинстве является null - * `jsonMsg` - сообщение в JSON - * `matches` - массив совпадений в регулярных выражениях. Может являтся null +При получении сообщения в личных сообщениях от игрока. + + * `username` - И отправителя. + * `message` - Сообщение, очищенное от всех цветовых кодов. + * `translate` - Тип сообщения. В большинстве является `null`. + * `jsonMsg` - Сообщение в формате JSON. + * `matches` - Массив совпадений в регулярных выражениях. Может являться `null`. + +#### "actionBar" (jsonMsg, verified) + +При появлении сообщения от сервера над хотбаром. + + * `jsonMsg` - Сообщение в формате JSON. + * `verified` - Если не подтверждено - `null`, если подтверждено и правильно - `true`, если подтверждено, но не правильно - `false`. + +#### "message" (jsonMsg, position, sender, verified) + +При появлении любого серверного сообщения, включая чаты. -#### "actionBar" (jsonMsg) + * `jsonMsg` - Объект [ChatMessage](https://github.com/PrismarineJS/prismarine-chat) содержащий форматированное сообщение. Дополнительно может обладать следующими свойствами: + * unsigned - Неподтверждённый объект `ChatMessage`. Только для версий 1.19.2+, когда сервер разрешает "небезопасный" чат или сервер изменяет сообщения без подписи игрока. + * `position` - (> = 1.8.1): Положение сообщения в чате может быть + * `chat` + * `system` + * `game_info` + * `sender` - UUID отправителя, если известно (1.16+), иначе `null`. + * `verified` - Если не подтверждено - `null`, если подтверждено и правильно - `true`, если подтверждено, но не правильно - `false`. -При появлении в панели действия +#### "messagestr" (message, messagePosition, jsonMsg, sender, verified) - * `jsonMsg` - сообщение в JSON +То же самое, что и `"message"`, но вызывает `.toString()` в объекте `prismarine-message`, чтобы сразу получить сообщение. -#### "message" (jsonMsg, position) + * `sender` - UUID отправителя, если известно (1.16+), иначе `null`. + * `verified` - Если не подтверждено - `null`, если подтверждено и правильно - `true`, если подтверждено, но не правильно - `false`. -При появлении любого серверного сообщения, включая чаты +#### "inject_allowed" - * `jsonMsg` - сообщение в JSON - * `position` - (> = 1.8.1): положение сообщения чата может быть - * Чат - * Система - * информация об игре +Срабатывает, когда главный файл загружен, здесь вы можете загрузить `mcData` и плагины, но лучше подождать ивент `"spawn"`. #### "login" -Срабатывает при успешном подключении к серверу -Отличается от "spawn" +Срабатывает при успешном подключении к серверу. +Возможно, вам потребуется дождаться ивента `"spawn"`, прежде чем что-либо делать на сервере. #### "spawn" -Выдается один раз после того, как вы вошли на сервер -и каждый раз, после смерти. +Срабатывает один раз после того, как вы вошли на сервер и появились в мире, а также срабатывает при респавне после смерти. + +В большинстве случаев это событие, которое вы хотите прослушать, прежде чем что-либо делать на сервере. #### "respawn" -Срабатывает при появлении в мире -Обычно используется вызов "spawn" +Срабатывает при смене миров и после появления в мире. +В большинстве случаев вам нужно сначала дождаться ивента `"spawn"` вместо этого. #### "game" -Срабатывает, если сервер меняет свойства в server.properties +Срабатывает, если сервер меняет свойства в `server.properties`. + +#### "resourcePack" (url, hash) + +Срабатывает, когда сервер отправляет ресурспак. #### "title" -Срабатывает, когда сервер отправляет заголовок +Срабатывает, когда сервер отправляет текст по центру экрана. - * `text` - заголовок текста + * `text` - Текст на экране. #### "rain" Срабатывает, когда начинается или прекращается дождь. Если вы присоединитесь к серверу, на котором уже идет дождь, это событие также сработает. +#### "weatherUpdate" + +Срабатывает, когда `bot.thunderState` или `bot.rainState` изменяются. +Если вы присоединитесь к серверу, на котором уже идет дождь, это событие также сработает. + #### "time" -Срабатывает, когда сервер принудительно обновляет время. Смотрите `bot.time`. +Срабатывает, когда сервер отправляет время. Смотрите `bot.time`. #### "kicked" (reason, loggedIn) -Срабатывает при отключении от сервера. `reason` -выводит причину отключения. `loggedIn` -является `true`, если вы были кикнуты после успешного входа в систему, -или `false`, если отключение произошло во время подключения +Срабатывает при кике с сервера. + + * `reason` - Причина отключения. + * `loggedIn` - `true`, если вы были кикнуты после успешного входа на сервер, или `false`, если отключение произошло во время подключения. -#### "end" +#### "end" (reason) -Срабатывает, когда вы отключены от сервера +Срабатывает, когда вы отключены от сервера. + + * `reason` - причина отключения. (обычно `'socketClosed'`) + +#### "error" (err) + +Срабатывает, когда происходит какая-либо ошибка. #### "spawnReset" -Срабатывает, когда вы не можете заспавнится у своей кровати, и ваша точка появления сбрасывается +Срабатывает, когда вы не можете заспавниться у своей кровати, и ваша точка появления сбрасывается. #### "death" -Срабатывает, когда вы умерли +Срабатывает, когда вы умираете. #### "health" -Срабатывает, когда значения здоровья или голода изменяются +Срабатывает, когда значения здоровья или голода изменяются. + +#### "breath" + +Срабатывает, когда значение запаса воздуха изменяется. + +#### "entityAttributes" (entity) + +Срабатывает при изменении атрибутов (свойств) существа. + #### "entitySwingArm" (entity) #### "entityHurt" (entity) +#### "entityDead" (entity) +#### "entityTaming" (entity) +#### "entityTamed" (entity) +#### "entityShakingOffWater" (entity) +#### "entityEatingGrass" (entity) +#### "entityHandSwap" (entity) #### "entityWake" (entity) #### "entityEat" (entity) +#### "entityCriticalEffect" (entity) +#### "entityMagicCriticalEffect" (entity) #### "entityCrouch" (entity) #### "entityUncrouch" (entity) -#### "entityEquipmentChange" (entity) +#### "entityEquip" (entity) #### "entitySleep" (entity) #### "entitySpawn" (entity) +#### "itemDrop" (entity) #### "playerCollect" (collector, collected) -Если существо подняло предмет +Если существо подняло предмет. - * `collector` - существо, поднявшее предмет - * `collected` - существо, которое являлось поднятым предметом + * `collector` - Существо, поднявшее предмет. + * `collected` - Существо, которое являлось поднятым предметом. #### "entityGone" (entity) #### "entityMoved" (entity) #### "entityDetach" (entity, vehicle) #### "entityAttach" (entity, vehicle) -Если существо сидит в транспортном средстве, -таком как лодка, вагонетка +Если существо сидит в транспортном средстве, таком как лодка или вагонетка. - * `entity` - существо, которое сидит в транспортном средстве - * `vehicle` - существо, которое является транспортным средством + * `entity` - Существо, которое сидит в транспортном средстве. + * `vehicle` - Существо, которое является транспортным средством. #### "entityUpdate" (entity) #### "entityEffect" (entity, effect) #### "entityEffectEnd" (entity, effect) #### "playerJoined" (player) +#### "playerUpdated" (player) #### "playerLeft" (player) #### "blockUpdate" (oldBlock, newBlock) -Срабатывает, когда блок обновлен. `oldBlock` и` newBlock` могут сравниватся +(Лучше использовать этот ивент от `bot.world`, чем напрямую от бота) +Срабатывает при обновлении блока. `oldBlock` и `newBlock` можно сравнить. Стоит заметить, что `oldBlock` может быть `null`. #### "blockUpdate:(x, y, z)" (oldBlock, newBlock) -Срабатывает при обновлении блока в определенном месте. `oldBlock` и` newBlock` могут сравниватся +(Лучше использовать этот ивент от `bot.world`, чем напрямую от бота) +Срабатывает при обновлении блока в определенном месте. `oldBlock` и `newBlock` можно сравнить. + +Стоит заметить, что `oldBlock` может быть `null`. + +#### "blockPlaced" (oldBlock, newBlock) + +Срабатывает при установке блока. `oldBlock` и `newBlock` можно сравнить. Стоит заметить, что `oldBlock` может быть `null`. #### "chunkColumnLoad" (point) #### "chunkColumnUnload" (point) -Fires when a chunk has updated. `point` is the coordinates to the corner -of the chunk with the smallest x, y, and z values. +Срабатывает при обновлении чанка. `point` является координатами угла чанка с наименьшими значениями `x`, `y`, и `z`. #### "soundEffectHeard" (soundName, position, volume, pitch) -Срабатывает, когда вы слышите звуковой эффект +Срабатывает, когда вы слышите звуковой эффект. - * `soundName`: имя звукового эффекта - * `position`: координаты, где был проигран звук - * `volume`: уровень звука, 1.0 является 100% - * `pitch`: искажение звука, 63 является 100% + * `soundName` - Имя звукового эффекта. + * `position` - Координаты в виде `Vec3`, где был проигран звук. + * `volume` - Уровень звука в виде `float`, `1.0` является 100%. + * `pitch` - Искажение звука в виде `integer`, `63` является 100%. #### "hardcodedSoundEffectHeard" (soundId, soundCategory, position, volume, pitch) -Срабатывает, когда вы слышите сильной искаженный звуковой эффект +Срабатывает, когда вы слышите нестандартный звуковой эффект. - * `soundId`: ID имя звукового эффекта - * `soundCategory`: категория звукового эффекта - * `position`: координаты, где был проигран звук - * `volume`: уровень звука, 1.0 является 100% - * `pitch`: Искажение звука, 63 является 100% + * `soundId` - ID звукового эффекта. + * `soundCategory` - Категория звукового эффекта. + * `position` - Координаты в виде `Vec3`, где был проигран звук. + * `volume` - Уровень звука в виде `float`, `1.0` является 100%. + * `pitch` - Искажение звука в виде `integer`, `63` является 100%. #### "noteHeard" (block, instrument, pitch) -Срабатывает, когда был проигран звук нотного блока +Срабатывает, когда был проигран звук нотного блока. - * `block`: имя блока - * `instrument`: - - `id`: определенный ID - - `name`: один из видов звука [`harp`, `doubleBass`, `snareDrum`, `sticks`, `bassDrum`]. - * `pitch`: Высота ноты (от 0 до 24 включительно, где 0 - это -    самый низкий, а 24 - самый высокий). Больше информации о том можно найти на - [оффициальном Minecraft wiki](http://www.minecraftwiki.net/wiki/Note_Block). + * `block` - Блок, который проиграл звук. + * `instrument`: Объект + - `id` : ID в виде `integer`. + - `name` : Один из видов звука. + * `pitch` - Высота ноты (от 0 до 24 включительно, где 0 - это самая низкая, а 24 - самая высокая). Больше информации об этом можно найти на [оффициальной Minecraft википедии](http://www.minecraftwiki.net/wiki/Note_Block). #### "pistonMove" (block, isPulling, direction) -#### "chestLidMove" (block, isOpen) +#### "chestLidMove" (block, isOpen, block2) +* `block` - Блок, который был открыт. Если это двойной сундук - то отмечается правый блок. +* `isOpen` - Число игроков, открывших сундук. 0, если он закрыт. +* `block2`: Второй блок, который является частью двойного сундук. `null`, если это не двойной сундук. -#### "blockBreakProgressObserved" (block, destroyStage) +#### "blockBreakProgressObserved" (block, destroyStage, entity) Срабатывает, когда вы наблюдаете процесс разрушения блока - * `block`: имя блока, который ломается - * `destroyStage`: уровень прогресса (0 - 9) + * `block` - Блок, который ломают. + * `destroyStage` - Уровень прогресса (0-9). + * `entity` - Существо, которое ломает блок. -#### "blockBreakProgressEnd" (block) +#### "blockBreakProgressEnd" (block, entity) Срабатывает, когда процесс разрушения блока прекращен. -Происходит при прекращении разрушения блока или его полного разрушения +Происходит при прекращении разрушения блока или после его полного разрушения. - * `block`: имя блока, процесс разрушения которого был прекращен + * `block` - Блок, который перестали ломать. + * `entity` - Существо, которое перестало ломать блок. #### "diggingCompleted" (block) - * `block` - блок, который больше не существует + * `block` - Блок, который был разрушен. #### "diggingAborted" (block) - * `block` - блок, который все ещё существует + * `block` - Блок, который не был разрушен. #### "move" -Срабатывает при движении бота. Если вы хотите узнать текущее положение, используйте -`bot.entity.position` если вы хотите узнать предыдущее положение, используйте -`bot.entity.position.minus(bot.entity.velocity)`. +Срабатывает при движении бота. Если вы хотите узнать текущее положение, используйте `bot.entity.position`, если вы хотите узнать предыдущее положение, используйте `bot.entity.position.minus(bot.entity.velocity)`. #### "forcedMove" -Срабатывает при принудительном перемещении бота (телепорт, спавн). Если вы хотите узнать текущее положение, используйте -`bot.entity.position`. +Срабатывает при принудительном перемещении бота сервером (телепорт, спавн и т.д.). Если вы хотите узнать текущее положение, используйте `bot.entity.position`. #### "mount" -Срабатывает, если вы устанавливаете объект, например тележку. Чтобы получить доступ к ней, +Срабатывает, если вы поставили существо, например вагонетку. Чтобы получить доступ к ней, используйте `bot.vehicle`. -Чтобы установить её, используйте `mount`. +Чтобы сесть в неё, используйте `mount`. #### "dismount" (vehicle) -Срабатывает, если вы слезли с существа +Срабатывает, если вы слезли с существа. #### "windowOpen" (window) -Срабатывает, если вы используете верстак, сундук и т.д +Срабатывает, если вы открываете верстак, сундук и т.д. #### "windowClose" (window) -Срабатывает, если вы закрыли верстак, сундук и т.д +Срабатывает, если вы закрыли верстак, сундук и т.д. #### "sleep" -Срабатывает, если вы лягли спать +Срабатывает, если вы легли спать. #### "wake" -Срабатывает, если вы проснулись +Срабатывает, если вы проснулись. #### "experience" -Срабатывает, если значение `bot.experience.*` было обновлено +Срабатывает, если значение `bot.experience.*` было обновлено. #### "scoreboardCreated" (scoreboard) -Срабатывает, если скорборд был создан +Срабатывает, если скорборд был создан. #### "scoreboardDeleted" (scoreboard) -Срабатывает, если скорборд был удален +Срабатывает, если скорборд был удален. #### "scoreboardTitleChanged" (scoreboard) -Срабатывает, если скорборд был обновлен +Срабатывает, если название скорборда было обновлено. #### "scoreUpdated" (scoreboard, item) -Срабатывает, если значение в скорборде было обновлено +Срабатывает, если значение в скорборде было обновлено. #### "scoreRemoved" (scoreboard, item) -Срабатывает, если значение в скорборде было удалено +Срабатывает, если значение в скорборде было удалено. #### "scoreboardPosition" (position, scoreboard) -Срабатывает, если позиция скорборда была обновлена +Срабатывает, если позиция скорборда была обновлена. + +#### "teamCreated" (team) + +Срабатывает, если команда была создана. + +#### "teamRemoved" (team) + +Срабатывает, если команда была удалена. + +#### "teamUpdated" (team) + +Срабатывает, если команда была обновлена. + +#### "teamMemberAdded" (team) + +Срабатывает, если участник(и) были добавлены в команду. + +#### "teamMemberRemoved" (team) + +Срабатывает, если участник(и) были удалены из команды. #### "bossBarCreated" (bossBar) -Срабатывает, если боссбар был создан +Срабатывает, если боссбар был создан. #### "bossBarDeleted" (bossBar) -Срабатывает, если боссбар был удален +Срабатывает, если боссбар был удален. #### "bossBarUpdated" (bossBar) -Срабатывает, если боссбар был обновлен +Срабатывает, если боссбар был обновлен. + +#### "heldItemChanged" (heldItem) + +Срабатывает, если предмет в руке был изменён. + +#### "physicsTick" () + +Срабатывает каждый тик, если `bot.physicsEnabled` включен. + +#### "chat:name" (matches) + +Срабатывает, если все регулярные выражения шаблона чата совпадают. + +#### "particle" + +Срабатывает, если появилась частица. ### Functions -#### bot.blockAt(point) +#### bot.blockAt(point, extraInfos=true) -Возвращает блок в `point` или `null`, если эта точка не загружена +Возвращает блок в `point` или `null`, если эта точка не загружена. Если значение `extraInfos` равно `true`, возращает информацию о табличках, картинах, сундуках, шалкерах и т.д. (медленнее). Смотрите `Block`. +#### bot.waitForChunksToLoad() + +Эта функция возвращает `Promise` с `void` в качестве аргумента, когда все чанки были загружены. + #### bot.blockInSight(maxSteps, vectorLength) -Возвращает блок, на который смотрит бот, либо `null` - * `maxSteps` - количество блоков, по умолчанию 256. - * `vectorLength` - длина вектора, по умолчанию `5/16`. +Неподдерживается, используйте `blockAtCursor`. + +Возвращает блок, на который смотрит бот, либо `null`. + + * `maxSteps` - Количество блоков, по умолчанию 256. + * `vectorLength` - Длина вектора, по умолчанию `5/16`. + +#### bot.blockAtCursor(maxDistance=256) + +Возвращает блок, на который смотрит бот, либо `null`. + * `maxDistance` - Максимальное расстояние от глаз до блока, по умолчанию 256. + +#### bot.entityAtCursor(maxDistance=3.5) + +Возвращает существо, на которое смотрит бот, либо `null`. + * `maxDistance` - Максимальное расстояние от глаз до существа, по умолчанию 3,5. + +#### bot.blockAtEntityCursor(entity=bot.entity, maxDistance=256) + +Возвращает блок, на который смотрит существо, либо `null`. + * `entity` - Существо в виде `Object`. + * `maxDistance` - Максимальное расстояние от глаз до блока, по умолчанию 256. #### bot.canSeeBlock(block) -Возвращает true или false, в зависимости от того, -видит ли бот указанный блок, или нет +Возвращает `true` или `false`, в зависимости от того, +видит ли бот указанный блок, или нет. -#### bot.findBlock(options) +#### bot.findBlocks(options) -Находит ближайший блок, указанный в точке - * `options` - Дополнительные параментры для поиска: - - `point` -Начальная точка для поиска. - - `matching` - Функция, которая возвращает true, если указанный блок найден. Значение является ID блока, или массивом ID блоков - - `maxDistance` - Максимальная дистанция поиска, по умолчанию 16. +Находит ближайшие блоки от заданной точки. -Это простой пример, для более полного поиска, использующего алгоритмы, - используйте [mineflayer-blockfinder](https://github.com/Darthfett/mineflayer-blockfinder), которое имеет похожее API + * `options` - Параметры для поиска: + - `point` - Начальная позиция поиска (центр). По умолчанию позиция бота. + - `matching` - Функция, которая возращает `true`, если данный блок совпадает. Также поддерживает значение в виде ID блока или массива с ID нескольких блоков. + - `useExtraInfo` - Для сохранения обратной совместимости может привести к двум вариантам поведения в зависимости от типа + - **boolean** - Предсталяет функции `matching` больше информации - медленнее. + - **function** - Создаёт двойную функцию проверки, если блок проходит через функцию `matching`, то далее проходит через `useExtraInfo` с дополнительной информацией. + - `maxDistance` - Самое дальнее расстояние для поиска, по умолчанию 16. + - `count` - Количество блоков, которые нужно найти. По умолчанию 1. Может вернуть меньше, если будет найдено недостаточно блоков. + +Возвращает массив (может быть пустым) с координатами найденных блоков (не сами блоки). Массив отсортирован (от ближайших до дальних блоков). + +#### bot.findBlock(options) + +То же самое, что и `bot.blockAt(bot.findBlocks(options)[0])`. Возращает один блок, либо `null`. #### bot.canDigBlock(block) -Возвращает, является ли `block` ломаемым и находится в пределах диапазона +Возвращает, можно ли сломать блок и находится ли в пределах диапозона бота. #### bot.recipesFor(itemType, metadata, minResultCount, craftingTable) -Возвращает список рецептов (Recipe) которые вы можете использовать для крафта -предмета(itemType) с метаданными(metadata). +Возвращает список рецептов(`Recipe`), которые вы можете использовать для крафта +предмета(`itemType`) с мета-данными(`metadata`). - * `itemType` - ID предмета, который вы хотите создать - * `metadata` - значение метаданных создаваемого предмета, null соответствует любым метаданным - * `minResultCount` - количество создаваемого предмета, null эквивалентно 1 предмету, - присутствует проверка на количество материала, требуемого для изготовления предмета - * `craftingTable` - блок верстака, при указании null предмет создается в вашем инвентаре + * `itemType` - Числовой ID предмета, который вы хотите создать. + * `metadata` - Числовое значение мета-данных создаваемого предмета, `null` соответствует любым мета-данным + * `minResultCount` - Количество создаваемых предметов, на основе ресурсов из вашего инвентаря, `null` эквивалентно 1 предмету. + * `craftingTable` - Верстак (или подобный блок) в виде экземпляра `Block`. Если `null`, то будут работать только те рецепты, которые можно выполнить в окне инвентаря. #### bot.recipesAll(itemType, metadata, craftingTable) -То же, что и bot.recipesFor, но без проверки на количество материала, требуемого для изготовления предмета +То же, что и `bot.recipesFor`, но без проверки количества материала, требуемого для изготовления предмета. + +#### bot.nearestEntity(match = (entity) => { return true }) + +Возвращает ближайшее к боту существо, подходящий по функции (по умолчанию находит любое существо). Возвращает `null`, если существо не найдено. + +Пример: +```js +const cow = bot.nearestEntity(entity => entity.name.toLowerCase() === 'cow') // используем .toLowercase(), потому что в 1.8 "cow" пишется с большой буквы, что может вызвать несовместимость с новыми версиями +``` ### Methods -#### bot.end() +#### bot.end(reason) -Завершить соединение с сервером +Закрывает соединение с сервером. +* `reason` - Необязательная строка, в которой указывается причина отключения. #### bot.quit(reason) -Принудительно завершить соиденение по собственной причине (по умолчанию 'disconnect.quitting'). +Принудительно завершает соединение по собственной причине (по умолчанию `'disconnect.quitting'`). + +#### bot.tabComplete(str, [assumeCommand], [sendBlockInSight]) -#### bot.tabComplete(str, cb, [assumeCommand], [sendBlockInSight]) +Эта функция возвращает `Promise` с `matches` в качестве аргумента при завершении. -Запрашивает чат севрера - * `str` - Строка для завершения - * `callback(matches)` - - `matches` - Массив с совпадениями. - * `assumeCommand` - Поле отправлено на сервер, по умолчанию отключено. - * `sendBlockInSight` - Поле отправлено на сервер, по умолчанию включено. Установите для этого параметра значение false, если вы хотите повысить производительность. +Запрашивает подсказки к командам/аргументам в чате от сервера. + + * `str` - Строка для завершения через подсказки. + * `assumeCommand` - Поле отправляемое серверу, по умолчанию `false`. + * `sendBlockInSight` - Поле отправляемое серверу, по умолчанию `true`. Установите для этого параметра значение `false`, если вы хотите повысить производительность. #### bot.chat(message) -Отправляет сообщение. При необходимости разбивает большое сообщение на несколько маленьких +Отправляет сообщение в чат. При необходимости разбивает большое сообщение на несколько маленьких. #### bot.whisper(username, message) -Аналог "/tell <никнейм>". Все разделенные сообщения будут отправлятся пользователю +Аналог "/tell <никнейм>". Все разделенные сообщения будут отправлятся пользователю. #### bot.chatAddPattern(pattern, chatType, description) -Добавляет шаблон чата. Полезно, если формат чата сильно меняется за счёт плагинов - * `pattern` - регулярное выражение для совпадения - * `chatType` - вид сообщения. Например: "chat" или "whisper" - * 'description' - Необязательно, описание шаблона +Неподдерживается, используйте `addChatPattern`. + +Добавляет шаблон чата с помощью регулярных выражений. Полезно, если формат чата сильно меняется за счёт плагинов. + + * `pattern` - Регулярное выражение для совпадения с сообщением. + * `chatType` - Вид сообщения. Является названием ивента, который будет срабатывать при совпадении с шаблоном. Например: "chat" или "whisper". + * `description` - Необязательно, описание шаблона. + +#### bot.addChatPattern(name, pattern, chatPatternOptions) + +** то же самое, что и `bot.addChatPatternSet(name, [pattern], chatPatternOptions)` + +Создаёт ивент, который вызывается каждый раз, когда сообщение совпадает с шаблоном. +Ивент будет называться `"chat:name"`, где название - это значение `name` + +* `name` - Название, используемое для прослушивания ивента. +* `pattern` - Регулярное выражение для совпадения с сообщением. +* `chatPatternOptions` - Объект: + * `repeat` - По умолчанию `true`. Нужно ли прослушивать ивент после первого совпадения. + * `parse` - Вместо самого сообщения, которое совпало с шаблоном, возвращает группы из регулярного выражения. + * `deprecated` - (**нестабильно**) используется методом `bot.chatAddPattern` для сохранения совместимости, вероятно, будет удален. + +Возвращает число, которое используется методом `bot.removeChatPattern()` лишь для того, чтобы можно было удалить этот шаблон. + +#### bot.addChatPatternSet(name, patterns, chatPatternOptions) + +Создаёт ивент, который вызывается каждый раз, когда сообщения совпадают с шаблонами. +Ивент будет называться `"chat:name"`, где название - это значение `name`. +* `name` - Название, используемое для прослушивания ивента. +* `patterns` - Массив с регулярными выражениями для совпадения с сообщениями. +* `chatPatternOptions` - Объект: + * `repeat` - По умолчанию `true`. Нужно ли прослушивать ивент после первого совпадения. + * `parse` - Вместо самого сообщения, которое совпало с шаблоном, возвращает группы из регулярного выражения. + +Возвращает число, которое используется методом `bot.removeChatPattern()` лишь для того, чтобы можно было удалить этот шаблон. + +#### bot.removeChatPattern(name) + +Удаляет шаблон(ы) чата. +* `name` - Строка или число. + +Если `name` - строка, все шаблоны с этим названием будут удалены. +Если `name` - число, удаляет только определённый шаблон. + +#### bot.awaitMessage(...args) + +Промис, который срабатывает, когда сообщение совпадает с переданными аргументами. + +Пример: + +```js +async function wait () { + await bot.awaitMessage(' hello world') // срабатывает на "hello world" в чате от flatbot + await bot.awaitMessage([' hello', ' world']) // срабатывает на "hello" или "world" в чате от flatbot + await bot.awaitMessage([' hello', ' world'], [' im', ' batman']) // срабатывает на "hello" или "world" или "im" или "batman" в чате от flatbot + await bot.awaitMessage(' hello', ' world') // срабатывает на "hello" или "world" в чате от flatbot + await bot.awaitMessage(/ (.+)/) // срабатывает на первое сообщение подходящее по шаблону +} +``` #### bot.setSettings(options) -Посмотреть значение `bot.settings`. +Устанавливает значения для `bot.settings`. #### bot.loadPlugin(plugin) -Загрузить плагин - * `plugin` - функция +Загружает плагин. Ничего не делает, если плагин уже был загружен. + + * `plugin` - Функция. ```js function somePlugin (bot, options) { @@ -1302,297 +1758,453 @@ bot.once('login', () => { #### bot.loadPlugins(plugins) О загрузке плагинов смотрите в `bot.loadPlugin`. - * `plugins` - массив функций + * `plugins` - Массив функций. + +#### bot.hasPlugin(plugin) + +Проверяет, загружен ли плагин (или планирует загружаться) для данного бота. -#### bot.sleep(bedBlock, [cb]) +#### bot.sleep(bedBlock) -Отправить бота спать. `bedBlock` должен являтся блоком. `cb` может иметь параментр "err", если бот не может лечь спать +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. + +Отправляет бота спать. `bedBlock` должен быть экземпляром `Block`, который является кроватью. #### bot.isABed(bedBlock) -Возвращает true если `bedBlock` является кроватью +Возвращает `true`, если `bedBlock` является кроватью. + +#### bot.wake() -#### bot.wake([cb]) +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. -Встать с кровати. `cb` может иметь параментр "err", если бот не может встать +Поднимает бота с кровати. #### bot.setControlState(control, state) - * `control` - одно из ['forward', 'back', 'left', 'right', 'jump', 'sprint', 'sneak'] - * `state` - `true` или `false` +Это основной способ управлять ботом. Работает как нажатия кнопок в майнкрафте. +Например, `forward` со значением `true` будет перемещать бота вперёд. `forward` со значением `false` остановит бота от движения вперёд. +Вы можете использовать `bot.lookAt` вместе с этой функцией. jumper.js показывает на примере, как это можно использовать. + + * `control` - Одно из ['forward', 'back', 'left', 'right', 'jump', 'sprint', 'sneak']. + * `state` - `true` или `false`. + +#### bot.getControlState(control) + +Возращает `true`, если определённый элемент управления включен. + +* `control` - Одно из ['forward', 'back', 'left', 'right', 'jump', 'sprint', 'sneak']. #### bot.clearControlStates() -Отключить элементы управления +Отключает элементы управления. + +#### bot.getExplosionDamages(entity, position, radius, [rawDamages]) + +Возвращает, какой урон будет нанесен существу в радиусе вокруг места взрыва. +Будет возвращать `null`, если у существа нет брони и `rawDamages` является `true`, потому что функция не может рассчитать урон с броней без самой брони. + +* `entity` - Экземпляр существа. +* `position` - Экземпляр [Vec3](https://github.com/andrewrk/node-vec3). +* `radius` - Радиус взрыва в виде числа. +* `rawDamages` - Необязательно, если `true`, то при рассчётах не считает броню. + +#### bot.lookAt(point, [force]) + +Эта функция возвращает `Promise` с `void` в качестве аргумента, когда вы смотрите в указанную точку. -#### bot.lookAt(point, [force], [callback]) + * `point` - Экземпляр [Vec3](https://github.com/andrewrk/node-vec3). Поворачивает голову к указанной точке. + * `force` - Смотрите `force` в `bot.look`. - * `point` - наклонить голову к указанной точке - * `force` - Смотрите `force` в `bot.look` - * `callback()` необязательно, вызывается если вы смотрите на указанную точку +#### bot.look(yaw, pitch, [force]) -#### bot.look(yaw, pitch, [force], [callback]) +Эта функция возвращает `Promise` с `void` в качестве аргумента, когда вы смотрите с указанным `yaw` и `pitch`. -Установить направление головы +Устанавливает направление головы. - * `yaw` - Количество радианов для вертикальной оси - * `pitch` - Количество радианов для поворота вверх или вниз. 0 - строго вперед. - pi / 2 - смотреть вверх. -pi / 2 - смотреть вниз - * `force` - Если установлен true, плавный переход не состоится. Укажите значение true, - для проверки на стороне сервера. Рекомендуется включать, чтобы избежать конфликтов с античитом - * `callback()` - необязательно, вызывается, если бот смотрит на указанную точку + * `yaw` - Количество радианов по горизонтальной оси, начиная с востока по часовой стрелке. + * `pitch` - Количество радианов для поворота вверх или вниз. `0` - строго вперед. `pi / 2` - смотреть вверх. `-pi / 2` - смотреть вниз. + * `force` - Если установлен `true`, плавного поворота не будет. Укажите значение `true`, + если хотите передать серверу куда вы целитесь, например при бросании предметов или выстреле с лука. Это не требуется для вычислений на стороне клиента, таких как направление ходьбы. -#### bot.updateSign(block, text) +#### bot.updateSign(block, text, back = false) -Обновить текст на табличке +Изменяет текст на табличке. В Майнкрафте 1.20 и выше будет пытаться изменить текст с обратной стороны, если табличка не прикреплена к стене (Значение `back`). -#### bot.equip(item, destination, [callback]) +#### bot.equip(item, destination) -Надеть вещи из инвентаря +Эта функция возвращает `Promise` с `void` в качестве аргумента, когда вы надели предмет или когда узнаёте, что вам не удалось надеть предмет. - * `item` - Предмет. Смотрите `window.items()`. +Надевает предмет из вашего инвентаря. Если аргумент `item` является экземпляром `Item`, то функция будет пытаться надеть указанный предмет из слота окна. Если аргумент `item` является числом, то функция будет пытаться надеть первый попавшийся предмет в инвентаре с этим ID. (Проверка хотбара идёт последней. Слоты брони, крафта, результата крафта и второй руки не проверяются). + + * `item` - Экземпляр `Item` или число с ID предмета. Смотрите `window.items()`. * `destination` - - `"hand"` - `null` альтернатива к этому - - `"head"` - - `"torso"` - - `"legs"` - - `"feet"` - * `callback(error)` - необязательно. вызывается при успешной экипировке, - или при ошибке + - `"hand"` - (ведущая рука) `null` альтернатива к этому. + - `"head"` - (шлем) + - `"torso"` - (нагрудник) + - `"legs"` - (поножи) + - `"feet"` - (ботинки) + - `"off-hand"` - (вторая рука) Если доступно. + +#### bot.unequip(destination) + +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. + +Снимает предмет. + +#### bot.tossStack(item) -#### bot.unequip(destination, [callback]) +Эта функция возвращает `Promise` с `void` в качестве аргумента при выбрасывании. -Снять предмет + * `item` - Cтак предметов, которые вы хотите выбросить. -#### bot.tossStack(item, [callback]) +#### bot.toss(itemType, metadata, count) - * `item` - стак предмета, который вы хотите выбросить - * `callback(error)` - необязательно, вызывается если предмет выкинут, либо при ошибке +Эта функция возвращает `Promise` с `void` в качестве аргумента при одном выбрасывании. -#### bot.toss(itemType, metadata, count, [callback]) + * `itemType` - Числовой ID предмета, который вы хотите выбросить. + * `metadata` - Мета-данные предмета. Используйте `null`, чтобы выбрать любые мета-данные. + * `count` - Количество предметов, которые вы хотите выбросить. `null` равно `1`. - * `itemType` - ID предмета, который вы хотите выбросить - * `metadata` - метаданные предмета. Используйте `null` - чтобы выбрать любые метаданные - * `count` - количество предмета. null равно 1 - * `callback(err)` - (необязательно) вызывается при успешной операции +#### bot.dig(block, [forceLook = true], [digFace]) -#### bot.dig(block, [callback]) +Эта функция возвращает `Promise` с `void` в качестве аргумента, когда блок был сломан или разрушение было прервано. -Начать ломать блок предметом, который экипирован в руке -Смотрите также события "diggingCompleted" и "diggingAborted". +Начинает ломать блок предметом, который находится в руке. +Смотрите также ивенты `"diggingCompleted"` и `"diggingAborted"`. -Обратите внимание, что вы не сможете ломать другие блоки, -пока выбранный блок не будет сломан, либо не будет вызвана функция -`bot.stopDigging()`. +Обратите внимание, что вы не сможете ломать другие блоки, пока выбранный блок не будет сломан, либо не будет вызвана функция `bot.stopDigging()`. - * `block` - блок, который нужно ломать - * `callback(err)` - (необязательно) вызывается если блок сломан, или операция прервана + * `block` - Блок, который нужно сломать. + * `forceLook` - (необязательно) если `true`, сразу смотрит на блок и начинает ломать. Если `true`, бот плавно поворачивается к блоку, который нужно сломать. Кроме того, можно присвоить значение `'ignore'`, чтобы бот вообще не двигал головой. Также можно присвоить значение `'raycast'` для поворота головы бота до места, куда бот смотрит. + * `digFace` - (необязательно) По умолчанию `'auto'`, смотрит на центр блока и ломает верхнюю грань. Также может быть вектором vec3 для направления бота при разрушении блока. Например: ```vec3(0, 1, 0)```, когда копаешь сверху. Кроме того, может быть `'raycast'`, оно проверяет, видна ли сторона для бота и копает с этим направлением. Полезно для серверов с анти-читом. #### bot.stopDigging() +Останавливает разрушение блока. + #### bot.digTime(block) -Покажет время, которое нужно потратить, чтобы сломать блок +Покажет время, которое нужно потратить, чтобы сломать блок в миллисекундах. + +#### bot.acceptResourcePack() + +Подтверждает загрузку ресурс-пака. + +#### bot.denyResourcePack() + +Отклоняет загрузку ресурс-пака. + +#### bot.placeBlock(referenceBlock, faceVector) + +Эта функция возвращает `Promise` с `void` в качестве аргумента, когда сервер подтверждает, что блок поставлен. + + * `referenceBlock` - Блок, на котором вы хотите разместить свой блок. + * `faceVector` - Одно из шести направлений (Например: `new Vec3(0, 1, 0)` для верхней грани), указывающее, на какую грань `referenceBlock` будет установлен новый блок. + +Новый блок будет размещен на `referenceBlock.position.plus(faceVector)`. + +#### bot.placeEntity(referenceBlock, faceVector) + +Эта функция возвращает `Promise` с `Entity` в качестве аргумента при завершении. -#### bot.placeBlock(referenceBlock, faceVector, cb) + * `referenceBlock` - Блок, на котором вы хотите разместить существо. + * `faceVector` - Одно из шести направлений (Например: `new Vec3(0, 1, 0)` для верхней грани), указывающее, на какую грань `referenceBlock` будет установлено существо. - * `referenceBlock` - блок, который вы хотите разместить рядорм - * `faceVector` - один из шести направлений `new Vec3(0, 1, 0)`, чтобы указать сторону, - куда нужно поставить блок - * `cb` вызывается, если сервер подтвердит, что блок поставлен +Новое существо будет размещено на `referenceBlock.position.plus(faceVector)`. -Новый блок будет размещен на координатах `referenceBlock.position.plus(faceVector)`. +#### bot.activateBlock(block, direction?: Vec3, cursorPos?: Vec3) -#### bot.activateBlock(block, [callback]) +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. -Ударить нотный блок, открыть дверь и т.д +Ударяет нотный блок, открывает дверь и т.д. - * `block` - активируемый блок - * `callback(err)` - (необязательно) вызывается, если блок активирован + * `block` - Блок для активации. + * `direction` - (необязательно) По умолчанию `new Vec3(0, 1, 0)` (сверху). Вектор, отвечающий с какой стороны будет активироваться блок. Ничего не делает, когда целью является существо-хранилище. + * `cursorPos` - (необязательно) По умолчанию `new Vec3(0.5, 0.5, 0.5)` (центр блока). Является точкой, куда будет смотреть бот при активации блока. Отправляется с пакетом активации блока. Ничего не делает, когда целью является существо-хранилище. -#### bot.activateEntity(entity, [callback]) +#### bot.activateEntity(entity) -Нажать на существо, например житель, или NPC +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. - * `entity` - активируемре существо - * `callback(err)` - (необязательно) вызывается, если существо активировано +Нажимает на существо, например житель, или NPC. -#### bot.consume(callback) + * `entity` - Существо для активации. -Съесть/выпить предмет, который находится в руке +#### bot.activateEntityAt(entity, position) - * `callback(error)` - вызывается, если предмет использован +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. -#### bot.fish(callback) +Нажимает на существо с указанной позицией, полезно при взаимодействии с стойками для брони. -Использовать удочку + * `entity` - Существо для активации. + * `position` - Позиция для клика. - * `callback(error)` - вызывается, если рыбалка окончена +#### bot.consume() -#### bot.activateItem() +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении употребления. -Активирует предмет, который находится в руке. Используется для выстрела из лука, бросания яиц и т.д +Съедает/выпивает предмет, который находится в руке. + +#### bot.fish() + +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении рыбалки. + +Использует удочку. + +#### bot.activateItem(offHand=false) + +Активирует предмет, который находится в руке. Используется для выстрела из лука, бросания яиц и т.д. + + * `offHand` - Во второй ли руке находится предмет для активации. #### bot.deactivateItem() -Деактивирует предмет, который находится в руке. Например для прекращения натягивания тетевы лука и т.д +Деактивирует предмет, который находится в руке. Например для прекращения натягивания тетевы лука и т.д. #### bot.useOn(targetEntity) -Использует предмет, который находится в руке на существе. Например, одеть седло или использовать ножницы +Использует предмет, который находится в руке, на существе. Например, одеть седло или использовать ножницы. -#### bot.attack(entity) +#### bot.attack(entity, swing = true) -Атаковать игрока или моба +Атакует игрока или моба. -#### bot.swingArm([hand]) + * `entity` - Тип существа. Чтобы получить конкретное существо, используйте [bot.nearestEntity()](#botnearestentitymatch--entity---return-true-) или [bot.entities](#botentities). + * `swing` - По умолчанию `true`. Если `false` анимация руки при ударе не будет отображаться. -Сыграть анимацию удара руки +#### bot.swingArm([hand], showHand) - * `hand` может быть `left` или `right`. По умолчанию: `right` +Проигрывает анимацию руки при ударе. + + * `hand` - Может быть `left` или `right`, в зависимости от того, какую руку нужно анимировать. По умолчанию: `right`. + * `showHand` - Нужно ли добавлять руку в пакет. По умолчанию: `true`. #### bot.mount(entity) -Сесть в транспортное средство. +Сесть в транспортное средство. Чтобы слезть, используйте `bot.dismount`. #### bot.dismount() -Вылезть из транспортного средства. +Вылезти из транспортного средства. #### bot.moveVehicle(left,forward) -Двигатся в транспортном средстве: +Двигаться в транспортном средстве: - * по сторонам: -1 или 1 : -1 означает вправо, 1 означает влево - * вперед/назад: -1 или 1 : -1 означает назад, 1 означает вперед + * `left` - Может быть -1 или 1 : -1 означает вправо, 1 означает влево. + * `forward` - Может быть -1 или 1 : -1 означает назад, 1 означает вперед. -Направление относительно того, куда смотрит бот +Направление относительно того, куда смотрит бот. #### bot.setQuickBarSlot(slot) - * `slot` - выбрать слот ( 0 - 8 ) +Выбирает слот в хотбаре. + + * `slot` - Слот в хотбаре (0-8). + +#### bot.craft(recipe, count, craftingTable) + +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении крафта и обновлении инвентаря. + + * `recipe` - Рецепт крафта (экземпляр `Recipe`). Смотрите `bot.recipesFor`. + * `count` - Количество операций для крафта. Например: Если вы хотите скрафтить 8 палок из досок, вы должны установить `count` на `2`. `null` является `1`. + * `craftingTable` - Блок верстака (экземпляр `Block`), Вы можете использовать `null`, если рецепт можно использовать в инвентаре. -#### bot.craft(recipe, count, craftingTable, [callback]) +#### bot.writeBook(slot, pages) - * `recipe` - рецепт крафта. Смотрите `bot.recipesFor`. - * `count` - количество предмета крафта - Если вы хотите скрафтить 8 досок в палки, вы должны установить - `count` в `2`. `null` является 1 - * `craftingTable` - блок верстака, при указании null предмет крафтится в вашем инвентаре - * `callback` - (необязательно) Вызыватся если крафт завершен успешно +Эта функция возвращает `Promise` с `void` в качестве аргумента, когда написание было выполнено успешно или произошла ошибка. -#### bot.writeBook(slot, pages, [callback]) + * `slot` - Слот в инвентаре (например, 36 - первый слот в хотбаре). + * `pages` - Массив со страницами. - * `slot` - слот в инвентаре ( 0 - 36) - * `pages` - массив страниц - * `callback(error)` - необязательно. вызывается если редактирование завершено, либо при вызове ошибки +#### bot.openContainer(containerBlock or containerEntity, direction?, cursorPos?) -#### bot.openChest(chestBlock or minecartchestEntity) +Открывает хранилище блока или существа. -Устарело.Открывает сундук. Такой же как "openContainer" + * `containerBlock` или `containerEntity` - Экземпляр блока или существа для открытия. + * `direction` - (необязательно) По умолчанию `new Vec3(0, 1, 0)` (сверху). Вектор, отвечающий с какой стороны будет активироваться блок. Ничего не делает, когда целью является существо-хранилище. + * `cursorPos` - (необязательно) По умолчанию `new Vec3(0.5, 0.5, 0.5)` (центр блока). Является точкой, куда будет смотреть бот при активации блока. Отправляется с пакетом активации блока. Ничего не делает, когда целью является существо-хранилище. + +Вовзращает `Promise` с экземпляром `Container`, которое представляет хранилище, которое вы открываете. + +#### bot.openChest(chestBlock or minecartchestEntity, direction?, cursorPos?) + +Устарело. То же самое, что `openContainer`. #### bot.openFurnace(furnaceBlock) -Открывает печь +Возвращает `Promise` с экземпляром `Furnace`, представляющий печь, которую вы открываете. #### bot.openDispenser(dispenserBlock) -Открывает раздатчик +Устарело. То же самое, что `openContainer`. #### bot.openEnchantmentTable(enchantmentTableBlock) -Открывает стол зачарований +Возвращает `Promise` с экземпляром `EnchantmentTable`, представляющий стол зачарований, который вы открываете. + +#### bot.openAnvil(anvilBlock) + +Возвращает `Promise` с экземпляром `anvil`, представляющий наковальню, которую вы открываете. #### bot.openVillager(villagerEntity) -Открывает торговлю с жителем +Возвращает `Promise` с экземпляром `Villager`, представляющий жителя, с которым вы торгуете. +Вы можете прослушивать ивент `ready` для этого `Villager`, чтобы знать, когда он готов торговаться. + +#### bot.trade(villagerInstance, tradeIndex, [times]) + +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. + + * `villagerInstance` - Житель, с которым вы торгуете. + * `tradeIndex` - Номер предложения. + * `times` - Сколько раз произвести торговлю. + +#### bot.setCommandBlock(pos, command, [options]) + +Устанавливает настройки командного блока в позиции `pos`. +Пример аргумента `options`: + +```js +{ + mode: 2, + trackOutput: true, + conditional: false, + alwaysActive: true +} +``` + +`options.mode` может иметь 3 значения: 0 (Цепной), 1 (Цикличный), 2 (Импульсный) +Все дополнительные настройки по умолчанию `false`, кроме `mode`, который равен 2 (для повторения командного блока по умолчанию в Майнкрафте). + +#### bot.supportFeature(name) -#### bot.trade(villagerInstance, tradeIndex, [times], [cb]) +Может использоваться для проверки особой для текущей версии Майнкрафт возможности. Обычно это требуется только для обработки функций, зависящих от версии. -Использует `villagerInstance` для торговли +Список возможностей можно найти в файле [./lib/features.json](https://github.com/PrismarineJS/mineflayer/blob/master/lib/features.json). -#### bot.setCommandBlock(pos, command, track_output) +#### bot.waitForTicks(ticks) -.Установить командный блок по координатам +Это функция основана на промисе. Она ожидает определённое количество игровых тиков перед продолжением. Может быть полезно для быстрых таймеров, который требуют особых задержек, независимо от заданной физической скорости тиканья бота. Это похоже на стандартную функцию Javascript `setTimeout`, но выполняется специально по физическому таймеру бота. ### Методы инвентаря низкого уровня -Эти методы могут быть иногда полезны, но мы рекомендуем использовать методы, описанные выше +Эти методы могут быть иногда полезны, но мы рекомендуем использовать методы, описанные выше. -#### bot.clickWindow(slot, mouseButton, mode, cb) +#### bot.clickWindow(slot, mouseButton, mode) -Нажать на слот +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. + +Единственное действительное значение для `mode` - 0. Нажатие с шифтом или перемещение через мышь не реализовано. -#### bot.putSelectedItemRange(start, end, window, slot, cb) +Нажимает на текущее окно. Подробнее - https://wiki.vg/Protocol#Click_Container -Поместить предмет в слот в указаном диапазоне +Рекомендуется использовать `bot.simpleClick.*` -#### bot.putAway(slot, cb) +#### bot.putSelectedItemRange(start, end, window, slot) -Поместить предмет в слот инвентаря +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. + +Помещает предмет в слот в указаном диапазоне. + +#### bot.putAway(slot) + +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. + +Помещает предмет в слот инвентаря. #### bot.closeWindow(window) -Закрыть окно(GUI) +Закрывает окно. + +#### bot.transfer(options) -#### bot.transfer(options, cb) +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. -Поместить предмет с одного диапазона в другой. `options` это объект, содержащий : +Перемещает предмет с одного диапазона в другой. `options` это объект, содержащий : - * `window` : окно, куда требуется положить предмет - * `itemType` : тип предмета - * `metadata` : метаданные предмета - * `sourceStart` и `sourceEnd` : старый диапазон - * `destStart` и `destEnd` : новый диапазон + * `window` : (необязательно) Окно, куда требуется положить предмет. + * `itemType` : Тип предмета. + * `metadata` : (необязательно) Мета-данные предмета. + * `sourceStart` и `sourceEnd` : Старый диапозон. `sourceEnd` необязателен и будет по умолчанию равен `sourceStart` + 1. + * `destStart` и `destEnd` : Новый диапозон. `destEnd` необязателен и будет по умолчанию равен `destStart` + 1. + * `count` : Количество предметов. По умолчанию: `1`. + * `nbt` : Нбт-данные предмета. По умолчанию: `nullish` (игнорирует нбт). -#### bot.openBlock(block, Class) +#### bot.openBlock(block, direction?: Vec3, cursorPos?: Vec3) -Открыть блок, например сундук +Открывает блок, например сундук. Возвращает `Promise` с открытым окном (`Window`). - * `block` блок, который нужен открыть - * `Class` тип окна, которое нужно открыть + * `block` - Блок, который нужно открыть боту. + * `direction` - (необязательно) По умолчанию `new Vec3(0, 1, 0)` (сверху). Вектор, отвечающий с какой стороны будет активироваться блок. Ничего не делает, когда целью является существо-хранилище. + * `cursorPos` - (необязательно) По умолчанию `new Vec3(0.5, 0.5, 0.5)` (центр блока). Является точкой, куда будет смотреть бот при активации блока. Отправляется с пакетом активации блока. Ничего не делает, когда целью является существо-хранилище. -#### bot.openEntity(entity, Class) +#### bot.openEntity(entity) -Открыть GUI существа, например жителя +Открывает GUI существа, например жителя. Возвращает `Promise` с открытым окном (`Window`). - * `entity` существо, GUI которого нужно открыть - * `Class` тип окна, которое нужно открыть + * `entity` - Существо, GUI которого нужно открыть. -#### bot.moveSlotItem(sourceSlot, destSlot, cb) +#### bot.moveSlotItem(sourceSlot, destSlot) -Поместить предмет со слота `sourceSlot` в слот `destSlot` в открытом окне +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении. + +Помещает предмет со слота `sourceSlot` в слот `destSlot` в открытом окне. #### bot.updateHeldItem() -Обновить `bot.heldItem`. +Обновляет `bot.heldItem`. + +#### bot.getEquipmentDestSlot(destination) + +Получает ID слота экипировки по названию. + +Доступны: + * head (шлем) + * torso (нагрудник) + * legs (поножи) + * feet (ботинки) + * hand (главная рука) + * off-hand (вторая рука) ### bot.creative -Данные функции использются в творческом режиме +Эта коллекция API полезна в творческом режиме. +Обнаружение и изменение игровых режимов здесь не реализовано, но предполагается и часто требуется, чтобы бот находился в творческом режиме для работы этих функций. + +#### bot.creative.setInventorySlot(slot, item) + +Эта функция возвращает `Promise` с `void` в качестве аргумента, когда сервер выдаёт предмет в слот. -#### bot.creative.setInventorySlot(slot, item, [callback]) +Выдёт боту указанный предмет в слоте инвентаря. -Дает боту указанный предмет в слоте инвентаря. Не рекомендуется -выдавать дважды в один слот + * `slot` - Номер слота (например: 36 - первый слот в хотбаре). + * `item` - Экземпляр [prismarine-item](https://github.com/PrismarineJS/prismarine-item), содержащий мета-данные, нбт-данные и т.д. + Если `item` равен `null`, предмет в указанном слоте удаляется. - * `slot` номер слота ( 0 -36 ) - * `item` предмет, NBT-тег -     Если `item` равен` null`, элемент в указанном слоте удаляется. - * `callback(err)` (необязательно) вызывается, если сервер одобрил выдачу предмета +Если этот метод что-либо изменит, вы можете узнать об этом через `bot.inventory.on("updateSlot")`. -Если этот метод меняет ваш инвентарь, вы можете использовать `bot.inventory.on("updateSlot")`. +#### bot.creative.clearSlot(slot) -#### bot.creative.flyTo(destination, [cb]) +Эта функция возвращает `Promise` с `void` в качестве аргумента, когда сервер очищает слот. -Вызывает `startFlying()` и движется к месту назначения. -`destination` это `Vec3`, координаты `x` и `z`, которые обычно заканчиваются на `.5`. -Функция не будет рабоать, если присутствуют препятствия. -Рекомендуется отправлять на небольшие расстояния +Устанавливает значение `null` для предмета в заданном слоте. + * `slot` - Номер слота (например: 36 - первый слот в хотбаре). -Когда бот прибывает в пункт назначения, вызывается `cb`. +#### bot.creative.clearInventory() + +Эта функция возвращает `Promise` с `void` в качестве аргумента, когда сервер очищает слоты. + +#### bot.creative.flyTo(destination) + +Эта функция возвращает `Promise` с `void` в качестве аргумента, когда бот достигает точки назначения. + +Вызывает `startFlying()` и движется к месту назначения по прямой. +`destination` - это `Vec3`. Координаты `x` и `z` обычно заканчиваются на `.5`. +Функция не будет работать, если на пути присутствуют препятствия. +Рекомендуется отправлять на небольшие расстояния. Этот метод не пытается найти путь до точки. Ожидается, что реализация поиска пути будет использовать этот метод для перемещения на <2 блоков одновременно. @@ -1601,14 +2213,14 @@ bot.once('login', () => { #### bot.creative.startFlying() -Установите `bot.physics.gravity` к `0`. -Чтобы остановить полет, используйте `stopFlying()`. +Устанавливает `bot.physics.gravity` на `0`. +Чтобы остановить полет, используйте `stopFlying()`. Этот метод полезен, если вы хотите летать, копая землю под собой. Нет необходимости вызывать эту функцию перед вызовом `flyTo()`. -Обратите внимание, что во время полета `bot.entity.velocity` может быть не точным. +Обратите внимание, что во время полета `bot.entity.velocity` не будет точным. #### bot.creative.stopFlying() -Восстанавливает `bot.physics.gravity` к оригинальному значению. +Восстанавливает `bot.physics.gravity` к исходному значению. diff --git a/docs/ru/unstable_api_ru.md b/docs/ru/unstable_api_ru.md index e198f5693..e49a7b33f 100644 --- a/docs/ru/unstable_api_ru.md +++ b/docs/ru/unstable_api_ru.md @@ -2,11 +2,7 @@ **Содержание** *сгенерировано с помощью [DocToc](https://github.com/thlorenz/doctoc)* -Данный перевод был сделан добровольно, и не имеет прямого отношения к разработчикам Mineflayer. -Иногда данный перевод может быть неактуален, так как Mineflayer не стоит на месте и постоянно обновляется. -Чтобы посмотреть актуальную информацию, Вы можете посмотреть оригинальную документацию [нестабильного API](unstable_api.md). - -- [нестабильное API : bot._](#unstable-api--bot_) +- [unstable API : bot._](#unstable-api--bot_) - [bot._client](#bot_client) From ee6e7b1fce5581bc13d628c298bfebb9c283a7b0 Mon Sep 17 00:00:00 2001 From: FurnyGo <68079109+FurnyGo@users.noreply.github.com> Date: Fri, 1 Sep 2023 12:30:24 +0400 Subject: [PATCH 2/9] Update api_ru.md to 4.14.0 --- docs/ru/api_ru.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/docs/ru/api_ru.md b/docs/ru/api_ru.md index 185dab421..23a6f0ecb 100644 --- a/docs/ru/api_ru.md +++ b/docs/ru/api_ru.md @@ -136,6 +136,7 @@ - [bot.foodSaturation](#botfoodsaturation) - [bot.oxygenLevel](#botoxygenlevel) - [bot.physics](#botphysics) + - [bot.fireworkRocketDuration](#botfireworkrocketduration) - [bot.simpleClick.leftMouse (slot)](#botsimpleclickleftmouse-slot) - [bot.simpleClick.rightMouse (slot)](#botsimpleclickrightmouse-slot) - [bot.time.doDaylightCycle](#bottimedodaylightcycle) @@ -197,6 +198,7 @@ - ["entityEquip" (entity)](#entityequip-entity) - ["entitySleep" (entity)](#entitysleep-entity) - ["entitySpawn" (entity)](#entityspawn-entity) + - ["entityElytraFlew" (entity)](#entityelytraflew-entity) - ["itemDrop" (entity)](#itemdrop-entity) - ["playerCollect" (collector, collected)](#playercollect-collector-collected) - ["entityGone" (entity)](#entitygone-entity) @@ -223,6 +225,7 @@ - ["blockBreakProgressEnd" (block, entity)](#blockbreakprogressend-block-entity) - ["diggingCompleted" (block)](#diggingcompleted-block) - ["diggingAborted" (block)](#diggingaborted-block) + - ["usedFirework"](#usedfirework) - ["move"](#move) - ["forcedMove"](#forcedmove) - ["mount"](#mount) @@ -293,6 +296,7 @@ - [bot.unequip(destination)](#botunequipdestination) - [bot.tossStack(item)](#bottossstackitem) - [bot.toss(itemType, metadata, count)](#bottossitemtype-metadata-count) + - [bot.elytraFly()](#botelytrafly) - [bot.dig(block, [forceLook = true], [digFace])](#botdigblock-forcelook--true-digface) - [bot.stopDigging()](#botstopdigging) - [bot.digTime(block)](#botdigtimeblock) @@ -1072,6 +1076,10 @@ UUID существа, который определяется боссом. Изменение значений скорости, отдачи, скорости прыжка и т.д. Изменяйте на свой страх и риск! +#### bot.fireworkRocketDuration + +Сколько физических тиков осталось до окончания ускорения от фейерверка. + #### bot.simpleClick.leftMouse (slot) То же, что и `bot.clickWindow(slot, 0, 0)`. @@ -1331,6 +1339,10 @@ UUID существа, который определяется боссом. #### "entityEquip" (entity) #### "entitySleep" (entity) #### "entitySpawn" (entity) +#### "entityElytraFlew" (entity) + +Если существо начало летать на элитрах. + #### "itemDrop" (entity) #### "playerCollect" (collector, collected) @@ -1441,6 +1453,10 @@ UUID существа, который определяется боссом. * `block` - Блок, который не был разрушен. +#### "usedfirework" + +Срабатывает при использовании фейерверка во время полёта на элитрах. + #### "move" Срабатывает при движении бота. Если вы хотите узнать текущее положение, используйте `bot.entity.position`, если вы хотите узнать предыдущее положение, используйте `bot.entity.position.minus(bot.entity.velocity)`. @@ -1866,6 +1882,11 @@ bot.once('login', () => { * `metadata` - Мета-данные предмета. Используйте `null`, чтобы выбрать любые мета-данные. * `count` - Количество предметов, которые вы хотите выбросить. `null` равно `1`. +#### bot.elytraFly() + +Эта функция возвращает `Promise` с `void` в качестве аргумента при завершении полёта на элитрах. +В случае сбоя выдаёт сообщение об ошибке. + #### bot.dig(block, [forceLook = true], [digFace]) Эта функция возвращает `Promise` с `void` в качестве аргумента, когда блок был сломан или разрушение было прервано. @@ -1954,7 +1975,7 @@ bot.once('login', () => { #### bot.activateItem(offHand=false) -Активирует предмет, который находится в руке. Используется для выстрела из лука, бросания яиц и т.д. +Активирует предмет, который находится в руке. Используется для выстрела из лука, бросания яиц, использования фейерверков и т.д. * `offHand` - Во второй ли руке находится предмет для активации. From 718952e7444f94c1dffd6d213accfddf715bc1dd Mon Sep 17 00:00:00 2001 From: FurnyGo <68079109+FurnyGo@users.noreply.github.com> Date: Fri, 1 Sep 2023 12:44:45 +0400 Subject: [PATCH 3/9] Update link --- docs/ru/README_RU.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ru/README_RU.md b/docs/ru/README_RU.md index 1dc7938c2..b50d6ae00 100644 --- a/docs/ru/README_RU.md +++ b/docs/ru/README_RU.md @@ -45,10 +45,10 @@ | Ссылка | Описание | | -------------------------------------------------------------------------- | ------------------------------------- | -| [Обучение](tutorial.md) | Знакомство с Node.js и Mineflayer | +| [Обучение](tutorial_ru.md) | Знакомство с Node.js и Mineflayer | | [ЧАВО](FAQ_RU.md) | Появился вопрос? Найдите ответ здесь. | | **[api_ru.md](api_ru.md)**
[unstable_api.md](unstable_api_ru.md) | Полное описание API | -| [Обновления](history.md) | Список изменений в обновлениях | +| [Обновления](../history.md) | Список изменений в обновлениях | | [Примеры](https://github.com/PrismarineJS/mineflayer/tree/master/examples) | Примеры использования Mineflayer | From 22e7c4dac16cd8eb17758be4c502e72c151be5c7 Mon Sep 17 00:00:00 2001 From: FurnyGo <68079109+FurnyGo@users.noreply.github.com> Date: Fri, 1 Sep 2023 12:46:19 +0400 Subject: [PATCH 4/9] new docs files --- docs/ru/_sidebar.md | 9 +++++++++ docs/ru/demos_ru.md | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 docs/ru/_sidebar.md create mode 100644 docs/ru/demos_ru.md diff --git a/docs/ru/_sidebar.md b/docs/ru/_sidebar.md new file mode 100644 index 000000000..a63ccd5b8 --- /dev/null +++ b/docs/ru/_sidebar.md @@ -0,0 +1,9 @@ +- Первые шаги + - [Вступление](/) + - [API](api_ru.md) + - [ЧаВо](FAQ_ru.md) + - [Примеры](demos_ru.md) + - [Туториал](tutorial_ru.md) + - [Нестабильное API](unstable_api_ru.md) + - [Помочь](CONTRIBUTING_ru.md) + - [История](history.md) \ No newline at end of file diff --git a/docs/ru/demos_ru.md b/docs/ru/demos_ru.md new file mode 100644 index 000000000..971f8c4fe --- /dev/null +++ b/docs/ru/demos_ru.md @@ -0,0 +1,18 @@ +## mineflayer-navigate + +[navigate](https://github.com/andrewrk/mineflayer-navigate/) - Лёгкое передвижение с помощью поиска путей уровня A*. + + + +## rbot + +[rom1504/rbot](https://github.com/rom1504/rbot) - Умный бот, созданный на основе mineflayer. + + + +## chaoscraft + +[Chaoscraft](https://github.com/schematical/chaoscraft) - Майнкрафт бот, использующий генетические алгоритмы. + + +​ \ No newline at end of file From 5954716dcef989c54430c9d89a789e97c6a27837 Mon Sep 17 00:00:00 2001 From: FurnyGo <68079109+FurnyGo@users.noreply.github.com> Date: Fri, 1 Sep 2023 12:52:15 +0400 Subject: [PATCH 5/9] upload index.html --- docs/ru/index.html | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 docs/ru/index.html diff --git a/docs/ru/index.html b/docs/ru/index.html new file mode 100644 index 000000000..7e5bd7ec6 --- /dev/null +++ b/docs/ru/index.html @@ -0,0 +1,38 @@ + + + + + Mineflayer - создавайте Майнкрафт ботов с помощью стабильного и высокоуровневого API + + + + + + + + + + +
+ + + + From ba24a6834734cee55def82faab7ecc04125c0cbf Mon Sep 17 00:00:00 2001 From: FurnyGo <68079109+FurnyGo@users.noreply.github.com> Date: Fri, 1 Sep 2023 15:51:54 +0400 Subject: [PATCH 6/9] Tutorial translate --- docs/ru/api_ru.md | 32 +- docs/ru/tutorial_ru.md | 668 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 684 insertions(+), 16 deletions(-) create mode 100644 docs/ru/tutorial_ru.md diff --git a/docs/ru/api_ru.md b/docs/ru/api_ru.md index 23a6f0ecb..691b80008 100644 --- a/docs/ru/api_ru.md +++ b/docs/ru/api_ru.md @@ -1237,12 +1237,12 @@ UUID существа, который определяется боссом. #### "inject_allowed" -Срабатывает, когда главный файл загружен, здесь вы можете загрузить `mcData` и плагины, но лучше подождать ивент `"spawn"`. +Срабатывает, когда главный файл загружен, здесь вы можете загрузить `mcData` и плагины, но лучше подождать событие `"spawn"`. #### "login" Срабатывает при успешном подключении к серверу. -Возможно, вам потребуется дождаться ивента `"spawn"`, прежде чем что-либо делать на сервере. +Возможно, вам потребуется дождаться события `"spawn"`, прежде чем что-либо делать на сервере. #### "spawn" @@ -1254,7 +1254,7 @@ UUID существа, который определяется боссом. #### "respawn" Срабатывает при смене миров и после появления в мире. -В большинстве случаев вам нужно сначала дождаться ивента `"spawn"` вместо этого. +В большинстве случаев вам нужно сначала дождаться события `"spawn"` вместо этого. #### "game" @@ -1370,14 +1370,14 @@ UUID существа, который определяется боссом. #### "blockUpdate" (oldBlock, newBlock) -(Лучше использовать этот ивент от `bot.world`, чем напрямую от бота) +(Лучше использовать это событие от `bot.world`, чем напрямую от бота) Срабатывает при обновлении блока. `oldBlock` и `newBlock` можно сравнить. Стоит заметить, что `oldBlock` может быть `null`. #### "blockUpdate:(x, y, z)" (oldBlock, newBlock) -(Лучше использовать этот ивент от `bot.world`, чем напрямую от бота) +(Лучше использовать это событие от `bot.world`, чем напрямую от бота) Срабатывает при обновлении блока в определенном месте. `oldBlock` и `newBlock` можно сравнить. Стоит заметить, что `oldBlock` может быть `null`. @@ -1691,20 +1691,20 @@ const cow = bot.nearestEntity(entity => entity.name.toLowerCase() === 'cow') // Добавляет шаблон чата с помощью регулярных выражений. Полезно, если формат чата сильно меняется за счёт плагинов. * `pattern` - Регулярное выражение для совпадения с сообщением. - * `chatType` - Вид сообщения. Является названием ивента, который будет срабатывать при совпадении с шаблоном. Например: "chat" или "whisper". + * `chatType` - Вид сообщения. Является названием события, который будет срабатывать при совпадении с шаблоном. Например: "chat" или "whisper". * `description` - Необязательно, описание шаблона. #### bot.addChatPattern(name, pattern, chatPatternOptions) ** то же самое, что и `bot.addChatPatternSet(name, [pattern], chatPatternOptions)` -Создаёт ивент, который вызывается каждый раз, когда сообщение совпадает с шаблоном. -Ивент будет называться `"chat:name"`, где название - это значение `name` +Создаёт событие, который вызывается каждый раз, когда сообщение совпадает с шаблоном. +Событие будет называться `"chat:name"`, где название - это значение `name` -* `name` - Название, используемое для прослушивания ивента. +* `name` - Название, используемое для прослушивания события. * `pattern` - Регулярное выражение для совпадения с сообщением. * `chatPatternOptions` - Объект: - * `repeat` - По умолчанию `true`. Нужно ли прослушивать ивент после первого совпадения. + * `repeat` - По умолчанию `true`. Нужно ли прослушивать событие после первого совпадения. * `parse` - Вместо самого сообщения, которое совпало с шаблоном, возвращает группы из регулярного выражения. * `deprecated` - (**нестабильно**) используется методом `bot.chatAddPattern` для сохранения совместимости, вероятно, будет удален. @@ -1712,12 +1712,12 @@ const cow = bot.nearestEntity(entity => entity.name.toLowerCase() === 'cow') // #### bot.addChatPatternSet(name, patterns, chatPatternOptions) -Создаёт ивент, который вызывается каждый раз, когда сообщения совпадают с шаблонами. -Ивент будет называться `"chat:name"`, где название - это значение `name`. -* `name` - Название, используемое для прослушивания ивента. +Создаёт событие, который вызывается каждый раз, когда сообщения совпадают с шаблонами. +Событие будет называться `"chat:name"`, где название - это значение `name`. +* `name` - Название, используемое для прослушивания события. * `patterns` - Массив с регулярными выражениями для совпадения с сообщениями. * `chatPatternOptions` - Объект: - * `repeat` - По умолчанию `true`. Нужно ли прослушивать ивент после первого совпадения. + * `repeat` - По умолчанию `true`. Нужно ли прослушивать событие после первого совпадения. * `parse` - Вместо самого сообщения, которое совпало с шаблоном, возвращает группы из регулярного выражения. Возвращает число, которое используется методом `bot.removeChatPattern()` лишь для того, чтобы можно было удалить этот шаблон. @@ -1892,7 +1892,7 @@ bot.once('login', () => { Эта функция возвращает `Promise` с `void` в качестве аргумента, когда блок был сломан или разрушение было прервано. Начинает ломать блок предметом, который находится в руке. -Смотрите также ивенты `"diggingCompleted"` и `"diggingAborted"`. +Смотрите также события `"diggingCompleted"` и `"diggingAborted"`. Обратите внимание, что вы не сможете ломать другие блоки, пока выбранный блок не будет сломан, либо не будет вызвана функция `bot.stopDigging()`. @@ -2072,7 +2072,7 @@ bot.once('login', () => { #### bot.openVillager(villagerEntity) Возвращает `Promise` с экземпляром `Villager`, представляющий жителя, с которым вы торгуете. -Вы можете прослушивать ивент `ready` для этого `Villager`, чтобы знать, когда он готов торговаться. +Вы можете прослушивать события `ready` для этого `Villager`, чтобы знать, когда он готов торговаться. #### bot.trade(villagerInstance, tradeIndex, [times]) diff --git a/docs/ru/tutorial_ru.md b/docs/ru/tutorial_ru.md new file mode 100644 index 000000000..dffdde98b --- /dev/null +++ b/docs/ru/tutorial_ru.md @@ -0,0 +1,668 @@ +# Туториал + +**Содержание** + +- [Вступление](#вступление) +- [Основы](#основы) + - [Основы Javascript](#основы-javascript) + - [Установка Node](#установка-node) + - [Переменные в Javascript](#переменные-в-javascript) + - [Получение ответа](#получение-ответа) + - [Функции в Javascript](#функции-javascript) + - [Типы данных в Javascript](#типы-данных-в-javascript) + - [Условные конструкции](#условные-конструкции) + - [Циклы](#циклы) + - [Node Package Manager](#node-package-manager) + - [Создание бота](#создание-бота) + - [Объекты в Javascript](#объекты-в-javascript) + - [Присоединение](#присоединение) + - [Аргументы командной строки](#аргументы-командной-строки) + - [Передача функций](#передача-функций) + - [Прослушивание событий](#прослушивание-событий) + - [Промисы](#промисы) + - [Правильный и неправильный подход](#правильный-и-неправильный-подход) +- [Продвинутым](#продвинутым) + - [Цикл для объекта](#цикл-для-объекта) + - [Создание события для чата](#создание-события-для-чата) + - [Приветствующий бот](#приветствующий-бот) + - [Нестандартный формат чата](#нестандартный-формат-чата) +- [ЧаВо](#чаво) + - [Как запустить бота на Android](#как-запустить-бота-на-android) + - [Установка Termux](#установка-termux) + - [Настройка](#настройка) + - [Запуск вашего бота](#запуск-вашего-бота) + +## Вступление + +Этот туториал поможет вам начать работать с Mineflayer, даже если вы ничего не знаете о программировании. +Если вы уже знаете что-то о Node и NPM, вы можете сразу переходить к разделу [Создание бота](#создание-бота). + +## Основы + +Следующие разделы посвящены основным понятиям, которые вам необходимо знать, чтобы начать использовать Mineflayer. + +### Основы Javascript + +#### Установка Node + +В этом разделе вы научитесь основам Javascript, Node и NPM. + +Javascript (сокращённо JS) - это язык программирования, созданный для Интернета. Это то, что делает возможным максимальный уровень взаимодействия в Интернете. +Node.js, часто просто Node, позволяет использовать Javascript вне веб-браузеров. + +Для начала, вам нужно установить Node. Вы можете это сделать [здесь](https://nodejs.org/ru/download/). +После установки откройте командную строку (также известную как терминал) и затем введите `node -v` +Если вы всё сделали правильно, то вам напишет версию Node. Если вам написало о том, что команда не найдена, попробуйте установить ещё раз. + +Теперь у вас есть Node, вы можете начать писать код, но вам нужно кое-что ещё. +Javascript был написан в примитивном текстовом редакторе, но легче использовать [Интегрированную среду разработки](https://ru.wikipedia.org/wiki/Интегрированная_среда_разработки)(IDE) +IDE поможет вам в написании кода, потому что будет давать вам подсказки или указывать на ошибки в коде. Примером хорошей IDE является [Visual Studio Code](https://code.visualstudio.com/)(VSCode) +После того как вы установили VSCode, создайте новый текстовый файл и сохраните его где-нибудь, а затем переименуйте его так, чтобы в конце была приписка `.js`. Например: `bot.js` +Это сообщит VSCode о том, что вы работаете с Javascript, чтобы программа выдавала правильные подсказки. + +#### Переменные в Javascript + +Начните с этого: + +```js +const test = 5 +``` + +Это создаст переменную с названием `test` и выдаст ей значение `5` +Переменные используются для хранения данных и использования их в коде. + +Сохраните файл, теперь вы можете запустить этот код. Откройте терминал (или новый терминал в VSCode), затем выберите папку с вашим файлом. Для этого можно использовать команду `cd`. Например: `cd Documents\javascript` +Теперь ваш терминал находится в той же папке, где и ваш файл, вы можете запустить его с помощью `node filename.js` +Если вы всё сделали правильно, то вы ничего не будете видеть. +В следующей главе мы покажем вам, как вы можете выводить данные в терминале. + +В общем, использование `const` вместо `let` является нормальным при определении переменной. Переменная, определённая с помощью `const` не может быть изменена, так как является константой. +Javascript сможет заставить ваш код работать более эффективно, потому что он знает, что ему не нужно учитывать изменения значения этой переменной. +Если вы хотите изменяемую переменную, вы можете использовать `let`. + +```js +const test = 5 +// eslint-disable-next-line +test = 10 // Эта строчка неправильная +``` + +Вторая строчка неправильная, так как вы не можете перезаписать переменную `test`. + +Если вы хотите помочь себе и другим людям в понимании вашего кода, то вы можете использовать комментарии. +Чтобы написать комментарий вам нужно использовать `//`, всё после этого будет игнорироваться Javascript'ом. + +#### Получение ответа + +Довольно часто для того чтобы убедиться, что ваша программа работает правильно, вам нужно выводить значения переменных. +Вы можете сделать это отображая переменные в терминале. +В Javascript вы можете это сделать с помощью функции `console.log()`. + +```js +const test = 5 + +console.log(test) +``` + +Теперь когда вы сохраните и запустите этот код, то наконец увидите: + +```txt +5 +``` + +#### Функции в Javascript + +Далее вы узнаете о функциях. Функции - это часть кода, которая может быть использована несколько раз в вашем коде. +Это может быть полезно, потому что вам не нужно будет писать что-либо много раз. + +```js +const addition = (a, b) => { + return a + b +} + +const test1 = addition(5, 10) +const test2 = addition(1, 0) + +console.log(test1) +console.log(test2) +``` + +`=>` используется для определения функции, и называется стрелочным оператором. +Перед стрелочным оператором находится список параметров, всё, что находится в круглых скобках `()` - это параметры, разделённые запятыми. +Параметры - это переменные, которые вы можете передать вашей функции, чтобы функция могла с ними работать. +Затем после оператора идёт тело функции, это всё, что находится в фигурных скобках `{}` +Это то место, где вы можете поместить свой код функции. +Теперь, когда функция готова, вы присваиваем её к переменной, чтобы дать имя. В нашем случае - `addition` + +Как вы можете видеть, код берёт в качестве параметров переменные `a` и `b`, а затем складывает их. +Затем функция возвращает результат. +Когда функция определена, код в теле функции не выполняется. Чтобы запустить функцию вам нужно вызвать её. +Вы можете вызвать функцию, используя её имя, за которыми идут круглые скобки. В нашем случае - `addition()` +Однако для функции `addition` требуется 2 параметра. Их можно передать, добавив их в круглые скобки через запятую. В нашем случае - `addition(1, 2)` +Когда функция готова, вы можете Wпредставить, что вызов функции заменяется тем, что функция вернула. Таким образом, в этом случае `let test1 = addition(5, 10)` станет `let test1 = result` (На самом вы этого не увидите, но это может помочь вам понять концепцию). + +Иногда вы столкнётесь со следующим: `function addition() {}` Это означает то же самое, но предпочтительнее использовать `() => {}`. (Если вы действительно хотите знать почему, загуглите 'javascript function vs arrow function') + +Приведённый код выше должен вывести следующее: + +```txt +15 +1 +``` + +#### Типы данных в Javascript + +До этого мы работали только с числами, но Javascript имеет множество других типов данных: + +- Строка - это текст, который содержит множество символов. Строки объявляются с помощью `''` + +```js +const string = 'This is a string' // string type +``` + +- Массив - это тип, который может хранить несколько других переменных. Массивы объявляются с помощью `[]` + +```js +const array = [1, 2, 3] // array type +``` +- Объекты - это обычно продвинутые массивы, позже вы узнаете больше об этом типе в туториале. Они объявляются с помощью `{}` + +```js +const object = {} // object type +``` + +- У функций есть свой собственный тип + +```js +const adder = (a, b) => { return a + b } // function type +``` + +- Логический тип может быть `true` или `false` + +```js +const boolean = true // boolean type +``` + +- Когда что-либо ещё не объявлено, оно имеет тип `undefined` + +```js +let nothing // undefined type +const notDefined = undefined // undefined type +``` + +#### Условные конструкции + +Иногда вам придётся делать разные вещи, основываясь на определенном условии. +Это можно реализовать с помощью условных конструкций. + +```js +const name = 'Боб' + +if (name === `Боб`) { + console.log('Меня зовут Боб') +} else if (name === 'Алиса') { + console.log('Меня зовут Алиса') +} else { + console.log('Меня не зовут Боб или Алиса') +} +``` + +Условные конструкции создаются с помощью `if`. После этого идёт условие с круглых скобках `()`, код находится в фигурных скобках `{}` +В условии должно быть что-то, что возвращает логический тип данных. +В нашем случае используется `===`, которое возвращает `true`, если значение значение слева равняется значению справа. Иначе будет `false` +Если значение равно `true`, то код, соответствующий этому условию будет выполнен. +Вы можете продолжать цепочку условных конструкций используя `else if` и `else`. +Вы можете иметь столько условных конструкций с `else if`, сколько вы захотите, но можно использовать только только 1 `if` и `else`. +Если у вас присутствует `else`, то он будет вызываться только тогда, когда все остальные условия вернули `false` + +#### Циклы + +Циклы используются для повторения определенного кода до тех пор, пока не будет выполнено определенное условие. + +```js +let countDown = 5 + +while (countDown > 0) { + console.log(countDown) + countDown = countDown - 1 // Понижаем значение countDown на 1 +} + +console.log('Конец!') +``` + +Код выше будет выводить следующее: + +```txt +5 +4 +3 +2 +1 +Конец! +``` + +Цикл `while` имеет условие `()` и тело `{}` +Когда код доходит до цикла, он проверяет условие. Если условие равно `true`, то код в теле циклы будет выполнен. +Когда код в теле выполнен, условие проверяется ещё раз, и если оно равно `true`, код выполняется заново. +Это будет происходить до тех пор, пока условие равно `true` +Каждый цикл код выводит число `countDown`, а затем отнимает от него 1. +После 5 срабатывания, когда условие равно `0 > 0`, будет `false`, и тогда код будет продолжаться дальше. + +Цикл `for` также часто используется и немного отличается от `while`. + +```js +for (let countDown = 5; countDown > 0; countDown = countDown - 1) { + console.log(countDown) +} +``` + +Вместо одного условия, цикл содержит 3 разных части. +Эти части разделены точкой с запятой. +Первая часть - `let countDown = 5`, срабатывает только 1 раз, при запуске цикла. +Вторая часть - `countDown > 0`, условие, которое одинаково при каждом срабатывании цикла. +Третья часть - `countDown = countDown - 1`, срабатывает при каждом срабатывании цикла. + +Если вы хотите что-то сделать с каждым элементом массива, вы можете использовать цикл `for of`. + +```js +const array = [1, 2, 3] + +for (const item of array) { + console.log(item) +} +``` + +Цикл `for of` требует переменную перед `of`, это требуется для доступа к каждому элементу этой переменной. +Переменная после `of` нужна, чтобы хранить переменную. В основном это массивы, но также могут быть объектами. +Цикл будет выполняться для каждого элемента в `array`, и каждый раз переменная `item` будет являться элементом `array`. + +#### Node Package Manager + +Теперь вы узнаете как пользоваться [Node Package Manager](https://www.npmjs.com/)(NPM). +NPM автоматически устанавливается, когда вы устанавливаете Node. +NPM используется для получения библиотек, которые другие люди создали для удобства. +Вы можете посмотреть библиотеки на [сайте](https://www.npmjs.com/) и затем установить их, используя команду `npm install` в вашем терминале. +Например, чтобы скачать библиотеку Mineflayer, вам нужно прописать `npm install mineflayer` + +Теперь Node может получить доступ к установленной библиотеке с помощью функции `require()`. + +```js +const mineflayer = require('mineflayer') +``` + +После этого будет доступна переменная `mineflayer`, представляющая все функции Mineflayer. + +### Создание бота + +Теперь, когда вы знаете основы Javascript, Node и NPM, вы готовы к созданию вашего первого бота! +Если вы не знаете слов выше, то вернитесь к [предыдущему](#основы-javascript) + +Снизу представлены начальные действия для создания бота. + +```js +const mineflayer = require('mineflayer') + +const bot = mineflayer.createBot() +``` + +Если вы запустите этот код, вы заметите, что программа не останавливатся. Если вы хотите остановить работающую программу, нажмите `Ctrl` + `c` +Однако этот бот не совсем полезен, так как по умолчанию он подключается к серверу Minecraft, работающему на вашем компьютере, с портом 25565. +Если вы хотите выбрать сервер, на который будет заходить бот, вам нужно прописать некоторые настройки. + + +```js +const mineflayer = require('mineflayer') + +const options = { + host: 'localhost', // Измените это на айпи сервера, который вам нужен. + port: 25565 // Измените это на порт сервера, который вам нужен. +} + +const bot = mineflayer.createBot(options) +``` + +#### Объекты в Javascript + +Фигурные скобки `{}` используются для созданий объектов. +Объекты содержат значения в виде пар `ключ-значение` +Эти пары разделены с помощью `:`, где ключ перед двоеточием, а значение после двоеточия. +Ключи можно использовать для получения их значения. +Вы можете иметь несколько таких пар, разделённых запятыми. + +```js +const object = { + number: 10, + another: 5 +} + +console.log(object.number) // Выведет число 10 +``` + +Эта концепция часто используется для создания так называемых 'именованных параметров' +Преимущество этого заключается в том, что вам не нужно использовать все доступные опции, и их расположение не имеет значения. +Значением может быть что угодно, даже другой объект. Если значение является функцией, то эта функция часто вызывается методом для этого объекта. +Вы также можете создать объект одной строкой. + +```js +const bot = mineflayer.createBot({ host: 'localhost', port: 25565 }) +``` + +#### Присоединение + +Без каких либо параметров у бота будет ник `Player` и он сможет подключаться только к пиратским серверам(или LAN-сервера). +Если вы дополните `createBot` опцией `username`, то бот будет использовать указанный вами ник. (Всё ещё для пиратских серверов) +Чтобы зайти на конкретный лицензионный аккаунт, вы должны использовать `username` вместе с `password` + +```js +const bot = mineflayer.createBot({ + host: 'localhost', + port: 25565, + username: 'Player', + password: 'password' +}) +``` + +#### Аргументы командной строки + +Что если кому-то понравится ваш бот и он захочет использовать его на другом сервере или с другим аккаунтом? +Это означает, что все смогут изменить айпи сервера и настройки входа как они захотят. (А также плохая идея передавать свой пароль) +Поэтому многие используют аргументы командной строки. + +```js +const bot = mineflayer.createBot({ + host: process.argv[2], + port: parseInt(process.argv[3]), + username: process.argv[4], + password: process.argv[5] +}) +``` + +Как вы видите, теперь ваши данные не используются в коде! Но как его запустить? +Теперь вместо того, чтобы запускать код через `node filename.js`, вы должны запускать его с помощью `node filename.js host port username password` +Node автоматически разделит агрументы через пробел в массив. +Этот массив - `process.argv` +Данные можно получить с помощью индексов. Индексы всегда начинаются с 0, поэтому первый аргумент с номером `[0]` будет со значением `node` и т.д. + +| | Первый аргумент | Второй аргумент | Третий аргумент | Четвёртый аргумент | Пятый аргумент | Шестой аргумент | +| --- | :---: | :---: | :---: | :---: | :---: | :---: | +| Значение | `node` | `filename.js` | `host` | `port` | `username` | `password` | +| Индекс | `[0]` | `[1]` | `[2]` | `[3]` | `[4]` | `[5]` + +### Передача функций + +Передаваться в качестве аргумента могут не только основные переменные, но и функции. +Функции передаются точно так же. + +```js +const welcome = () => { + bot.chat('Привет!') +} + +bot.once('spawn', welcome) +``` + +Как вы можете видеть, метод `bot.once()` имеет 2 параметра. +Первый параметр - название события, второй - функция, которая вызывается, когда срабатывает событие. +Запомните, когда передаёте функцию в качестве аргумента, используйте только имя функции, без `()` + +`bot.chat()` - это метод отправки сообщений в чат. + +Вы можете упростить код, используя анонимные функции. +У анонимных функций нет названий, они создаются на месте имени функции. +Они так же могут иметь параметры в `()` и тело функции в `{}`, даже если они не используются. + +```js +bot.once('spawn', () => { + bot.chat('Привет!') +}) +``` + +### Прослушивание событий + +Объект бота имеет множество полезных [событий](http://prismarinejs.github.io/mineflayer/#/api_ru?id=events). +Вы можете прослушивать события используя методы `bot.on()` или `bot.once()` для объекта бота, они принимают имя события и функцию. +Чтобы удалить какой-либо прослушиватель событий, используйте метод `bot.removeListener()`. + +- `bot.on(eventName, listener)` + Вызывает функцию `listener` каждый раз, когда срабатывает событие `eventName`. +- `bot.once(eventName, listener)` + Вызывает функцию `listener` только один раз, когда впервые срабатывает событие `eventName`. +- `bot.removeListener(eventName, listener)` + Удаляет `listener` для события `eventName`. Чтобы это использовать, вам нужно либо определить вашу функцию с помощью `function myNamedFunc() {}`, либо поместить вашу функцию в переменную с помощью `const myNamedFunc = () => {}`. Затем вы можете использовать `myNamedFunc` в аргументе слушателя. + +События имеет не только объект бота, например у [`Сундуков`](http://prismarinejs.github.io/mineflayer/#/api_ru?id=mineflayerchest), [`Печек`](http://prismarinejs.github.io/mineflayer/#/api_ru?id=mineflayerfurnace), [`Раздатчиков`](http://prismarinejs.github.io/mineflayer/#/api_ru?id=mineflayerdispenser), [`Столов зачарования`](http://prismarinejs.github.io/mineflayer/#/api_ru?id=mineflayerenchantmenttable), [`Жителей`](http://prismarinejs.github.io/mineflayer/#/api_ru?id=mineflayervillager) также есть свои события. + +### Промисы +[Промисы](https://nodejs.dev/learn/understanding-javascript-promises) - это функции, которые вы можете использовать с помощью переменной `await` для ожидания, пока какая-либо функция не завершится (вы также можете прервать await, чтобы не ожидать результата). + +```js +async function consume (bot) { + try { + await bot.consume() + console.log('Съел') + } catch (err) { + console.log(error) + } +} +``` + +Код выше попытается употребить то, что сейчас бот держит в руке. +Когда употребление заканчивается, вызывается переданная функция. +После этого вы сможете делать любые другие вещи. +Функция также может быть вызвана при возникновении ошибки. + +#### Правильный и неправильный подход + +Снизу пример бота, который создаёт дубовые доски, а затем палки. + +Неправильно ❌: + +```js +function craft (bot) { + const mcData = require('minecraft-data')(bot.version) + const plankRecipe = bot.recipesFor(mcData.itemsByName.oak_planks.id ?? mcData.itemsByName.planks.id)[0] // Получение рецепта для дубовых досок + bot.craft(plankRecipe, 1) // ❌ Начинает создавать дубовые доски + + const stickRecipe = bot.recipesFor(mcData.itemsByName.sticks.id)[0] // Получение рецепта для палок + bot.craft(stickRecipe, 1) // ❌ Начинает создавать палки +} +``` + +Правильно с промисами ✔️: + +```js +async function craft (bot) { + const mcData = require('minecraft-data')(bot.version) + const plankRecipe = bot.recipesFor(mcData.itemsByName.oak_planks.id ?? mcData.itemsByName.planks.id)[0] + await bot.craft(plankRecipe, 1, null) + const stickRecipe = bot.recipesFor(mcData.itemsByName.sticks.id)[0] + await bot.craft(stickRecipe, 1, null) + bot.chat('Скрафтил палки') +} +``` + +Причина почему первый код неправильный в том, что когда вызывается `bot.craft()`, код продолжает что-то делать, пока бот крафтит. +К тому времени как код уже выполняет второй `bot.craft()`, первый ещё возможно даже не закончился, а значит ресурсов для палок ещё нет. +Использование промисов может исправить это, потому что будет известно, когда закончится выполнение `bot.craft()`. + +Больше о методе `bot.craft()` [здесь](https://github.com/PrismarineJS/mineflayer/blob/master/docs/api_ru.md#botcraftrecipe-count-craftingtable). + +## Продвинутым + +Следующие концепции необязательны для создания бота на Mineflayer, но могут быть полезны для понимая и создания усовершенствованных ботов. +Мы предполагаем, что вы поняли [Основы](#основы). + +### Цикл для объекта + +Цикл `for of` описанный в [разделе о циклах](#циклы) также может использоваться и для объектов. + +Если у нас есть следующий объект: + +```js +const obj = { + a: 1, + b: 2, + c: 3 +} +``` + +Мы можем создать цикл, перебирающий все значения объекта. + +```js +for (const value of Object.values(obj)) { + console.log(value) +} +``` + +```txt +1 +2 +3 +``` + +Это цикл, перебирающий все ключи объекта. + +```js +for (const key of Object.keys(obj)) { + console.log(key) +} +``` + +```txt +a +b +c +``` + +Вы также можете одновременно использовать ключи и значения одновременно. Сначала вам придется деструктурировать переменные, объяснение вы можете найти [здесь.](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) + +```js +for (const [key, value] of Object.entries(obj)) { + console.log(key + ', ' + value) +} +``` + +```txt +a, 1 +b, 2 +c, 3 +``` + +Эти циклы возможны благодаря `Object.values(obj)` и `Object.keys(obj)`, который возвращают массивы с значениями и ключами объектов соотвественно. +`Object.entries(obj)` возвращает массив, состоящий из двух элементов: ключа и его значения. +Важно знать, что в отличии от функций `Object.values()` и `Object.keys()`, функция `Object.entries()` порядок элементов останется таким же, каким он был в объекте. + +Также существует цикл `for in`. Однако, вам чаще придётся использовать `for of` вместо `for in`, потому что есть различия в ключах. +Цикл `for in` работает на основе ключей вместо значений. (Индекс в этом случае, если это массив) +Однако он зацикливается не только на своих собственных ключах, но и на ключах из другого объекта, от которого он "наследуется", что нежелательно и может сбивать с толку. Подробнее об этом [здесь.](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/for...in) +В общем, вам понадобится `for of` вместо `for in`, поэтому убедитесь, что вы не путаете эти два понятия. + +### Создание события для чата + +Вы можете создать свои собственные события для чата, используя метод [`bot.chatAddPattern()`](http://prismarinejs.github.io/mineflayer/#/api_ru?id=#botchataddpatternpattern-chattype-description). Полезно для серверов с плагинами, который меняют формат чата на сервере. +Метод [`bot.chatAddPattern()`](http://prismarinejs.github.io/mineflayer/#/api_ru?id=botchataddpatternpattern-chattype-description) принимает три аргумента : + +- `pattern` - Регулярное выражение для совпадения с сообщением. +- `chatType` - Вид сообщения. Является названием события, который будет срабатывать при совпадении с шаблоном. Например: "chat" или "whisper". +- `description` - Необязательно, описание шаблона. + +Вы можете добавить [группы](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions/Groups_and_Ranges) в `pattern`, чтобы затем слушатель последовательно распределил группы по аргументам вашего обратного вызова. + +Ознакомиться с регулярными выражениями вы можете [здесь](https://ru.wikipedia.org/wiki/Регулярные_выражения). + +Примеры : + +#### Приветствующий бот + +Здесь мы создаём бота, который отвечает на 'привет' другого игрока. + +```js +bot.chatAddPattern( + /(прив|привет|Привет)/, + 'hello', + 'Кто-то приветствуется' +) + +const hi = () => { + bot.chat('Здарова!') +} + +bot.on('hello', hi) +``` + +#### Нестандартный формат чата + +Создание события основанного на изменённом формате сообщений. +Пример: + +```txt +[Игрок] Player1 > Привет +[Админ] Alex > прив +[Игрок] Player2 > Помогите, я застрял +[Модератор] Jim > Сейчас +``` + +```js +bot.chatAddPattern( + /^\[(.+)\] (\S+) > (.+)$/, + 'my_chat_event', + 'Собственное событие чата' +) + +const logger = (rank, username, message) => { + console.log(`${username} сказал ${message}`) +} + +bot.on('my_chat_event', logger) +``` + +Объяснение этого `^\[(.+)\] (\S+) > (.+)$` вы можете найти [здесь](https://regex101.com/r/VDUrDC/2). + +## ЧаВо + +### Как запустить бота на Android + +Вы можете запускать ботов на Android при помощи [Termux](https://termux.com/). + +#### Установка Termux + +Установите [Termux](https://termux.com/) и запустите его. + +#### Настройка + +Установите `Node.js`: + +```bash +pkg update -y +pkg install nodejs -y +``` + +❗️ Выдайте Termux права на доступ к файлам в настройках приложения. +Создайте папку во внутреннем хранилище : + +```bash +cd /sdcard +mkdir my_scripts +cd my_scripts +``` + +Установите `mineflayer`: + +```bash +npm install mineflayer +``` + +Теперь вы можете скопировать и хранить все свои скрипты в папке `my_scripts` во внутреннем хранилище. + +#### Запуск вашего бота + +Чтобы запустить бота, запустите Node с именем вашего скрипта. + +```bash +node script_name.js +``` + +❗️ Каждый раз, когда вы открываете Termux, вы должны изменять директорию на `/sdcard/my_scripts`, перед тем как запускать бота: + +```bash +cd /sdcard/my_scripts +``` From db9df8c369e03a957fcc48fd9697a7266eca54db Mon Sep 17 00:00:00 2001 From: FurnyGo <68079109+FurnyGo@users.noreply.github.com> Date: Sat, 2 Sep 2023 15:06:34 +0400 Subject: [PATCH 7/9] upload contributing --- docs/ru/CONTRIBUTING_RU.md | 86 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 docs/ru/CONTRIBUTING_RU.md diff --git a/docs/ru/CONTRIBUTING_RU.md b/docs/ru/CONTRIBUTING_RU.md new file mode 100644 index 000000000..e573cbbbb --- /dev/null +++ b/docs/ru/CONTRIBUTING_RU.md @@ -0,0 +1,86 @@ +# Вклад в проект + +Изначально Mineflayer создал [andrewrk](http://github.com/andrewrk), но с тех пор проект был улучшен и исправлен многими [помощниками](https://github.com/andrewrk/mineflayer/graphs/contributors). +Это то, почему важно знать, как внести свой вклад в mineflayer. + +## Организация проблем + +У нас есть метки трёх стадий для организаций проблем: + +* Стадия 1: созданы каким-либо новичком, мы не знаем, нуждается ли это в реализации или исправлении +* Стадия 2: многообещающая идея, но требует дополнительного обдумывания перед реализацией +* Стадия 3: идея точно задана, осталось только сделать код + +Ссылки по типу https://github.com/PrismarineJS/mineflayer/issues?q=is%3Aopen+is%3Aissue+-label%3AStage1 могут использоваться для показа только с меток первой стадии, если вы хотите развить какую-либо тему. + +## Создание тестов +Mineflayer имеет 2 вида тестов : + + * [Внутренние тесты](test/internalTest.js) : Тесты, которые выполняются на простом сервере, созданном с помощью node-minecraft-protocol. + * [Внешние тесты](test/externalTests/) : Тесты, который выполняются на ванильном сервере. + +Цель этих тестов - автоматически определить, что работает, а что нет в mineflayer, чтобы было проще заставить mineflayer работать. + +### Создание внешних тестов + +Для внешних тестов вам просто нужно создать файл в [test/externalTests](test/externalTests) + +Например : [test/externalTests/digAndBuild.js](https://github.com/PrismarineJS/mineflayer/blob/master/test/externalTests/digAndBuild.js) + +Этот файл должен экспортировать функцию, возвращающую функцию или массив функций, принимающих в качестве параметра объект бота и выполненный обратный вызов, +он должен содержать утверждения для проверки, если тестируемая функциональность не сработала. + + +## Создание стороннего плагина +Mineflayer поддерживает плагины; любой желающий может создать плагин, который добавляет API еще более высокого уровня поверх Mineflayer. + +Несколько сторонних плагинов, которые уже были сделаны вы можете найти [здесь](https://github.com/andrewrk/mineflayer#third-party-plugins). + +Для того чтобы создать новый плагин, вам необходимо : + +1. Создать новый репозиторий +2. В вашем файле index.js, экспортировать функцию init, которая будет принимать mineflayer в качестве аргумента. ([Пример](https://github.com/andrewrk/mineflayer-navigate/blob/e24cb6a868ce64ae43bea2d035832c15ed01d301/index.js#L18)) +3. Эта функция возвращает функцию inject, которая принимает объект бота. ([Пример](https://github.com/andrewrk/mineflayer-navigate/blob/e24cb6a868ce64ae43bea2d035832c15ed01d301/index.js#L23)) +4. С помощью этой inject функции можно добавить функционал объекту бота. ([Пример](https://github.com/andrewrk/mineflayer-navigate/blob/e24cb6a868ce64ae43bea2d035832c15ed01d301/index.js#L32)) + +Поскольку объект mineflayer передается в параметре, этот новый пакет не должен зависеть от mineflayer (в package.json не должно быть зависимости mineflayer) + +Смотрите [полный пример здесь](https://github.com/andrewrk/mineflayer-navigate/tree/e24cb6a868ce64ae43bea2d035832c15ed01d301). + +## Сообщения об ошибках +Mineflayer хорошо работает в большинстве случаев, но иногда в нем все еще есть ошибки. + +При обнаружении ошибки лучше всего сообщить о проблеме, предоставив следующую информацию : + +* что вы хотите сделать (цель на английском языке) +* что вы делаете (ваш код) +* что происходит +* что вы ожидали увидеть + +## Код Mineflayer +Некоторые вещи, о которых следует подумать при отправке Pull Request или commit : + +### Обработка ошибок +В большинстве случаев mineflayer не должен выводить бота из строя. Даже если что-то не сработает, бот может воспользоваться альтернативным маршрутом, чтобы добраться до своей цели. + +Это означает, что мы не должны использовать `throw(new Error("error"))`, а вместо этого использовать соглашение node.js о передаче ошибки в обратном вызове. ++ +Пример : + +```js +function myfunction (param1, callback) { + // что-то делаем + let toDo = 1 + toDo = 2 + if (toDo === 2) { // всё работает + callback() + } else { + callback(new Error('что-то не так')) + } +} +``` + +Вы можете посмотреть другие примеры в [коде mineflayer](https://github.com/andrewrk/mineflayer/blob/a8736c4ea473cf1a609c5a29046c0cdad006d429/lib/plugins/bed.js#L10) + +### Обновление документации +Список содержимого документации docs/api.md is made with doctoc. After updating that file, you should run doctoc docs/api.md to update the table of content. From 305cecc494030335c93ec88be314bb4e07e18728 Mon Sep 17 00:00:00 2001 From: FurnyGo <68079109+FurnyGo@users.noreply.github.com> Date: Sat, 2 Sep 2023 15:07:37 +0400 Subject: [PATCH 8/9] Update links --- docs/ru/CONTRIBUTING_RU.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ru/CONTRIBUTING_RU.md b/docs/ru/CONTRIBUTING_RU.md index e573cbbbb..f39352888 100644 --- a/docs/ru/CONTRIBUTING_RU.md +++ b/docs/ru/CONTRIBUTING_RU.md @@ -16,8 +16,8 @@ ## Создание тестов Mineflayer имеет 2 вида тестов : - * [Внутренние тесты](test/internalTest.js) : Тесты, которые выполняются на простом сервере, созданном с помощью node-minecraft-protocol. - * [Внешние тесты](test/externalTests/) : Тесты, который выполняются на ванильном сервере. + * [Внутренние тесты](../../test/internalTest.js) : Тесты, которые выполняются на простом сервере, созданном с помощью node-minecraft-protocol. + * [Внешние тесты](../../test/externalTests/) : Тесты, который выполняются на ванильном сервере. Цель этих тестов - автоматически определить, что работает, а что нет в mineflayer, чтобы было проще заставить mineflayer работать. From f50ea661bbeaca89028f1c124487bf9cbe4fdbd6 Mon Sep 17 00:00:00 2001 From: FurnyGo <68079109+FurnyGo@users.noreply.github.com> Date: Sat, 2 Sep 2023 15:10:10 +0400 Subject: [PATCH 9/9] Update links again --- docs/ru/CONTRIBUTING_RU.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ru/CONTRIBUTING_RU.md b/docs/ru/CONTRIBUTING_RU.md index f39352888..c0f298c35 100644 --- a/docs/ru/CONTRIBUTING_RU.md +++ b/docs/ru/CONTRIBUTING_RU.md @@ -23,7 +23,7 @@ Mineflayer имеет 2 вида тестов : ### Создание внешних тестов -Для внешних тестов вам просто нужно создать файл в [test/externalTests](test/externalTests) +Для внешних тестов вам просто нужно создать файл в [test/externalTests](../../test/externalTests) Например : [test/externalTests/digAndBuild.js](https://github.com/PrismarineJS/mineflayer/blob/master/test/externalTests/digAndBuild.js)