Skip to content

Commit

Permalink
Updating RU docs (#3178)
Browse files Browse the repository at this point in the history
* Updating existing russian docs

* Update api_ru.md to 4.14.0

* Update link

* new docs files

* upload index.html

* Tutorial translate

* upload contributing

* Update links

* Update links again
  • Loading branch information
FurnyGo committed Sep 2, 2023
1 parent 167e271 commit 7474564
Show file tree
Hide file tree
Showing 9 changed files with 2,311 additions and 774 deletions.
86 changes: 86 additions & 0 deletions docs/ru/CONTRIBUTING_RU.md
Original file line number Diff line number Diff line change
@@ -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.
124 changes: 107 additions & 17 deletions docs/ru/FAQ_RU.md
Original file line number Diff line number Diff line change
Expand Up @@ -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', () => {})
Expand All @@ -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()`.

Пример:

Expand All @@ -32,42 +76,38 @@ 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), чтобы посмотреть пример

### Как проверить отправленные/полученные пакеты?

Включите отладку https://github.com/PrismarineJS/mineflayer#debug

### Я хочу избежать отключения бота от сервера даже в случае задержки сервера, как мне этого добиться?

Один из способов - увеличить параметр [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
if (display == null) return message

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
Expand All @@ -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

### Бот не может ломать/ставить блоки или открывать сундуки

Убедитесь, что защита спавна не мешает боту

0 comments on commit 7474564

Please sign in to comment.