chore: cleanup configs, docs, checkstyle, remove dead deps
This commit is contained in:
parent
984b364295
commit
d3d87c34e0
23 changed files with 1703 additions and 2231 deletions
65
.github/ISSUE_TEMPLATE/bug_report.md
vendored
65
.github/ISSUE_TEMPLATE/bug_report.md
vendored
|
|
@ -1,47 +1,54 @@
|
||||||
---
|
---
|
||||||
name: Сообщение об ошибке
|
name: Bug Report / Сообщение об ошибке
|
||||||
about: Создайте отчет об ошибке, чтобы помочь нам улучшить плагин
|
about: Report a bug to help us improve / Сообщите об ошибке чтобы помочь нам
|
||||||
title: '[BUG] '
|
title: '[BUG] '
|
||||||
labels: bug
|
labels: bug
|
||||||
assignees: ''
|
assignees: ''
|
||||||
---
|
---
|
||||||
|
|
||||||
## Описание ошибки
|
## Description | Описание
|
||||||
Четкое и краткое описание того, что произошло.
|
|
||||||
|
|
||||||
## Шаги для воспроизведения
|
### English
|
||||||
1. Перейти к '...'
|
Clear and concise description of the bug.
|
||||||
2. Выполнить команду '...'
|
|
||||||
3. Увидеть ошибку
|
|
||||||
|
|
||||||
## Ожидаемое поведение
|
### Русский
|
||||||
Четкое и краткое описание того, что вы ожидали увидеть.
|
Четкое и краткое описание ошибки.
|
||||||
|
|
||||||
## Скриншоты
|
---
|
||||||
Если применимо, добавьте скриншоты для объяснения проблемы.
|
|
||||||
|
|
||||||
## Информация о сервере
|
## Steps to Reproduce | Шаги для воспроизведения
|
||||||
- Версия Minecraft: [например, 1.21.1]
|
|
||||||
- Версия сервера: [например, Paper 1.21.1-116]
|
|
||||||
- Версия плагина: [например, 1.5.5]
|
|
||||||
- Версия Java: [например, Java 21]
|
|
||||||
|
|
||||||
## Установленные плагины
|
1. Go to / Перейти к '...'
|
||||||
Список других плагинов на сервере (особенно те, которые могут взаимодействовать с чатом):
|
2. Run command / Выполнить команду '...'
|
||||||
- PlaceholderAPI
|
3. See error / Увидеть ошибку
|
||||||
- LuckPerms
|
|
||||||
- ...
|
## Expected Behavior | Ожидаемое поведение
|
||||||
|
|
||||||
|
## Actual Behavior | Фактическое поведение
|
||||||
|
|
||||||
|
## Screenshots | Скриншоты
|
||||||
|
|
||||||
|
## Server Info | Информация о сервере
|
||||||
|
|
||||||
|
- Minecraft version:
|
||||||
|
- Server version (Paper/Folia):
|
||||||
|
- Plugin version:
|
||||||
|
- Java version:
|
||||||
|
|
||||||
|
## Installed Plugins | Установленные плагины
|
||||||
|
|
||||||
|
PlaceholderAPI, LuckPerms, etc.
|
||||||
|
|
||||||
|
## Logs | Логи
|
||||||
|
|
||||||
## Логи
|
|
||||||
```
|
```
|
||||||
Вставьте сюда релевантные логи из console или latest.log
|
Paste relevant logs here
|
||||||
```
|
```
|
||||||
|
|
||||||
## Конфигурация
|
## Configuration | Конфигурация
|
||||||
Если проблема связана с конфигурацией, вставьте релевантные части:
|
|
||||||
```yaml
|
```yaml
|
||||||
# config.yml или другой конфиг
|
# Relevant config sections
|
||||||
```
|
```
|
||||||
|
|
||||||
## Дополнительный контекст
|
## Additional Context | Дополнительный контекст
|
||||||
Любая другая информация о проблеме.
|
|
||||||
|
|
|
||||||
66
.github/ISSUE_TEMPLATE/feature_request.md
vendored
66
.github/ISSUE_TEMPLATE/feature_request.md
vendored
|
|
@ -1,49 +1,55 @@
|
||||||
---
|
---
|
||||||
name: Запрос новой функции
|
name: Feature Request / Запрос функции
|
||||||
about: Предложите идею для этого проекта
|
about: Suggest an idea for this project / Предложите идею для проекта
|
||||||
title: '[FEATURE] '
|
title: '[FEATURE] '
|
||||||
labels: enhancement
|
labels: enhancement
|
||||||
assignees: ''
|
assignees: ''
|
||||||
---
|
---
|
||||||
|
|
||||||
## Описание функции
|
## Description | Описание
|
||||||
Четкое и краткое описание того, что вы хотите добавить.
|
|
||||||
|
|
||||||
## Проблема, которую это решает
|
### English
|
||||||
Опишите проблему, которую решает эта функция. Например: "Я всегда расстраиваюсь, когда [...]"
|
Clear and concise description of the feature.
|
||||||
|
|
||||||
## Предлагаемое решение
|
### Русский
|
||||||
Четкое и краткое описание того, что вы хотите видеть.
|
Четкое и краткое описание функции.
|
||||||
|
|
||||||
## Альтернативы
|
---
|
||||||
Четкое и краткое описание любых альтернативных решений или функций, которые вы рассматривали.
|
|
||||||
|
|
||||||
## Примеры использования
|
## Problem | Проблема
|
||||||
Как бы вы использовали эту функцию? Приведите примеры команд, конфигурации и т.д.
|
|
||||||
|
### English
|
||||||
|
Describe the problem this solves.
|
||||||
|
|
||||||
|
### Русский
|
||||||
|
Опишите проблему, которую решает эта функция.
|
||||||
|
|
||||||
|
## Proposed Solution | Предлагаемое решение
|
||||||
|
|
||||||
|
## Alternatives | Альтернативы
|
||||||
|
|
||||||
|
## Usage Examples | Примеры использования
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
# Пример конфигурации
|
# Example config
|
||||||
new-feature:
|
|
||||||
enabled: true
|
|
||||||
option: value
|
|
||||||
```
|
```
|
||||||
|
|
||||||
```
|
```
|
||||||
# Пример команды
|
# Example command
|
||||||
/newcommand <аргумент>
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Приоритет
|
## Priority | Приоритет
|
||||||
- [ ] Критично - без этого плагин не работает должным образом
|
|
||||||
- [ ] Высокий - значительно улучшит функциональность
|
|
||||||
- [ ] Средний - было бы хорошо иметь
|
|
||||||
- [ ] Низкий - небольшое улучшение
|
|
||||||
|
|
||||||
## Готовность помочь
|
- [ ] Critical / Критично
|
||||||
- [ ] Я могу помочь с реализацией (Pull Request)
|
- [ ] High / Высокий
|
||||||
- [ ] Я могу помочь с тестированием
|
- [ ] Medium / Средний
|
||||||
- [ ] Я могу помочь с документацией
|
- [ ] Low / Низкий
|
||||||
- [ ] Я только предлагаю идею
|
|
||||||
|
|
||||||
## Дополнительный контекст
|
## Willing to Help | Готовность помочь
|
||||||
Добавьте любой другой контекст или скриншоты о запросе функции здесь.
|
|
||||||
|
- [ ] I can implement / Могу реализовать (PR)
|
||||||
|
- [ ] I can test / Могу тестировать
|
||||||
|
- [ ] I can document / Могу помочь с документацией
|
||||||
|
- [ ] Just suggesting / Только предлагаю
|
||||||
|
|
||||||
|
## Additional Context | Дополнительный контекст
|
||||||
|
|
|
||||||
42
.github/ISSUE_TEMPLATE/question.md
vendored
42
.github/ISSUE_TEMPLATE/question.md
vendored
|
|
@ -1,31 +1,37 @@
|
||||||
---
|
---
|
||||||
name: Вопрос
|
name: Question / Вопрос
|
||||||
about: Задайте вопрос о плагине
|
about: Ask a question about the plugin / Задайте вопрос о плагине
|
||||||
title: '[QUESTION] '
|
title: '[QUESTION] '
|
||||||
labels: question
|
labels: question
|
||||||
assignees: ''
|
assignees: ''
|
||||||
---
|
---
|
||||||
|
|
||||||
## Ваш вопрос
|
## Question | Вопрос
|
||||||
|
|
||||||
|
### English
|
||||||
|
Clearly state your question.
|
||||||
|
|
||||||
|
### Русский
|
||||||
Четко сформулируйте ваш вопрос.
|
Четко сформулируйте ваш вопрос.
|
||||||
|
|
||||||
## Что вы уже пробовали
|
---
|
||||||
Опишите, что вы уже пытались сделать для решения вопроса:
|
|
||||||
- [ ] Прочитал документацию в README.md
|
|
||||||
- [ ] Проверил существующие issues
|
|
||||||
- [ ] Проверил конфигурационные файлы
|
|
||||||
- [ ] Попробовал поискать в интернете
|
|
||||||
|
|
||||||
## Контекст
|
## What I've Tried | Что я уже пробовал
|
||||||
Предоставьте любой релевантный контекст:
|
|
||||||
- Версия плагина:
|
- [ ] Read README / Прочитал README
|
||||||
- Версия сервера:
|
- [ ] Checked existing issues / Проверил существующие issues
|
||||||
- Что вы пытаетесь сделать:
|
- [ ] Checked config files / Проверил конфиги
|
||||||
|
- [ ] Searched online / Искал в интернете
|
||||||
|
|
||||||
|
## Context | Контекст
|
||||||
|
|
||||||
|
- Plugin version / Версия плагина:
|
||||||
|
- Server version / Версия сервера:
|
||||||
|
- What I'm trying to do / Что я пытаюсь сделать:
|
||||||
|
|
||||||
|
## Configuration (if applicable) | Конфигурация (если применимо)
|
||||||
|
|
||||||
## Конфигурация (если применимо)
|
|
||||||
```yaml
|
```yaml
|
||||||
# Вставьте релевантную часть конфигурации
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Дополнительная информация
|
## Additional Info | Дополнительная информация
|
||||||
Любая другая информация, которая может помочь ответить на ваш вопрос.
|
|
||||||
|
|
|
||||||
80
.github/PULL_REQUEST_TEMPLATE.md
vendored
80
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
|
@ -1,49 +1,57 @@
|
||||||
# Pull Request
|
# Pull Request
|
||||||
|
|
||||||
## Описание изменений
|
## Description | Описание
|
||||||
|
|
||||||
|
### English
|
||||||
|
Clear and concise description of what this PR does.
|
||||||
|
|
||||||
|
### Русский
|
||||||
Четкое и краткое описание того, что делает этот PR.
|
Четкое и краткое описание того, что делает этот PR.
|
||||||
|
|
||||||
Fixes #(issue номер)
|
Fixes #(issue)
|
||||||
|
|
||||||
## Тип изменений
|
---
|
||||||
Отметьте релевантные пункты:
|
|
||||||
- [ ] Исправление ошибки (bug fix)
|
|
||||||
- [ ] Новая функция (feature)
|
|
||||||
- [ ] Критическое изменение (breaking change)
|
|
||||||
- [ ] Обновление документации
|
|
||||||
- [ ] Рефакторинг кода
|
|
||||||
- [ ] Улучшение производительности
|
|
||||||
- [ ] Обновление зависимостей
|
|
||||||
|
|
||||||
## Как это было протестировано?
|
## Type of Change | Тип изменений
|
||||||
Опишите тесты, которые вы провели для проверки ваших изменений:
|
|
||||||
- [ ] Тестирование на локальном сервере
|
|
||||||
- [ ] Тестирование с другими плагинами
|
|
||||||
- [ ] Юнит-тесты
|
|
||||||
- [ ] Интеграционные тесты
|
|
||||||
|
|
||||||
**Конфигурация тестирования**:
|
- [ ] Bug fix / Исправление ошибки
|
||||||
- Версия Minecraft:
|
- [ ] New feature / Новая функция
|
||||||
- Версия сервера:
|
- [ ] Breaking change / Критическое изменение
|
||||||
- Версия Java:
|
- [ ] Documentation / Документация
|
||||||
|
- [ ] Refactoring / Рефакторинг
|
||||||
|
- [ ] Performance / Производительность
|
||||||
|
- [ ] Dependencies / Зависимости
|
||||||
|
|
||||||
## Чеклист
|
---
|
||||||
- [ ] Мой код следует стилю этого проекта
|
|
||||||
- [ ] Я провел самопроверку своего кода
|
|
||||||
- [ ] Я прокомментировал свой код, особенно в сложных местах
|
|
||||||
- [ ] Я внес соответствующие изменения в документацию
|
|
||||||
- [ ] Мои изменения не генерируют новых предупреждений
|
|
||||||
- [ ] Я добавил тесты, которые доказывают, что мое исправление эффективно или что моя функция работает
|
|
||||||
- [ ] Новые и существующие юнит-тесты проходят локально с моими изменениями
|
|
||||||
- [ ] Любые зависимые изменения были объединены и опубликованы в downstream модулях
|
|
||||||
|
|
||||||
## Скриншоты (если применимо)
|
## Testing | Тестирование
|
||||||
Добавьте скриншоты для демонстрации изменений.
|
|
||||||
|
|
||||||
## Дополнительный контекст
|
- [ ] Local server test / Локальный сервер
|
||||||
Добавьте любой другой контекст о PR здесь.
|
- [ ] Unit tests / Юнит-тесты
|
||||||
|
- [ ] With other plugins / С другими плагинами
|
||||||
|
|
||||||
|
**Configuration:**
|
||||||
|
- Minecraft version:
|
||||||
|
- Server version:
|
||||||
|
- Java version:
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist | Чеклист
|
||||||
|
|
||||||
|
- [ ] Code follows Google Java Style / Код следует Google Java Style
|
||||||
|
- [ ] Self-review completed / Проведена самопроверка
|
||||||
|
- [ ] Documentation updated / Документация обновлена
|
||||||
|
- [ ] No new warnings / Нет новых предупреждений
|
||||||
|
- [ ] Tests pass / Тесты проходят
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Screenshots (if applicable) | Скриншоты (если применимо)
|
||||||
|
|
||||||
|
## Additional Context | Дополнительный контекст
|
||||||
|
|
||||||
|
## Related Issues | Связанные issues
|
||||||
|
|
||||||
## Связанные issues
|
|
||||||
Список связанных issues:
|
|
||||||
- Closes #
|
- Closes #
|
||||||
- Related to #
|
- Related to #
|
||||||
|
|
|
||||||
6
.gitignore
vendored
6
.gitignore
vendored
|
|
@ -2,6 +2,9 @@
|
||||||
.gradle/
|
.gradle/
|
||||||
build/
|
build/
|
||||||
|
|
||||||
|
# Compiled output (IDE auto-build)
|
||||||
|
bin/
|
||||||
|
|
||||||
# Local Paper test server (gradlew runServer / run-paper)
|
# Local Paper test server (gradlew runServer / run-paper)
|
||||||
run/
|
run/
|
||||||
api_docs/
|
api_docs/
|
||||||
|
|
@ -12,6 +15,9 @@ api_docs/
|
||||||
*.iml
|
*.iml
|
||||||
*.ipr
|
*.ipr
|
||||||
*.iws
|
*.iws
|
||||||
|
.classpath
|
||||||
|
.project
|
||||||
|
.settings/
|
||||||
.vscode/
|
.vscode/
|
||||||
*.code-workspace
|
*.code-workspace
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
# Кодекс поведения участников
|
|
||||||
|
|
||||||
## Наше обязательство
|
|
||||||
|
|
||||||
Мы, как участники и сопровождающие проекта, обязуемся сделать участие в нашем проекте и сообществе свободным от домогательств для всех, независимо от возраста, телосложения, видимой или невидимой инвалидности, этнической принадлежности, половых характеристик, гендерной идентичности и самовыражения, уровня опыта, образования, социально-экономического статуса, национальности, внешности, расы, религии или сексуальной идентичности и ориентации.
|
|
||||||
|
|
||||||
## Наши стандарты
|
|
||||||
|
|
||||||
Примеры поведения, которое способствует созданию позитивной среды:
|
|
||||||
|
|
||||||
* Использование приветливого и инклюзивного языка
|
|
||||||
* Уважение различных точек зрения и опыта
|
|
||||||
* Конструктивное принятие критики
|
|
||||||
* Фокус на том, что лучше для сообщества
|
|
||||||
* Проявление эмпатии к другим участникам сообщества
|
|
||||||
|
|
||||||
Примеры неприемлемого поведения:
|
|
||||||
|
|
||||||
* Использование сексуализированного языка или образов
|
|
||||||
* Троллинг, оскорбительные/уничижительные комментарии, личные или политические атаки
|
|
||||||
* Публичные или приватные домогательства
|
|
||||||
* Публикация личной информации других людей без явного разрешения
|
|
||||||
* Другое поведение, которое может быть обоснованно расценено как неуместное в профессиональной среде
|
|
||||||
|
|
||||||
## Наши обязанности
|
|
||||||
|
|
||||||
Сопровождающие проекта несут ответственность за разъяснение стандартов приемлемого поведения и должны предпринимать соответствующие и справедливые корректирующие действия в ответ на любые случаи неприемлемого поведения.
|
|
||||||
|
|
||||||
Сопровождающие проекта имеют право и обязанность удалять, редактировать или отклонять комментарии, коммиты, код, правки вики, issues и другие вклады, которые не соответствуют этому Кодексу поведения, или временно или постоянно блокировать любого участника за другое поведение, которое они считают неуместным, угрожающим, оскорбительным или вредным.
|
|
||||||
|
|
||||||
## Область применения
|
|
||||||
|
|
||||||
Этот Кодекс поведения применяется как в пространствах проекта, так и в публичных пространствах, когда человек представляет проект или его сообщество. Примеры представления проекта или сообщества включают использование официального адреса электронной почты проекта, публикацию через официальный аккаунт в социальных сетях или выступление в качестве назначенного представителя на онлайн или оффлайн мероприятии.
|
|
||||||
|
|
||||||
## Применение
|
|
||||||
|
|
||||||
О случаях оскорбительного, домогательского или иного неприемлемого поведения можно сообщить, связавшись с командой проекта через [Issues](https://codeberg.org/loki5512344/Lochat/issues). Все жалобы будут рассмотрены и расследованы, и результатом будет ответ, который считается необходимым и соответствующим обстоятельствам. Команда проекта обязана сохранять конфиденциальность в отношении лица, сообщившего об инциденте.
|
|
||||||
|
|
||||||
## Атрибуция
|
|
||||||
|
|
||||||
Этот Кодекс поведения адаптирован из [Contributor Covenant](https://www.contributor-covenant.org), версия 2.0, доступная по адресу https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
|
|
||||||
141
CONTRIBUTING.md
Normal file
141
CONTRIBUTING.md
Normal file
|
|
@ -0,0 +1,141 @@
|
||||||
|
# Contributing to LoChat | Вклад в LoChat
|
||||||
|
|
||||||
|
First off, thank you for considering contributing! We welcome all types of contributions — bug reports, feature requests, documentation, and code changes.
|
||||||
|
|
||||||
|
Прежде всего, спасибо за желание внести вклад! Мы приветствуем любые виды вклада — сообщения об ошибках, запросы функций, документацию и изменения кода.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🇬🇧 English
|
||||||
|
|
||||||
|
### How to Contribute
|
||||||
|
|
||||||
|
1. **Fork** the repository
|
||||||
|
2. **Create a branch** (`git checkout -b feature/your-feature`)
|
||||||
|
3. **Make your changes**
|
||||||
|
4. **Test** your changes (`./gradlew build`)
|
||||||
|
5. **Commit** (`git commit -m 'Add some feature'`)
|
||||||
|
6. **Push** (`git push origin feature/your-feature`)
|
||||||
|
7. **Open a Pull Request**
|
||||||
|
|
||||||
|
### Pull Request Guidelines
|
||||||
|
|
||||||
|
- Keep PRs focused — one feature/fix per PR
|
||||||
|
- Write descriptive commit messages
|
||||||
|
- Update documentation if needed
|
||||||
|
- Ensure code passes `./gradlew build`
|
||||||
|
- Follow Google Java Style (see [checkstyle config](config/checkstyle/README.md))
|
||||||
|
|
||||||
|
### Development Setup
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Clone and build
|
||||||
|
git clone https://github.com/loki5512344/LoChat.git
|
||||||
|
cd LoChat
|
||||||
|
./gradlew build
|
||||||
|
|
||||||
|
# Run local test server
|
||||||
|
./gradlew runServer
|
||||||
|
```
|
||||||
|
|
||||||
|
### Code Style
|
||||||
|
|
||||||
|
This project follows **Google Java Style Guide** with:
|
||||||
|
- 2-space indentation
|
||||||
|
- Javadoc on public APIs
|
||||||
|
- No wildcard imports
|
||||||
|
- Max 100 characters per line
|
||||||
|
|
||||||
|
The build includes Checkstyle verification. Run `./gradlew check` to validate.
|
||||||
|
|
||||||
|
### Report Bugs
|
||||||
|
|
||||||
|
Create an issue via [Bug Report template](.github/ISSUE_TEMPLATE/bug_report.md) with:
|
||||||
|
- Server version and plugin version
|
||||||
|
- Steps to reproduce
|
||||||
|
- Expected vs actual behavior
|
||||||
|
- Relevant logs and configs
|
||||||
|
|
||||||
|
### Feature Requests
|
||||||
|
|
||||||
|
Create an issue via [Feature Request template](.github/ISSUE_TEMPLATE/feature_request.md) describing:
|
||||||
|
- What you want to add and why
|
||||||
|
- How it should work
|
||||||
|
- Example configuration/usage
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🇷🇺 Русский
|
||||||
|
|
||||||
|
### Как внести вклад
|
||||||
|
|
||||||
|
1. **Сделайте форк** репозитория
|
||||||
|
2. **Создайте ветку** (`git checkout -b feature/your-feature`)
|
||||||
|
3. **Внесите изменения**
|
||||||
|
4. **Протестируйте** (`./gradlew build`)
|
||||||
|
5. **Закоммитьте** (`git commit -m 'Add some feature'`)
|
||||||
|
6. **Запушьте** (`git push origin feature/your-feature`)
|
||||||
|
7. **Откройте Pull Request**
|
||||||
|
|
||||||
|
### Рекомендации по Pull Request
|
||||||
|
|
||||||
|
- Один PR — одна функция/исправление
|
||||||
|
- Пишите информативные сообщения коммитов
|
||||||
|
- Обновляйте документацию при необходимости
|
||||||
|
- Убедитесь, что код проходит `./gradlew build`
|
||||||
|
- Следуйте Google Java Style (см. [конфиг checkstyle](config/checkstyle/README.md))
|
||||||
|
|
||||||
|
### Настройка окружения
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Клонирование и сборка
|
||||||
|
git clone https://github.com/loki5512344/LoChat.git
|
||||||
|
cd LoChat
|
||||||
|
./gradlew build
|
||||||
|
|
||||||
|
# Запуск локального тестового сервера
|
||||||
|
./gradlew runServer
|
||||||
|
```
|
||||||
|
|
||||||
|
### Стиль кода
|
||||||
|
|
||||||
|
Проект следует **Google Java Style Guide**:
|
||||||
|
- Отступы: 2 пробела
|
||||||
|
- Javadoc для публичных API
|
||||||
|
- Без *-импортов
|
||||||
|
- Максимум 100 символов на строку
|
||||||
|
|
||||||
|
Сборка включает проверку Checkstyle. Запустите `./gradlew check` для проверки.
|
||||||
|
|
||||||
|
### Сообщение об ошибке
|
||||||
|
|
||||||
|
Создайте issue по [шаблону](.github/ISSUE_TEMPLATE/bug_report.md) с:
|
||||||
|
- Версией сервера и плагина
|
||||||
|
- Шагами для воспроизведения
|
||||||
|
- Ожидаемым и фактическим поведением
|
||||||
|
- Релевантными логами и конфигами
|
||||||
|
|
||||||
|
### Запрос функции
|
||||||
|
|
||||||
|
Создайте issue по [шаблону](.github/ISSUE_TEMPLATE/feature_request.md) с описанием:
|
||||||
|
- Что вы хотите добавить и зачем
|
||||||
|
- Как это должно работать
|
||||||
|
- Пример конфигурации/использования
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Contribution Types | Типы вклада
|
||||||
|
|
||||||
|
| Type | Description |
|
||||||
|
|------|-------------|
|
||||||
|
| 🐛 Bug fix | Error correction |
|
||||||
|
| ✨ Feature | New functionality |
|
||||||
|
| 📝 Docs | Documentation improvements |
|
||||||
|
| ⚡ Performance | Optimization |
|
||||||
|
| 🔒 Security | Security improvements |
|
||||||
|
| 🎨 UI/UX | Visual improvements |
|
||||||
|
|
||||||
|
## Need Help? | Нужна помощь?
|
||||||
|
|
||||||
|
- [Issues](https://codeberg.org/loki5512344/Lochat/issues)
|
||||||
|
- [Discussions](https://codeberg.org/loki5512344/Lochat/issues)
|
||||||
676
README.md
676
README.md
|
|
@ -1,27 +1,264 @@
|
||||||
# LoChat - Advanced Chat Plugin
|
# LoChat
|
||||||
|
|
||||||
Мощный чат плагин для Paper/Folia серверов с градиентными никами, продвинутой модерацией и гибкой конфигурацией.
|
> **Advanced chat plugin for Paper/Folia servers**
|
||||||
|
> **Продвинутый чат плагин для Paper/Folia серверов**
|
||||||
|
|
||||||
## Сборка и локальный тестовый сервер
|
[](https://github.com/loki5512344/LoChat/actions/workflows/build.yml)
|
||||||
|
[](LICENSE)
|
||||||
|
[](https://papermc.io)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
**[EN](#english) · [RU](#russian)**
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<a name="english"></a>
|
||||||
|
|
||||||
|
## 🇬🇧 English
|
||||||
|
|
||||||
|
### Overview
|
||||||
|
|
||||||
|
LoChat is a powerful Minecraft chat plugin for Paper 1.21+ and Folia servers. It features gradient nicknames, advanced moderation, flexible configuration, Discord integration, and extensive API.
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
#### Chat System
|
||||||
|
- **Global chat** — cross-server player communication
|
||||||
|
- **Local chat** — radius-based proximity chat
|
||||||
|
- **Private messages** — PM system with reply support
|
||||||
|
- **Ignore system** — block unwanted players
|
||||||
|
- **Mentions** — `@player`, `@everyone`, `@here`, `@role`
|
||||||
|
- **Hover/Click events** — interactive messages
|
||||||
|
- **Custom join/quit/death messages** with weapon name
|
||||||
|
|
||||||
|
#### Gradient Nicknames & Prefixes
|
||||||
|
- Custom gradient colors (up to 7 colors)
|
||||||
|
- Built-in presets (fire, ocean, rainbow, etc.)
|
||||||
|
- Custom prefixes and suffixes
|
||||||
|
- LuckPerms integration (gradient prefixes/suffixes)
|
||||||
|
- PlayerPoints purchase system
|
||||||
|
- Cooldowns and limits
|
||||||
|
|
||||||
|
#### Moderation
|
||||||
|
- Mute system with history
|
||||||
|
- Ban system with duration and reason
|
||||||
|
- Warn system
|
||||||
|
- Temporary and permanent punishments
|
||||||
|
- Silent mutes
|
||||||
|
- Punishment escalation
|
||||||
|
|
||||||
|
#### Chat Filters
|
||||||
|
- Swear filter with bypass protection (x→x, o→o, etc.)
|
||||||
|
- Anti-spam and anti-flood
|
||||||
|
- CAPS filter
|
||||||
|
- URL and IP filter
|
||||||
|
- Hidden link filter (discord.gg, bit.ly, etc.)
|
||||||
|
- Repeated character filter
|
||||||
|
- Configurable bad words list
|
||||||
|
|
||||||
|
#### RP Commands
|
||||||
|
- `/me` — third-person actions
|
||||||
|
- `/do` — action descriptions
|
||||||
|
- `/try` — chance-based actions
|
||||||
|
- `/roll` — dice roll
|
||||||
|
- Configurable radius and cooldowns
|
||||||
|
|
||||||
|
#### Sound Effects
|
||||||
|
- PM and mention sounds
|
||||||
|
- Mute/unmute sounds
|
||||||
|
- Gradient sounds
|
||||||
|
- Command sounds
|
||||||
|
- Per-player sound settings
|
||||||
|
|
||||||
|
#### Discord Integration
|
||||||
|
- Webhook message relay
|
||||||
|
- Join/quit/death events
|
||||||
|
- Custom formats and colors
|
||||||
|
- Player avatars
|
||||||
|
- Message filtering
|
||||||
|
|
||||||
|
### Quick Start
|
||||||
|
|
||||||
|
#### Installation
|
||||||
|
|
||||||
|
1. Download the latest release
|
||||||
|
2. Place the JAR in `plugins/`
|
||||||
|
3. Restart the server
|
||||||
|
4. Configure in `plugins/LoChat/`
|
||||||
|
|
||||||
|
#### Building from Source
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/loki5512344/LoChat.git
|
||||||
|
cd LoChat
|
||||||
|
./gradlew build
|
||||||
|
# JAR will be in build/libs/
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Local Test Server
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./gradlew runServer
|
./gradlew runServer
|
||||||
```
|
```
|
||||||
|
|
||||||
Gradle задача `runServer` ([run-paper](https://github.com/jpenilla/run-paper)) скачивает Paper 1.21.1, собирает JAR плагина и кладёт его в `run/plugins`. Первый запуск долгий из-за загрузки. Остановка через `stop` в консоли сервера.
|
Uses [run-paper](https://github.com/jpenilla/run-paper) — downloads Paper 1.21.4, builds the plugin, and places it in `run/plugins/`.
|
||||||
|
|
||||||
## Основные возможности
|
### Dependencies
|
||||||
|
|
||||||
### Чат система
|
**Required:** Java 21+, Paper 1.21.1+ or Folia
|
||||||
- Глобальный чат - общение между всеми игроками
|
|
||||||
- Локальный чат - общение в радиусе
|
|
||||||
- Личные сообщения - PM система с ответами
|
|
||||||
- Игнорирование - блокировка нежелательных игроков
|
|
||||||
- Упоминания - @player, @everyone, @here, @role
|
|
||||||
- Hover/Click события - интерактивные сообщения
|
|
||||||
- Кастомные сообщения входа/выхода/смерти с названием оружия
|
|
||||||
|
|
||||||
### Градиентные ники и префиксы
|
**Optional:** PlaceholderAPI, LuckPerms, PlayerPoints, LibertyBans, SkinsRestorer
|
||||||
|
|
||||||
|
### Commands
|
||||||
|
|
||||||
|
#### Chat
|
||||||
|
| Command | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `/g <message>` | Global chat |
|
||||||
|
| `/l <message>` | Local chat |
|
||||||
|
| `/msg <player> <message>` | Private message |
|
||||||
|
| `/reply <message>` | Reply to PM |
|
||||||
|
| `/ignore <player>` | Ignore player |
|
||||||
|
| `/unignore <player>` | Unignore player |
|
||||||
|
| `/ignorelist` | List ignored players |
|
||||||
|
|
||||||
|
#### Gradients
|
||||||
|
| Command | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `/color <hex1> [hex2] ...` | Set gradient |
|
||||||
|
| `/prefix <text>` | Set prefix |
|
||||||
|
| `/aprefix <command>` | Admin gradient commands |
|
||||||
|
|
||||||
|
#### Moderation
|
||||||
|
| Command | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `/lmute <player> [time] [-s] [reason]` | Mute player |
|
||||||
|
| `/lunmute <player> [-s]` | Unmute player |
|
||||||
|
| `/lban <player> [time] [reason]` | Ban player |
|
||||||
|
| `/lunban <player>` | Unban player |
|
||||||
|
| `/lwarn <player> [reason]` | Warn player |
|
||||||
|
| `/lmutelist` | List mutes |
|
||||||
|
| `/lmutehistory <player>` | Mute history |
|
||||||
|
|
||||||
|
#### RP
|
||||||
|
| Command | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `/me <action>` | Third-person action |
|
||||||
|
| `/do <description>` | Action description |
|
||||||
|
| `/try <attempt>` | Chance attempt |
|
||||||
|
| `/roll [number]` | Dice roll |
|
||||||
|
|
||||||
|
#### Admin
|
||||||
|
| Command | Description |
|
||||||
|
|---------|-------------|
|
||||||
|
| `/lochat reload` | Reload config |
|
||||||
|
| `/clearchat` | Clear chat |
|
||||||
|
| `/chatspy` | Spy mode |
|
||||||
|
| `/announce <message>` | Announcement |
|
||||||
|
|
||||||
|
### Time Formats
|
||||||
|
|
||||||
|
- `s` — seconds (`30s` = 30 seconds)
|
||||||
|
- `m` — minutes (`15m` = 15 minutes)
|
||||||
|
- `h` — hours (`2h` = 2 hours)
|
||||||
|
- `d` — days (`7d` = 7 days)
|
||||||
|
- `perm` or `0` — permanent
|
||||||
|
|
||||||
|
### Placeholders
|
||||||
|
|
||||||
|
**Chat:** `{player}`, `{player_prefix}`, `{player_suffix}`, `{message}`, `{emoji}`, `{prefix}`, `{separator}`
|
||||||
|
|
||||||
|
**Hover:** `{player}`, `{world}`, `{ping}`, `{gamemode}`, `{health}`, `{food}`
|
||||||
|
|
||||||
|
**Death:** `{player}`, `{killer}`, `{weapon}`, `{death_message}`
|
||||||
|
|
||||||
|
### Permissions
|
||||||
|
|
||||||
|
#### Gradients
|
||||||
|
- `gradient.color` — access to `/color`
|
||||||
|
- `gradient.prefix` — access to `/prefix`
|
||||||
|
- `gradient.bypass.cost` — free usage
|
||||||
|
- `gradient.bypass.cooldown` — bypass cooldown
|
||||||
|
- `gradient.admin` — admin commands
|
||||||
|
|
||||||
|
#### Chat
|
||||||
|
- `lochat.chat.colors` — colored messages
|
||||||
|
- `lochat.chat.global` — global chat
|
||||||
|
- `lochat.chat.local` — local chat
|
||||||
|
- `lochat.pm` — private messages
|
||||||
|
|
||||||
|
#### Moderation
|
||||||
|
- `lochat.mute` — mute players
|
||||||
|
- `lochat.mute.silent` — silent mutes
|
||||||
|
- `lochat.ban` — ban players
|
||||||
|
- `lochat.warn` — warn players
|
||||||
|
|
||||||
|
#### Filter Bypass
|
||||||
|
- `lochat.bypass.swear` — bypass swear filter
|
||||||
|
- `lochat.bypass.spam` — bypass anti-spam
|
||||||
|
- `lochat.bypass.flood` — bypass anti-flood
|
||||||
|
- `lochat.bypass.caps` — bypass CAPS filter
|
||||||
|
- `lochat.bypass.urlfilter` — bypass URL filter
|
||||||
|
- `lochat.bypass.cooldown` — bypass cooldown
|
||||||
|
|
||||||
|
### API
|
||||||
|
|
||||||
|
```java
|
||||||
|
// Get ServiceRegistry
|
||||||
|
ServiceRegistry registry = plugin.getServiceRegistry();
|
||||||
|
|
||||||
|
// Send global message
|
||||||
|
ChatService chatService = registry.get(ChatService.class);
|
||||||
|
chatService.sendGlobalMessage(player, "Hello!");
|
||||||
|
|
||||||
|
// Create custom filter
|
||||||
|
public class MyFilter implements MessageFilter {
|
||||||
|
@Override
|
||||||
|
public FilterResult filter(Player player, String message) {
|
||||||
|
if (message.contains("badword")) {
|
||||||
|
return FilterResult.blocked("Message blocked");
|
||||||
|
}
|
||||||
|
return FilterResult.ok(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Known Issues
|
||||||
|
|
||||||
|
- Gradients may not display correctly on clients < 1.16
|
||||||
|
- Some filters may block legitimate messages (configurable in `config/filters.yml`)
|
||||||
|
|
||||||
|
### License
|
||||||
|
|
||||||
|
[GNU General Public License v3.0](LICENSE)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<a name="russian"></a>
|
||||||
|
|
||||||
|
## 🇷🇺 Русский
|
||||||
|
|
||||||
|
### Обзор
|
||||||
|
|
||||||
|
LoChat — это мощный чат-плагин для Minecraft Paper 1.21+ и Folia серверов. Включает градиентные ники, продвинутую модерацию, гибкую конфигурацию, Discord интеграцию и обширный API.
|
||||||
|
|
||||||
|
### Основные возможности
|
||||||
|
|
||||||
|
#### Система чата
|
||||||
|
- **Глобальный чат** — общение между всеми игроками
|
||||||
|
- **Локальный чат** — общение в радиусе
|
||||||
|
- **Личные сообщения** — PM система с ответами
|
||||||
|
- **Игнорирование** — блокировка нежелательных игроков
|
||||||
|
- **Упоминания** — `@player`, `@everyone`, `@here`, `@role`
|
||||||
|
- **Hover/Click события** — интерактивные сообщения
|
||||||
|
- **Кастомные сообщения входа/выхода/смерти** с названием оружия
|
||||||
|
|
||||||
|
#### Градиентные ники и префиксы
|
||||||
- Кастомные градиентные цвета (до 7 цветов)
|
- Кастомные градиентные цвета (до 7 цветов)
|
||||||
- Готовые пресеты (огонь, океан, радуга и т.д.)
|
- Готовые пресеты (огонь, океан, радуга и т.д.)
|
||||||
- Кастомные префиксы и суффиксы
|
- Кастомные префиксы и суффиксы
|
||||||
|
|
@ -29,315 +266,179 @@ Gradle задача `runServer` ([run-paper](https://github.com/jpenilla/run-pap
|
||||||
- Система покупки через PlayerPoints
|
- Система покупки через PlayerPoints
|
||||||
- Кулдауны и ограничения
|
- Кулдауны и ограничения
|
||||||
|
|
||||||
### Модерация
|
#### Модерация
|
||||||
- Мут система с историей
|
- Мут система с историей
|
||||||
- Бан система с временем и причиной
|
- Бан система с временем и причиной
|
||||||
- Варны (предупреждения)
|
- Варны (предупреждения)
|
||||||
- Временные и постоянные наказания
|
- Временные и постоянные наказания
|
||||||
- Скрытые муты (silent)
|
- Скрытые муты (silent)
|
||||||
- Готовые причины наказаний
|
|
||||||
- Эскалация наказаний
|
- Эскалация наказаний
|
||||||
|
|
||||||
### Фильтры чата
|
#### Фильтры чата
|
||||||
- Фильтр мата с защитой от обхода (х->x, о->o и т.д.)
|
- Фильтр мата с защитой от обхода (х→x, о→o и т.д.)
|
||||||
- Антиспам и антифлуд
|
- Антиспам и антифлуд
|
||||||
- CAPS фильтр
|
- CAPS фильтр
|
||||||
- URL и IP фильтр
|
- URL и IP фильтр
|
||||||
- Фильтр скрытых ссылок (discord.gg, bit.ly и т.д.)
|
- Фильтр скрытых ссылок (discord.gg, bit.ly и т.д.)
|
||||||
- Фильтр повторяющихся символов
|
- Фильтр повторяющихся символов
|
||||||
- Настраиваемый список запрещенных слов
|
- Настраиваемый список запрещённых слов
|
||||||
|
|
||||||
### RP команды
|
#### RP команды
|
||||||
- /me - действия от третьего лица
|
- `/me` — действия от третьего лица
|
||||||
- /do - описание действий
|
- `/do` — описание действий
|
||||||
- /try - попытка действия с шансом
|
- `/try` — попытка действия с шансом
|
||||||
- /roll - бросок кубика
|
- `/roll` — бросок кубика
|
||||||
- Настраиваемый радиус и кулдауны
|
- Настраиваемый радиус и кулдауны
|
||||||
|
|
||||||
### Звуковые эффекты
|
#### Звуковые эффекты
|
||||||
- Звуки для PM и упоминаний
|
- Звуки для PM и упоминаний
|
||||||
- Звуки для мутов/размутов
|
- Звуки для мутов/размутов
|
||||||
- Звуки для градиентов
|
- Звуки для градиентов
|
||||||
- Звуки для команд
|
- Звуки для команд
|
||||||
- Персональные настройки звуков
|
- Персональные настройки звуков
|
||||||
|
|
||||||
### Discord интеграция
|
#### Discord интеграция
|
||||||
- Webhook для отправки сообщений
|
- Webhook для отправки сообщений
|
||||||
- События входа/выхода/смерти
|
- События входа/выхода/смерти
|
||||||
- Кастомные форматы и цвета
|
- Кастомные форматы и цвета
|
||||||
- Аватары игроков
|
- Аватары игроков
|
||||||
- Фильтрация сообщений
|
- Фильтрация сообщений
|
||||||
|
|
||||||
## Структура конфигов
|
### Быстрый старт
|
||||||
|
|
||||||
```
|
#### Установка
|
||||||
plugins/LoChat/
|
|
||||||
├── config.yml # Основной конфиг (все настройки в одном месте)
|
|
||||||
├── messages.yml # Сообщения плагина
|
|
||||||
├── custom-commands.yml # Кастомные команды
|
|
||||||
├── badwords.txt # Список запрещенных слов
|
|
||||||
│
|
|
||||||
├── config/
|
|
||||||
│ ├── appearance.yml # Внешний вид чата (префиксы, форматы, hover)
|
|
||||||
│ ├── discord.yml # Discord интеграция
|
|
||||||
│ ├── filters.yml # Настройки фильтров
|
|
||||||
│ ├── messages.yml # Дополнительные сообщения
|
|
||||||
│ ├── mute.yml # Настройки мутов
|
|
||||||
│ └── sounds.yml # Звуковые эффекты
|
|
||||||
│
|
|
||||||
└── data/
|
|
||||||
├── mutes.yml # Данные мутов
|
|
||||||
├── bans.yml # Данные банов
|
|
||||||
├── ignores.yml # Игнорирование
|
|
||||||
└── gradient-data.yml # Градиентные ники
|
|
||||||
```
|
|
||||||
|
|
||||||
## Быстрый старт
|
|
||||||
|
|
||||||
### Установка
|
|
||||||
|
|
||||||
1. Скачайте последнюю версию из Releases
|
1. Скачайте последнюю версию из Releases
|
||||||
2. Поместите JAR в папку `plugins/`
|
2. Поместите JAR в папку `plugins/`
|
||||||
3. Перезапустите сервер
|
3. Перезапустите сервер
|
||||||
4. Настройте конфиги в `plugins/LoChat/`
|
4. Настройте конфиги в `plugins/LoChat/`
|
||||||
|
|
||||||
### Первая настройка
|
#### Сборка из исходников
|
||||||
|
|
||||||
1. **Основной конфиг** (`config.yml`):
|
|
||||||
- Настройте радиус локального чата
|
|
||||||
- Включите/отключите нужные функции
|
|
||||||
- Настройте цены на градиенты
|
|
||||||
- Настройте фильтры
|
|
||||||
|
|
||||||
2. **Фильтр мата** (`badwords.txt`):
|
|
||||||
- Добавьте свои запрещенные слова
|
|
||||||
- По одному слову на строку
|
|
||||||
- Строки с # игнорируются
|
|
||||||
|
|
||||||
3. **Внешний вид** (`config/appearance.yml`):
|
|
||||||
- Настройте префиксы чата (GLOBAL/LOCAL)
|
|
||||||
- Измените цвета и форматы
|
|
||||||
- Настройте hover подсказки
|
|
||||||
- Добавьте эмодзи
|
|
||||||
|
|
||||||
4. **Discord** (`config/discord.yml`):
|
|
||||||
- Вставьте URL вебхука
|
|
||||||
- Настройте форматы сообщений
|
|
||||||
- Включите нужные события
|
|
||||||
|
|
||||||
## Сборка из исходников
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Клонировать репозиторий
|
git clone https://github.com/loki5512344/LoChat.git
|
||||||
git clone https://codeberg.org/loki5512344/Lochat.git
|
cd LoChat
|
||||||
cd Lochat
|
|
||||||
|
|
||||||
# Собрать проект
|
|
||||||
./gradlew build
|
./gradlew build
|
||||||
|
|
||||||
# Jar файл будет в build/libs/
|
# Jar файл будет в build/libs/
|
||||||
```
|
```
|
||||||
|
|
||||||
## Зависимости
|
#### Локальный тестовый сервер
|
||||||
|
|
||||||
### Обязательные
|
```bash
|
||||||
- Java 21+
|
./gradlew runServer
|
||||||
- Paper 1.21.1+ или Folia
|
|
||||||
|
|
||||||
### Опциональные
|
|
||||||
- PlaceholderAPI - для плейсхолдеров
|
|
||||||
- LuckPerms - для градиентных префиксов/суффиксов
|
|
||||||
- PlayerPoints - для покупки градиентов
|
|
||||||
- LibertyBans - синхронизация мутов
|
|
||||||
- SkinsRestorer - поддержка скинов
|
|
||||||
|
|
||||||
## Команды
|
|
||||||
|
|
||||||
### Чат команды
|
|
||||||
- `/g <сообщение>` - глобальный чат
|
|
||||||
- `/l <сообщение>` - локальный чат
|
|
||||||
- `/msg <игрок> <сообщение>` - личное сообщение
|
|
||||||
- `/reply <сообщение>` - ответить на ЛС
|
|
||||||
- `/ignore <игрок>` - игнорировать игрока
|
|
||||||
- `/unignore <игрок>` - разигнорировать
|
|
||||||
- `/ignorelist` - список игнорируемых
|
|
||||||
|
|
||||||
### Градиенты
|
|
||||||
- `/color <hex1> [hex2] ...` - установить градиент
|
|
||||||
- `/prefix <текст>` - установить префикс
|
|
||||||
- `/aprefix <команда>` - админские команды градиентов
|
|
||||||
|
|
||||||
### Модерация
|
|
||||||
- `/lmute <игрок> [время] [-s] [причина]` - замутить
|
|
||||||
- `/lunmute <игрок> [-s]` - размутить
|
|
||||||
- `/lban <игрок> [время] [причина]` - забанить
|
|
||||||
- `/lunban <игрок>` - разбанить
|
|
||||||
- `/lwarn <игрок> [причина]` - выдать варн
|
|
||||||
- `/lmutelist` - список мутов
|
|
||||||
- `/lmutehistory <игрок>` - история мутов
|
|
||||||
|
|
||||||
### RP команды
|
|
||||||
- `/me <действие>` - действие от 3-го лица
|
|
||||||
- `/do <описание>` - описание действия
|
|
||||||
- `/try <попытка>` - попытка с шансом
|
|
||||||
- `/roll [число]` - бросок кубика
|
|
||||||
|
|
||||||
### Админские
|
|
||||||
- `/lochat reload` - перезагрузить конфиг
|
|
||||||
- `/clearchat` - очистить чат
|
|
||||||
- `/chatspy` - режим шпиона
|
|
||||||
- `/announce <сообщение>` - объявление
|
|
||||||
|
|
||||||
## Примеры использования
|
|
||||||
|
|
||||||
### Градиентный ник
|
|
||||||
```
|
|
||||||
/color #FF0000 #00FF00 #0000FF
|
|
||||||
```
|
|
||||||
Создаст радужный градиент от красного через зеленый к синему.
|
|
||||||
|
|
||||||
### Кастомный префикс
|
|
||||||
```
|
|
||||||
/prefix [VIP]
|
|
||||||
```
|
|
||||||
Установит префикс `[VIP]` перед ником.
|
|
||||||
|
|
||||||
### Настройка системы оплаты градиентов
|
|
||||||
|
|
||||||
#### Вариант 1: Через PlayerPoints (платно)
|
|
||||||
```yaml
|
|
||||||
# config.yml
|
|
||||||
gradient:
|
|
||||||
price-per-color: 50
|
|
||||||
prefix-price: 500
|
|
||||||
use-permission-instead-of-cost: false
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Вариант 2: Через пермишены (бесплатно)
|
Использует [run-paper](https://github.com/jpenilla/run-paper) — скачивает Paper 1.21.4, собирает плагин и помещает его в `run/plugins/`.
|
||||||
```yaml
|
|
||||||
# config.yml
|
|
||||||
gradient:
|
|
||||||
price-per-color: 0
|
|
||||||
prefix-price: 0
|
|
||||||
use-permission-instead-of-cost: true
|
|
||||||
```
|
|
||||||
|
|
||||||
Выдайте игрокам права:
|
### Зависимости
|
||||||
```
|
|
||||||
/lp user <игрок> permission set gradient.color true
|
|
||||||
/lp user <игрок> permission set gradient.prefix true
|
|
||||||
/lp user <игрок> permission set gradient.bypass.cost true
|
|
||||||
```
|
|
||||||
|
|
||||||
### Основные пермишены
|
**Обязательные:** Java 21+, Paper 1.21.1+ или Folia
|
||||||
|
|
||||||
#### Градиенты
|
**Опциональные:** PlaceholderAPI, LuckPerms, PlayerPoints, LibertyBans, SkinsRestorer
|
||||||
- `gradient.color` - доступ к /color
|
|
||||||
- `gradient.prefix` - доступ к /prefix
|
### Команды
|
||||||
- `gradient.bypass.cost` - бесплатное использование
|
|
||||||
- `gradient.bypass.cooldown` - обход кулдауна
|
|
||||||
- `gradient.admin` - админские команды
|
|
||||||
|
|
||||||
#### Чат
|
#### Чат
|
||||||
- `lochat.chat.colors` - цветные сообщения
|
| Команда | Описание |
|
||||||
- `lochat.chat.global` - глобальный чат
|
|---------|----------|
|
||||||
- `lochat.chat.local` - локальный чат
|
| `/g <сообщение>` | Глобальный чат |
|
||||||
- `lochat.pm` - личные сообщения
|
| `/l <сообщение>` | Локальный чат |
|
||||||
|
| `/msg <игрок> <сообщение>` | Личное сообщение |
|
||||||
|
| `/reply <сообщение>` | Ответить на ЛС |
|
||||||
|
| `/ignore <игрок>` | Игнорировать игрока |
|
||||||
|
| `/unignore <игрок>` | Разигнорировать |
|
||||||
|
| `/ignorelist` | Список игнорируемых |
|
||||||
|
|
||||||
|
#### Градиенты
|
||||||
|
| Команда | Описание |
|
||||||
|
|---------|----------|
|
||||||
|
| `/color <hex1> [hex2] ...` | Установить градиент |
|
||||||
|
| `/prefix <текст>` | Установить префикс |
|
||||||
|
| `/aprefix <команда>` | Админские команды градиентов |
|
||||||
|
|
||||||
#### Модерация
|
#### Модерация
|
||||||
- `lochat.mute` - мутить игроков
|
| Команда | Описание |
|
||||||
- `lochat.mute.silent` - скрытые муты
|
|---------|----------|
|
||||||
- `lochat.ban` - банить игроков
|
| `/lmute <игрок> [время] [-s] [причина]` | Замутить |
|
||||||
- `lochat.warn` - выдавать варны
|
| `/lunmute <игрок> [-s]` | Размутить |
|
||||||
|
| `/lban <игрок> [время] [причина]` | Забанить |
|
||||||
|
| `/lunban <игрок>` | Разбанить |
|
||||||
|
| `/lwarn <игрок> [причина]` | Выдать варн |
|
||||||
|
| `/lmutelist` | Список мутов |
|
||||||
|
| `/lmutehistory <игрок>` | История мутов |
|
||||||
|
|
||||||
|
#### RP
|
||||||
|
| Команда | Описание |
|
||||||
|
|---------|----------|
|
||||||
|
| `/me <действие>` | Действие от 3-го лица |
|
||||||
|
| `/do <описание>` | Описание действия |
|
||||||
|
| `/try <попытка>` | Попытка с шансом |
|
||||||
|
| `/roll [число]` | Бросок кубика |
|
||||||
|
|
||||||
|
#### Админские
|
||||||
|
| Команда | Описание |
|
||||||
|
|---------|----------|
|
||||||
|
| `/lochat reload` | Перезагрузить конфиг |
|
||||||
|
| `/clearchat` | Очистить чат |
|
||||||
|
| `/chatspy` | Режим шпиона |
|
||||||
|
| `/announce <сообщение>` | Объявление |
|
||||||
|
|
||||||
|
### Форматы времени
|
||||||
|
|
||||||
|
- `s` — секунды (`30s` = 30 секунд)
|
||||||
|
- `m` — минуты (`15m` = 15 минут)
|
||||||
|
- `h` — часы (`2h` = 2 часа)
|
||||||
|
- `d` — дни (`7d` = 7 дней)
|
||||||
|
- `perm` или `0` — навсегда
|
||||||
|
|
||||||
|
### Плейсхолдеры
|
||||||
|
|
||||||
|
**Чат:** `{player}`, `{player_prefix}`, `{player_suffix}`, `{message}`, `{emoji}`, `{prefix}`, `{separator}`
|
||||||
|
|
||||||
|
**Hover:** `{player}`, `{world}`, `{ping}`, `{gamemode}`, `{health}`, `{food}`
|
||||||
|
|
||||||
|
**Смерть:** `{player}`, `{killer}`, `{weapon}`, `{death_message}`
|
||||||
|
|
||||||
|
### Пермишены
|
||||||
|
|
||||||
|
#### Градиенты
|
||||||
|
- `gradient.color` — доступ к `/color`
|
||||||
|
- `gradient.prefix` — доступ к `/prefix`
|
||||||
|
- `gradient.bypass.cost` — бесплатное использование
|
||||||
|
- `gradient.bypass.cooldown` — обход кулдауна
|
||||||
|
- `gradient.admin` — админские команды
|
||||||
|
|
||||||
|
#### Чат
|
||||||
|
- `lochat.chat.colors` — цветные сообщения
|
||||||
|
- `lochat.chat.global` — глобальный чат
|
||||||
|
- `lochat.chat.local` — локальный чат
|
||||||
|
- `lochat.pm` — личные сообщения
|
||||||
|
|
||||||
|
#### Модерация
|
||||||
|
- `lochat.mute` — мутить игроков
|
||||||
|
- `lochat.mute.silent` — скрытые муты
|
||||||
|
- `lochat.ban` — банить игроков
|
||||||
|
- `lochat.warn` — выдавать варны
|
||||||
|
|
||||||
#### Обход фильтров
|
#### Обход фильтров
|
||||||
- `lochat.bypass.swear` - обход мат-фильтра
|
- `lochat.bypass.swear` — обход мат-фильтра
|
||||||
- `lochat.bypass.spam` - обход антиспама
|
- `lochat.bypass.spam` — обход антиспама
|
||||||
- `lochat.bypass.flood` - обход антифлуда
|
- `lochat.bypass.flood` — обход антифлуда
|
||||||
- `lochat.bypass.caps` - обход CAPS фильтра
|
- `lochat.bypass.caps` — обход CAPS фильтра
|
||||||
- `lochat.bypass.urlfilter` - обход URL фильтра
|
- `lochat.bypass.urlfilter` — обход URL фильтра
|
||||||
- `lochat.bypass.cooldown` - обход кулдауна
|
- `lochat.bypass.cooldown` — обход кулдауна
|
||||||
|
|
||||||
### Мут игрока
|
### API
|
||||||
```
|
|
||||||
/lmute Player123 1h Спам в чате
|
|
||||||
```
|
|
||||||
Замутит игрока на 1 час с причиной "Спам в чате".
|
|
||||||
|
|
||||||
### Скрытый мут
|
|
||||||
```
|
|
||||||
/lmute Player123 30m -s Нарушение правил
|
|
||||||
```
|
|
||||||
Замутит игрока скрытно (другие игроки не увидят уведомление).
|
|
||||||
|
|
||||||
### Бан с причиной
|
|
||||||
```
|
|
||||||
/lban Player123 7d Читы
|
|
||||||
```
|
|
||||||
Забанит игрока на 7 дней с причиной "Читы".
|
|
||||||
|
|
||||||
## Форматы времени
|
|
||||||
|
|
||||||
- `s` - секунды (30s = 30 секунд)
|
|
||||||
- `m` - минуты (15m = 15 минут)
|
|
||||||
- `h` - часы (2h = 2 часа)
|
|
||||||
- `d` - дни (7d = 7 дней)
|
|
||||||
- `perm` или `0` - навсегда
|
|
||||||
|
|
||||||
Примеры:
|
|
||||||
- `1h30m` - 1 час 30 минут
|
|
||||||
- `7d` - 7 дней
|
|
||||||
- `perm` - навсегда
|
|
||||||
|
|
||||||
## Плейсхолдеры
|
|
||||||
|
|
||||||
### Чат
|
|
||||||
- `{player}` - ник игрока
|
|
||||||
- `{player_prefix}` - префикс игрока (LuckPerms/градиент)
|
|
||||||
- `{player_suffix}` - суффикс игрока (LuckPerms/градиент)
|
|
||||||
- `{message}` - текст сообщения
|
|
||||||
- `{emoji}` - эмодзи префикса чата
|
|
||||||
- `{prefix}` - префикс чата (GLOBAL/LOCAL)
|
|
||||||
- `{separator}` - разделитель
|
|
||||||
|
|
||||||
### Hover
|
|
||||||
- `{player}` - ник игрока
|
|
||||||
- `{world}` - мир игрока
|
|
||||||
- `{ping}` - пинг
|
|
||||||
- `{gamemode}` - режим игры
|
|
||||||
- `{health}` - здоровье
|
|
||||||
- `{food}` - голод
|
|
||||||
|
|
||||||
### Смерть
|
|
||||||
- `{player}` - ник погибшего
|
|
||||||
- `{killer}` - ник убийцы
|
|
||||||
- `{weapon}` - название оружия
|
|
||||||
- `{death_message}` - стандартное сообщение смерти
|
|
||||||
|
|
||||||
## API для разработчиков
|
|
||||||
|
|
||||||
### Получение сервисов
|
|
||||||
```java
|
```java
|
||||||
// Получить ServiceRegistry
|
// Получить ServiceRegistry
|
||||||
ServiceRegistry registry = plugin.getServiceRegistry();
|
ServiceRegistry registry = plugin.getServiceRegistry();
|
||||||
|
|
||||||
// Получить сервис чата
|
|
||||||
ChatService chatService = registry.get(ChatService.class);
|
|
||||||
|
|
||||||
// Отправить глобальное сообщение
|
// Отправить глобальное сообщение
|
||||||
|
ChatService chatService = registry.get(ChatService.class);
|
||||||
chatService.sendGlobalMessage(player, "Привет!");
|
chatService.sendGlobalMessage(player, "Привет!");
|
||||||
|
|
||||||
// Получить сервис мутов
|
// Создание кастомного фильтра
|
||||||
MuteService muteService = registry.get(MuteService.class);
|
|
||||||
|
|
||||||
// Проверить мут
|
|
||||||
if (muteService.isMuted(player.getUniqueId())) {
|
|
||||||
// Игрок замучен
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Создание кастомного фильтра
|
|
||||||
```java
|
|
||||||
public class MyFilter implements MessageFilter {
|
public class MyFilter implements MessageFilter {
|
||||||
@Override
|
@Override
|
||||||
public FilterResult filter(Player player, String message) {
|
public FilterResult filter(Player player, String message) {
|
||||||
|
|
@ -349,53 +450,28 @@ public class MyFilter implements MessageFilter {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Известные проблемы
|
### Известные проблемы
|
||||||
|
|
||||||
- Градиенты могут некорректно отображаться в старых версиях клиента (< 1.16)
|
- Градиенты могут некорректно отображаться в старых версиях клиента (< 1.16)
|
||||||
- Некоторые фильтры могут блокировать легитимные сообщения (настраивается в `config/filters.yml`)
|
- Некоторые фильтры могут блокировать легитимные сообщения (настраивается в `config/filters.yml`)
|
||||||
|
|
||||||
## Статистика проекта
|
### Лицензия
|
||||||
|
|
||||||
- Версия: 1.5.5
|
[GNU General Public License v3.0](LICENSE)
|
||||||
- Строк кода: 9000+
|
|
||||||
- Конфигов: 10+
|
|
||||||
- Команд: 30+
|
|
||||||
|
|
||||||
## Вклад в проект
|
---
|
||||||
|
|
||||||
Мы приветствуем вклад в развитие проекта! Перед началом работы ознакомьтесь с:
|
## Project Statistics | Статистика проекта
|
||||||
- [Code of Conduct](CODE_OF_CONDUCT.md) - правила поведения в сообществе
|
|
||||||
- [Security Policy](SECURITY.md) - политика безопасности
|
|
||||||
|
|
||||||
### Как внести вклад
|
| Metric | Value |
|
||||||
|
|--------|-------|
|
||||||
|
| Version | 1.5.5 |
|
||||||
|
| Java files | 150+ |
|
||||||
|
| Commands | 30+ |
|
||||||
|
| Config files | 10+ |
|
||||||
|
|
||||||
1. Fork репозитория
|
## Links | Ссылки
|
||||||
2. Создайте ветку для фичи (`git checkout -b feature/amazing-feature`)
|
|
||||||
3. Commit изменения (`git commit -m 'Add amazing feature'`)
|
|
||||||
4. Push в ветку (`git push origin feature/amazing-feature`)
|
|
||||||
5. Откройте Pull Request
|
|
||||||
|
|
||||||
### Типы вклада
|
|
||||||
|
|
||||||
- 🐛 Исправление багов
|
|
||||||
- ✨ Новые функции
|
|
||||||
- 📝 Улучшение документации
|
|
||||||
- 🎨 Улучшение UI/UX
|
|
||||||
- ⚡ Оптимизация производительности
|
|
||||||
- 🔒 Улучшение безопасности
|
|
||||||
|
|
||||||
## Лицензия
|
|
||||||
|
|
||||||
GNU General Public License v3.0 - см. файл [LICENSE](LICENSE)
|
|
||||||
|
|
||||||
Это свободное программное обеспечение. Вы можете распространять и/или модифицировать его в соответствии с условиями GNU General Public License версии 3.
|
|
||||||
|
|
||||||
## Автор
|
|
||||||
|
|
||||||
Loki Development Team
|
|
||||||
- Codeberg: @loki5512344
|
|
||||||
|
|
||||||
## Ссылки
|
|
||||||
|
|
||||||
- [Codeberg Repository](https://codeberg.org/loki5512344/Lochat)
|
- [Codeberg Repository](https://codeberg.org/loki5512344/Lochat)
|
||||||
- [Issues](https://codeberg.org/loki5512344/Lochat/issues)
|
- [Issues](https://codeberg.org/loki5512344/Lochat/issues)
|
||||||
|
- [Contributing Guide](CONTRIBUTING.md)
|
||||||
|
|
|
||||||
116
SECURITY.md
116
SECURITY.md
|
|
@ -1,116 +0,0 @@
|
||||||
# Политика безопасности
|
|
||||||
|
|
||||||
## Поддерживаемые версии
|
|
||||||
|
|
||||||
Мы активно поддерживаем следующие версии плагина:
|
|
||||||
|
|
||||||
| Версия | Поддержка |
|
|
||||||
| ------ | ----------------- |
|
|
||||||
| 1.5.x | :white_check_mark: |
|
|
||||||
| 1.4.x | :x: |
|
|
||||||
| < 1.4 | :x: |
|
|
||||||
|
|
||||||
## Сообщение об уязвимости
|
|
||||||
|
|
||||||
Если вы обнаружили уязвимость в безопасности, пожалуйста, **НЕ** создавайте публичный issue.
|
|
||||||
|
|
||||||
### Как сообщить
|
|
||||||
|
|
||||||
1. Создайте приватный issue через [Security Advisory](https://codeberg.org/loki5512344/Lochat/issues)
|
|
||||||
2. Опишите уязвимость максимально подробно:
|
|
||||||
- Тип уязвимости (SQL injection, XSS, command injection и т.д.)
|
|
||||||
- Шаги для воспроизведения
|
|
||||||
- Потенциальное влияние
|
|
||||||
- Предлагаемое решение (если есть)
|
|
||||||
|
|
||||||
### Что ожидать
|
|
||||||
|
|
||||||
- **Подтверждение получения**: в течение 48 часов
|
|
||||||
- **Первоначальная оценка**: в течение 7 дней
|
|
||||||
- **Исправление**: в зависимости от серьезности (критические - 1-3 дня, высокие - 7-14 дней)
|
|
||||||
- **Публичное раскрытие**: после выпуска патча
|
|
||||||
|
|
||||||
## Известные проблемы безопасности
|
|
||||||
|
|
||||||
### Текущие
|
|
||||||
|
|
||||||
Нет известных критических уязвимостей.
|
|
||||||
|
|
||||||
### Исправленные
|
|
||||||
|
|
||||||
- **v1.5.0**: Исправлена возможность обхода фильтра мата через Unicode символы
|
|
||||||
- **v1.4.5**: Исправлена SQL injection в системе мутов
|
|
||||||
- **v1.4.0**: Исправлена возможность выполнения команд через кастомные команды
|
|
||||||
|
|
||||||
## Рекомендации по безопасности
|
|
||||||
|
|
||||||
### Для администраторов серверов
|
|
||||||
|
|
||||||
1. **Регулярно обновляйте плагин** до последней версии
|
|
||||||
2. **Ограничьте права**:
|
|
||||||
- Не давайте `lochat.admin` обычным игрокам
|
|
||||||
- Используйте `lochat.bypass.*` только для доверенных модераторов
|
|
||||||
3. **Настройте фильтры**:
|
|
||||||
- Включите все фильтры в `config/filters.yml`
|
|
||||||
- Регулярно обновляйте `badwords.txt`
|
|
||||||
4. **Мониторинг**:
|
|
||||||
- Проверяйте логи на подозрительную активность
|
|
||||||
- Используйте `/chatspy` для контроля личных сообщений
|
|
||||||
|
|
||||||
### Для разработчиков
|
|
||||||
|
|
||||||
1. **Валидация входных данных**:
|
|
||||||
- Всегда проверяйте пользовательский ввод
|
|
||||||
- Используйте prepared statements для SQL
|
|
||||||
2. **Безопасность API**:
|
|
||||||
- Не доверяйте данным из внешних источников
|
|
||||||
- Проверяйте права доступа перед выполнением операций
|
|
||||||
3. **Конфигурация**:
|
|
||||||
- Не храните чувствительные данные в конфигах
|
|
||||||
- Используйте переменные окружения для секретов
|
|
||||||
|
|
||||||
## Безопасные практики использования
|
|
||||||
|
|
||||||
### Discord Webhook
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# ❌ Плохо - webhook в публичном конфиге
|
|
||||||
discord:
|
|
||||||
webhook-url: "https://discord.com/api/webhooks/123456789/abcdefg"
|
|
||||||
|
|
||||||
# ✅ Хорошо - webhook через переменную окружения
|
|
||||||
discord:
|
|
||||||
webhook-url: "${DISCORD_WEBHOOK_URL}"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Фильтры
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
# ✅ Рекомендуемая конфигурация
|
|
||||||
filters:
|
|
||||||
swear-filter:
|
|
||||||
enabled: true
|
|
||||||
block-unicode-bypass: true
|
|
||||||
block-space-bypass: true
|
|
||||||
|
|
||||||
spam-filter:
|
|
||||||
enabled: true
|
|
||||||
max-messages: 3
|
|
||||||
time-window: 5
|
|
||||||
|
|
||||||
url-filter:
|
|
||||||
enabled: true
|
|
||||||
whitelist-mode: true
|
|
||||||
allowed-domains:
|
|
||||||
- "yourdomain.com"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Контакты
|
|
||||||
|
|
||||||
Для вопросов по безопасности:
|
|
||||||
- Issues: https://codeberg.org/loki5512344/Lochat/issues
|
|
||||||
- Email: loki@lokili.xyz
|
|
||||||
|
|
||||||
## Благодарности
|
|
||||||
|
|
||||||
Мы благодарим всех, кто ответственно сообщает об уязвимостях и помогает сделать проект безопаснее.
|
|
||||||
527
TODO.md
527
TODO.md
|
|
@ -1,419 +1,170 @@
|
||||||
# TODO — LoChat Critical Fixes & Config Refactor
|
# LoChat Development TODO
|
||||||
|
|
||||||
> Дата: 17.03.2026
|
> Last updated: 2026-07-05
|
||||||
> Статус: ✅ КРИТИЧНЫЕ БАГИ ИСПРАВЛЕНЫ | ✅ РЕФАКТОРИНГ КОНФИГОВ ЗАВЕРШЁН
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ✅ ИСПРАВЛЕНО
|
## ✅ COMPLETED
|
||||||
|
|
||||||
### 1. ✅ УТЕЧКА ПАМЯТИ: Scheduled Tasks
|
### Memory Leaks
|
||||||
**Статус:** ИСПРАВЛЕНО
|
- [x] AutoMessageManager: save task reference, cancel in `stop()`
|
||||||
- AutoMessageManager теперь сохраняет ссылку на task и отменяет в `stop()`
|
- [x] Event listeners: `HandlerList.unregisterAll(this)` in `onDisable()`
|
||||||
- Добавлена проверка и отмена старой задачи перед созданием новой
|
- [x] MuteHistoryManager: MAX_HISTORY_PER_PLAYER = 50
|
||||||
|
|
||||||
### 2. ✅ УТЕЧКА ПАМЯТИ: Event Listeners
|
### Race Conditions
|
||||||
**Статус:** ИСПРАВЛЕНО
|
- [x] AsyncChatEvent: try-catch for Location in async
|
||||||
- Добавлен `HandlerList.unregisterAll(this)` в `LoChat.onDisable()`
|
- [x] ConfigManager: `volatile` + `synchronized reload()`
|
||||||
- Listeners корректно отменяются при выключении плагина
|
|
||||||
|
|
||||||
### 3. ✅ УТЕЧКА ПАМЯТИ: MuteHistoryManager
|
### Compilation Fixes
|
||||||
**Статус:** ИСПРАВЛЕНО
|
- [x] EnhancedChatRenderer: `appearanceCfg` → `cfg.getAppearanceConfig()`
|
||||||
- Добавлен лимит MAX_HISTORY_PER_PLAYER = 50 записей
|
- [x] Replace deprecated `Registry.SOUNDS.match()` with `Registry.SOUNDS.get(NamespacedKey)`
|
||||||
- Старые записи автоматически удаляются
|
- [x] Remove unused imports
|
||||||
|
- [x] Remove redundant `TabCompleter` from `RollCommand`
|
||||||
|
|
||||||
### 4. ✅ RACE CONDITION: AsyncChatEvent
|
### Config Refactor
|
||||||
**Статус:** ИСПРАВЛЕНО
|
- [x] BaseConfig base class for all configs
|
||||||
- Добавлен try-catch для безопасной работы с Location в async
|
- [x] MessagesConfig (renamed from HardcodedMessages)
|
||||||
- Кэшируются данные перед async операциями
|
- [x] Clean config.yml: 300+ → 44 lines
|
||||||
|
- [x] Thread-safety: volatile + synchronized
|
||||||
|
|
||||||
### 5. ✅ КОМПИЛЯЦИЯ: EnhancedChatRenderer
|
### Main Class Refactor
|
||||||
**Статус:** ИСПРАВЛЕНО
|
- [x] PluginInitializer — init logic
|
||||||
- Исправлена переменная `appearanceCfg` → `cfg.getAppearanceConfig()`
|
- [x] PluginShutdown — shutdown logic
|
||||||
|
- [x] LoChat: 185 → 108 lines
|
||||||
|
|
||||||
### 6. ✅ РЕФАКТОРИНГ КОНФИГОВ
|
### Documentation
|
||||||
**Статус:** ЗАВЕРШЁН
|
- [x] README bilingual (EN + RU)
|
||||||
- Создан базовый класс `BaseConfig` для избежания дублирования кода
|
- [x] CONTRIBUTING.md created
|
||||||
- Переименован `HardcodedMessages` → `MessagesConfig`
|
- [x] CODE_OF_CONDUCT.md bilingual
|
||||||
- Все конфиги остались в папке `config/` для удобства
|
- [x] SECURITY.md bilingual
|
||||||
- Структура: `plugins/LoChat/config/*.yml`
|
- [x] GitHub issue/PR templates bilingual
|
||||||
- Правильное копирование файлов из `resources/config/`
|
- [x] Config comments in English, no Spacelegacy palette
|
||||||
|
|
||||||
### 7. ✅ ОТКЛЮЧЕНИЕ ЧАТОВ
|
### Checkstyle
|
||||||
**Статус:** РЕАЛИЗОВАНО
|
- [x] Google Java Style config (2-space indent, 100-char lines, Javadoc)
|
||||||
- Добавлена проверка `isGlobalEnabled()` и `isLocalEnabled()`
|
- [x] Checkstyle plugin wired into build.gradle.kts
|
||||||
- Игроки получают сообщение если чат отключен
|
|
||||||
- Настройки в `config.yml`: `chat.global.enabled` и `chat.local.enabled`
|
|
||||||
|
|
||||||
### 8. ✅ БАГ: Пробел в табе между префиксом и ником
|
### Cleanup
|
||||||
**Статус:** ИСПРАВЛЕНО
|
- [x] Removed `libs/lolib-3.0.0.jar` (unused)
|
||||||
- Убрал `.stripTrailing()` из `DisplayNameUtil.buildColoredPrefix()`
|
- [x] Removed CODE_OF_CONDUCT.md, SECURITY.md
|
||||||
- Теперь пробел из `prefix-format: "[{prefix}] "` сохраняется
|
- [x] Added `bin/` to .gitignore
|
||||||
- В табе отображается: `[Префикс] Ник` вместо `[Префикс]Ник`
|
- [x] Configs rewritten: clean, English, no Russian/Spacelegacy
|
||||||
|
|
||||||
### 9. ✅ РЕФАКТОРИНГ: Главный класс LoChat
|
|
||||||
**Статус:** ЗАВЕРШЁН
|
|
||||||
- Создан `PluginInitializer` - вся логика инициализации
|
|
||||||
- Создан `PluginShutdown` - вся логика выключения
|
|
||||||
- Главный класс сократился с 185 до 108 строк (42% уменьшение)
|
|
||||||
- Следует Single Responsibility Principle
|
|
||||||
|
|
||||||
### 10. ✅ ЧИСТКА: Warnings и deprecated методы
|
|
||||||
**Статус:** ИСПРАВЛЕНО
|
|
||||||
- Заменил deprecated `Registry.SOUNDS.match()` на `Registry.SOUNDS.get(NamespacedKey)` (Paper API)
|
|
||||||
- Удалил все неиспользуемые импорты
|
|
||||||
- Убрал redundant interface `TabCompleter` из `RollCommand`
|
|
||||||
- Проект собирается без ошибок
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 📁 СТРУКТУРА КОНФИГОВ
|
## 🟡 CODE QUALITY ISSUES (HIGH PRIORITY)
|
||||||
|
|
||||||
```
|
### 1. Max 3 Files Per Folder
|
||||||
plugins/LoChat/
|
|
||||||
├── config.yml # Основной конфиг
|
|
||||||
├── messages.yml # Сообщения игрокам
|
|
||||||
├── custom-commands.yml # Кастомные команды
|
|
||||||
├── config/
|
|
||||||
│ ├── appearance.yml # ✅ Внешний вид чата (AppearanceConfig)
|
|
||||||
│ ├── messages.yml # ✅ Системные сообщения (MessagesConfig)
|
|
||||||
│ ├── mute.yml # ✅ Настройки мутов (MuteConfig)
|
|
||||||
│ ├── filters.yml # ✅ Фильтры сообщений (FiltersConfig)
|
|
||||||
│ ├── sounds.yml # ✅ Звуки (SoundsConfig)
|
|
||||||
│ ├── discord.yml # ✅ Discord интеграция (DiscordIntegration)
|
|
||||||
│ ├── gradient.yml # ✅ Градиенты (GradientModule)
|
|
||||||
│ ├── automessages.yml # Автосообщения
|
|
||||||
│ ├── chat-formats.yml # Форматы чата
|
|
||||||
│ ├── database.yml # База данных
|
|
||||||
│ └── integrations.yml # Интеграции
|
|
||||||
└── data/
|
|
||||||
├── players.yml
|
|
||||||
├── mutes.json
|
|
||||||
├── filter-words.json
|
|
||||||
└── ...
|
|
||||||
```
|
|
||||||
|
|
||||||
### ✅ Подключенные конфиги:
|
| Folder | Files | Fix |
|
||||||
- `AppearanceConfig` - внешний вид чата, префиксы, цвета, эмодзи
|
|--------|-------|-----|
|
||||||
- `MessagesConfig` - все системные сообщения для игроков
|
| `config/` | **9** ⚠️ | Split into `config/chat/`, `config/mute/`, `config/filter/`, `config/general/` |
|
||||||
- `MuteConfig` - настройки системы мутов
|
| `api/service/` | **8** ⚠️ | Keep interfaces flat or split into `api/service/chat/`, `api/service/mute/` |
|
||||||
- `FiltersConfig` - все фильтры (капс, мат, реклама, флуд, спам)
|
| `core/service/` | **8** ⚠️ | Mirror the api split |
|
||||||
- `SoundsConfig` - звуковые эффекты
|
|
||||||
- `DiscordIntegration` - Discord вебхуки
|
### 2. DRY: `AppearanceConfig.loadEmojiCache()` Called Twice
|
||||||
- `GradientModule` - градиентные ники
|
|
||||||
|
**File:** `config/AppearanceConfig.java:23-31`
|
||||||
|
- `init()` calls `super.init()` which calls `onLoad()` which calls `loadEmojiCache()`
|
||||||
|
- Then `init()` calls `loadEmojiCache()` again
|
||||||
|
- **Fix:** Remove the duplicate call in `init()`
|
||||||
|
|
||||||
|
### 3. SRP: `ConfigManager.java` (278 lines)
|
||||||
|
|
||||||
|
God class with 60+ methods across 10+ concerns:
|
||||||
|
- Config orchestration
|
||||||
|
- Chat settings (global, local, PM)
|
||||||
|
- Mention settings
|
||||||
|
- Clear chat state mutation
|
||||||
|
- Announcement settings
|
||||||
|
- Join/quit/death message settings
|
||||||
|
|
||||||
|
**Fix:** Split into `ChatConfig`, `PmConfig`, `MentionConfig`, `ClearChatConfig`, `AnnouncementConfig`, `CustomMessagesConfig`
|
||||||
|
|
||||||
|
### 4. OCP: `AdvancedMessageFilter.filterMessage()`
|
||||||
|
|
||||||
|
Hardcoded pipeline of 7 filters. Adding a new filter requires modifying this method.
|
||||||
|
|
||||||
|
**Fix:** Dynamic `List<Filter>` pipeline with registration
|
||||||
|
|
||||||
|
### 5. ISP: `MessagingService` (fat interface)
|
||||||
|
|
||||||
|
16 methods across 4 concerns: PM + Spy + Ignore + Persistence
|
||||||
|
|
||||||
|
**Fix:** Split into `PrivateMessageService`, `SpyService`, `IgnoreService`, `PersistableService`
|
||||||
|
|
||||||
|
### 6. DIP: Service Locator Anti-Pattern
|
||||||
|
|
||||||
|
`ServiceRegistry.get(Xxx.class)` used everywhere instead of constructor DI.
|
||||||
|
|
||||||
|
**Fix:** Pass required services via constructor parameters
|
||||||
|
|
||||||
|
### 7. DRY: 12 Commands Duplicate Constructor Pattern
|
||||||
|
|
||||||
|
Commands like `MsgCommand`, `ReplyCommand`, `IgnoreCommand`, `MuteCommand`, `BanCommand` etc. don't use `BaseCommand` hierarchy and repeat the same field/constructor/permission pattern.
|
||||||
|
|
||||||
|
**Fix:** Migrate all to `PlayerCommand` / `AdminCommand`
|
||||||
|
|
||||||
|
### 8. DRY: PM Send Logic Duplicated
|
||||||
|
|
||||||
|
`MsgCommand.java:48-59` and `ReplyCommand.java:47-57` have identical PM send code.
|
||||||
|
|
||||||
|
**Fix:** Extract to shared method/service
|
||||||
|
|
||||||
|
### 9. KISS: `MuteCommand.onCommand()` (~100 lines)
|
||||||
|
|
||||||
|
High complexity: argument parsing, flags, fallback logic, permission checks, broadcast logic, voice-mute.
|
||||||
|
|
||||||
|
**Fix:** Decompose into `MuteRequest` parser + `MuteExecutor` service
|
||||||
|
|
||||||
|
### 10. OOP: Leaked Internals
|
||||||
|
|
||||||
|
- `LoChat.getInstance()` — singleton abuse
|
||||||
|
- `LoChat` exposes 7+ internal components via public getters
|
||||||
|
- `ChatEventListener` casts to concrete `PlayerServiceImpl`
|
||||||
|
- `BaseConfig` has `protected` mutable fields
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🎯 АРХИТЕКТУРА
|
## 🔵 MEDIUM PRIORITY
|
||||||
|
|
||||||
### BaseConfig
|
### 11. Dual Message Configs
|
||||||
Базовый класс для всех конфигов:
|
|
||||||
- Автоматическое копирование из resources
|
|
||||||
- Поддержка подпапок (config/)
|
|
||||||
- Единый интерфейс load/reload/save
|
|
||||||
- Избегает дублирования кода
|
|
||||||
|
|
||||||
### Конфиги наследуют BaseConfig:
|
`MessageConfig.java` (root, path-based) and `MessagesConfig.java` (config/, typed getters) overlap.
|
||||||
- `MessagesConfig` (config/messages.yml)
|
|
||||||
- `AppearanceConfig` (config/appearance.yml)
|
**Fix:** Unify into single `MessageConfig`
|
||||||
- Легко добавлять новые конфиги
|
|
||||||
|
### 12. Filter Classes Don't Share Interface
|
||||||
|
|
||||||
|
`core/filter/filters/*.java` are standalone. `CooldownFilter`/`MuteFilter` implement `MessageFilter` from api.
|
||||||
|
|
||||||
|
**Fix:** Make all filters implement `MessageFilter`
|
||||||
|
|
||||||
|
### 13. 5+ Services Repeat Load/Save/Persistence
|
||||||
|
|
||||||
|
`NickServiceImpl`, `PlayerServiceImpl`, `ChatServiceImpl`, `PunishmentServiceImpl` all have their own file I/O.
|
||||||
|
|
||||||
|
**Fix:** Shared persistence utility
|
||||||
|
|
||||||
|
### 14. Mute Duration Permissions Not Declared in plugin.yml
|
||||||
|
|
||||||
|
`lochat.mute.dur.5m`, `lochat.mute.dur.3h`, `lochat.mute.reason.*` — used in code/configs but missing from plugin.yml.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ✅ ЗАДАЧА ВЫПОЛНЕНА: Очистка config.yml
|
## ⚪ LOW PRIORITY
|
||||||
|
|
||||||
### ✅ РЕЗУЛЬТАТ:
|
### 15. Performance: Aho-Corasick for Swear Filter
|
||||||
- Сократил config.yml с 300+ строк до 44 строк (85% уменьшение!)
|
|
||||||
- Убрал дублирующиеся секции (filters, mentions, automessages, mute)
|
|
||||||
- Убрал раздутые секции (custom-commands, data-storage)
|
|
||||||
- Убрал пресеты градиентов
|
|
||||||
- Оставил только базовые настройки (chat, hub, gradient, rp)
|
|
||||||
- Проект собирается без ошибок
|
|
||||||
|
|
||||||
### 🔍 СТАТУС КОНФИГОВ:
|
### 16. Discord Rate Limiter
|
||||||
Все конфиги в config/ проверены и почищены:
|
|
||||||
- ✅ appearance.yml (AppearanceConfig) - используется
|
### 17. Tests: Only 4 test files (150 main files)
|
||||||
- ✅ messages.yml (MessagesConfig) - используется
|
|
||||||
- ✅ mute.yml (MuteConfig) - используется
|
### 18. `.project`, `.classpath`, `.settings/` should be gitignored
|
||||||
- ✅ filters.yml (FiltersConfig) - используется
|
|
||||||
- ✅ sounds.yml (SoundsConfig) - используется
|
|
||||||
- ✅ discord.yml (DiscordIntegration) - используется
|
|
||||||
- ❌ automessages.yml - удален (не использовался)
|
|
||||||
- ❌ chat-formats.yml - удален (не использовался)
|
|
||||||
- ❌ database.yml - удален (не использовался)
|
|
||||||
- ❌ gradient.yml - удален (не использовался)
|
|
||||||
- ❌ integrations.yml - удален (не использовался)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## ✅ ЗАДАЧА ВЫПОЛНЕНА: Thread-Safety для ConfigManager
|
## 📋 KNOWN ISSUES
|
||||||
|
|
||||||
### ✅ РЕЗУЛЬТАТ:
|
- Gradients may not display correctly on clients < 1.16
|
||||||
- Добавлен `volatile` для всех конфигов (config, appearanceConfig, messagesConfig, muteConfig, filtersConfig, soundsConfig)
|
- Some filters may block legitimate messages (configurable in `config/filters.yml`)
|
||||||
- Метод `reload()` теперь `synchronized` для предотвращения race conditions
|
|
||||||
- Все потоки теперь видят актуальную версию конфигов после reload
|
|
||||||
- Проект собирается без ошибок
|
|
||||||
|
|
||||||
### 📝 ЧТО СДЕЛАНО:
|
|
||||||
```java
|
|
||||||
// Было:
|
|
||||||
private FileConfiguration config;
|
|
||||||
private AppearanceConfig appearanceConfig;
|
|
||||||
|
|
||||||
// Стало:
|
|
||||||
private volatile FileConfiguration config;
|
|
||||||
private volatile AppearanceConfig appearanceConfig;
|
|
||||||
|
|
||||||
// И метод reload стал synchronized:
|
|
||||||
public synchronized void reload() { ... }
|
|
||||||
```
|
|
||||||
|
|
||||||
**Зачем volatile:**
|
|
||||||
- Гарантирует видимость изменений между потоками
|
|
||||||
- Предотвращает кэширование значений в регистрах CPU
|
|
||||||
- Обеспечивает happens-before relationship
|
|
||||||
|
|
||||||
**Зачем synchronized:**
|
|
||||||
- Предотвращает одновременный reload из разных потоков
|
|
||||||
- Гарантирует атомарность операции перезагрузки
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 ОСТАЛОСЬ (НИЗКИЙ ПРИОРИТЕТ)
|
|
||||||
|
|
||||||
### ПРОИЗВОДИТЕЛЬНОСТЬ: Фильтры
|
|
||||||
- Рассмотреть Aho-Corasick алгоритм для поиска матных слов
|
|
||||||
- Добавить метрики производительности
|
|
||||||
|
|
||||||
### БЕЗОПАСНОСТЬ: Discord rate limiting
|
|
||||||
- Добавить локальный rate limiter
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ ИТОГ
|
|
||||||
|
|
||||||
Все критичные баги исправлены. Плагин полностью готов к использованию.
|
|
||||||
|
|
||||||
**Выполнено:**
|
|
||||||
- ✅ Исправлены утечки памяти (tasks, listeners, history)
|
|
||||||
- ✅ Исправлены race conditions
|
|
||||||
- ✅ Рефакторинг конфигов (BaseConfig, MessagesConfig, FiltersConfig, SoundsConfig, MuteConfig)
|
|
||||||
- ✅ Очистка config.yml (300+ → 52 строки)
|
|
||||||
- ✅ Thread-safety для ConfigManager (volatile + synchronized)
|
|
||||||
- ✅ Баг с пробелом в табе
|
|
||||||
- ✅ Рефакторинг главного класса (185 → 108 строк)
|
|
||||||
- ✅ Чистка warnings и deprecated методов
|
|
||||||
- ✅ Режим единого чата (опционально через local.enabled: false)
|
|
||||||
|
|
||||||
**Архитектура:**
|
|
||||||
- SOLID принципы (ServiceRegistry, DI)
|
|
||||||
- Чистый код (Single Responsibility)
|
|
||||||
- Thread-safe reload
|
|
||||||
- Минимальный главный класс
|
|
||||||
|
|
||||||
Проект собирается без ошибок и готов к продакшену.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 ПЛАН ИСПРАВЛЕНИЯ КРИТИЧНЫХ БАГОВ
|
|
||||||
|
|
||||||
### Фаза 1: Утечки памяти (СРОЧНО)
|
|
||||||
1. **AutoMessageManager** - сохранять ссылку на task и отменять в `stop()`
|
|
||||||
2. **LoChat.onDisable()** - добавить `HandlerList.unregisterAll(this)`
|
|
||||||
3. **MuteHistoryManager** - ограничить размер истории (MAX 50 записей на игрока)
|
|
||||||
|
|
||||||
### Фаза 2: Race conditions
|
|
||||||
4. **ChatEventListener** - проверить `DistanceUtil.isInRange()` на async-safety
|
|
||||||
5. **ConfigManager** - использовать `volatile` для thread-safe reload
|
|
||||||
|
|
||||||
### Фаза 3: Компиляция
|
|
||||||
6. **EnhancedChatRenderer** - исправить `appearanceCfg` → `cfg.getAppearanceConfig()`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 ПЛАН ИСПРАВЛЕНИЯ КОНФИГОВ
|
|
||||||
|
|
||||||
### Вариант 1: Всё в config.yml (РЕКОМЕНДУЕТСЯ)
|
|
||||||
Объединить все настройки в один `config.yml` с секциями.
|
|
||||||
|
|
||||||
**Структура config.yml:**
|
|
||||||
```yaml
|
|
||||||
config-version: 5
|
|
||||||
|
|
||||||
# Базовые настройки
|
|
||||||
chat:
|
|
||||||
global:
|
|
||||||
enabled: true
|
|
||||||
cooldown: 3
|
|
||||||
local:
|
|
||||||
enabled: true
|
|
||||||
radius: 100
|
|
||||||
cooldown: 1
|
|
||||||
pm:
|
|
||||||
enabled: true
|
|
||||||
sound: true
|
|
||||||
|
|
||||||
# Внешний вид чата
|
|
||||||
chat-appearance:
|
|
||||||
prefixes:
|
|
||||||
global:
|
|
||||||
emoji: "✦"
|
|
||||||
text: "GLOBAL"
|
|
||||||
colors:
|
|
||||||
- "#B798A8"
|
|
||||||
- "#7858E9"
|
|
||||||
separator:
|
|
||||||
text: " ▶ "
|
|
||||||
color: "#9878C9"
|
|
||||||
local:
|
|
||||||
emoji: "◆"
|
|
||||||
text: "LOCAL"
|
|
||||||
colors:
|
|
||||||
- "#9878C9"
|
|
||||||
- "#7858E9"
|
|
||||||
separator:
|
|
||||||
text: " ▶ "
|
|
||||||
color: "#8B6BD6"
|
|
||||||
hover:
|
|
||||||
enabled: true
|
|
||||||
format:
|
|
||||||
- "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
|
||||||
- "&#B798A8✦ &f{player}"
|
|
||||||
- ""
|
|
||||||
- "⚖C9⏱ &fПинг: ẲE9{ping}ms"
|
|
||||||
- "⚖C9♥ &fЗдоровье: ẲE9{health}/20"
|
|
||||||
- "⚖C9🍖 &fГолод: ẲE9{food}/20"
|
|
||||||
- ""
|
|
||||||
- "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
|
||||||
- "&#B798A8✦ &fНажми чтобы написать"
|
|
||||||
emojis:
|
|
||||||
":heart:": "❤"
|
|
||||||
":star:": "★"
|
|
||||||
":diamond:": "◆"
|
|
||||||
|
|
||||||
# Сообщения
|
|
||||||
messages:
|
|
||||||
mute:
|
|
||||||
player-muted: "⚖C9Игрок ẲE9{player} ⚖C9замучен на ẲE9{time}"
|
|
||||||
muted-message: "&#CF6679Вы замучены на ẲE9{time}\n&#B798A8Причина: &f{reason}"
|
|
||||||
local-chat:
|
|
||||||
nobody-heard: "⚖C9Вас никто не услышал"
|
|
||||||
cooldown:
|
|
||||||
message: "&#B798A8Подождите ẲE9{remaining} &#B798A8сек"
|
|
||||||
|
|
||||||
# RP команды
|
|
||||||
rp:
|
|
||||||
radius: 100
|
|
||||||
cooldowns:
|
|
||||||
me: 3
|
|
||||||
try: 5
|
|
||||||
do: 3
|
|
||||||
roll: 2
|
|
||||||
|
|
||||||
# Градиенты
|
|
||||||
gradient:
|
|
||||||
enabled: true
|
|
||||||
presets:
|
|
||||||
fire: ["#FF4500", "#FF6347", "#FFD700"]
|
|
||||||
ocean: ["#00CED1", "#1E90FF", "#4169E1"]
|
|
||||||
```
|
|
||||||
|
|
||||||
**Файлы для изменения:**
|
|
||||||
1. `src/main/resources/config.yml` - объединить все настройки
|
|
||||||
2. `src/main/java/com/loki/lochat/config/ConfigManager.java` - убрать AppearanceConfig и HardcodedMessages
|
|
||||||
3. `src/main/java/com/loki/lochat/renderer/EnhancedChatRenderer.java` - читать из ConfigManager напрямую
|
|
||||||
4. Удалить `src/main/java/com/loki/lochat/config/AppearanceConfig.java`
|
|
||||||
5. Удалить `src/main/java/com/loki/lochat/config/HardcodedMessages.java`
|
|
||||||
6. Удалить все файлы из `src/main/resources/config/`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Вариант 2: Отдельные файлы в корне resources
|
|
||||||
Переместить конфиги в корень `resources/` и создавать их вручную.
|
|
||||||
|
|
||||||
**Структура:**
|
|
||||||
```
|
|
||||||
src/main/resources/
|
|
||||||
├── config.yml # Основной конфиг
|
|
||||||
├── chat-appearance.yml # Внешний вид
|
|
||||||
├── messages.yml # Сообщения
|
|
||||||
├── gradient-config.yml # Градиенты
|
|
||||||
└── custom-commands.yml # Кастомные команды
|
|
||||||
```
|
|
||||||
|
|
||||||
**Файлы для изменения:**
|
|
||||||
1. Переместить все из `config/` в корень `resources/`
|
|
||||||
2. `AppearanceConfig.java` - изменить путь с `config/chat-appearance.yml` на `chat-appearance.yml`
|
|
||||||
3. `HardcodedMessages.java` - изменить путь с `config/hardcoded-messages.yml` на `messages.yml`
|
|
||||||
4. Убрать создание папки `config/` в коде
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 РЕКОМЕНДАЦИЯ
|
|
||||||
|
|
||||||
**Использовать Вариант 1** - один большой `config.yml`:
|
|
||||||
- ✅ Всё в одном месте
|
|
||||||
- ✅ Гарантированно работает
|
|
||||||
- ✅ Проще для пользователей
|
|
||||||
- ✅ Меньше файлов
|
|
||||||
- ✅ Только hex-цвета (&#FFD700)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 ЧЕКЛИСТ ВЫПОЛНЕНИЯ
|
|
||||||
|
|
||||||
### Шаг 1: Подготовка
|
|
||||||
- [ ] Сохранить текущие настройки из всех конфигов
|
|
||||||
- [ ] Создать бэкап проекта
|
|
||||||
|
|
||||||
### Шаг 2: Объединение конфигов
|
|
||||||
- [ ] Скопировать все секции из `config/chat-appearance.yml` в `config.yml`
|
|
||||||
- [ ] Скопировать все секции из `config/hardcoded-messages.yml` в `config.yml`
|
|
||||||
- [ ] Заменить все `<red>`, `<bold>` на hex-цвета `&#FF0000`
|
|
||||||
- [ ] Проверить отступы YAML
|
|
||||||
|
|
||||||
### Шаг 3: Изменение кода
|
|
||||||
- [ ] `ConfigManager.java` - убрать `AppearanceConfig` и `HardcodedMessages`
|
|
||||||
- [ ] `ConfigManager.java` - добавить методы для чтения всех настроек из `config.yml`
|
|
||||||
- [ ] `EnhancedChatRenderer.java` - заменить `cfg.getAppearanceConfig()` на прямые вызовы
|
|
||||||
- [ ] Удалить `AppearanceConfig.java`
|
|
||||||
- [ ] Удалить `HardcodedMessages.java`
|
|
||||||
|
|
||||||
### Шаг 4: Очистка
|
|
||||||
- [ ] Удалить папку `src/main/resources/config/`
|
|
||||||
- [ ] Удалить неиспользуемые импорты
|
|
||||||
|
|
||||||
### Шаг 5: Тестирование
|
|
||||||
- [ ] `./gradlew clean build -x test`
|
|
||||||
- [ ] Проверить что jar собирается
|
|
||||||
- [ ] Запустить на тестовом сервере
|
|
||||||
- [ ] Проверить что `config.yml` создаётся
|
|
||||||
- [ ] Проверить что все настройки работают
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 ТЕКУЩЕЕ СОСТОЯНИЕ
|
|
||||||
|
|
||||||
**Проблемные файлы:**
|
|
||||||
- `src/main/java/com/loki/lochat/renderer/EnhancedChatRenderer.java` - ошибки компиляции
|
|
||||||
- `src/main/java/com/loki/lochat/config/ConfigManager.java` - неполный рефакторинг
|
|
||||||
|
|
||||||
**Что работает:**
|
|
||||||
- Базовые настройки чата
|
|
||||||
- Градиенты
|
|
||||||
- RP команды с кулдаунами
|
|
||||||
|
|
||||||
**Что НЕ работает:**
|
|
||||||
- Файлы из `config/` не копируются на сервер
|
|
||||||
- Префиксы чата (читаются из несуществующих файлов)
|
|
||||||
- Hover подсказки
|
|
||||||
- Эмодзи замены
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📌 ВАЖНО
|
|
||||||
|
|
||||||
- Использовать ТОЛЬКО hex-цвета: `&#FFD700`
|
|
||||||
- НЕ использовать MiniMessage: `<red>`, `<bold>`
|
|
||||||
- Все настройки в `config.yml`
|
|
||||||
- Простая и понятная структура
|
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,11 @@ plugins {
|
||||||
java
|
java
|
||||||
id("xyz.jpenilla.run-paper") version "2.3.1"
|
id("xyz.jpenilla.run-paper") version "2.3.1"
|
||||||
jacoco
|
jacoco
|
||||||
|
checkstyle
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "com.loki"
|
group = "com.loki"
|
||||||
version = "1.5.5-1.21.8"
|
version = "1.5.5-1.21.x"
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
|
@ -30,6 +31,14 @@ dependencies {
|
||||||
testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.10.0")
|
testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.10.0")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
checkstyle {
|
||||||
|
toolVersion = "10.21.4"
|
||||||
|
configFile = file("config/checkstyle/checkstyle.xml")
|
||||||
|
isIgnoreFailures = false
|
||||||
|
maxErrors = 0
|
||||||
|
maxWarnings = 100
|
||||||
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
toolchain {
|
toolchain {
|
||||||
languageVersion.set(JavaLanguageVersion.of(21))
|
languageVersion.set(JavaLanguageVersion.of(21))
|
||||||
|
|
@ -63,13 +72,12 @@ jacoco {
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.jar {
|
tasks.jar {
|
||||||
archiveFileName.set("LoChat-1.5.5-1.21.8.jar")
|
archiveFileName.set("LoChat-${project.version}.jar")
|
||||||
from(configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) })
|
from(configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) })
|
||||||
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
|
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
|
||||||
}
|
}
|
||||||
|
|
||||||
// Локальный Paper для тестов: .\gradlew.bat runServer
|
// Локальный Paper для тестов: .\gradlew.bat runServer
|
||||||
tasks.runServer {
|
tasks.runServer {
|
||||||
minecraftVersion("1.21.4")
|
minecraftVersion("1.21.4") // lowest supported; runs on any 1.21.x Paper server
|
||||||
// Совпадает с compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT")
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,83 +1,115 @@
|
||||||
# Checkstyle Configuration
|
# Checkstyle Configuration | Конфигурация Checkstyle
|
||||||
|
|
||||||
Автоматическая проверка качества кода во время билда.
|
This project uses **Google Java Style** for code quality enforcement.
|
||||||
|
Проект использует **Google Java Style** для контроля качества кода.
|
||||||
|
|
||||||
## Правила
|
---
|
||||||
|
|
||||||
### Размеры
|
## 🇬🇧 English
|
||||||
- **Файл**: максимум 150 строк
|
|
||||||
- **Метод**: максимум 30 строк
|
|
||||||
- **Строка**: максимум 120 символов
|
|
||||||
- **Параметры**: максимум 5 параметров
|
|
||||||
|
|
||||||
### Сложность
|
### Rules
|
||||||
- **Cyclomatic Complexity**: максимум 10
|
|
||||||
- **Вложенность if**: максимум 3 уровня
|
|
||||||
- **Вложенность try**: максимум 2 уровня
|
|
||||||
|
|
||||||
### Качество кода
|
Based on [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html):
|
||||||
- Нет дублирования строк (макс 2 повтора)
|
|
||||||
- Нет магических чисел (кроме -1, 0, 1, 2, 3, 4, 5, 10, 20, 100)
|
|
||||||
- Нет * импортов
|
|
||||||
- Нет неиспользуемых импортов
|
|
||||||
- Упрощение boolean выражений
|
|
||||||
- equals() и hashCode() вместе
|
|
||||||
|
|
||||||
### Форматирование
|
| Category | Rule | Value |
|
||||||
- Отступы: 4 пробела
|
|----------|------|-------|
|
||||||
- Скобки обязательны для if/for/while
|
| **Indentation** | Basic offset | 2 spaces |
|
||||||
- Один оператор на строку
|
| **Indentation** | Continuation indent | 4 spaces |
|
||||||
- Пробелы вокруг операторов
|
| **Line length** | Max characters | 100 |
|
||||||
|
| **File length** | Max lines | 600 |
|
||||||
|
| **Method length** | Max lines | 60 |
|
||||||
|
| **Complexity** | Cyclomatic complexity | ≤ 15 |
|
||||||
|
| **Parameters** | Max per method | 7 |
|
||||||
|
| **Nested if** | Max depth | 3 |
|
||||||
|
| **Nested try** | Max depth | 2 |
|
||||||
|
|
||||||
## Запуск проверки
|
### Key Requirements
|
||||||
|
|
||||||
|
- **Spaces only** — no tabs
|
||||||
|
- **Braces** — required for `if`, `for`, `while`, `do`
|
||||||
|
- **Imports** — no wildcards, no unused imports, grouped ordering
|
||||||
|
- **Javadoc** — required on all public/protected methods and types
|
||||||
|
- **Naming** — camelCase, no abbreviations (except allowed: IO, URL, HTML, etc.)
|
||||||
|
|
||||||
|
### Running
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Проверить весь проект
|
# Full check
|
||||||
./gradlew check
|
./gradlew check
|
||||||
|
|
||||||
# Проверить только LoChat
|
# Only LoChat
|
||||||
./gradlew checkstyleMain
|
./gradlew checkstyleMain
|
||||||
|
|
||||||
# Проверить только LoHub
|
|
||||||
./gradlew :lohub:checkstyleMain
|
|
||||||
|
|
||||||
# Проверить только LoVelocity
|
|
||||||
./gradlew :lovelocity:checkstyleMain
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Отчеты
|
### Reports
|
||||||
|
|
||||||
После проверки отчеты доступны в:
|
After check, reports are available at:
|
||||||
- `build/reports/checkstyle/main.html`
|
- `build/reports/checkstyle/main.html`
|
||||||
- `lohub/build/reports/checkstyle/main.html`
|
|
||||||
- `lovelocity/build/reports/checkstyle/main.html`
|
|
||||||
|
|
||||||
## Отключение проверки
|
### IntelliJ IDEA Setup
|
||||||
|
|
||||||
Если нужно временно отключить проверку для конкретного файла:
|
1. Install "CheckStyle-IDEA" plugin
|
||||||
|
2. Settings → Tools → Checkstyle
|
||||||
|
3. Add configuration: `config/checkstyle/checkstyle.xml`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🇷🇺 Русский
|
||||||
|
|
||||||
|
### Правила
|
||||||
|
|
||||||
|
Основаны на [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html):
|
||||||
|
|
||||||
|
| Категория | Правило | Значение |
|
||||||
|
|-----------|---------|----------|
|
||||||
|
| **Отступы** | Основной | 2 пробела |
|
||||||
|
| **Отступы** | Перенос строки | 4 пробела |
|
||||||
|
| **Длина строки** | Максимум | 100 символов |
|
||||||
|
| **Длина файла** | Максимум | 600 строк |
|
||||||
|
| **Длина метода** | Максимум | 60 строк |
|
||||||
|
| **Сложность** | Цикломатическая | ≤ 15 |
|
||||||
|
| **Параметры** | Макс. на метод | 7 |
|
||||||
|
| **Вложенность if** | Макс. глубина | 3 |
|
||||||
|
| **Вложенность try** | Макс. глубина | 2 |
|
||||||
|
|
||||||
|
### Ключевые требования
|
||||||
|
|
||||||
|
- **Только пробелы** — никаких табуляций
|
||||||
|
- **Скобки** — обязательны для `if`, `for`, `while`, `do`
|
||||||
|
- **Импорты** — без *-импортов, без неиспользуемых, группировка
|
||||||
|
- **Javadoc** — обязателен для всех public/protected методов и типов
|
||||||
|
- **Именование** — camelCase, без сокращений (кроме разрешённых: IO, URL, HTML и т.д.)
|
||||||
|
|
||||||
|
### Запуск
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Полная проверка
|
||||||
|
./gradlew check
|
||||||
|
|
||||||
|
# Только LoChat
|
||||||
|
./gradlew checkstyleMain
|
||||||
|
```
|
||||||
|
|
||||||
|
### Отчёты
|
||||||
|
|
||||||
|
После проверки отчёты доступны в:
|
||||||
|
- `build/reports/checkstyle/main.html`
|
||||||
|
|
||||||
|
### Настройка IntelliJ IDEA
|
||||||
|
|
||||||
|
1. Установите плагин "CheckStyle-IDEA"
|
||||||
|
2. Settings → Tools → Checkstyle
|
||||||
|
3. Добавьте конфигурацию: `config/checkstyle/checkstyle.xml`
|
||||||
|
|
||||||
|
### Disabling Checks | Отключение проверок
|
||||||
|
|
||||||
```java
|
```java
|
||||||
// CHECKSTYLE:OFF
|
// CHECKSTYLE:OFF
|
||||||
public class MyClass {
|
public class MyClass {
|
||||||
// код без проверки
|
// code without checks
|
||||||
}
|
}
|
||||||
// CHECKSTYLE:ON
|
// CHECKSTYLE:ON
|
||||||
```
|
|
||||||
|
|
||||||
Или для конкретной строки:
|
// Per line:
|
||||||
|
|
||||||
```java
|
|
||||||
private static final int MAGIC = 42; // CHECKSTYLE IGNORE MagicNumber
|
private static final int MAGIC = 42; // CHECKSTYLE IGNORE MagicNumber
|
||||||
```
|
```
|
||||||
|
|
||||||
## Интеграция с IDE
|
|
||||||
|
|
||||||
### IntelliJ IDEA
|
|
||||||
1. Установить плагин "CheckStyle-IDEA"
|
|
||||||
2. Settings → Tools → Checkstyle
|
|
||||||
3. Добавить конфиг: `config/checkstyle/checkstyle.xml`
|
|
||||||
4. Активировать проверку в реальном времени
|
|
||||||
|
|
||||||
### VS Code
|
|
||||||
1. Установить расширение "Checkstyle for Java"
|
|
||||||
2. Настроить путь к конфигу в settings.json
|
|
||||||
|
|
|
||||||
|
|
@ -3,71 +3,185 @@
|
||||||
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
|
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
|
||||||
"https://checkstyle.org/dtds/configuration_1_3.dtd">
|
"https://checkstyle.org/dtds/configuration_1_3.dtd">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Google Java Style configuration for LoChat.
|
||||||
|
Based on Google Java Style Guide:
|
||||||
|
https://google.github.io/styleguide/javaguide.html
|
||||||
|
-->
|
||||||
<module name="Checker">
|
<module name="Checker">
|
||||||
<property name="charset" value="UTF-8"/>
|
<property name="charset" value="UTF-8"/>
|
||||||
<property name="severity" value="warning"/>
|
<property name="severity" value="warning"/>
|
||||||
<property name="fileExtensions" value="java"/>
|
<property name="fileExtensions" value="java"/>
|
||||||
|
|
||||||
|
<!-- File length: max 600 lines -->
|
||||||
<module name="FileLength">
|
<module name="FileLength">
|
||||||
<property name="max" value="600"/>
|
<property name="max" value="600"/>
|
||||||
</module>
|
</module>
|
||||||
|
|
||||||
|
<!-- Line length: max 100 characters (Google style) -->
|
||||||
<module name="LineLength">
|
<module name="LineLength">
|
||||||
<property name="max" value="140"/>
|
<property name="max" value="100"/>
|
||||||
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
|
<property name="ignorePattern"
|
||||||
|
value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
|
||||||
</module>
|
</module>
|
||||||
|
|
||||||
|
<!-- No tabs allowed (Google style: spaces only) -->
|
||||||
|
<module name="FileTabCharacter"/>
|
||||||
|
|
||||||
<module name="TreeWalker">
|
<module name="TreeWalker">
|
||||||
|
|
||||||
<module name="MethodLength">
|
<!-- ========== Google Style: Indentation ========== -->
|
||||||
<property name="max" value="60"/>
|
<!-- Basic offset: 2, continuation indent: 4 (Google style) -->
|
||||||
<property name="countEmpty" value="false"/>
|
<module name="Indentation">
|
||||||
|
<property name="basicOffset" value="2"/>
|
||||||
|
<property name="braceAdjustment" value="0"/>
|
||||||
|
<property name="caseIndent" value="2"/>
|
||||||
|
<property name="throwsIndent" value="4"/>
|
||||||
|
<property name="arrayInitIndent" value="2"/>
|
||||||
|
<property name="lineWrappingIndentation" value="4"/>
|
||||||
|
<property name="forceStrictCondition" value="false"/>
|
||||||
</module>
|
</module>
|
||||||
|
|
||||||
<module name="CyclomaticComplexity">
|
<!-- ========== Google Style: Braces ========== -->
|
||||||
<property name="max" value="15"/>
|
<!-- Braces required for if/for/while/do (Google style) -->
|
||||||
|
<module name="NeedBraces"/>
|
||||||
|
<!-- Left brace at end of line (Google style) -->
|
||||||
|
<module name="LeftCurly">
|
||||||
|
<property name="option" value="eol"/>
|
||||||
|
</module>
|
||||||
|
<!-- Right brace alone on line (Google style) -->
|
||||||
|
<module name="RightCurly">
|
||||||
|
<property name="option" value="alone"/>
|
||||||
</module>
|
</module>
|
||||||
|
|
||||||
<module name="ParameterNumber">
|
<!-- ========== Google Style: Whitespace ========== -->
|
||||||
<property name="max" value="7"/>
|
<module name="WhitespaceAround">
|
||||||
|
<property name="allowEmptyConstructors" value="true"/>
|
||||||
|
<property name="allowEmptyMethods" value="true"/>
|
||||||
|
<property name="allowEmptyTypes" value="true"/>
|
||||||
|
<property name="allowEmptyLoops" value="true"/>
|
||||||
|
<property name="allowEmptyLambdas" value="true"/>
|
||||||
|
<property name="allowEmptyCatches" value="true"/>
|
||||||
</module>
|
</module>
|
||||||
|
<module name="WhitespaceAfter"/>
|
||||||
<module name="NestedIfDepth">
|
<module name="NoWhitespaceBefore">
|
||||||
<property name="max" value="3"/>
|
<property name="tokens" value="COMMA, SEMI, POST_INC, POST_DEC, DOT, METHOD_REF"/>
|
||||||
</module>
|
</module>
|
||||||
|
<module name="NoWhitespaceAfter">
|
||||||
<module name="NestedTryDepth">
|
<property name="tokens"
|
||||||
<property name="max" value="2"/>
|
value="BNOT, DEC, DOT, INC, LNOT, UNARY_MINUS, UNARY_PLUS, ARRAY_DECLARATOR"/>
|
||||||
</module>
|
</module>
|
||||||
|
<module name="GenericWhitespace"/>
|
||||||
|
<module name="MethodParamPad"/>
|
||||||
|
<module name="ParenPad"/>
|
||||||
|
<module name="TypecastParenPad"/>
|
||||||
|
<module name="NoLineWrap"/>
|
||||||
|
|
||||||
|
<!-- ========== Google Style: Naming ========== -->
|
||||||
<module name="AvoidStarImport"/> <module name="UnusedImports"/>
|
|
||||||
<module name="RedundantImport"/>
|
|
||||||
|
|
||||||
|
|
||||||
<module name="PackageName">
|
<module name="PackageName">
|
||||||
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
|
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
|
||||||
</module>
|
</module>
|
||||||
<module name="TypeName"/>
|
<module name="TypeName"/>
|
||||||
<module name="MethodName"/>
|
<module name="MethodName"/>
|
||||||
<module name="MemberName"/> <module name="ParameterName"/>
|
<module name="MemberName"/>
|
||||||
|
<module name="ParameterName"/>
|
||||||
<module name="LocalVariableName"/>
|
<module name="LocalVariableName"/>
|
||||||
<module name="ConstantName"/>
|
<module name="ConstantName"/>
|
||||||
|
<module name="CatchParameterName"/>
|
||||||
|
<module name="ClassTypeParameterName"/>
|
||||||
<module name="NeedBraces"/>
|
<module name="MethodTypeParameterName"/>
|
||||||
<module name="LeftCurly"/>
|
<module name="InterfaceTypeParameterName"/>
|
||||||
<module name="RightCurly"/>
|
<module name="LambdaParameterName"/>
|
||||||
|
<module name="PatternVariableName"/>
|
||||||
<module name="WhitespaceAround">
|
<module name="RecordComponentName"/>
|
||||||
<property name="allowEmptyConstructors" value="true"/>
|
<module name="LocalFinalVariableName"/>
|
||||||
<property name="allowEmptyMethods" value="true"/>
|
<module name="StaticVariableName"/>
|
||||||
|
<module name="AbbreviationAsWordInName">
|
||||||
|
<property name="allowedAbbreviationLength" value="0"/>
|
||||||
|
<property name="ignoreFinal" value="false"/>
|
||||||
|
<property name="allowedAbbreviations" value="IO, URL, HTML, XML, JSON, SQL, API, PM, RP, GUI, ID"/>
|
||||||
</module>
|
</module>
|
||||||
|
|
||||||
<module name="ModifierOrder"/> <module name="EmptyStatement"/>
|
<!-- ========== Google Style: Imports ========== -->
|
||||||
<module name="EqualsHashCode"/> <module name="SimplifyBooleanExpression"/>
|
<module name="AvoidStarImport"/>
|
||||||
|
<module name="UnusedImports"/>
|
||||||
|
<module name="RedundantImport"/>
|
||||||
|
<module name="ImportOrder">
|
||||||
|
<property name="groups" value="com,net,org,java,javax"/>
|
||||||
|
<property name="ordered" value="true"/>
|
||||||
|
<property name="separated" value="true"/>
|
||||||
|
<property name="option" value="top"/>
|
||||||
|
<property name="sortStaticImportsAlphabetically" value="true"/>
|
||||||
|
</module>
|
||||||
|
|
||||||
|
<!-- ========== Google Style: Modifiers ========== -->
|
||||||
|
<module name="ModifierOrder"/>
|
||||||
|
<module name="RedundantModifier"/>
|
||||||
|
|
||||||
|
<!-- ========== Code Quality ========== -->
|
||||||
|
<module name="EmptyStatement"/>
|
||||||
|
<module name="EqualsHashCode"/>
|
||||||
|
<module name="SimplifyBooleanExpression"/>
|
||||||
<module name="SimplifyBooleanReturn"/>
|
<module name="SimplifyBooleanReturn"/>
|
||||||
<module name="StringLiteralEquality"/> <module name="DefaultComesLast"/> <module name="MultipleVariableDeclarations"/> <module name="FallThrough"/> <module name="HideUtilityClassConstructor"/>
|
<module name="StringLiteralEquality"/>
|
||||||
|
<module name="DefaultComesLast"/>
|
||||||
|
<module name="MultipleVariableDeclarations"/>
|
||||||
|
<module name="FallThrough"/>
|
||||||
|
<module name="HideUtilityClassConstructor"/>
|
||||||
|
<module name="OneTopLevelClass"/>
|
||||||
|
<module name="OneStatementPerLine"/>
|
||||||
|
<module name="EmptyBlock">
|
||||||
|
<property name="option" value="text"/>
|
||||||
|
</module>
|
||||||
|
<module name="EmptyCatchBlock">
|
||||||
|
<property name="exceptionVariableName" value="expected|ignore"/>
|
||||||
|
</module>
|
||||||
|
<module name="MissingSwitchDefault"/>
|
||||||
|
<module name="UpperEll"/>
|
||||||
|
<module name="ArrayTypeStyle"/>
|
||||||
|
<module name="CommentsIndentation"/>
|
||||||
|
<module name="UnnecessaryParentheses"/>
|
||||||
|
|
||||||
|
<!-- ========== Metrics ========== -->
|
||||||
|
<module name="MethodLength">
|
||||||
|
<property name="max" value="60"/>
|
||||||
|
<property name="countEmpty" value="false"/>
|
||||||
|
</module>
|
||||||
|
<module name="CyclomaticComplexity">
|
||||||
|
<property name="max" value="15"/>
|
||||||
|
</module>
|
||||||
|
<module name="ParameterNumber">
|
||||||
|
<property name="max" value="7"/>
|
||||||
|
</module>
|
||||||
|
<module name="NestedIfDepth">
|
||||||
|
<property name="max" value="3"/>
|
||||||
|
</module>
|
||||||
|
<module name="NestedTryDepth">
|
||||||
|
<property name="max" value="2"/>
|
||||||
|
</module>
|
||||||
|
|
||||||
|
<!-- ========== Google Style: Javadoc ========== -->
|
||||||
|
<module name="JavadocMethod">
|
||||||
|
<property name="accessModifiers" value="public, protected"/>
|
||||||
|
<property name="allowMissingParamTags" value="false"/>
|
||||||
|
<property name="allowMissingReturnTag" value="false"/>
|
||||||
|
<property name="allowedAnnotations" value="Override, Test"/>
|
||||||
|
<property name="tokens" value="METHOD_DEF, CTOR_DEF, ANNOTATION_FIELD_DEF"/>
|
||||||
|
</module>
|
||||||
|
<module name="MissingJavadocMethod">
|
||||||
|
<property name="scope" value="public"/>
|
||||||
|
<property name="minLineCount" value="2"/>
|
||||||
|
<property name="allowedAnnotations" value="Override, Test"/>
|
||||||
|
<property name="tokens" value="METHOD_DEF, CTOR_DEF"/>
|
||||||
|
</module>
|
||||||
|
<module name="MissingJavadocType">
|
||||||
|
<property name="scope" value="public"/>
|
||||||
|
</module>
|
||||||
|
<module name="JavadocType">
|
||||||
|
<property name="scope" value="public"/>
|
||||||
|
</module>
|
||||||
|
<module name="JavadocStyle"/>
|
||||||
|
<module name="NonEmptyAtclause"/>
|
||||||
|
|
||||||
</module>
|
</module>
|
||||||
</module>
|
</module>
|
||||||
Binary file not shown.
|
|
@ -1,143 +1,114 @@
|
||||||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
# LoChat main configuration
|
||||||
# ║ LoChat Configuration ║
|
# All settings for chat, gradients, moderation, RP commands, sounds, and filters.
|
||||||
# ║ Единый конфиг плагина ║
|
|
||||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
|
||||||
|
|
||||||
config-version: 5
|
config-version: 6
|
||||||
prefix: "�D4FF[LoChat]"
|
|
||||||
|
# ── General ────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
prefix: "&8[&3LoChat&8]"
|
||||||
|
|
||||||
|
# ── Chat System ────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
# │ Режимы чата │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
chat:
|
chat:
|
||||||
# Глобальный чат (все видят, активируется через "!")
|
|
||||||
global:
|
global:
|
||||||
enabled: true
|
enabled: true
|
||||||
cooldown: 3
|
cooldown: 3
|
||||||
|
|
||||||
# Локальный чат (только в радиусе)
|
|
||||||
local:
|
local:
|
||||||
enabled: true
|
enabled: true
|
||||||
cooldown: 1
|
cooldown: 1
|
||||||
radius: 100
|
radius: 100
|
||||||
|
|
||||||
# Личные сообщения
|
|
||||||
pm:
|
pm:
|
||||||
enabled: true
|
enabled: true
|
||||||
cooldown: 2
|
cooldown: 2
|
||||||
|
|
||||||
# Лимиты сообщений
|
min-message-length: 1
|
||||||
min_message_length: 1
|
max-message-length: 2000
|
||||||
max_message_length: 2000
|
clear-lines: 100
|
||||||
clear_lines: 100
|
|
||||||
|
# ── Chat Appearance ────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
# │ Внешний вид чата (префиксы, форматы, цвета) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
appearance:
|
appearance:
|
||||||
# Префиксы чата (GLOBAL / LOCAL)
|
|
||||||
prefixes:
|
prefixes:
|
||||||
global:
|
global:
|
||||||
emoji: "✦"
|
emoji: "&b\u2726"
|
||||||
text: "GLOBAL"
|
text: "GLOBAL"
|
||||||
colors: ["#B798A8", "#7858E9"]
|
separator: " &8\u25B6 "
|
||||||
separator:
|
message-color: "&7"
|
||||||
text: " ▶ "
|
|
||||||
color: "#9878C9"
|
|
||||||
message-color: "#E8E0F0"
|
|
||||||
|
|
||||||
local:
|
local:
|
||||||
emoji: "◆"
|
emoji: "&d\u25C6"
|
||||||
text: "LOCAL"
|
text: "LOCAL"
|
||||||
colors: ["#9878C9", "#7858E9"]
|
separator: " &8\u25B6 "
|
||||||
separator:
|
message-color: "&7"
|
||||||
text: " ▶ "
|
|
||||||
color: "#8B6BD6"
|
|
||||||
message-color: "#E8E0F0"
|
|
||||||
|
|
||||||
# Формат сообщений
|
|
||||||
# {emoji} {prefix} {separator} {player_prefix} {player} {player_suffix} {message}
|
|
||||||
chat-format:
|
chat-format:
|
||||||
global: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix}: {message}"
|
global: "{emoji} {prefix}{separator}{player_prefix}{player}{player_suffix}&f: {message}"
|
||||||
local: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix}: {message}"
|
local: "{emoji} {prefix}{separator}{player_prefix}{player}{player_suffix}&f: {message}"
|
||||||
|
|
||||||
# Hover при наведении на ник
|
|
||||||
hover:
|
hover:
|
||||||
enabled: true
|
enabled: true
|
||||||
format:
|
format:
|
||||||
- "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
- "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
|
||||||
- "&#B798A8✦ &f{player}"
|
- " &b\u2726 &f{player}"
|
||||||
- ""
|
- ""
|
||||||
- "⚖C9⏱ &fПинг: ẲE9{ping}ms"
|
- " &7Ping: &b{ping}ms"
|
||||||
- "⚖C9❤ &fЗдоровье: ẲE9{health}/20"
|
- " &7Health: &a{health}&7/20"
|
||||||
- "⚖C9🍖 &fГолод: ẲE9{food}/20"
|
- " &7Food: &6{food}&7/20"
|
||||||
- ""
|
- ""
|
||||||
- "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
- "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
|
||||||
- "&#B798A8✦ &fНажми чтобы написать"
|
- " &7Click to message"
|
||||||
|
|
||||||
# Эмодзи (текстовые замены)
|
|
||||||
emojis:
|
emojis:
|
||||||
":heart:": "❤"
|
":heart:": "\u2764"
|
||||||
":star:": "★"
|
":star:": "\u2605"
|
||||||
":diamond:": "♦"
|
":diamond:": "\u2666"
|
||||||
":check:": "✓"
|
":check:": "\u2713"
|
||||||
":cross:": "✗"
|
":cross:": "\u2717"
|
||||||
":arrow:": "→"
|
":arrow:": "\u2192"
|
||||||
":smile:": ":)"
|
":smile:": ":)"
|
||||||
":sad:": ":("
|
":sad:": ":("
|
||||||
":shrug:": "¯\\_(ツ)_/¯"
|
|
||||||
|
|
||||||
# Цвета системных сообщений
|
# ── Gradient Nicknames & Prefixes ──────────────────────────────────────────────
|
||||||
colors:
|
|
||||||
nobody_heard: "#9878C9"
|
|
||||||
error: "#CF6679"
|
|
||||||
success: "#9878C9"
|
|
||||||
warning: "#B798A8"
|
|
||||||
info: "#A485BC"
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
# │ Градиентные ники и префиксы │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
gradient:
|
gradient:
|
||||||
enabled: true
|
enabled: true
|
||||||
use-gradient-name: true
|
use-gradient-name: true
|
||||||
use-custom-prefix: true
|
use-custom-prefix: true
|
||||||
|
|
||||||
# Настройки отображения
|
|
||||||
display:
|
display:
|
||||||
update-display-name: true
|
update-display-name: true
|
||||||
update-tab-list: true
|
update-tab-list: true
|
||||||
|
|
||||||
# Лимиты
|
limits:
|
||||||
min-colors: 1
|
min-colors: 1
|
||||||
max-colors: 7
|
max-colors: 7
|
||||||
max-prefix-length: 16
|
max-prefix-length: 16
|
||||||
|
|
||||||
# Цены (PlayerPoints)
|
pricing:
|
||||||
price-per-color: 50
|
price-per-color: 50
|
||||||
prefix-price: 500
|
prefix-price: 500
|
||||||
prefix-one-time-purchase: true
|
prefix-one-time-purchase: true
|
||||||
use-permission-instead-of-cost: false
|
use-permission-instead-of-cost: false
|
||||||
|
|
||||||
# Кулдауны (секунды)
|
cooldowns:
|
||||||
color-cooldown: 60
|
color: 60
|
||||||
prefix-cooldown: 120
|
prefix: 120
|
||||||
|
|
||||||
# Форматирование
|
formatting:
|
||||||
prefix-format: "[{prefix}] "
|
prefix-format: "[{prefix}] "
|
||||||
gradient-on-prefix: true
|
gradient-on-prefix: true
|
||||||
gradient-on-luckperms-prefix: true
|
gradient-on-luckperms-prefix: true
|
||||||
gradient-on-luckperms-suffix: true
|
gradient-on-luckperms-suffix: true
|
||||||
continuous-gradient: true
|
continuous-gradient: true
|
||||||
use-legacy-rgb-format: true
|
|
||||||
|
|
||||||
# Хранилище (file / sqlite)
|
storage:
|
||||||
storage-type: "file"
|
type: file
|
||||||
sqlite-file: "gradient-data.db"
|
sqlite-file: "gradient-data.db"
|
||||||
|
|
||||||
|
# ── RP Commands ────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
# │ RP команды (/me, /do, /try, /roll) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
rp:
|
rp:
|
||||||
radius: 100
|
radius: 100
|
||||||
cooldowns:
|
cooldowns:
|
||||||
|
|
@ -146,126 +117,92 @@ rp:
|
||||||
do: 3
|
do: 3
|
||||||
roll: 2
|
roll: 2
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Chat Filters ───────────────────────────────────────────────────────────────
|
||||||
# │ Фильтры чата │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
filters:
|
filters:
|
||||||
# Мат-фильтр
|
|
||||||
swear:
|
swear:
|
||||||
enabled: true
|
enabled: true
|
||||||
replace: false
|
replace: false
|
||||||
replacement: "***"
|
replacement: "***"
|
||||||
words:
|
|
||||||
- "хуй"
|
|
||||||
- "пизда"
|
|
||||||
- "ебать"
|
|
||||||
|
|
||||||
# URL фильтр
|
|
||||||
url:
|
url:
|
||||||
enabled: true
|
enabled: true
|
||||||
replacement: "[ссылка скрыта]"
|
replacement: "&7[URL hidden]"
|
||||||
|
|
||||||
# IP фильтр
|
|
||||||
ip:
|
ip:
|
||||||
enabled: true
|
enabled: true
|
||||||
replacement: "[IP скрыт]"
|
replacement: "&7[IP hidden]"
|
||||||
|
|
||||||
# Скрытые URL (discord.gg и т.д.)
|
|
||||||
hidden-urls:
|
hidden-urls:
|
||||||
enabled: true
|
enabled: true
|
||||||
patterns:
|
patterns:
|
||||||
- "discord\\.gg"
|
- "discord\\.gg"
|
||||||
- "dsc\\.gg"
|
- "dsc\\.gg"
|
||||||
|
- "bit\\.ly"
|
||||||
|
- "tinyurl\\.com"
|
||||||
|
|
||||||
# Анти-спам
|
|
||||||
spam:
|
spam:
|
||||||
enabled: true
|
enabled: true
|
||||||
max-repeating-chars: 5
|
max-repeating-chars: 5
|
||||||
|
|
||||||
# Анти-флуд
|
|
||||||
flood:
|
flood:
|
||||||
enabled: true
|
enabled: true
|
||||||
max-same-messages: 3
|
max-same-messages: 3
|
||||||
|
|
||||||
# Капс
|
|
||||||
caps:
|
caps:
|
||||||
enabled: true
|
enabled: true
|
||||||
max-caps-percent: 70
|
max-caps-percent: 70
|
||||||
min-length: 5
|
min-length: 5
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Moderation ─────────────────────────────────────────────────────────────────
|
||||||
# │ Модерация (муты, баны, варны) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
moderation:
|
moderation:
|
||||||
# Дефолтные значения
|
|
||||||
default-mute-duration: "7d"
|
default-mute-duration: "7d"
|
||||||
default-mute-reason: "Без причины"
|
default-mute-reason: "No reason specified"
|
||||||
default-ban-reason: "Без причины"
|
default-ban-reason: "No reason specified"
|
||||||
|
|
||||||
# Команда после мута (для голосового чата)
|
|
||||||
voice-mute-console-command: ""
|
voice-mute-console-command: ""
|
||||||
|
ban-kick-message: "&cYou have been banned!\n&7Reason: &f{reason}"
|
||||||
|
|
||||||
# Сообщение при кике забаненного
|
# ── Sounds ─────────────────────────────────────────────────────────────────────
|
||||||
ban-kick-message: "&#CF6679Вы забанены! &#B798A8Причина: ẲE9{reason}"
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
# │ Звуки │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
sounds:
|
sounds:
|
||||||
# Упоминание в чате
|
|
||||||
mention:
|
mention:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "BLOCK_NOTE_BLOCK_PLING"
|
sound: BLOCK_NOTE_BLOCK_PLING
|
||||||
volume: 1.0
|
volume: 1.0
|
||||||
pitch: 1.5
|
pitch: 1.5
|
||||||
|
|
||||||
# Личное сообщение
|
|
||||||
pm:
|
pm:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "ENTITY_EXPERIENCE_ORB_PICKUP"
|
sound: ENTITY_EXPERIENCE_ORB_PICKUP
|
||||||
volume: 0.8
|
volume: 0.8
|
||||||
pitch: 1.2
|
pitch: 1.2
|
||||||
|
|
||||||
# Команды
|
|
||||||
command:
|
command:
|
||||||
enabled: false
|
enabled: false
|
||||||
sound: "UI_BUTTON_CLICK"
|
sound: UI_BUTTON_CLICK
|
||||||
volume: 0.5
|
volume: 0.5
|
||||||
pitch: 1.0
|
pitch: 1.0
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Join / Quit / Death Messages ──────────────────────────────────────────────
|
||||||
# │ Сообщения входа/выхода/смерти │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
messages:
|
messages:
|
||||||
# Сообщение при входе
|
|
||||||
# {player} - ник игрока
|
|
||||||
join:
|
join:
|
||||||
enabled: true
|
enabled: true
|
||||||
format: "⚖C9✦ &#B798A8{player} ẲE9зашел на сервер"
|
format: "&7\u2726 &b{player} &7joined the server"
|
||||||
|
|
||||||
# Сообщение при выходе
|
|
||||||
quit:
|
quit:
|
||||||
enabled: true
|
enabled: true
|
||||||
format: "⚖C9✦ &#B798A8{player} ẲE9вышел с сервера"
|
format: "&7\u2726 &b{player} &7left the server"
|
||||||
|
|
||||||
# Сообщение при смерти
|
|
||||||
# {player} - ник игрока
|
|
||||||
# {killer} - ник убийцы (если есть)
|
|
||||||
# {weapon} - название оружия (если есть)
|
|
||||||
# {death_message} - стандартное сообщение смерти
|
|
||||||
death:
|
death:
|
||||||
enabled: true
|
enabled: true
|
||||||
# Убийство игроком
|
player-kill: "&c\u2620 &7{player} was killed by &f{killer} &7(&f{weapon}&7)"
|
||||||
player_kill: "&#CF6679☠ &#B798A8{player} ẲE9был убит игроком &#B798A8{killer} ⚖C9({weapon})"
|
mob-kill: "&c\u2620 &7{player} was slain by &f{killer}"
|
||||||
# Смерть от моба
|
default: "&c\u2620 &7{player} {death_message}"
|
||||||
mob_kill: "&#CF6679☠ &#B798A8{player} ẲE9был убит мобом &#B798A8{killer}"
|
|
||||||
# Обычная смерть
|
|
||||||
default: "&#CF6679☠ &#B798A8{player} ẲE9{death_message}"
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Hub Command ────────────────────────────────────────────────────────────────
|
||||||
# │ Прочее │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
hub-command:
|
||||||
# Hub команда
|
|
||||||
hub_command:
|
|
||||||
enabled: true
|
enabled: true
|
||||||
server: "hub"
|
server: "hub"
|
||||||
|
|
|
||||||
|
|
@ -1,136 +1,98 @@
|
||||||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
# LoChat chat appearance
|
||||||
# ║ LoChat — config/appearance.yml ║
|
# Controls how messages look in-game: prefixes, format, hover, emojis.
|
||||||
# ║ In-game chat look: prefixes, format, hover, emoji shortcuts, Discord UI ║
|
|
||||||
# ║ Palette (Spacelegacy): #B798A8 (dusty rose) → #7858E9 (violet) ║
|
|
||||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Chat Prefixes ──────────────────────────────────────────────────────────────
|
||||||
# │ Chat prefixes (gradient label + separator + default message color) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
#
|
|
||||||
# Gradient: use 2+ hex colors; letters are blended smoothly along the label.
|
|
||||||
# message-color: used when the player does NOT have lochat.chat.colors (see plugin.yml).
|
|
||||||
|
|
||||||
prefixes:
|
prefixes:
|
||||||
global:
|
global:
|
||||||
emoji: "✦"
|
emoji: "\u2726"
|
||||||
text: "GLOBAL"
|
text: "GLOBAL"
|
||||||
colors:
|
separator: " \u25B6 "
|
||||||
- "#B798A8"
|
message-color: "&7"
|
||||||
- "#7858E9"
|
|
||||||
separator:
|
|
||||||
text: " ▶ "
|
|
||||||
color: "#9878C9"
|
|
||||||
message-color: "#E8E0F0"
|
|
||||||
|
|
||||||
local:
|
local:
|
||||||
emoji: "◆"
|
emoji: "\u25C6"
|
||||||
text: "LOCAL"
|
text: "LOCAL"
|
||||||
colors:
|
separator: " \u25B6 "
|
||||||
- "#9878C9"
|
message-color: "&7"
|
||||||
- "#7858E9"
|
|
||||||
separator:
|
|
||||||
text: " ▶ "
|
|
||||||
color: "#8B6BD6"
|
|
||||||
message-color: "#E8E0F0"
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Chat Format ────────────────────────────────────────────────────────────────
|
||||||
# │ Rendered chat line layout │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
#
|
|
||||||
# Placeholders:
|
# Placeholders:
|
||||||
# {emoji} — prefix emoji (✦ / ◆)
|
# {emoji}, {prefix}, {separator}
|
||||||
# {prefix} — gradient prefix text (GLOBAL / LOCAL)
|
# {player_prefix}, {player}, {player_suffix}
|
||||||
# {separator} — separator (e.g. ▶)
|
# {message}
|
||||||
# {player_prefix} — LuckPerms / gradient prefix from LoPreff
|
|
||||||
# {player} — display name + hover (click to /msg)
|
|
||||||
# {player_suffix} — LuckPerms / gradient suffix from LoPreff
|
|
||||||
# {message} — message body
|
|
||||||
#
|
|
||||||
# Examples:
|
|
||||||
# Default: {emoji} {prefix} {separator} {player} : {message}
|
|
||||||
# Minimal: {player_prefix} {player} ▶ {message}
|
|
||||||
# Custom: ✦ {player_prefix} {player} {player_suffix} ▶ {message}
|
|
||||||
|
|
||||||
chat-format:
|
chat-format:
|
||||||
global: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix} : {message}"
|
global: "{emoji} {prefix}{separator}{player_prefix}{player}{player_suffix}&f: {message}"
|
||||||
local: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix} : {message}"
|
local: "{emoji} {prefix}{separator}{player_prefix}{player}{player_suffix}&f: {message}"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Hover on Player Name ───────────────────────────────────────────────────────
|
||||||
# │ Hover shown when pointing at the player name in chat │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
hover:
|
hover:
|
||||||
enabled: true
|
enabled: true
|
||||||
format:
|
format:
|
||||||
- "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
- "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
|
||||||
- "&#B798A8✦ &f{player}"
|
- " \u2726 &f{player}"
|
||||||
- ""
|
- ""
|
||||||
- "⚖C9⏱ &fПинг: ẲE9{ping}ms"
|
- " &7Ping: &b{ping}ms"
|
||||||
- "⚖C9❤ &fЗдоровье: ẲE9{health}/20"
|
- " &7Health: &a{health}&7/20"
|
||||||
- "⚖C9🍖 &fГолод: ẲE9{food}/20"
|
- " &7Food: &6{food}&7/20"
|
||||||
- ""
|
- ""
|
||||||
- "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
- "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
|
||||||
- "&#B798A8✦ &fНажми чтобы написать"
|
- " &7Click to message"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Emoji Shortcuts ────────────────────────────────────────────────────────────
|
||||||
# │ Text shortcuts → unicode (applied to outgoing chat before URLs / mentions) │
|
# Text shortcuts replaced in outgoing messages before processing.
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
emojis:
|
emojis:
|
||||||
":heart:": "❤"
|
":heart:": "\u2764"
|
||||||
":hearts:": "♥"
|
":hearts:": "\u2665"
|
||||||
":star:": "★"
|
":star:": "\u2605"
|
||||||
":stars:": "✦"
|
":stars:": "\u2726"
|
||||||
":diamond:": "♦"
|
":diamond:": "\u2666"
|
||||||
":check:": "✓"
|
":check:": "\u2713"
|
||||||
":cross:": "✗"
|
":cross:": "\u2717"
|
||||||
":arrow:": "→"
|
":arrow:": "\u2192"
|
||||||
":up:": "↑"
|
":up:": "\u2191"
|
||||||
":down:": "↓"
|
":down:": "\u2193"
|
||||||
":left:": "←"
|
":left:": "\u2190"
|
||||||
":right:": "→"
|
":right:": "\u2192"
|
||||||
":music:": "♪"
|
":music:": "\u266A"
|
||||||
":note:": "♫"
|
":note:": "\u266B"
|
||||||
":smile:": ":)"
|
":smile:": ":)"
|
||||||
":sad:": ":("
|
":sad:": ":("
|
||||||
":wink:": ";)"
|
":shrug:": "\u00AF\\_(\u30C4)_/\u00AF"
|
||||||
":shrug:": "¯\\_(ツ)_/¯"
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Chat Settings ──────────────────────────────────────────────────────────────
|
||||||
# │ Radius, length limits, and misc chat UI colors (plugin internals) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
chat:
|
chat:
|
||||||
local_radius: 100
|
local-radius: 100
|
||||||
clear_lines: 100
|
clear-lines: 100
|
||||||
min_message_length: 1
|
min-message-length: 1
|
||||||
max_message_length: 2000
|
max-message-length: 2000
|
||||||
colors:
|
colors:
|
||||||
nobody_heard: "#9878C9"
|
nobody-heard: "&7"
|
||||||
error: "#CF6679"
|
error: "&c"
|
||||||
success: "#9878C9"
|
success: "&a"
|
||||||
warning: "#B798A8"
|
warning: "&6"
|
||||||
info: "#A485BC"
|
info: "&7"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Discord Embeds ─────────────────────────────────────────────────────────────
|
||||||
# │ Discord webhook embeds (see also config/discord.yml for webhooks) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
discord:
|
discord:
|
||||||
emojis:
|
emojis:
|
||||||
global_chat: "✦"
|
global-chat: "\u2726"
|
||||||
local_chat: "◆"
|
local-chat: "\u25C6"
|
||||||
player_join: "♦"
|
player-join: "\u25C6"
|
||||||
player_quit: "◈"
|
player-quit: "\u25C7"
|
||||||
player_death: "✗"
|
player-death: "\u2717"
|
||||||
avatar_urls:
|
avatar-urls:
|
||||||
default: "https://mc-heads.net/avatar/minecraft/64"
|
default: "https://mc-heads.net/avatar/minecraft/64"
|
||||||
player: "https://mc-heads.net/avatar/{player}/64"
|
player: "https://mc-heads.net/avatar/{player}/64"
|
||||||
default_embed_color: "7858E9"
|
default-embed-color: "3498DB"
|
||||||
event_titles:
|
event-titles:
|
||||||
join: "♦ Игрок зашел на сервер"
|
join: "Player joined"
|
||||||
quit: "◈ Игрок покинул сервер"
|
quit: "Player left"
|
||||||
death: "✗ Смерть игрока"
|
death: "Player died"
|
||||||
global_chat: "✦ Глобальный чат"
|
global-chat: "Global Chat"
|
||||||
local_chat: "◆ Локальный чат"
|
local-chat: "Local Chat"
|
||||||
|
|
|
||||||
|
|
@ -1,110 +1,73 @@
|
||||||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
# LoChat Discord integration
|
||||||
# ║ Discord Integration ║
|
# Relays chat messages and server events to a Discord channel via webhook.
|
||||||
# ║ Интеграция с Discord ║
|
|
||||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
# ── General ────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
# Включить интеграцию с Discord
|
|
||||||
enabled: true
|
enabled: true
|
||||||
|
|
||||||
# Настройки вебхука
|
# ── Webhook ────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
webhook:
|
webhook:
|
||||||
# URL вебхука Discord (получить в настройках канала)
|
|
||||||
url: "https://discord.com/api/webhooks/YOUR_WEBHOOK_ID/YOUR_WEBHOOK_TOKEN"
|
url: "https://discord.com/api/webhooks/YOUR_WEBHOOK_ID/YOUR_WEBHOOK_TOKEN"
|
||||||
|
username: "Minecraft"
|
||||||
|
avatar-url: "https://mc-heads.net/avatar/minecraft/64"
|
||||||
|
|
||||||
# Имя бота в Discord
|
# ── Chat Relay ─────────────────────────────────────────────────────────────────
|
||||||
username: "Minecraft Server"
|
|
||||||
|
|
||||||
# Аватар бота (URL изображения)
|
|
||||||
avatar_url: "https://mc-heads.net/avatar/minecraft/64"
|
|
||||||
|
|
||||||
# Настройки чата
|
|
||||||
chat:
|
chat:
|
||||||
# Отправлять сообщения чата в Discord
|
|
||||||
enabled: true
|
enabled: true
|
||||||
|
global-only: true
|
||||||
# Отправлять только глобальный чат (true) или весь чат (false)
|
|
||||||
global_only: true
|
|
||||||
|
|
||||||
# Формат сообщения чата
|
|
||||||
format: "**{player}**: {message}"
|
format: "**{player}**: {message}"
|
||||||
|
embed-color: "5865F2"
|
||||||
|
use-embed: true
|
||||||
|
|
||||||
# Цвет embed для сообщений чата (hex без #)
|
# ── Events ─────────────────────────────────────────────────────────────────────
|
||||||
embed_color: "5865F2"
|
|
||||||
|
|
||||||
# Использовать embed или обычное сообщение
|
|
||||||
use_embed: true
|
|
||||||
|
|
||||||
# Настройки событий игроков
|
|
||||||
events:
|
events:
|
||||||
# Отправлять события входа/выхода
|
|
||||||
enabled: true
|
enabled: true
|
||||||
|
|
||||||
# Настройки входа на сервер
|
|
||||||
# {player} - ник игрока
|
|
||||||
join:
|
join:
|
||||||
enabled: true
|
enabled: true
|
||||||
title: "🟢 Игрок зашел на сервер"
|
title: "Player joined"
|
||||||
description: "**{player}** присоединился к серверу"
|
description: "**{player}** joined the server"
|
||||||
color: "00FF00"
|
color: "00FF00"
|
||||||
thumbnail: "https://mc-heads.net/avatar/{player}/64"
|
thumbnail: "https://mc-heads.net/avatar/{player}/64"
|
||||||
|
|
||||||
# Настройки выхода с сервера
|
|
||||||
# {player} - ник игрока
|
|
||||||
quit:
|
quit:
|
||||||
enabled: true
|
enabled: true
|
||||||
title: "🔴 Игрок покинул сервер"
|
title: "Player left"
|
||||||
description: "**{player}** покинул сервер"
|
description: "**{player}** left the server"
|
||||||
color: "FF0000"
|
color: "FF0000"
|
||||||
thumbnail: "https://mc-heads.net/avatar/{player}/64"
|
thumbnail: "https://mc-heads.net/avatar/{player}/64"
|
||||||
|
|
||||||
# Настройки смерти игрока
|
|
||||||
# {player} - ник игрока
|
|
||||||
# {killer} - ник убийцы (если есть)
|
|
||||||
# {weapon} - название оружия (если есть)
|
|
||||||
# {death_message} - стандартное сообщение смерти
|
|
||||||
death:
|
death:
|
||||||
enabled: true
|
enabled: true
|
||||||
# Убийство игроком
|
player-kill:
|
||||||
player_kill:
|
title: "PvP kill"
|
||||||
title: "⚔️ PvP убийство"
|
description: "**{player}** was killed by **{killer}** using **{weapon}**"
|
||||||
description: "**{player}** был убит игроком **{killer}** с помощью **{weapon}**"
|
|
||||||
color: "FF0000"
|
color: "FF0000"
|
||||||
# Смерть от моба
|
mob-kill:
|
||||||
mob_kill:
|
title: "Mob kill"
|
||||||
title: "💀 Смерть от моба"
|
description: "**{player}** was slain by **{killer}**"
|
||||||
description: "**{player}** был убит мобом **{killer}**"
|
|
||||||
color: "800080"
|
color: "800080"
|
||||||
# Обычная смерть
|
|
||||||
default:
|
default:
|
||||||
title: "💀 Смерть игрока"
|
title: "Player died"
|
||||||
description: "**{player}** {death_message}"
|
description: "**{player}** {death_message}"
|
||||||
color: "800080"
|
color: "800080"
|
||||||
thumbnail: "https://mc-heads.net/avatar/{player}/64"
|
thumbnail: "https://mc-heads.net/avatar/{player}/64"
|
||||||
|
|
||||||
# Настройки фильтрации
|
# ── Filtering ──────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
filter:
|
filter:
|
||||||
# Игнорировать сообщения от ботов
|
ignore-bots: true
|
||||||
ignore_bots: true
|
min-message-length: 1
|
||||||
|
max-message-length: 2000
|
||||||
|
sanitize-mentions: true
|
||||||
|
|
||||||
# Минимальная длина сообщения для отправки
|
# ── Performance ────────────────────────────────────────────────────────────────
|
||||||
min_message_length: 1
|
|
||||||
|
|
||||||
# Максимальная длина сообщения (обрезать если больше)
|
|
||||||
max_message_length: 2000
|
|
||||||
|
|
||||||
# Заменять @everyone и @here на безопасные варианты
|
|
||||||
sanitize_mentions: true
|
|
||||||
|
|
||||||
# Настройки производительности
|
|
||||||
performance:
|
performance:
|
||||||
# Асинхронная отправка (рекомендуется)
|
|
||||||
async: true
|
async: true
|
||||||
|
|
||||||
# Таймаут подключения (секунды)
|
|
||||||
timeout: 10
|
timeout: 10
|
||||||
|
retry-attempts: 3
|
||||||
# Повторные попытки при ошибке
|
retry-delay: 1000
|
||||||
retry_attempts: 3
|
|
||||||
|
|
||||||
# Задержка между попытками (миллисекунды)
|
|
||||||
retry_delay: 1000
|
|
||||||
|
|
|
||||||
|
|
@ -1,44 +1,34 @@
|
||||||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
# LoChat chat filters
|
||||||
# ║ LoChat — Фильтры чата ║
|
# Control spam, swearing, URLs, and other unwanted content.
|
||||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Swear Filter ───────────────────────────────────────────────────────────────
|
||||||
# │ Мат-фильтр │
|
# Uses badwords.txt for the word list.
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
# Bypass permission: lochat.bypass.swear
|
||||||
# Использует badwords.txt для списка слов
|
|
||||||
# Автоматически ловит замены букв: х->x, о->o, е->e и т.д.
|
|
||||||
# Обход: lochat.bypass.swear
|
|
||||||
|
|
||||||
swear:
|
swear:
|
||||||
enabled: true
|
enabled: true
|
||||||
replace: false # true = заменять на ***, false = блокировать сообщение
|
replace: false
|
||||||
replacement: "***"
|
replacement: "***"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── URL Filter ─────────────────────────────────────────────────────────────────
|
||||||
# │ URL фильтр │
|
# Blocks URLs in messages.
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
# Bypass permission: lochat.bypass.urlfilter
|
||||||
# Блокирует ссылки в чате
|
|
||||||
# Обход: lochat.bypass.urlfilter
|
|
||||||
|
|
||||||
url:
|
url:
|
||||||
enabled: true
|
enabled: true
|
||||||
replacement: "[ссылка скрыта]"
|
replacement: "&7[URL hidden]"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── IP Filter ──────────────────────────────────────────────────────────────────
|
||||||
# │ IP фильтр │
|
# Blocks IP addresses in messages.
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
# Bypass permission: lochat.bypass.ipfilter
|
||||||
# Блокирует IP адреса в чате
|
|
||||||
# Обход: lochat.bypass.ipfilter
|
|
||||||
|
|
||||||
ip:
|
ip:
|
||||||
enabled: true
|
enabled: true
|
||||||
replacement: "[IP скрыт]"
|
replacement: "&7[IP hidden]"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Hidden URL Filter ──────────────────────────────────────────────────────────
|
||||||
# │ Скрытые URL (discord.gg и т.д.) │
|
# Blocks known link shorteners and invite links.
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
# Bypass permission: lochat.bypass.hiddenurls
|
||||||
# Блокирует популярные сокращенные ссылки
|
|
||||||
# Обход: lochat.bypass.hiddenurls
|
|
||||||
|
|
||||||
hidden-urls:
|
hidden-urls:
|
||||||
enabled: true
|
enabled: true
|
||||||
|
|
@ -49,33 +39,27 @@ hidden-urls:
|
||||||
- "tinyurl\\.com"
|
- "tinyurl\\.com"
|
||||||
- "goo\\.gl"
|
- "goo\\.gl"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Spam Filter ────────────────────────────────────────────────────────────────
|
||||||
# │ Анти-спам │
|
# Blocks messages with excessive repeated characters.
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
# Bypass permission: lochat.bypass.spam
|
||||||
# Блокирует повторяющиеся символы (ааааааа, хххххх)
|
|
||||||
# Обход: lochat.bypass.spam
|
|
||||||
|
|
||||||
spam:
|
spam:
|
||||||
enabled: true
|
enabled: true
|
||||||
max-repeating-chars: 5 # Максимум повторений одного символа
|
max-repeating-chars: 5
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Flood Filter ───────────────────────────────────────────────────────────────
|
||||||
# │ Анти-флуд │
|
# Blocks identical messages sent in quick succession.
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
# Bypass permission: lochat.bypass.flood
|
||||||
# Блокирует одинаковые сообщения подряд
|
|
||||||
# Обход: lochat.bypass.flood
|
|
||||||
|
|
||||||
flood:
|
flood:
|
||||||
enabled: true
|
enabled: true
|
||||||
max-same-messages: 3 # Сколько раз можно отправить одно и то же
|
max-same-messages: 3
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── CAPS Filter ────────────────────────────────────────────────────────────────
|
||||||
# │ Капс-фильтр │
|
# Blocks messages with too many capital letters.
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
# Bypass permission: lochat.bypass.caps
|
||||||
# Блокирует сообщения с большим количеством заглавных букв
|
|
||||||
# Обход: lochat.bypass.caps
|
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
enabled: true
|
enabled: true
|
||||||
max-caps-percent: 70 # Максимум % заглавных букв
|
max-caps-percent: 70
|
||||||
min-length: 5 # Минимальная длина для проверки
|
min-length: 5
|
||||||
|
|
|
||||||
|
|
@ -1,137 +1,123 @@
|
||||||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
# LoChat system messages
|
||||||
# ║ LoChat Hardcoded Messages ║
|
# Internal messages for commands, filters, moderation, and general feedback.
|
||||||
# ║ Цветовая гамма: Spacelegacy ║
|
|
||||||
# ║ #B798A8 → #7858E9 ║
|
# ── Commands ───────────────────────────────────────────────────────────────────
|
||||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
|
||||||
|
|
||||||
commands:
|
commands:
|
||||||
mute:
|
mute:
|
||||||
usage: "&#B798A8Использование: ẲE9/mute <ник> [время] [-s] [причина]"
|
usage: "&cUsage: &f/mute <player> [time] [-s] [reason]"
|
||||||
time_help: "⚖C9Время: ẲE91d⚖C9, ẲE92h⚖C9, ẲE930m⚖C9, ẲE960s⚖C9, ẲE9perm"
|
time-help: "&7Time format: &f1d&7, &f2h&7, &f30m&7, &f60s&7, &fperm"
|
||||||
silent_help: "&#B798A8-s ⚖C9— тихий мут (право ẲE9lochat.mute.silent⚖C9)"
|
silent-help: "&7-s &7= silent mute (requires &flochat.mute.silent&7)"
|
||||||
no_silent_permission: "&#CF6679Нет права на тихий мут"
|
no-silent-permission: "&cNo permission for silent mute"
|
||||||
default_reason: "Без причины"
|
default-reason: "No reason specified"
|
||||||
default_duration: "7d"
|
default-duration: "7d"
|
||||||
|
|
||||||
cooldown:
|
cooldown:
|
||||||
message: "&#B798A8Подождите ẲE9{remaining} &#B798A8сек"
|
message: "&cPlease wait &f{remaining} &cseconds"
|
||||||
|
|
||||||
clear_chat:
|
clear-chat:
|
||||||
lines_cleared: "⚖C9Чат очищен ẲE9({lines} строк⚖C9)"
|
lines-cleared: "&aChat cleared &7({lines} lines)"
|
||||||
no_permission: "&#CF6679Нет прав для очистки чата"
|
no-permission: "&cNo permission to clear chat"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Local Chat ─────────────────────────────────────────────────────────────────
|
||||||
# │ ЛОКАЛЬНЫЙ ЧАТ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
local_chat:
|
local-chat:
|
||||||
nobody_heard: "⚖C9Вас никто не услышал &#B798A8— рядом нет игроков"
|
nobody-heard: "&7Nobody heard you — no players nearby"
|
||||||
no_players_nearby: "&#B798A8Рядом нет игроков"
|
no-players-nearby: "&7No players nearby"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Filters ────────────────────────────────────────────────────────────────────
|
||||||
# │ ФИЛЬТРЫ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
filters:
|
filters:
|
||||||
caps:
|
caps:
|
||||||
min_length: 3
|
min-length: 3
|
||||||
blocked_message: "&#CF6679Не кричите в чате"
|
blocked-message: "&cPlease don't shout"
|
||||||
auto_lowercase_notice: "&#B798A8Сообщение автоматически исправлено"
|
auto-lowercase-notice: "&7Message auto-corrected"
|
||||||
spam:
|
spam:
|
||||||
blocked_message: "&#CF6679Не спамьте"
|
blocked-message: "&cDo not spam"
|
||||||
similar_message: "&#CF6679Вы уже отправляли похожее сообщение"
|
similar-message: "&cYou already sent a similar message"
|
||||||
swear:
|
swear:
|
||||||
blocked_message: "&#CF6679Запрещённые слова"
|
blocked-message: "&cInappropriate language"
|
||||||
replaced_notice: "&#B798A8Некоторые слова заменены"
|
replaced-notice: "&7Some words were replaced"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Mute Messages ──────────────────────────────────────────────────────────────
|
||||||
# │ МУТИРОВАНИЕ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
mute:
|
mute:
|
||||||
muted_message: "&#CF6679Вы замучены! &#B798A8Причина: ẲE9{reason}&#B798A8. Осталось: ẲE9{time}"
|
muted-message: "&cYou are muted! &7Reason: &f{reason}&7. Remaining: &f{time}"
|
||||||
muted_permanent: "&#CF6679Вы замучены навсегда! &#B798A8Причина: ẲE9{reason}"
|
muted-permanent: "&cYou are permanently muted! &7Reason: &f{reason}"
|
||||||
player_muted: "⚖C9Игрок ẲE9{player} ⚖C9замучен на ẲE9{time}⚖C9. Причина: &#B798A8{reason}"
|
player-muted: "&aPlayer &f{player} &amuted for &f{time}&a. Reason: &7{reason}"
|
||||||
player_muted_permanent: "⚖C9Игрок ẲE9{player} ⚖C9замучен навсегда. Причина: &#B798A8{reason}"
|
player-muted-permanent: "&aPlayer &f{player} &amuted permanently. Reason: &7{reason}"
|
||||||
player_muted_silent: "&#B798A8[⚖C9ТИХИЙ МУТ&#B798A8] ẲE9{player} &#B798A8замучен на ẲE9{time}"
|
player-muted-silent: "&8[&7SILENT&8] &f{player} &7muted for &f{time}"
|
||||||
player_unmuted: "⚖C9Игрок ẲE9{player} ⚖C9размучен"
|
player-unmuted: "&aPlayer &f{player} &aunmuted"
|
||||||
not_muted: "&#B798A8Игрок ẲE9{player} &#B798A8не замучен"
|
not-muted: "&7Player &f{player} &7is not muted"
|
||||||
player_not_found: "&#CF6679Игрок не найден!"
|
player-not-found: "&cPlayer not found!"
|
||||||
invalid_time: "&#CF6679Неверный формат времени!"
|
invalid-time: "&cInvalid time format!"
|
||||||
already_muted: "&#CF6679Игрок уже замучен!"
|
already-muted: "&cPlayer is already muted!"
|
||||||
no_silent_unmute_permission: "&#CF6679Нет права на тихий размут!"
|
no-silent-unmute-permission: "&cNo permission for silent unmute"
|
||||||
player_not_muted_simple: "&#CF6679Игрок не замучен!"
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Gamemodes ──────────────────────────────────────────────────────────────────
|
||||||
# │ ИГРОВЫЕ РЕЖИМЫ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
gamemodes:
|
gamemodes:
|
||||||
survival: "Выживание"
|
survival: "Survival"
|
||||||
creative: "Творчество"
|
creative: "Creative"
|
||||||
adventure: "Приключение"
|
adventure: "Adventure"
|
||||||
spectator: "Наблюдатель"
|
spectator: "Spectator"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Private Messages ───────────────────────────────────────────────────────────
|
||||||
# │ ЛИЧНЫЕ СООБЩЕНИЯ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
private_messages:
|
private-messages:
|
||||||
no_reply_target: "&#CF6679Нет цели для ответа"
|
no-reply-target: "&cNobody to reply to"
|
||||||
message_sent: "&#B798A8Сообщение отправлено ẲE9{player}"
|
message-sent: "&aMessage sent to &f{player}"
|
||||||
player_offline: "&#CF6679Игрок ẲE9{player} &#CF6679не в сети"
|
player-offline: "&cPlayer &f{player} &cis not online"
|
||||||
cannot_message_self: "&#CF6679Нельзя писать самому себе"
|
cannot-message-self: "&cYou cannot message yourself"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Ignore ─────────────────────────────────────────────────────────────────────
|
||||||
# │ ИГНОРИРОВАНИЕ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
ignore:
|
ignore:
|
||||||
player_ignored: "⚖C9Игрок ẲE9{player} ⚖C9добавлен в игнор"
|
player-ignored: "&aPlayer &f{player} &ais now ignored"
|
||||||
player_unignored: "⚖C9Игрок ẲE9{player} ⚖C9убран из игнора"
|
player-unignored: "&aPlayer &f{player} &ais no longer ignored"
|
||||||
already_ignored: "&#B798A8Игрок ẲE9{player} &#B798A8уже в игноре"
|
already-ignored: "&7Player &f{player} &7is already ignored"
|
||||||
not_ignored: "&#B798A8Игрок ẲE9{player} &#B798A8не в игноре"
|
not-ignored: "&7Player &f{player} &7is not ignored"
|
||||||
cannot_ignore_self: "&#CF6679Нельзя игнорировать самого себя"
|
cannot-ignore-self: "&cYou cannot ignore yourself"
|
||||||
ignore_list_empty: "&#B798A8Список игнора пуст"
|
ignore-list-empty: "&7Your ignore list is empty"
|
||||||
ignore_list_header: "&#B798A8Игнорируемые игроки⚖C9:"
|
ignore-list-header: "&7Ignored players:"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── General ────────────────────────────────────────────────────────────────────
|
||||||
# │ ОБЩИЕ СООБЩЕНИЯ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
general:
|
general:
|
||||||
no_permission: "&#CF6679Нет прав!"
|
no-permission: "&cNo permission!"
|
||||||
player_only: "&#CF6679Только для игроков!"
|
player-only: "&cPlayers only!"
|
||||||
invalid_arguments: "&#CF6679Неверные аргументы!"
|
invalid-arguments: "&cInvalid arguments!"
|
||||||
command_disabled: "&#CF6679Команда отключена!"
|
command-disabled: "&cCommand disabled!"
|
||||||
feature_disabled: "&#CF6679Функция отключена!"
|
feature-disabled: "&cFeature disabled!"
|
||||||
player_not_found: "&#CF6679Игрок не найден!"
|
player-not-found: "&cPlayer not found!"
|
||||||
time_formats:
|
time-formats:
|
||||||
seconds: "сек"
|
seconds: "s"
|
||||||
minutes: "мин"
|
minutes: "m"
|
||||||
hours: "ч"
|
hours: "h"
|
||||||
days: "д"
|
days: "d"
|
||||||
permanent: "навсегда"
|
permanent: "permanent"
|
||||||
enabled: "ẲE9Включено"
|
enabled: "&aEnabled"
|
||||||
disabled: "&#B798A8Отключено"
|
disabled: "&7Disabled"
|
||||||
online: "⚖C9В сети"
|
online: "&aOnline"
|
||||||
offline: "&#B798A8Не в сети"
|
offline: "&7Offline"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Moderation ─────────────────────────────────────────────────────────────────
|
||||||
# │ ВАРНЫ / БАНЫ (LoChat) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
moderation:
|
moderation:
|
||||||
default_reason: "Без причины"
|
default-reason: "No reason specified"
|
||||||
duration_permanent: "навсегда"
|
duration-permanent: "permanent"
|
||||||
warn_received: "&#CF6679⚠ Вам выдано предупреждение! &#B798A8Причина: ẲE9{reason}"
|
warn-received: "&6\u26A0 &cYou received a warning! &7Reason: &f{reason}"
|
||||||
warn_staff_confirm: "⚖C9Игроку ẲE9{player} ⚖C9выдан варн. &#B798A8Причина: ẲE9{reason}"
|
warn-staff-confirm: "&aPlayer &f{player} &awarned. &7Reason: &f{reason}"
|
||||||
silent_warn_staff: "&#B798A8[⚖C9ТИХИЙ ВАРН&#B798A8] ẲE9{player}⚖C9: &#B798A8{reason}"
|
silent-warn-staff: "&8[&7SILENT&8] &f{player}&7: &7{reason}"
|
||||||
ban_usage: "&#B798A8Использование: ẲE9/lban <ник> [время|perm] [причина]"
|
ban-usage: "&cUsage: &f/lban <player> [time|perm] [reason]"
|
||||||
ban_confirm: "⚖C9Игрок ẲE9{player} ⚖C9забанен. &#B798A8Срок: ẲE9{duration}"
|
ban-confirm: "&aPlayer &f{player} &abanned. &7Duration: &f{duration}"
|
||||||
unban_confirm: "⚖C9Бан снят с ẲE9{player}"
|
unban-confirm: "&aBan lifted for &f{player}"
|
||||||
not_banned: "&#CF6679Игрок не забанен!"
|
not-banned: "&cPlayer is not banned!"
|
||||||
already_banned: "&#CF6679Игрок уже забанен!"
|
already-banned: "&cPlayer is already banned!"
|
||||||
warn_usage: "&#B798A8Использование: ẲE9/warn <ник> [причина]"
|
warn-usage: "&cUsage: &f/warn <player> [reason]"
|
||||||
silent_warn_usage: "&#B798A8Использование: ẲE9/silentwarn <ник> [причина]"
|
silent-warn-usage: "&cUsage: &f/silentwarn <player> [reason]"
|
||||||
ban_kick_message: "<gradient:#FF5555:#8B0000><bold>═══════ ДОСТУП ЗАПРЕЩЁН ═══════</bold></gradient>\n<gray>Вы заблокированы на этом сервере.</gray>\n<white>Причина: <gradient:#7858E9:#B798A8>{reason}</gradient></white>\n<gray>Модератор: <white>{moderator}</white></gray>\n<gray>Срок: <#7858E9>{duration}</#7858E9></gray>\n<gradient:#FF5555:#8B0000><bold>════════════════════════</bold></gradient>"
|
ban-kick-message: |
|
||||||
|
<red><bold>You are banned from this server.</bold></red>
|
||||||
|
<gray>Reason: <white>{reason}</white></gray>
|
||||||
|
<gray>Moderator: <white>{moderator}</white></gray>
|
||||||
|
<gray>Duration: <white>{duration}</white></gray>
|
||||||
|
|
|
||||||
|
|
@ -1,290 +1,212 @@
|
||||||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
# LoChat mute system configuration
|
||||||
# ║ LoChat Mute Configuration ║
|
# Controls mute durations, automatic mutes, escalation, and notifications.
|
||||||
# ║ Конфигурация мутов ║
|
|
||||||
# ║ Версия: 1.5.5-1.20.1 ║
|
|
||||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── General Settings ───────────────────────────────────────────────────────────
|
||||||
# │ ОСНОВНЫЕ НАСТРОЙКИ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
# Причина мута по умолчанию
|
default-reason: "Chat rule violation"
|
||||||
default-reason: "Нарушение правил чата"
|
|
||||||
|
|
||||||
# Длительность мута по умолчанию
|
|
||||||
default-duration: "1h"
|
default-duration: "1h"
|
||||||
|
|
||||||
# Максимальная длина причины мута
|
|
||||||
max-reason-length: 100
|
max-reason-length: 100
|
||||||
|
|
||||||
# Показывать причину мута игроку
|
|
||||||
show-reason: true
|
show-reason: true
|
||||||
|
|
||||||
# Показывать оставшееся время мута
|
|
||||||
show-remaining-time: true
|
show-remaining-time: true
|
||||||
|
|
||||||
# Автоматически размучивать при истечении времени
|
|
||||||
auto-unmute: true
|
auto-unmute: true
|
||||||
|
|
||||||
# Сохранять историю мутов
|
|
||||||
save-history: true
|
save-history: true
|
||||||
|
|
||||||
# Максимальное количество записей в истории на игрока
|
|
||||||
max-history-entries: 50
|
max-history-entries: 50
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Available Durations ────────────────────────────────────────────────────────
|
||||||
# │ ДОСТУПНЫЕ ДЛИТЕЛЬНОСТИ │
|
# Each duration requires a permission. Empty permission = no restriction.
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
durations:
|
durations:
|
||||||
# Формат: "время": "право для использования"
|
|
||||||
"5m":
|
"5m":
|
||||||
permission: "lochat.mute.dur.5m"
|
permission: "lochat.mute.dur.5m"
|
||||||
display: "5 минут"
|
display: "5 minutes"
|
||||||
|
|
||||||
"10m":
|
"10m":
|
||||||
permission: "lochat.mute.dur.10m"
|
permission: "lochat.mute.dur.10m"
|
||||||
display: "10 минут"
|
display: "10 minutes"
|
||||||
|
|
||||||
"30m":
|
"30m":
|
||||||
permission: "lochat.mute.dur.30m"
|
permission: "lochat.mute.dur.30m"
|
||||||
display: "30 минут"
|
display: "30 minutes"
|
||||||
|
|
||||||
"1h":
|
"1h":
|
||||||
permission: "lochat.mute.dur.1h"
|
permission: "lochat.mute.dur.1h"
|
||||||
display: "1 час"
|
display: "1 hour"
|
||||||
|
|
||||||
"3h":
|
"3h":
|
||||||
permission: "lochat.mute.dur.3h"
|
permission: "lochat.mute.dur.3h"
|
||||||
display: "3 часа"
|
display: "3 hours"
|
||||||
|
|
||||||
"6h":
|
"6h":
|
||||||
permission: "lochat.mute.dur.6h"
|
permission: "lochat.mute.dur.6h"
|
||||||
display: "6 часов"
|
display: "6 hours"
|
||||||
|
|
||||||
"12h":
|
"12h":
|
||||||
permission: "lochat.mute.dur.12h"
|
permission: "lochat.mute.dur.12h"
|
||||||
display: "12 часов"
|
display: "12 hours"
|
||||||
|
|
||||||
"1d":
|
"1d":
|
||||||
permission: "lochat.mute.dur.1d"
|
permission: "lochat.mute.dur.1d"
|
||||||
display: "1 день"
|
display: "1 day"
|
||||||
|
|
||||||
"3d":
|
"3d":
|
||||||
permission: "lochat.mute.dur.3d"
|
permission: "lochat.mute.dur.3d"
|
||||||
display: "3 дня"
|
display: "3 days"
|
||||||
|
|
||||||
"7d":
|
"7d":
|
||||||
permission: "lochat.mute.dur.7d"
|
permission: "lochat.mute.dur.7d"
|
||||||
display: "7 дней"
|
display: "7 days"
|
||||||
|
|
||||||
"14d":
|
"14d":
|
||||||
permission: "lochat.mute.dur.14d"
|
permission: "lochat.mute.dur.14d"
|
||||||
display: "14 дней"
|
display: "14 days"
|
||||||
|
|
||||||
"30d":
|
"30d":
|
||||||
permission: "lochat.mute.dur.30d"
|
permission: "lochat.mute.dur.30d"
|
||||||
display: "30 дней"
|
display: "30 days"
|
||||||
|
|
||||||
"perm":
|
"perm":
|
||||||
permission: "lochat.mute.dur.perm"
|
permission: "lochat.mute.dur.perm"
|
||||||
display: "Навсегда"
|
display: "Permanent"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Preset Reasons ─────────────────────────────────────────────────────────────
|
||||||
# │ ГОТОВЫЕ ПРИЧИНЫ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
reasons:
|
reasons:
|
||||||
spam:
|
spam:
|
||||||
text: "Спам в чате"
|
text: "Spam"
|
||||||
duration: "30m"
|
duration: "30m"
|
||||||
permission: "lochat.mute.reason.spam"
|
permission: "lochat.mute.reason.spam"
|
||||||
|
|
||||||
caps:
|
caps:
|
||||||
text: "Злоупотребление заглавными буквами"
|
text: "Excessive caps"
|
||||||
duration: "15m"
|
duration: "15m"
|
||||||
permission: "lochat.mute.reason.caps"
|
permission: "lochat.mute.reason.caps"
|
||||||
|
|
||||||
swear:
|
swear:
|
||||||
text: "Использование нецензурной лексики"
|
text: "Inappropriate language"
|
||||||
duration: "1h"
|
duration: "1h"
|
||||||
permission: "lochat.mute.reason.swear"
|
permission: "lochat.mute.reason.swear"
|
||||||
|
|
||||||
flood:
|
flood:
|
||||||
text: "Флуд в чате"
|
text: "Flood"
|
||||||
duration: "20m"
|
duration: "20m"
|
||||||
permission: "lochat.mute.reason.flood"
|
permission: "lochat.mute.reason.flood"
|
||||||
|
|
||||||
advertising:
|
advertising:
|
||||||
text: "Реклама"
|
text: "Advertising"
|
||||||
duration: "3h"
|
duration: "3h"
|
||||||
permission: "lochat.mute.reason.advertising"
|
permission: "lochat.mute.reason.advertising"
|
||||||
|
|
||||||
insult:
|
insult:
|
||||||
text: "Оскорбления игроков"
|
text: "Insulting players"
|
||||||
duration: "2h"
|
duration: "2h"
|
||||||
permission: "lochat.mute.reason.insult"
|
permission: "lochat.mute.reason.insult"
|
||||||
|
|
||||||
toxicity:
|
# ── Auto-Mute ──────────────────────────────────────────────────────────────────
|
||||||
text: "Токсичное поведение"
|
|
||||||
duration: "6h"
|
|
||||||
permission: "lochat.mute.reason.toxicity"
|
|
||||||
|
|
||||||
politics:
|
|
||||||
text: "Обсуждение политики"
|
|
||||||
duration: "1h"
|
|
||||||
permission: "lochat.mute.reason.politics"
|
|
||||||
|
|
||||||
religion:
|
|
||||||
text: "Религиозные споры"
|
|
||||||
duration: "1h"
|
|
||||||
permission: "lochat.mute.reason.religion"
|
|
||||||
|
|
||||||
begging:
|
|
||||||
text: "Попрошайничество"
|
|
||||||
duration: "30m"
|
|
||||||
permission: "lochat.mute.reason.begging"
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
# │ АВТОМАТИЧЕСКИЕ МУТЫ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
auto-mute:
|
auto-mute:
|
||||||
# Включить автоматические муты
|
|
||||||
enabled: true
|
enabled: true
|
||||||
|
|
||||||
# Мут за спам
|
|
||||||
spam:
|
spam:
|
||||||
enabled: true
|
enabled: true
|
||||||
threshold: 5 # Количество сообщений
|
threshold: 5
|
||||||
time-window: 10 # За какое время (секунды)
|
time-window: 10
|
||||||
duration: "10m"
|
duration: "10m"
|
||||||
reason: "Автомут: спам в чате"
|
reason: "Auto-mute: spam"
|
||||||
|
|
||||||
# Мут за мат
|
|
||||||
swear:
|
swear:
|
||||||
enabled: true
|
enabled: true
|
||||||
threshold: 3 # Количество нарушений
|
threshold: 3
|
||||||
duration: "30m"
|
duration: "30m"
|
||||||
reason: "Автомут: использование мата"
|
reason: "Auto-mute: inappropriate language"
|
||||||
|
|
||||||
# Мут за заглавные буквы
|
|
||||||
caps:
|
caps:
|
||||||
enabled: true
|
enabled: true
|
||||||
threshold: 5 # Количество нарушений
|
threshold: 5
|
||||||
duration: "5m"
|
duration: "5m"
|
||||||
reason: "Автомут: злоупотребление CAPS"
|
reason: "Auto-mute: excessive caps"
|
||||||
|
|
||||||
# Мут за рекламу
|
|
||||||
advertising:
|
advertising:
|
||||||
enabled: true
|
enabled: true
|
||||||
threshold: 1 # Одно нарушение
|
threshold: 1
|
||||||
duration: "1h"
|
duration: "1h"
|
||||||
reason: "Автомут: реклама"
|
reason: "Auto-mute: advertising"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Punishment Escalation ──────────────────────────────────────────────────────
|
||||||
# │ ЭСКАЛАЦИЯ НАКАЗАНИЙ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
escalation:
|
escalation:
|
||||||
# Включить эскалацию наказаний
|
|
||||||
enabled: true
|
enabled: true
|
||||||
|
|
||||||
# Период для подсчета нарушений (дни)
|
|
||||||
period: 30
|
period: 30
|
||||||
|
|
||||||
# Уровни наказаний
|
|
||||||
levels:
|
levels:
|
||||||
1:
|
1:
|
||||||
duration: "30m"
|
duration: "30m"
|
||||||
reason: "Первое нарушение"
|
reason: "First offense"
|
||||||
|
|
||||||
2:
|
2:
|
||||||
duration: "2h"
|
duration: "2h"
|
||||||
reason: "Повторное нарушение"
|
reason: "Second offense"
|
||||||
|
|
||||||
3:
|
3:
|
||||||
duration: "12h"
|
duration: "12h"
|
||||||
reason: "Третье нарушение"
|
reason: "Third offense"
|
||||||
|
|
||||||
4:
|
4:
|
||||||
duration: "3d"
|
duration: "3d"
|
||||||
reason: "Четвертое нарушение"
|
reason: "Fourth offense"
|
||||||
|
|
||||||
5:
|
5:
|
||||||
duration: "7d"
|
duration: "7d"
|
||||||
reason: "Пятое нарушение"
|
reason: "Fifth offense"
|
||||||
|
|
||||||
6:
|
6:
|
||||||
duration: "perm"
|
duration: "perm"
|
||||||
reason: "Систематические нарушения"
|
reason: "Systematic violations"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Notifications ──────────────────────────────────────────────────────────────
|
||||||
# │ УВЕДОМЛЕНИЯ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
notifications:
|
notifications:
|
||||||
# Уведомлять администраторов о мутах
|
|
||||||
notify-staff: true
|
notify-staff: true
|
||||||
|
|
||||||
# Право для получения уведомлений
|
|
||||||
staff-permission: "lochat.mute.notify"
|
staff-permission: "lochat.mute.notify"
|
||||||
|
|
||||||
# Публичные уведомления о мутах
|
|
||||||
public-mute: false
|
public-mute: false
|
||||||
|
|
||||||
# Публичные уведомления о размутах
|
|
||||||
public-unmute: false
|
public-unmute: false
|
||||||
|
|
||||||
# Скрытые муты (с флагом -s)
|
|
||||||
silent-mute:
|
silent-mute:
|
||||||
enabled: true
|
enabled: true
|
||||||
permission: "lochat.mute.silent"
|
permission: "lochat.mute.silent"
|
||||||
notify-permission: "lochat.mute.see-silent"
|
notify-permission: "lochat.mute.see-silent"
|
||||||
|
|
||||||
# Формат уведомлений
|
|
||||||
formats:
|
formats:
|
||||||
mute: "&#FF6B6B{moderator} замутил {player} на {duration}. Причина: {reason}"
|
mute: "&c{moderator} &7muted &f{player} &7for &f{duration}&7. Reason: &f{reason}"
|
||||||
unmute: "BCB77{moderator} размутил {player}"
|
unmute: "&a{moderator} &7unmuted &f{player}"
|
||||||
silent-mute: "&#FFA726[ТИХО] {moderator} замутил {player} на {duration}. Причина: {reason}"
|
silent-mute: "&6[SILENT] &f{moderator} &7muted &f{player} &7for &f{duration}"
|
||||||
auto-mute: "&#FF6B6B[АВТО] {player} замучен на {duration}. Причина: {reason}"
|
auto-mute: "&c[AUTO] &f{player} &7muted for &f{duration}&7. Reason: &f{reason}"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Integrations ───────────────────────────────────────────────────────────────
|
||||||
# │ ИНТЕГРАЦИИ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
integrations:
|
integrations:
|
||||||
# LibertyBans
|
|
||||||
libertybans:
|
libertybans:
|
||||||
enabled: false
|
enabled: false
|
||||||
sync-mutes: true
|
sync-mutes: true
|
||||||
|
|
||||||
# AdvancedBan
|
|
||||||
advancedban:
|
advancedban:
|
||||||
enabled: false
|
enabled: false
|
||||||
sync-mutes: true
|
sync-mutes: true
|
||||||
|
|
||||||
# LiteBans
|
|
||||||
litebans:
|
litebans:
|
||||||
enabled: false
|
enabled: false
|
||||||
sync-mutes: true
|
sync-mutes: true
|
||||||
|
|
||||||
# Discord уведомления
|
|
||||||
discord:
|
discord:
|
||||||
enabled: false
|
enabled: false
|
||||||
webhook-url: ""
|
webhook-url: ""
|
||||||
format: "**{moderator}** замутил **{player}** на **{duration}**\nПричина: {reason}"
|
format: "**{moderator}** muted **{player}** for **{duration}**\nReason: {reason}"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Storage ────────────────────────────────────────────────────────────────────
|
||||||
# │ ХРАНЕНИЕ ДАННЫХ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
storage:
|
storage:
|
||||||
# Тип хранения: file, mysql, sqlite
|
type: file
|
||||||
type: "file"
|
|
||||||
|
|
||||||
# Настройки MySQL
|
|
||||||
mysql:
|
mysql:
|
||||||
host: "localhost"
|
host: "localhost"
|
||||||
port: 3306
|
port: 3306
|
||||||
|
|
@ -293,29 +215,22 @@ storage:
|
||||||
password: "password"
|
password: "password"
|
||||||
table-prefix: "lochat_"
|
table-prefix: "lochat_"
|
||||||
|
|
||||||
# Настройки SQLite
|
|
||||||
sqlite:
|
sqlite:
|
||||||
file: "plugins/LoChat/mutes.db"
|
file: "plugins/LoChat/mutes.db"
|
||||||
|
|
||||||
# Автоматическая очистка старых записей
|
|
||||||
cleanup:
|
cleanup:
|
||||||
enabled: true
|
enabled: true
|
||||||
days: 90 # Удалять записи старше N дней
|
days: 90
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Extra Features ─────────────────────────────────────────────────────────────
|
||||||
# │ ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
features:
|
features:
|
||||||
# Временные муты (автоматически снимаются)
|
|
||||||
temporary-mutes: true
|
temporary-mutes: true
|
||||||
|
|
||||||
# IP муты (мутить по IP адресу)
|
|
||||||
ip-mutes:
|
ip-mutes:
|
||||||
enabled: false
|
enabled: false
|
||||||
permission: "lochat.mute.ip"
|
permission: "lochat.mute.ip"
|
||||||
|
|
||||||
# Мут команд (блокировать определенные команды)
|
|
||||||
command-mute:
|
command-mute:
|
||||||
enabled: false
|
enabled: false
|
||||||
blocked-commands:
|
blocked-commands:
|
||||||
|
|
@ -323,13 +238,11 @@ features:
|
||||||
- "say"
|
- "say"
|
||||||
- "tell"
|
- "tell"
|
||||||
|
|
||||||
# Предупреждения перед мутом
|
|
||||||
warnings:
|
warnings:
|
||||||
enabled: true
|
enabled: true
|
||||||
max-warnings: 3
|
max-warnings: 3
|
||||||
reset-time: 3600 # Сброс предупреждений (секунды)
|
reset-time: 3600
|
||||||
|
|
||||||
# Апелляции на муты
|
|
||||||
appeals:
|
appeals:
|
||||||
enabled: false
|
enabled: false
|
||||||
command: "/appeal"
|
command: "/appeal"
|
||||||
|
|
|
||||||
|
|
@ -1,313 +1,158 @@
|
||||||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
# LoChat sound configuration
|
||||||
# ║ LoChat Sounds Configuration ║
|
# Controls sound effects for chat events, moderation, and system actions.
|
||||||
# ║ Конфигурация звуков ║
|
|
||||||
# ║ Версия: 1.5.5-1.20.1 ║
|
|
||||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── General ────────────────────────────────────────────────────────────────────
|
||||||
# │ ОСНОВНЫЕ НАСТРОЙКИ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
settings:
|
settings:
|
||||||
# Включить звуки
|
|
||||||
enabled: true
|
enabled: true
|
||||||
|
|
||||||
# Глобальная громкость (0.0 - 1.0)
|
|
||||||
global-volume: 0.5
|
global-volume: 0.5
|
||||||
|
|
||||||
# Глобальная высота тона (0.5 - 2.0)
|
|
||||||
global-pitch: 1.0
|
global-pitch: 1.0
|
||||||
|
|
||||||
# Разрешить игрокам отключать звуки
|
|
||||||
allow-disable: true
|
allow-disable: true
|
||||||
|
|
||||||
# Команда для управления звуками
|
|
||||||
toggle-command: "/sounds"
|
toggle-command: "/sounds"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Message Sounds ─────────────────────────────────────────────────────────────
|
||||||
# │ ЗВУКИ СООБЩЕНИЙ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
messages:
|
messages:
|
||||||
# Личные сообщения
|
|
||||||
private-message:
|
private-message:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "BLOCK_NOTE_BLOCK_PLING"
|
sound: BLOCK_NOTE_BLOCK_PLING
|
||||||
volume: 0.8
|
volume: 0.8
|
||||||
pitch: 1.2
|
pitch: 1.2
|
||||||
# Играть только получателю
|
|
||||||
receiver-only: true
|
receiver-only: true
|
||||||
|
|
||||||
# Упоминания в чате
|
|
||||||
mention:
|
mention:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "BLOCK_NOTE_BLOCK_BELL"
|
sound: BLOCK_NOTE_BLOCK_BELL
|
||||||
volume: 0.7
|
volume: 0.7
|
||||||
pitch: 1.5
|
pitch: 1.5
|
||||||
# Дополнительный звук для @everyone
|
everyone-sound: BLOCK_NOTE_BLOCK_CHIME
|
||||||
everyone-sound: "BLOCK_NOTE_BLOCK_CHIME"
|
|
||||||
|
|
||||||
# Глобальный чат
|
|
||||||
global-chat:
|
global-chat:
|
||||||
enabled: false
|
enabled: false
|
||||||
sound: "UI_BUTTON_CLICK"
|
sound: UI_BUTTON_CLICK
|
||||||
volume: 0.3
|
volume: 0.3
|
||||||
pitch: 1.0
|
pitch: 1.0
|
||||||
|
|
||||||
# Локальный чат
|
|
||||||
local-chat:
|
local-chat:
|
||||||
enabled: false
|
enabled: false
|
||||||
sound: "UI_BUTTON_CLICK"
|
sound: UI_BUTTON_CLICK
|
||||||
volume: 0.2
|
volume: 0.2
|
||||||
pitch: 0.8
|
pitch: 0.8
|
||||||
|
|
||||||
# Объявления
|
|
||||||
announcement:
|
announcement:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "BLOCK_NOTE_BLOCK_CHIME"
|
sound: BLOCK_NOTE_BLOCK_CHIME
|
||||||
volume: 1.0
|
volume: 1.0
|
||||||
pitch: 1.0
|
pitch: 1.0
|
||||||
# Дополнительные звуки для важных объявлений
|
important-sound: ENTITY_ENDER_DRAGON_GROWL
|
||||||
important-sound: "ENTITY_ENDER_DRAGON_GROWL"
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── System Sounds ──────────────────────────────────────────────────────────────
|
||||||
# │ ЗВУКИ СИСТЕМЫ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
system:
|
system:
|
||||||
# Подключение к серверу
|
|
||||||
join:
|
join:
|
||||||
enabled: false
|
enabled: false
|
||||||
sound: "ENTITY_PLAYER_LEVELUP"
|
sound: ENTITY_PLAYER_LEVELUP
|
||||||
volume: 0.5
|
volume: 0.5
|
||||||
pitch: 1.0
|
pitch: 1.0
|
||||||
# Играть только подключившемуся игроку
|
|
||||||
self-only: true
|
self-only: true
|
||||||
|
|
||||||
# Отключение от сервера
|
|
||||||
quit:
|
quit:
|
||||||
enabled: false
|
enabled: false
|
||||||
sound: "BLOCK_NOTE_BLOCK_BASS"
|
sound: BLOCK_NOTE_BLOCK_BASS
|
||||||
volume: 0.3
|
volume: 0.3
|
||||||
pitch: 0.8
|
pitch: 0.8
|
||||||
|
|
||||||
# Мут игрока
|
|
||||||
mute:
|
mute:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "BLOCK_ANVIL_LAND"
|
sound: BLOCK_ANVIL_LAND
|
||||||
volume: 0.6
|
volume: 0.6
|
||||||
pitch: 0.5
|
pitch: 0.5
|
||||||
# Играть замученному игроку
|
target-sound: ENTITY_VILLAGER_NO
|
||||||
target-sound: "ENTITY_VILLAGER_NO"
|
|
||||||
|
|
||||||
# Размут игрока
|
|
||||||
unmute:
|
unmute:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "ENTITY_PLAYER_LEVELUP"
|
sound: ENTITY_PLAYER_LEVELUP
|
||||||
volume: 0.7
|
volume: 0.7
|
||||||
pitch: 1.2
|
pitch: 1.2
|
||||||
# Играть размученному игроку
|
target-sound: ENTITY_VILLAGER_YES
|
||||||
target-sound: "ENTITY_VILLAGER_YES"
|
|
||||||
|
|
||||||
# Очистка чата
|
|
||||||
clear-chat:
|
clear-chat:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "ITEM_BUCKET_EMPTY"
|
sound: ITEM_BUCKET_EMPTY
|
||||||
volume: 0.5
|
volume: 0.5
|
||||||
pitch: 1.5
|
pitch: 1.5
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Gradient Sounds ────────────────────────────────────────────────────────────
|
||||||
# │ ЗВУКИ ГРАДИЕНТОВ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
gradient:
|
gradient:
|
||||||
# Установка градиента
|
|
||||||
color-set:
|
color-set:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "BLOCK_NOTE_BLOCK_HARP"
|
sound: BLOCK_NOTE_BLOCK_HARP
|
||||||
volume: 0.6
|
volume: 0.6
|
||||||
pitch: 1.3
|
pitch: 1.3
|
||||||
|
|
||||||
# Сброс градиента
|
|
||||||
color-reset:
|
color-reset:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "BLOCK_NOTE_BLOCK_BASS"
|
sound: BLOCK_NOTE_BLOCK_BASS
|
||||||
volume: 0.4
|
volume: 0.4
|
||||||
pitch: 0.7
|
pitch: 0.7
|
||||||
|
|
||||||
# Установка префикса
|
|
||||||
prefix-set:
|
prefix-set:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "BLOCK_NOTE_BLOCK_CHIME"
|
sound: BLOCK_NOTE_BLOCK_CHIME
|
||||||
volume: 0.7
|
volume: 0.7
|
||||||
pitch: 1.4
|
pitch: 1.4
|
||||||
|
|
||||||
# Ошибка (недостаточно средств, кулдаун и т.д.)
|
|
||||||
error:
|
error:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "ENTITY_VILLAGER_NO"
|
sound: ENTITY_VILLAGER_NO
|
||||||
volume: 0.5
|
volume: 0.5
|
||||||
pitch: 0.8
|
pitch: 0.8
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Command Sounds ─────────────────────────────────────────────────────────────
|
||||||
# │ ЗВУКИ КОМАНД │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
commands:
|
commands:
|
||||||
# Успешное выполнение команды
|
|
||||||
success:
|
success:
|
||||||
enabled: false
|
enabled: false
|
||||||
sound: "ENTITY_EXPERIENCE_ORB_PICKUP"
|
sound: ENTITY_EXPERIENCE_ORB_PICKUP
|
||||||
volume: 0.4
|
volume: 0.4
|
||||||
pitch: 1.2
|
pitch: 1.2
|
||||||
|
|
||||||
# Ошибка выполнения команды
|
|
||||||
error:
|
error:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "ENTITY_VILLAGER_NO"
|
sound: ENTITY_VILLAGER_NO
|
||||||
volume: 0.5
|
volume: 0.5
|
||||||
pitch: 0.8
|
pitch: 0.8
|
||||||
|
|
||||||
# Недостаточно прав
|
|
||||||
no-permission:
|
no-permission:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "BLOCK_NOTE_BLOCK_BASS"
|
sound: BLOCK_NOTE_BLOCK_BASS
|
||||||
volume: 0.6
|
volume: 0.6
|
||||||
pitch: 0.5
|
pitch: 0.5
|
||||||
|
|
||||||
# Игрок не найден
|
|
||||||
player-not-found:
|
player-not-found:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "ENTITY_ITEM_BREAK"
|
sound: ENTITY_ITEM_BREAK
|
||||||
volume: 0.4
|
volume: 0.4
|
||||||
pitch: 0.6
|
pitch: 0.6
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Filter Sounds ──────────────────────────────────────────────────────────────
|
||||||
# │ ЗВУКИ ФИЛЬТРОВ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
filters:
|
filters:
|
||||||
# Сообщение заблокировано фильтром
|
|
||||||
blocked:
|
blocked:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "ENTITY_VILLAGER_NO"
|
sound: ENTITY_VILLAGER_NO
|
||||||
volume: 0.6
|
volume: 0.6
|
||||||
pitch: 0.7
|
pitch: 0.7
|
||||||
|
|
||||||
# Предупреждение от фильтра
|
|
||||||
warning:
|
warning:
|
||||||
enabled: true
|
enabled: true
|
||||||
sound: "BLOCK_NOTE_BLOCK_PLING"
|
sound: BLOCK_NOTE_BLOCK_PLING
|
||||||
volume: 0.5
|
volume: 0.5
|
||||||
pitch: 0.9
|
pitch: 0.9
|
||||||
|
|
||||||
# Автоматическое исправление (например, caps)
|
|
||||||
auto-fix:
|
auto-fix:
|
||||||
enabled: false
|
enabled: false
|
||||||
sound: "UI_BUTTON_CLICK"
|
sound: UI_BUTTON_CLICK
|
||||||
volume: 0.3
|
volume: 0.3
|
||||||
pitch: 1.1
|
pitch: 1.1
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
# │ КАСТОМНЫЕ ЗВУКИ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
custom:
|
|
||||||
# Звуки для VIP игроков
|
|
||||||
vip:
|
|
||||||
enabled: false
|
|
||||||
join-sound: "ENTITY_PLAYER_LEVELUP"
|
|
||||||
message-sound: "BLOCK_NOTE_BLOCK_HARP"
|
|
||||||
volume: 0.8
|
|
||||||
pitch: 1.3
|
|
||||||
|
|
||||||
# Звуки для администраторов
|
|
||||||
admin:
|
|
||||||
enabled: false
|
|
||||||
join-sound: "ENTITY_ENDER_DRAGON_GROWL"
|
|
||||||
command-sound: "BLOCK_ANVIL_USE"
|
|
||||||
volume: 0.7
|
|
||||||
pitch: 1.0
|
|
||||||
|
|
||||||
# Праздничные звуки
|
|
||||||
holiday:
|
|
||||||
enabled: false
|
|
||||||
christmas:
|
|
||||||
sound: "BLOCK_NOTE_BLOCK_CHIME"
|
|
||||||
volume: 0.6
|
|
||||||
pitch: 1.5
|
|
||||||
new-year:
|
|
||||||
sound: "ENTITY_FIREWORK_ROCKET_BLAST"
|
|
||||||
volume: 0.8
|
|
||||||
pitch: 1.2
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
# │ ЗВУКОВЫЕ СХЕМЫ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
schemes:
|
|
||||||
# Классическая схема
|
|
||||||
classic:
|
|
||||||
name: "Классическая"
|
|
||||||
description: "Стандартные звуки Minecraft"
|
|
||||||
sounds:
|
|
||||||
private-message: "BLOCK_NOTE_BLOCK_PLING"
|
|
||||||
mention: "BLOCK_NOTE_BLOCK_BELL"
|
|
||||||
announcement: "BLOCK_NOTE_BLOCK_CHIME"
|
|
||||||
|
|
||||||
# Минималистичная схема
|
|
||||||
minimal:
|
|
||||||
name: "Минимальная"
|
|
||||||
description: "Только важные звуки"
|
|
||||||
sounds:
|
|
||||||
private-message: "UI_BUTTON_CLICK"
|
|
||||||
mention: "BLOCK_NOTE_BLOCK_PLING"
|
|
||||||
announcement: "ENTITY_EXPERIENCE_ORB_PICKUP"
|
|
||||||
|
|
||||||
# Отключенная схема
|
|
||||||
silent:
|
|
||||||
name: "Тишина"
|
|
||||||
description: "Все звуки отключены"
|
|
||||||
sounds: {}
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
# │ НАСТРОЙКИ ПО МИРАМ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
worlds:
|
|
||||||
# Настройки для конкретных миров
|
|
||||||
world_nether:
|
|
||||||
volume-modifier: 0.7 # Уменьшить громкость на 30%
|
|
||||||
pitch-modifier: 0.8 # Понизить тон
|
|
||||||
|
|
||||||
world_the_end:
|
|
||||||
volume-modifier: 0.5
|
|
||||||
pitch-modifier: 1.2
|
|
||||||
# Отключить определенные звуки
|
|
||||||
disabled-sounds:
|
|
||||||
- "global-chat"
|
|
||||||
- "local-chat"
|
|
||||||
|
|
||||||
creative_world:
|
|
||||||
volume-modifier: 1.2
|
|
||||||
# Включить дополнительные звуки
|
|
||||||
extra-sounds:
|
|
||||||
build: "BLOCK_STONE_PLACE"
|
|
||||||
fly: "ENTITY_BAT_TAKEOFF"
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
|
||||||
# │ ПЕРСОНАЛЬНЫЕ НАСТРОЙКИ │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
personal:
|
|
||||||
# Разрешить игрокам настраивать громкость
|
|
||||||
allow-volume-control: true
|
|
||||||
|
|
||||||
# Разрешить игрокам выбирать звуковые схемы
|
|
||||||
allow-scheme-selection: true
|
|
||||||
|
|
||||||
# Сохранять настройки игроков
|
|
||||||
save-preferences: true
|
|
||||||
|
|
||||||
# Файл для сохранения настроек
|
|
||||||
preferences-file: "plugins/LoChat/sound-preferences.yml"
|
|
||||||
|
|
@ -1,140 +1,83 @@
|
||||||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
# LoChat custom commands
|
||||||
# ║ Custom Commands Configuration ║
|
# Define your own commands with custom messages and actions.
|
||||||
# ║ Конфигурация кастомных команд ║
|
#
|
||||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
# Fields:
|
||||||
|
# enabled - whether the command is active
|
||||||
|
# permission - required permission (optional)
|
||||||
|
# message - message content (supports MiniMessage format)
|
||||||
|
# aliases - alternative command names
|
||||||
|
# type - chat | broadcast | title | actionbar | bungee
|
||||||
|
# target - sender | all | permission:<perm>
|
||||||
|
# server - (bungee only) target server name
|
||||||
|
|
||||||
# Информационные команды
|
|
||||||
help:
|
help:
|
||||||
enabled: true
|
enabled: true
|
||||||
message: |
|
message: |
|
||||||
<gradient:#FFD700:#FFA500><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
|
<gray>Available commands:</gray>
|
||||||
<gradient:#87CEEB:#4169E1><bold>📚 Помощь по серверу</bold></gradient>
|
<gray>\u2022 <white>/spawn</white> - teleport to spawn
|
||||||
|
<gray>\u2022 <white>/msg <player></white> - private message
|
||||||
<#FFEB3B>🏠 Основные команды:</color>
|
<gray>\u2022 <white>/color</white> - gradient nickname
|
||||||
<#9E9E9E>• <#FFFFFF>/spawn</color> - телепорт на спавн
|
<gray>\u2022 <white>/prefix</white> - custom prefix
|
||||||
<#9E9E9E>• <#FFFFFF>/home</color> - телепорт домой
|
aliases: []
|
||||||
<#9E9E9E>• <#FFFFFF>/sethome</color> - установить дом
|
type: chat
|
||||||
|
target: sender
|
||||||
<#FFEB3B>💬 Чат команды:</color>
|
|
||||||
<#9E9E9E>• <#FFFFFF>!сообщение</color> - глобальный чат
|
|
||||||
<#9E9E9E>• <#FFFFFF>/msg игрок</color> - личное сообщение
|
|
||||||
<#9E9E9E>• <#FFFFFF>/reply</color> - ответить на ЛС
|
|
||||||
|
|
||||||
<#FFEB3B>🎨 Кастомизация:</color>
|
|
||||||
<#9E9E9E>• <#FFFFFF>/color</color> - градиентный ник
|
|
||||||
<#9E9E9E>• <#FFFFFF>/prefix</color> - кастомный префикс
|
|
||||||
|
|
||||||
<gradient:#FFD700:#FFA500><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
|
|
||||||
aliases: ["помощь", "хелп"]
|
|
||||||
type: "chat"
|
|
||||||
target: "sender"
|
|
||||||
|
|
||||||
rules:
|
rules:
|
||||||
enabled: true
|
enabled: true
|
||||||
message: |
|
message: |
|
||||||
<gradient:#FF6B6B:#FF4500><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
|
<red><bold>Server Rules</bold></red>
|
||||||
<gradient:#87CEEB:#4169E1><bold>📋 Правила сервера</bold></gradient>
|
<gray>1. No cheating or hacking</gray>
|
||||||
|
<gray>2. No griefing or stealing</gray>
|
||||||
<#F44336><bold>🚫 Запрещено:</bold></color>
|
<gray>3. No swearing or insults</gray>
|
||||||
<#9E9E9E>• Читерство и использование модов
|
<gray>4. No spam</gray>
|
||||||
<#9E9E9E>• Гриферство и воровство
|
<gray>5. No advertising</gray>
|
||||||
<#9E9E9E>• Мат и оскорбления
|
aliases: []
|
||||||
<#9E9E9E>• Спам в чате
|
type: chat
|
||||||
<#9E9E9E>• Реклама других серверов
|
target: sender
|
||||||
|
|
||||||
<#4CAF50><bold>✅ Разрешено:</bold></color>
|
|
||||||
<#9E9E9E>• Строительство в любом стиле
|
|
||||||
<#9E9E9E>• Торговля между игроками
|
|
||||||
<#9E9E9E>• Создание команд и кланов
|
|
||||||
<#9E9E9E>• Использование /home и /spawn
|
|
||||||
|
|
||||||
<#FFA726><bold>⚠️ За нарушения:</bold></color>
|
|
||||||
<#9E9E9E>• Предупреждение → Мут → Бан
|
|
||||||
|
|
||||||
<gradient:#FF6B6B:#FF4500><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
|
|
||||||
aliases: ["правила", "rule"]
|
|
||||||
type: "chat"
|
|
||||||
target: "sender"
|
|
||||||
|
|
||||||
discord:
|
discord:
|
||||||
enabled: true
|
enabled: true
|
||||||
message: |
|
message: |
|
||||||
<gradient:#5865F2:#7289DA><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
|
<color:#5865F2><bold>Join our Discord!</bold></color>
|
||||||
<gradient:#87CEEB:#4169E1><bold>💬 Discord сервер</bold></gradient>
|
<click:open_url:'https://discord.gg/yourserver'><u><color:#00BFFF>discord.gg/yourserver</color></u></click>
|
||||||
|
aliases: ["ds"]
|
||||||
<#5865F2><bold>Присоединяйся к нашему Discord!</bold></color>
|
type: chat
|
||||||
|
target: sender
|
||||||
<#FFEB3B>🔗 Ссылка:</color> <click:open_url:'https://discord.gg/yourserver'><u><#00BFFF>discord.gg/yourserver</u></click>
|
|
||||||
|
|
||||||
<#FFEB3B>📢 В Discord ты найдешь:</color>
|
|
||||||
<#9E9E9E>• Общение с игроками
|
|
||||||
<#9E9E9E>• Новости и обновления
|
|
||||||
<#9E9E9E>• Поддержку администрации
|
|
||||||
<#9E9E9E>• Конкурсы и ивенты
|
|
||||||
|
|
||||||
<gradient:#5865F2:#7289DA><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
|
|
||||||
aliases: ["дискорд", "ds"]
|
|
||||||
type: "chat"
|
|
||||||
target: "sender"
|
|
||||||
|
|
||||||
coords:
|
coords:
|
||||||
enabled: true
|
enabled: true
|
||||||
message: "<#FFEB3B>📍 <bold>Ваши координаты:</bold></color> <#9E9E9E>X: <#FFFFFF>{x}</color> Y: <#FFFFFF>{y}</color> Z: <#FFFFFF>{z}</color> <#9E9E9E>Мир: <#4CAF50>{world}</color>"
|
message: "<gold>\u25B6 <white>X: {x} Y: {y} Z: {z} <dark_gray>World: <green>{world}</green>"
|
||||||
aliases: ["координаты", "pos", "position"]
|
aliases: ["pos", "position"]
|
||||||
type: "chat"
|
type: chat
|
||||||
target: "sender"
|
target: sender
|
||||||
|
|
||||||
ping:
|
ping:
|
||||||
enabled: true
|
enabled: true
|
||||||
message: "<#FFEB3B>📶 <bold>Ваш пинг:</bold></color> <#4CAF50>{ping}ms</color>"
|
message: "<gold>\u25B6 <white>Your ping: <green>{ping}ms</green>"
|
||||||
aliases: ["пинг"]
|
aliases: []
|
||||||
type: "chat"
|
type: chat
|
||||||
target: "sender"
|
target: sender
|
||||||
type: "chat"
|
|
||||||
target: "sender"
|
|
||||||
|
|
||||||
hub:
|
hub:
|
||||||
enabled: true
|
enabled: true
|
||||||
message: "<#4CAF50>🏠 Подключение к хабу...</color>"
|
message: "<green>Connecting to hub...</green>"
|
||||||
aliases: ["lobby", "хаб"]
|
aliases: ["lobby"]
|
||||||
type: "bungee"
|
type: bungee
|
||||||
target: "sender"
|
target: sender
|
||||||
server: "hub"
|
server: hub
|
||||||
|
|
||||||
discord:
|
|
||||||
enabled: true
|
|
||||||
message: |
|
|
||||||
<gradient:#5865F2:#7289DA><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
|
|
||||||
<gradient:#87CEEB:#4169E1><bold>💬 Discord сервер</bold></gradient>
|
|
||||||
|
|
||||||
<#5865F2><bold>Присоединяйся к нашему Discord!</bold></color>
|
|
||||||
|
|
||||||
<#FFEB3B>🔗 Ссылка:</color> <click:open_url:'https://discord.gg/yourserver'><u><#00BFFF>discord.gg/yourserver</u></click>
|
|
||||||
|
|
||||||
<#FFEB3B>📢 В Discord ты найдешь:</color>
|
|
||||||
<#9E9E9E>• Общение с игроками
|
|
||||||
<#9E9E9E>• Новости и обновления
|
|
||||||
<#9E9E9E>• Поддержку администрации
|
|
||||||
<#9E9E9E>• Конкурсы и ивенты
|
|
||||||
|
|
||||||
<gradient:#5865F2:#7289DA><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
|
|
||||||
aliases: ["дискорд", "ds"]
|
|
||||||
type: "chat"
|
|
||||||
target: "sender"
|
|
||||||
|
|
||||||
# Команды для администрации
|
|
||||||
broadcast:
|
broadcast:
|
||||||
enabled: true
|
enabled: true
|
||||||
permission: "lochat.broadcast"
|
permission: "lochat.broadcast"
|
||||||
message: "{message}"
|
message: "{message}"
|
||||||
aliases: ["bc", "объявить"]
|
aliases: ["bc"]
|
||||||
type: "broadcast"
|
type: broadcast
|
||||||
target: "all"
|
target: all
|
||||||
|
|
||||||
maintenance:
|
maintenance:
|
||||||
enabled: false
|
enabled: false
|
||||||
permission: "lochat.maintenance"
|
permission: "lochat.maintenance"
|
||||||
message: "<#FFA726><bold>🔧 Сервер переведен в режим технических работ</bold></color>"
|
message: "<gold><bold>Server is now in maintenance mode</bold></gold>"
|
||||||
aliases: ["тех-работы", "техработы"]
|
aliases: []
|
||||||
type: "title"
|
type: title
|
||||||
target: "all"
|
target: all
|
||||||
|
|
|
||||||
|
|
@ -1,225 +1,166 @@
|
||||||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
# LoChat player messages
|
||||||
# ║ LoChat — messages.yml ║
|
# All messages sent to players. Supports & color codes and placeholders.
|
||||||
# ║ Default palette (Spacelegacy): #7858E9 (dusty rose) → #7858E9 (violet) ║
|
|
||||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
|
||||||
#
|
|
||||||
# Color roles (reference when editing strings below):
|
|
||||||
# ẲE9 — primary labels / body (dusty rose)
|
|
||||||
# ⚖C9 — accents / separators (mid violet)
|
|
||||||
# ẲE9 — emphasis / values (deep violet)
|
|
||||||
# &f / #E8E0F0 — message body white
|
|
||||||
# &#CF6679 — errors (muted red, fits the palette)
|
|
||||||
|
|
||||||
prefix: "ẲE9[⚖C9LB6BD6oẲE9CⅵDChB6BD6a⚖C9tẲE9]"
|
prefix: "&8[&3LoChat&8]"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Global Chat ────────────────────────────────────────────────────────────────
|
||||||
# │ Global chat (toggle messages, server-disabled notice) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
global:
|
global:
|
||||||
toggled-on: "⚖C9Глобальный чат ẲE9включён"
|
toggled-on: "&aGlobal chat enabled"
|
||||||
toggled-off: "⚖C9Глобальный чат ẲE9отключён"
|
toggled-off: "&cGlobal chat disabled"
|
||||||
disabled: "&#CF6679Глобальный чат отключён на этом сервере"
|
disabled: "&cGlobal chat is disabled on this server"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Local Chat ─────────────────────────────────────────────────────────────────
|
||||||
# │ Local chat (no recipients nearby) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
local:
|
local:
|
||||||
no-players: "ẲE9Рядом нет игроков"
|
no-players: "&cNo players nearby"
|
||||||
nobody-heard: "⚖C9Вас никто не услышал ẲE9— рядом нет игроков"
|
nobody-heard: "&7Nobody heard you — no players nearby"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Private Messages ───────────────────────────────────────────────────────────
|
||||||
# │ Private messages (/msg, /reply) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
pm:
|
pm:
|
||||||
format-sent: "ẲE9[⚖C9→ẲE9] ⚖C9Вы ẲE9→ {receiver_display}ẲE9: &f{message}"
|
format-sent: "&8[&a\u2192&8] &7You &a\u2192 &f{receiver_display}&8: &f{message}"
|
||||||
format-received: "ẲE9[⚖C9←ẲE9] {sender_display} ẲE9→ ⚖C9ВыẲE9: &f{message}"
|
format-received: "&8[&e\u2190&8] &f{sender_display} &e\u2192 &7You&8: &f{message}"
|
||||||
use-gradient-names: true
|
no-reply: "&cNobody to reply to"
|
||||||
sent: "ẲE9[⚖C9→ẲE9] ⚖C9Вы ẲE9→ &f{player}ẲE9: &f{message}"
|
ignored: "&cThis player is ignoring you"
|
||||||
received: "ẲE9[⚖C9←ẲE9] &f{player} ẲE9→ ⚖C9ВыẲE9: &f{message}"
|
player-offline: "&cPlayer is not online"
|
||||||
no-reply: "&#CF6679Некому ответить"
|
self: "&cYou cannot message yourself"
|
||||||
ignored: "&#CF6679Этот игрок вас игнорирует"
|
|
||||||
player-offline: "&#CF6679Игрок не в сети"
|
|
||||||
self: "&#CF6679Нельзя писать самому себе"
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Ignore List ────────────────────────────────────────────────────────────────
|
||||||
# │ Ignore list │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
ignore:
|
ignore:
|
||||||
added: "⚖C9Игрок ẲE9{player} ⚖C9добавлен в игнор"
|
added: "&aPlayer &f{player} &ais now ignored"
|
||||||
removed: "⚖C9Игрок ẲE9{player} ⚖C9убран из игнора"
|
removed: "&aPlayer &f{player} &ais no longer ignored"
|
||||||
already-ignored: "ẲE9Игрок ẲE9{player} ẲE9уже в игноре"
|
already-ignored: "&7Player &f{player} &7is already ignored"
|
||||||
not-ignored: "ẲE9Игрок ẲE9{player} ẲE9не в игноре"
|
not-ignored: "&7Player &f{player} &7is not ignored"
|
||||||
self: "&#CF6679Нельзя игнорировать самого себя"
|
self: "&cYou cannot ignore yourself"
|
||||||
list-empty: "ẲE9Ваш список игнора пуст"
|
list-empty: "&7Your ignore list is empty"
|
||||||
list-header: "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
list-header: "&8\u2500\u2500\u2500\u2500\u2500 Ignored Players \u2500\u2500\u2500\u2500\u2500"
|
||||||
list-footer: "ẲE9Всего: ẲE9{count} ẲE9игроков"
|
list-footer: "&7Total: &f{count} &7players"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Announcements ──────────────────────────────────────────────────────────────
|
||||||
# │ Announcements │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
announce:
|
announce:
|
||||||
reloaded: "⚖C9Конфигурация ẲE9перезагружена"
|
reloaded: "&aConfiguration reloaded"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Chat Spy ───────────────────────────────────────────────────────────────────
|
||||||
# │ Chat spy (moderation) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
spy:
|
spy:
|
||||||
enabled: "⚖C9Режим шпиона ẲE9включён"
|
enabled: "&aSpy mode enabled"
|
||||||
disabled: "⚖C9Режим шпиона ẲE9отключён"
|
disabled: "&cSpy mode disabled"
|
||||||
format: "ẲE9[⚖C9SPYẲE9] ẲE9{sender} ẲE9→ ⚖C9{receiver}ẲE9: &f{message}"
|
format: "&8[&4SPY&8] &f{sender} &8\u2192 &7{receiver}&8: &f{message}"
|
||||||
chat-format: "ẲE9[⚖C9SPYẲE9] ẲE9{type} ẲE9{sender}ẲE9: &f{message}"
|
chat-format: "&8[&4SPY&8] &f{sender}&8: &f{message}"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Filters ────────────────────────────────────────────────────────────────────
|
||||||
# │ Message filters │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
filter:
|
filter:
|
||||||
blocked: "&#CF6679Сообщение заблокировано"
|
blocked: "&cMessage blocked"
|
||||||
warning: "ẲE9Предупреждение"
|
warning: "&6Warning"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Cooldowns ──────────────────────────────────────────────────────────────────
|
||||||
# │ Cooldowns │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
cooldown:
|
cooldown:
|
||||||
wait: "ẲE9Подождите ẲE9{time} ẲE9сек"
|
wait: "&cPlease wait &f{time} &cseconds"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Anti-Spam ──────────────────────────────────────────────────────────────────
|
||||||
# │ Anti-spam (caps, repeat, similar messages) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
antispam:
|
antispam:
|
||||||
caps: "&#CF6679Не кричите в чате"
|
caps: "&cPlease don't shout"
|
||||||
repeat: "&#CF6679Не повторяйте символы"
|
repeat: "&cPlease don't repeat characters"
|
||||||
similar: "&#CF6679Не отправляйте одинаковые сообщения"
|
similar: "&cPlease don't send the same message"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Clear Chat ─────────────────────────────────────────────────────────────────
|
||||||
# │ Clear chat │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
clearchat:
|
clearchat:
|
||||||
cleared: "⚖C9Чат очищен ẲE9администратором ẲE9{player}"
|
cleared: "&aChat cleared by &f{player}"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Errors ─────────────────────────────────────────────────────────────────────
|
||||||
# │ Command / usage errors │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
errors:
|
errors:
|
||||||
no-permission: "&#CF6679Нет прав"
|
no-permission: "&cNo permission"
|
||||||
player-not-found: "&#CF6679Игрок не найден"
|
player-not-found: "&cPlayer not found"
|
||||||
invalid-usage: "ẲE9Использование: ẲE9{usage}"
|
invalid-usage: "&cUsage: &f{usage}"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── General ────────────────────────────────────────────────────────────────────
|
||||||
# │ General (permissions, reload, hub, etc.) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
general:
|
general:
|
||||||
no-permission: "&#CF6679У вас нет прав!"
|
no-permission: "&cYou don't have permission!"
|
||||||
players-only: "&#CF6679Только для игроков!"
|
players-only: "&cThis command is for players only!"
|
||||||
config-reloaded: "⚖C9Конфиг ẲE9перезагружен!"
|
config-reloaded: "&aConfiguration reloaded!"
|
||||||
invalid-player: "&#CF6679Игрок ẲE9{player} &#CF6679не найден!"
|
invalid-player: "&cPlayer &f{player} &cnot found!"
|
||||||
cooldown-active: "ẲE9Подождите ẲE9{time}с"
|
cooldown-active: "&cPlease wait &f{time}&cs"
|
||||||
command-disabled: "&#CF6679Команда отключена!"
|
command-disabled: "&cCommand disabled!"
|
||||||
|
|
||||||
|
# ── Hub ────────────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
hub:
|
hub:
|
||||||
connecting: "⚖C9Подключение к ẲE9{server}⚖C9..."
|
connecting: "&aConnecting to &f{server}&a..."
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Mute ───────────────────────────────────────────────────────────────────────
|
||||||
# │ Mutes │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
mute:
|
mute:
|
||||||
muted: "⚖C9Игрок ẲE9{player} ⚖C9замучен на ẲE9{time}"
|
muted: "&aPlayer &f{player} &amuted for &f{time}"
|
||||||
unmuted: "⚖C9Игрок ẲE9{player} ⚖C9размучен"
|
unmuted: "&aPlayer &f{player} &aunmuted"
|
||||||
already-muted: "ẲE9Игрок ẲE9{player} ẲE9уже замучен"
|
already-muted: "&7Player &f{player} &7is already muted"
|
||||||
not-muted: "ẲE9Игрок ẲE9{player} ẲE9не замучен"
|
not-muted: "&7Player &f{player} &7is not muted"
|
||||||
you-muted: "&#CF6679Вы замучены! ẲE9Осталось: ẲE9{time}"
|
you-muted: "&cYou are muted! &7Remaining: &f{time}"
|
||||||
permanent: "&#CF6679Вы замучены навсегда!"
|
permanent: "&cYou are permanently muted!"
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Gradients ──────────────────────────────────────────────────────────────────
|
||||||
# │ Gradient nick module (LoPreff) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
gradient:
|
gradient:
|
||||||
color-set: "⚖C9Градиент ẲE9установлен!"
|
color-set: "&aGradient set!"
|
||||||
color-enabled: "⚖C9Градиентный ник ẲE9включён"
|
color-enabled: "&aGradient nickname enabled"
|
||||||
color-disabled: "ẲE9Градиентный ник ⚖C9отключён"
|
color-disabled: "&7Gradient nickname disabled"
|
||||||
color-reset: "ẲE9Градиент сброшен"
|
color-reset: "&7Gradient reset"
|
||||||
prefix-set: "⚖C9Префикс ẲE9установлен!"
|
prefix-set: "&aPrefix set!"
|
||||||
prefix-reset: "ẲE9Префикс сброшен"
|
prefix-reset: "&7Prefix reset"
|
||||||
prefix-reset-success: "⚖C9Префикс успешно ẲE9сброшен!"
|
prefix-enabled: "&aPrefix enabled"
|
||||||
prefix-enabled: "⚖C9Префикс ẲE9включён"
|
prefix-disabled: "&7Prefix disabled"
|
||||||
prefix-disabled: "ẲE9Префикс ⚖C9отключён"
|
invalid-hex: "&cInvalid hex color: &f{color}"
|
||||||
invalid-hex: "&#CF6679Неверный HEX цвет: ẲE9{color}"
|
invalid-color: "&cInvalid color: &f{color}"
|
||||||
invalid-color: "&#CF6679Неверный цвет: ẲE9{color}"
|
too-many-colors: "&cToo many colors! Maximum: &f{max}"
|
||||||
too-many-colors: "&#CF6679Слишком много цветов! Максимум: ẲE9{max}"
|
too-few-colors: "&cToo few colors! Minimum: &f{min}"
|
||||||
too-few-colors: "&#CF6679Слишком мало цветов! Минимум: ẲE9{min}"
|
cooldown: "&cPlease wait &f{time} &cseconds"
|
||||||
not-enough-colors: "&#CF6679Слишком мало цветов! Минимум: ẲE9{min}"
|
not-enough-points: "&cNot enough points! Need: &f{price}"
|
||||||
cooldown: "ẲE9Подождите ẲE9{time} ẲE9сек"
|
player-not-found: "&cPlayer not found"
|
||||||
not-enough-points: "&#CF6679Недостаточно поинтов! Нужно: ẲE9{price}"
|
color-help: "&cUsage: &f/color <hex1> <hex2> ..."
|
||||||
not-enough-points-color: "&#CF6679Недостаточно поинтов! Нужно: ẲE9{price}"
|
color-success: "&aGradient applied!"
|
||||||
not-enough-points-prefix: "&#CF6679Недостаточно поинтов! Нужно: ẲE9{price}"
|
color-no-colors: "&7You have no colors set"
|
||||||
player-not-found: "&#CF6679Игрок не найден"
|
prefix-help: "&cUsage: &f/prefix <text>"
|
||||||
color-help: "ẲE9Использование: ẲE9/color <HEX1> <HEX2>"
|
prefix-success: "&aPrefix set!"
|
||||||
color-success: "⚖C9Градиент успешно ẲE9установлен!"
|
prefix-success-free: "&aPrefix set!"
|
||||||
color-no-colors: "ẲE9У вас нет установленных цветов"
|
prefix-no-prefix: "&7You have no prefix"
|
||||||
color-copy-usage: "ẲE9Использование: ẲE9/color copy <игрок>"
|
prefix-too-long: "&cPrefix too long! Max: &f{max}"
|
||||||
color-copy-no-colors: "ẲE9У игрока ẲE9{player} ẲE9нет цветов"
|
prefix-no-colors: "&cPrefix cannot contain color codes"
|
||||||
prefix-help: "ẲE9Использование: ẲE9/prefix <текст> ẲE9или ẲE9/prefix reset"
|
only-player: "&cPlayers only!"
|
||||||
prefix-success: "⚖C9Префикс установлен! ẲE9Стоимость: ẲE9{price} ẲE9поинтов"
|
no-permission: "&cNo permission!"
|
||||||
prefix-success-free: "⚖C9Префикс ẲE9установлен!"
|
reload-success: "&aConfiguration reloaded!"
|
||||||
prefix-no-prefix: "ẲE9У вас нет префикса"
|
info-header: "&8\u2500\u2500\u2500\u2500\u2500 &f{player} &8\u2500\u2500\u2500\u2500\u2500"
|
||||||
prefix-too-long: "&#CF6679Префикс слишком длинный! Максимум: ẲE9{max}"
|
info-prefix: "&7Prefix: &f{prefix}"
|
||||||
prefix-no-colors: "&#CF6679Префикс не может содержать цветовые коды!"
|
info-colors: "&7Colors: &f{colors}"
|
||||||
prefix-invalid-chars: "&#CF6679Недопустимые символы в префиксе!"
|
|
||||||
prefix-blacklisted: "&#CF6679Этот префикс запрещён!"
|
|
||||||
only-player: "&#CF6679Только для игроков!"
|
|
||||||
no-permission: "&#CF6679Нет прав!"
|
|
||||||
reload-success: "⚖C9Конфигурация ẲE9перезагружена!"
|
|
||||||
info-header: "ẲE9▬▬▬▬▬▬▬▬ ẲE9{player} ẲE9▬▬▬▬▬▬▬▬"
|
|
||||||
info-prefix: "ẲE9Префикс: &f{prefix}"
|
|
||||||
info-prefix-enabled: "ẲE9Префикс активен: &f{enabled}"
|
|
||||||
info-colors: "ẲE9Цвета: &f{colors}"
|
|
||||||
info-color-enabled: "ẲE9Цвет активен: &f{enabled}"
|
|
||||||
info-prefix-purchased: "ẲE9Куплен: &f{purchased}"
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── Custom Nicknames ───────────────────────────────────────────────────────────
|
||||||
# │ Custom nicknames (/nick) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
nick:
|
nick:
|
||||||
current: "ẲE9Ваш ник: ẲE9{nick}"
|
current: "&7Your nickname: &f{nick}"
|
||||||
usage: "ẲE9Использование: ẲE9/nick <ник> ẲE9или ẲE9/nick reset"
|
usage: "&cUsage: &f/nick <name> &7or &f/nick reset"
|
||||||
reset-usage: "ẲE9Используйте ẲE9/nick reset ẲE9для сброса"
|
no-nick: "&7You have no custom nickname"
|
||||||
set-usage: "ẲE9Используйте ẲE9/nick <ник> ẲE9для установки"
|
reset-success: "&aNickname reset!"
|
||||||
no-nick: "ẲE9У вас нет кастомного ника"
|
set-success: "&aNickname changed to: &f{nick}"
|
||||||
reset-success: "⚖C9Ник ẲE9сброшен!"
|
invalid: "&cInvalid nickname!"
|
||||||
set-success: "⚖C9Ник изменён на: &f{nick}"
|
taken: "&cThis nickname is already taken!"
|
||||||
invalid: "&#CF6679Невалидный ник!"
|
error: "&cFailed to set nickname!"
|
||||||
requirements-header: "ẲE9Требования:"
|
|
||||||
requirements-length: "⚖C9◆ &fДлина: 3-16 символов"
|
|
||||||
requirements-chars: "⚖C9◆ &fБуквы, цифры, _, русские буквы"
|
|
||||||
requirements-colors: "⚖C9◆ &fЦвета: ẲE9&#RRGGBBẲE9текст"
|
|
||||||
taken: "&#CF6679Этот ник уже занят!"
|
|
||||||
error: "&#CF6679Не удалось установить ник!"
|
|
||||||
|
|
||||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
# ── RP Commands ────────────────────────────────────────────────────────────────
|
||||||
# │ Roleplay commands (/me, /try, /do, /roll) │
|
|
||||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
|
||||||
|
|
||||||
rp:
|
rp:
|
||||||
me: "<color:#7858E9>* {player} {action}</color>"
|
me: "&7* {player} {action}"
|
||||||
try-format: "<color:#7858E9>* {player} пытается {action}...</color> {result}"
|
try-format: "&7* {player} tries {action}... &f{result}"
|
||||||
try-success: "<color:#9878C9><bold>[Успех!]</bold></color>"
|
try-success: "&a[Success!]"
|
||||||
try-fail: "<color:#CF6679><bold>[Провал!]</bold></color>"
|
try-fail: "&c[Fail!]"
|
||||||
do-format: "<color:#7858E9>[<color:#7858E9>Сцена</color>]</color> <white>{description}</white> <color:#9878C9>({player})</color>"
|
do-format: "&8[Scene] &f{description} &7({player})"
|
||||||
roll-format: "<color:#7858E9>* {player} бросает кубик и получает </color><color:#7858E9><bold>{result}</bold></color><color:#7858E9> из </color><color:#9878C9>{max}</color>"
|
roll-format: "&7* {player} rolls &f{result} &7out of &f{max}"
|
||||||
roll-min-error: "<color:#CF6679>Минимальное значение кубика: 2</color>"
|
roll-min-error: "&cMinimum dice value: 2"
|
||||||
roll-max-error: "<color:#CF6679>Максимальное значение: 1000000</color>"
|
roll-max-error: "&cMaximum dice value: 1000000"
|
||||||
roll-invalid-number: "<color:#CF6679>Укажите число: /roll [максимум]</color>"
|
roll-invalid-number: "&cPlease specify a number: /roll [max]"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue