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: Сообщение об ошибке
|
||||
about: Создайте отчет об ошибке, чтобы помочь нам улучшить плагин
|
||||
name: Bug Report / Сообщение об ошибке
|
||||
about: Report a bug to help us improve / Сообщите об ошибке чтобы помочь нам
|
||||
title: '[BUG] '
|
||||
labels: bug
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
## Описание ошибки
|
||||
Четкое и краткое описание того, что произошло.
|
||||
## Description | Описание
|
||||
|
||||
## Шаги для воспроизведения
|
||||
1. Перейти к '...'
|
||||
2. Выполнить команду '...'
|
||||
3. Увидеть ошибку
|
||||
### English
|
||||
Clear and concise description of the bug.
|
||||
|
||||
## Ожидаемое поведение
|
||||
Четкое и краткое описание того, что вы ожидали увидеть.
|
||||
### Русский
|
||||
Четкое и краткое описание ошибки.
|
||||
|
||||
## Скриншоты
|
||||
Если применимо, добавьте скриншоты для объяснения проблемы.
|
||||
---
|
||||
|
||||
## Информация о сервере
|
||||
- Версия Minecraft: [например, 1.21.1]
|
||||
- Версия сервера: [например, Paper 1.21.1-116]
|
||||
- Версия плагина: [например, 1.5.5]
|
||||
- Версия Java: [например, Java 21]
|
||||
## Steps to Reproduce | Шаги для воспроизведения
|
||||
|
||||
## Установленные плагины
|
||||
Список других плагинов на сервере (особенно те, которые могут взаимодействовать с чатом):
|
||||
- PlaceholderAPI
|
||||
- LuckPerms
|
||||
- ...
|
||||
1. Go to / Перейти к '...'
|
||||
2. Run command / Выполнить команду '...'
|
||||
3. See error / Увидеть ошибку
|
||||
|
||||
## 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
|
||||
# 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: Запрос новой функции
|
||||
about: Предложите идею для этого проекта
|
||||
name: Feature Request / Запрос функции
|
||||
about: Suggest an idea for this project / Предложите идею для проекта
|
||||
title: '[FEATURE] '
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
## Описание функции
|
||||
Четкое и краткое описание того, что вы хотите добавить.
|
||||
## Description | Описание
|
||||
|
||||
## Проблема, которую это решает
|
||||
Опишите проблему, которую решает эта функция. Например: "Я всегда расстраиваюсь, когда [...]"
|
||||
### English
|
||||
Clear and concise description of the feature.
|
||||
|
||||
## Предлагаемое решение
|
||||
Четкое и краткое описание того, что вы хотите видеть.
|
||||
### Русский
|
||||
Четкое и краткое описание функции.
|
||||
|
||||
## Альтернативы
|
||||
Четкое и краткое описание любых альтернативных решений или функций, которые вы рассматривали.
|
||||
---
|
||||
|
||||
## Примеры использования
|
||||
Как бы вы использовали эту функцию? Приведите примеры команд, конфигурации и т.д.
|
||||
## Problem | Проблема
|
||||
|
||||
### English
|
||||
Describe the problem this solves.
|
||||
|
||||
### Русский
|
||||
Опишите проблему, которую решает эта функция.
|
||||
|
||||
## Proposed Solution | Предлагаемое решение
|
||||
|
||||
## Alternatives | Альтернативы
|
||||
|
||||
## Usage Examples | Примеры использования
|
||||
|
||||
```yaml
|
||||
# Пример конфигурации
|
||||
new-feature:
|
||||
enabled: true
|
||||
option: value
|
||||
# Example config
|
||||
```
|
||||
|
||||
```
|
||||
# Пример команды
|
||||
/newcommand <аргумент>
|
||||
# Example command
|
||||
```
|
||||
|
||||
## Приоритет
|
||||
- [ ] Критично - без этого плагин не работает должным образом
|
||||
- [ ] Высокий - значительно улучшит функциональность
|
||||
- [ ] Средний - было бы хорошо иметь
|
||||
- [ ] Низкий - небольшое улучшение
|
||||
## Priority | Приоритет
|
||||
|
||||
## Готовность помочь
|
||||
- [ ] Я могу помочь с реализацией (Pull Request)
|
||||
- [ ] Я могу помочь с тестированием
|
||||
- [ ] Я могу помочь с документацией
|
||||
- [ ] Я только предлагаю идею
|
||||
- [ ] Critical / Критично
|
||||
- [ ] 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: Вопрос
|
||||
about: Задайте вопрос о плагине
|
||||
name: Question / Вопрос
|
||||
about: Ask a question about the plugin / Задайте вопрос о плагине
|
||||
title: '[QUESTION] '
|
||||
labels: question
|
||||
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
|
||||
# Вставьте релевантную часть конфигурации
|
||||
```
|
||||
|
||||
## Дополнительная информация
|
||||
Любая другая информация, которая может помочь ответить на ваш вопрос.
|
||||
## Additional Info | Дополнительная информация
|
||||
|
|
|
|||
80
.github/PULL_REQUEST_TEMPLATE.md
vendored
80
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
|
@ -1,49 +1,57 @@
|
|||
# Pull Request
|
||||
|
||||
## Описание изменений
|
||||
## Description | Описание
|
||||
|
||||
### English
|
||||
Clear and concise description of what this PR does.
|
||||
|
||||
### Русский
|
||||
Четкое и краткое описание того, что делает этот PR.
|
||||
|
||||
Fixes #(issue номер)
|
||||
Fixes #(issue)
|
||||
|
||||
## Тип изменений
|
||||
Отметьте релевантные пункты:
|
||||
- [ ] Исправление ошибки (bug fix)
|
||||
- [ ] Новая функция (feature)
|
||||
- [ ] Критическое изменение (breaking change)
|
||||
- [ ] Обновление документации
|
||||
- [ ] Рефакторинг кода
|
||||
- [ ] Улучшение производительности
|
||||
- [ ] Обновление зависимостей
|
||||
---
|
||||
|
||||
## Как это было протестировано?
|
||||
Опишите тесты, которые вы провели для проверки ваших изменений:
|
||||
- [ ] Тестирование на локальном сервере
|
||||
- [ ] Тестирование с другими плагинами
|
||||
- [ ] Юнит-тесты
|
||||
- [ ] Интеграционные тесты
|
||||
## Type of Change | Тип изменений
|
||||
|
||||
**Конфигурация тестирования**:
|
||||
- Версия Minecraft:
|
||||
- Версия сервера:
|
||||
- Версия Java:
|
||||
- [ ] Bug fix / Исправление ошибки
|
||||
- [ ] New feature / Новая функция
|
||||
- [ ] Breaking change / Критическое изменение
|
||||
- [ ] Documentation / Документация
|
||||
- [ ] Refactoring / Рефакторинг
|
||||
- [ ] Performance / Производительность
|
||||
- [ ] Dependencies / Зависимости
|
||||
|
||||
## Чеклист
|
||||
- [ ] Мой код следует стилю этого проекта
|
||||
- [ ] Я провел самопроверку своего кода
|
||||
- [ ] Я прокомментировал свой код, особенно в сложных местах
|
||||
- [ ] Я внес соответствующие изменения в документацию
|
||||
- [ ] Мои изменения не генерируют новых предупреждений
|
||||
- [ ] Я добавил тесты, которые доказывают, что мое исправление эффективно или что моя функция работает
|
||||
- [ ] Новые и существующие юнит-тесты проходят локально с моими изменениями
|
||||
- [ ] Любые зависимые изменения были объединены и опубликованы в downstream модулях
|
||||
---
|
||||
|
||||
## Скриншоты (если применимо)
|
||||
Добавьте скриншоты для демонстрации изменений.
|
||||
## Testing | Тестирование
|
||||
|
||||
## Дополнительный контекст
|
||||
Добавьте любой другой контекст о PR здесь.
|
||||
- [ ] Local server test / Локальный сервер
|
||||
- [ ] 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 #
|
||||
- Related to #
|
||||
|
|
|
|||
6
.gitignore
vendored
6
.gitignore
vendored
|
|
@ -2,6 +2,9 @@
|
|||
.gradle/
|
||||
build/
|
||||
|
||||
# Compiled output (IDE auto-build)
|
||||
bin/
|
||||
|
||||
# Local Paper test server (gradlew runServer / run-paper)
|
||||
run/
|
||||
api_docs/
|
||||
|
|
@ -12,6 +15,9 @@ api_docs/
|
|||
*.iml
|
||||
*.ipr
|
||||
*.iws
|
||||
.classpath
|
||||
.project
|
||||
.settings/
|
||||
.vscode/
|
||||
*.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
|
||||
./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
|
||||
|
||||
### Чат система
|
||||
- Глобальный чат - общение между всеми игроками
|
||||
- Локальный чат - общение в радиусе
|
||||
- Личные сообщения - PM система с ответами
|
||||
- Игнорирование - блокировка нежелательных игроков
|
||||
- Упоминания - @player, @everyone, @here, @role
|
||||
- Hover/Click события - интерактивные сообщения
|
||||
- Кастомные сообщения входа/выхода/смерти с названием оружия
|
||||
**Required:** Java 21+, Paper 1.21.1+ or Folia
|
||||
|
||||
### Градиентные ники и префиксы
|
||||
**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 цветов)
|
||||
- Готовые пресеты (огонь, океан, радуга и т.д.)
|
||||
- Кастомные префиксы и суффиксы
|
||||
|
|
@ -29,315 +266,179 @@ Gradle задача `runServer` ([run-paper](https://github.com/jpenilla/run-pap
|
|||
- Система покупки через PlayerPoints
|
||||
- Кулдауны и ограничения
|
||||
|
||||
### Модерация
|
||||
#### Модерация
|
||||
- Мут система с историей
|
||||
- Бан система с временем и причиной
|
||||
- Варны (предупреждения)
|
||||
- Временные и постоянные наказания
|
||||
- Скрытые муты (silent)
|
||||
- Готовые причины наказаний
|
||||
- Эскалация наказаний
|
||||
|
||||
### Фильтры чата
|
||||
- Фильтр мата с защитой от обхода (х->x, о->o и т.д.)
|
||||
#### Фильтры чата
|
||||
- Фильтр мата с защитой от обхода (х→x, о→o и т.д.)
|
||||
- Антиспам и антифлуд
|
||||
- CAPS фильтр
|
||||
- URL и IP фильтр
|
||||
- Фильтр скрытых ссылок (discord.gg, bit.ly и т.д.)
|
||||
- Фильтр повторяющихся символов
|
||||
- Настраиваемый список запрещенных слов
|
||||
- Настраиваемый список запрещённых слов
|
||||
|
||||
### RP команды
|
||||
- /me - действия от третьего лица
|
||||
- /do - описание действий
|
||||
- /try - попытка действия с шансом
|
||||
- /roll - бросок кубика
|
||||
#### RP команды
|
||||
- `/me` — действия от третьего лица
|
||||
- `/do` — описание действий
|
||||
- `/try` — попытка действия с шансом
|
||||
- `/roll` — бросок кубика
|
||||
- Настраиваемый радиус и кулдауны
|
||||
|
||||
### Звуковые эффекты
|
||||
#### Звуковые эффекты
|
||||
- Звуки для PM и упоминаний
|
||||
- Звуки для мутов/размутов
|
||||
- Звуки для градиентов
|
||||
- Звуки для команд
|
||||
- Персональные настройки звуков
|
||||
|
||||
### Discord интеграция
|
||||
#### Discord интеграция
|
||||
- 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
|
||||
2. Поместите JAR в папку `plugins/`
|
||||
3. Перезапустите сервер
|
||||
4. Настройте конфиги в `plugins/LoChat/`
|
||||
|
||||
### Первая настройка
|
||||
|
||||
1. **Основной конфиг** (`config.yml`):
|
||||
- Настройте радиус локального чата
|
||||
- Включите/отключите нужные функции
|
||||
- Настройте цены на градиенты
|
||||
- Настройте фильтры
|
||||
|
||||
2. **Фильтр мата** (`badwords.txt`):
|
||||
- Добавьте свои запрещенные слова
|
||||
- По одному слову на строку
|
||||
- Строки с # игнорируются
|
||||
|
||||
3. **Внешний вид** (`config/appearance.yml`):
|
||||
- Настройте префиксы чата (GLOBAL/LOCAL)
|
||||
- Измените цвета и форматы
|
||||
- Настройте hover подсказки
|
||||
- Добавьте эмодзи
|
||||
|
||||
4. **Discord** (`config/discord.yml`):
|
||||
- Вставьте URL вебхука
|
||||
- Настройте форматы сообщений
|
||||
- Включите нужные события
|
||||
|
||||
## Сборка из исходников
|
||||
#### Сборка из исходников
|
||||
|
||||
```bash
|
||||
# Клонировать репозиторий
|
||||
git clone https://codeberg.org/loki5512344/Lochat.git
|
||||
cd Lochat
|
||||
|
||||
# Собрать проект
|
||||
git clone https://github.com/loki5512344/LoChat.git
|
||||
cd LoChat
|
||||
./gradlew build
|
||||
|
||||
# Jar файл будет в build/libs/
|
||||
```
|
||||
|
||||
## Зависимости
|
||||
#### Локальный тестовый сервер
|
||||
|
||||
### Обязательные
|
||||
- Java 21+
|
||||
- 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
|
||||
```bash
|
||||
./gradlew runServer
|
||||
```
|
||||
|
||||
#### Вариант 2: Через пермишены (бесплатно)
|
||||
```yaml
|
||||
# config.yml
|
||||
gradient:
|
||||
price-per-color: 0
|
||||
prefix-price: 0
|
||||
use-permission-instead-of-cost: true
|
||||
```
|
||||
Использует [run-paper](https://github.com/jpenilla/run-paper) — скачивает Paper 1.21.4, собирает плагин и помещает его в `run/plugins/`.
|
||||
|
||||
Выдайте игрокам права:
|
||||
```
|
||||
/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
|
||||
|
||||
#### Градиенты
|
||||
- `gradient.color` - доступ к /color
|
||||
- `gradient.prefix` - доступ к /prefix
|
||||
- `gradient.bypass.cost` - бесплатное использование
|
||||
- `gradient.bypass.cooldown` - обход кулдауна
|
||||
- `gradient.admin` - админские команды
|
||||
**Опциональные:** PlaceholderAPI, LuckPerms, PlayerPoints, LibertyBans, SkinsRestorer
|
||||
|
||||
### Команды
|
||||
|
||||
#### Чат
|
||||
- `lochat.chat.colors` - цветные сообщения
|
||||
- `lochat.chat.global` - глобальный чат
|
||||
- `lochat.chat.local` - локальный чат
|
||||
- `lochat.pm` - личные сообщения
|
||||
| Команда | Описание |
|
||||
|---------|----------|
|
||||
| `/g <сообщение>` | Глобальный чат |
|
||||
| `/l <сообщение>` | Локальный чат |
|
||||
| `/msg <игрок> <сообщение>` | Личное сообщение |
|
||||
| `/reply <сообщение>` | Ответить на ЛС |
|
||||
| `/ignore <игрок>` | Игнорировать игрока |
|
||||
| `/unignore <игрок>` | Разигнорировать |
|
||||
| `/ignorelist` | Список игнорируемых |
|
||||
|
||||
#### Градиенты
|
||||
| Команда | Описание |
|
||||
|---------|----------|
|
||||
| `/color <hex1> [hex2] ...` | Установить градиент |
|
||||
| `/prefix <текст>` | Установить префикс |
|
||||
| `/aprefix <команда>` | Админские команды градиентов |
|
||||
|
||||
#### Модерация
|
||||
- `lochat.mute` - мутить игроков
|
||||
- `lochat.mute.silent` - скрытые муты
|
||||
- `lochat.ban` - банить игроков
|
||||
- `lochat.warn` - выдавать варны
|
||||
| Команда | Описание |
|
||||
|---------|----------|
|
||||
| `/lmute <игрок> [время] [-s] [причина]` | Замутить |
|
||||
| `/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.spam` - обход антиспама
|
||||
- `lochat.bypass.flood` - обход антифлуда
|
||||
- `lochat.bypass.caps` - обход CAPS фильтра
|
||||
- `lochat.bypass.urlfilter` - обход URL фильтра
|
||||
- `lochat.bypass.cooldown` - обход кулдауна
|
||||
- `lochat.bypass.swear` — обход мат-фильтра
|
||||
- `lochat.bypass.spam` — обход антиспама
|
||||
- `lochat.bypass.flood` — обход антифлуда
|
||||
- `lochat.bypass.caps` — обход CAPS фильтра
|
||||
- `lochat.bypass.urlfilter` — обход URL фильтра
|
||||
- `lochat.bypass.cooldown` — обход кулдауна
|
||||
|
||||
### Мут игрока
|
||||
```
|
||||
/lmute Player123 1h Спам в чате
|
||||
```
|
||||
Замутит игрока на 1 час с причиной "Спам в чате".
|
||||
### API
|
||||
|
||||
### Скрытый мут
|
||||
```
|
||||
/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
|
||||
// Получить ServiceRegistry
|
||||
ServiceRegistry registry = plugin.getServiceRegistry();
|
||||
|
||||
// Получить сервис чата
|
||||
ChatService chatService = registry.get(ChatService.class);
|
||||
|
||||
// Отправить глобальное сообщение
|
||||
ChatService chatService = registry.get(ChatService.class);
|
||||
chatService.sendGlobalMessage(player, "Привет!");
|
||||
|
||||
// Получить сервис мутов
|
||||
MuteService muteService = registry.get(MuteService.class);
|
||||
|
||||
// Проверить мут
|
||||
if (muteService.isMuted(player.getUniqueId())) {
|
||||
// Игрок замучен
|
||||
}
|
||||
```
|
||||
|
||||
### Создание кастомного фильтра
|
||||
```java
|
||||
// Создание кастомного фильтра
|
||||
public class MyFilter implements MessageFilter {
|
||||
@Override
|
||||
public FilterResult filter(Player player, String message) {
|
||||
|
|
@ -349,53 +450,28 @@ public class MyFilter implements MessageFilter {
|
|||
}
|
||||
```
|
||||
|
||||
## Известные проблемы
|
||||
### Известные проблемы
|
||||
|
||||
- Градиенты могут некорректно отображаться в старых версиях клиента (< 1.16)
|
||||
- Некоторые фильтры могут блокировать легитимные сообщения (настраивается в `config/filters.yml`)
|
||||
|
||||
## Статистика проекта
|
||||
### Лицензия
|
||||
|
||||
- Версия: 1.5.5
|
||||
- Строк кода: 9000+
|
||||
- Конфигов: 10+
|
||||
- Команд: 30+
|
||||
[GNU General Public License v3.0](LICENSE)
|
||||
|
||||
## Вклад в проект
|
||||
---
|
||||
|
||||
Мы приветствуем вклад в развитие проекта! Перед началом работы ознакомьтесь с:
|
||||
- [Code of Conduct](CODE_OF_CONDUCT.md) - правила поведения в сообществе
|
||||
- [Security Policy](SECURITY.md) - политика безопасности
|
||||
## Project Statistics | Статистика проекта
|
||||
|
||||
### Как внести вклад
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| Version | 1.5.5 |
|
||||
| Java files | 150+ |
|
||||
| Commands | 30+ |
|
||||
| Config files | 10+ |
|
||||
|
||||
1. Fork репозитория
|
||||
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
|
||||
|
||||
## Ссылки
|
||||
## Links | Ссылки
|
||||
|
||||
- [Codeberg Repository](https://codeberg.org/loki5512344/Lochat)
|
||||
- [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
|
||||
**Статус:** ИСПРАВЛЕНО
|
||||
- AutoMessageManager теперь сохраняет ссылку на task и отменяет в `stop()`
|
||||
- Добавлена проверка и отмена старой задачи перед созданием новой
|
||||
### Memory Leaks
|
||||
- [x] AutoMessageManager: save task reference, cancel in `stop()`
|
||||
- [x] Event listeners: `HandlerList.unregisterAll(this)` in `onDisable()`
|
||||
- [x] MuteHistoryManager: MAX_HISTORY_PER_PLAYER = 50
|
||||
|
||||
### 2. ✅ УТЕЧКА ПАМЯТИ: Event Listeners
|
||||
**Статус:** ИСПРАВЛЕНО
|
||||
- Добавлен `HandlerList.unregisterAll(this)` в `LoChat.onDisable()`
|
||||
- Listeners корректно отменяются при выключении плагина
|
||||
### Race Conditions
|
||||
- [x] AsyncChatEvent: try-catch for Location in async
|
||||
- [x] ConfigManager: `volatile` + `synchronized reload()`
|
||||
|
||||
### 3. ✅ УТЕЧКА ПАМЯТИ: MuteHistoryManager
|
||||
**Статус:** ИСПРАВЛЕНО
|
||||
- Добавлен лимит MAX_HISTORY_PER_PLAYER = 50 записей
|
||||
- Старые записи автоматически удаляются
|
||||
### Compilation Fixes
|
||||
- [x] EnhancedChatRenderer: `appearanceCfg` → `cfg.getAppearanceConfig()`
|
||||
- [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
|
||||
**Статус:** ИСПРАВЛЕНО
|
||||
- Добавлен try-catch для безопасной работы с Location в async
|
||||
- Кэшируются данные перед async операциями
|
||||
### Config Refactor
|
||||
- [x] BaseConfig base class for all configs
|
||||
- [x] MessagesConfig (renamed from HardcodedMessages)
|
||||
- [x] Clean config.yml: 300+ → 44 lines
|
||||
- [x] Thread-safety: volatile + synchronized
|
||||
|
||||
### 5. ✅ КОМПИЛЯЦИЯ: EnhancedChatRenderer
|
||||
**Статус:** ИСПРАВЛЕНО
|
||||
- Исправлена переменная `appearanceCfg` → `cfg.getAppearanceConfig()`
|
||||
### Main Class Refactor
|
||||
- [x] PluginInitializer — init logic
|
||||
- [x] PluginShutdown — shutdown logic
|
||||
- [x] LoChat: 185 → 108 lines
|
||||
|
||||
### 6. ✅ РЕФАКТОРИНГ КОНФИГОВ
|
||||
**Статус:** ЗАВЕРШЁН
|
||||
- Создан базовый класс `BaseConfig` для избежания дублирования кода
|
||||
- Переименован `HardcodedMessages` → `MessagesConfig`
|
||||
- Все конфиги остались в папке `config/` для удобства
|
||||
- Структура: `plugins/LoChat/config/*.yml`
|
||||
- Правильное копирование файлов из `resources/config/`
|
||||
### Documentation
|
||||
- [x] README bilingual (EN + RU)
|
||||
- [x] CONTRIBUTING.md created
|
||||
- [x] CODE_OF_CONDUCT.md bilingual
|
||||
- [x] SECURITY.md bilingual
|
||||
- [x] GitHub issue/PR templates bilingual
|
||||
- [x] Config comments in English, no Spacelegacy palette
|
||||
|
||||
### 7. ✅ ОТКЛЮЧЕНИЕ ЧАТОВ
|
||||
**Статус:** РЕАЛИЗОВАНО
|
||||
- Добавлена проверка `isGlobalEnabled()` и `isLocalEnabled()`
|
||||
- Игроки получают сообщение если чат отключен
|
||||
- Настройки в `config.yml`: `chat.global.enabled` и `chat.local.enabled`
|
||||
### Checkstyle
|
||||
- [x] Google Java Style config (2-space indent, 100-char lines, Javadoc)
|
||||
- [x] Checkstyle plugin wired into build.gradle.kts
|
||||
|
||||
### 8. ✅ БАГ: Пробел в табе между префиксом и ником
|
||||
**Статус:** ИСПРАВЛЕНО
|
||||
- Убрал `.stripTrailing()` из `DisplayNameUtil.buildColoredPrefix()`
|
||||
- Теперь пробел из `prefix-format: "[{prefix}] "` сохраняется
|
||||
- В табе отображается: `[Префикс] Ник` вместо `[Префикс]Ник`
|
||||
|
||||
### 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`
|
||||
- Проект собирается без ошибок
|
||||
### Cleanup
|
||||
- [x] Removed `libs/lolib-3.0.0.jar` (unused)
|
||||
- [x] Removed CODE_OF_CONDUCT.md, SECURITY.md
|
||||
- [x] Added `bin/` to .gitignore
|
||||
- [x] Configs rewritten: clean, English, no Russian/Spacelegacy
|
||||
|
||||
---
|
||||
|
||||
## 📁 СТРУКТУРА КОНФИГОВ
|
||||
## 🟡 CODE QUALITY ISSUES (HIGH PRIORITY)
|
||||
|
||||
```
|
||||
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
|
||||
└── ...
|
||||
```
|
||||
### 1. Max 3 Files Per Folder
|
||||
|
||||
### ✅ Подключенные конфиги:
|
||||
- `AppearanceConfig` - внешний вид чата, префиксы, цвета, эмодзи
|
||||
- `MessagesConfig` - все системные сообщения для игроков
|
||||
- `MuteConfig` - настройки системы мутов
|
||||
- `FiltersConfig` - все фильтры (капс, мат, реклама, флуд, спам)
|
||||
- `SoundsConfig` - звуковые эффекты
|
||||
- `DiscordIntegration` - Discord вебхуки
|
||||
- `GradientModule` - градиентные ники
|
||||
| Folder | Files | Fix |
|
||||
|--------|-------|-----|
|
||||
| `config/` | **9** ⚠️ | Split into `config/chat/`, `config/mute/`, `config/filter/`, `config/general/` |
|
||||
| `api/service/` | **8** ⚠️ | Keep interfaces flat or split into `api/service/chat/`, `api/service/mute/` |
|
||||
| `core/service/` | **8** ⚠️ | Mirror the api split |
|
||||
|
||||
### 2. DRY: `AppearanceConfig.loadEmojiCache()` Called Twice
|
||||
|
||||
**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
|
||||
Базовый класс для всех конфигов:
|
||||
- Автоматическое копирование из resources
|
||||
- Поддержка подпапок (config/)
|
||||
- Единый интерфейс load/reload/save
|
||||
- Избегает дублирования кода
|
||||
### 11. Dual Message Configs
|
||||
|
||||
### Конфиги наследуют BaseConfig:
|
||||
- `MessagesConfig` (config/messages.yml)
|
||||
- `AppearanceConfig` (config/appearance.yml)
|
||||
- Легко добавлять новые конфиги
|
||||
`MessageConfig.java` (root, path-based) and `MessagesConfig.java` (config/, typed getters) overlap.
|
||||
|
||||
**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
|
||||
|
||||
### ✅ РЕЗУЛЬТАТ:
|
||||
- Сократил config.yml с 300+ строк до 44 строк (85% уменьшение!)
|
||||
- Убрал дублирующиеся секции (filters, mentions, automessages, mute)
|
||||
- Убрал раздутые секции (custom-commands, data-storage)
|
||||
- Убрал пресеты градиентов
|
||||
- Оставил только базовые настройки (chat, hub, gradient, rp)
|
||||
- Проект собирается без ошибок
|
||||
### 15. Performance: Aho-Corasick for Swear Filter
|
||||
|
||||
### 🔍 СТАТУС КОНФИГОВ:
|
||||
Все конфиги в config/ проверены и почищены:
|
||||
- ✅ appearance.yml (AppearanceConfig) - используется
|
||||
- ✅ messages.yml (MessagesConfig) - используется
|
||||
- ✅ mute.yml (MuteConfig) - используется
|
||||
- ✅ filters.yml (FiltersConfig) - используется
|
||||
- ✅ sounds.yml (SoundsConfig) - используется
|
||||
- ✅ discord.yml (DiscordIntegration) - используется
|
||||
- ❌ automessages.yml - удален (не использовался)
|
||||
- ❌ chat-formats.yml - удален (не использовался)
|
||||
- ❌ database.yml - удален (не использовался)
|
||||
- ❌ gradient.yml - удален (не использовался)
|
||||
- ❌ integrations.yml - удален (не использовался)
|
||||
### 16. Discord Rate Limiter
|
||||
|
||||
### 17. Tests: Only 4 test files (150 main files)
|
||||
|
||||
### 18. `.project`, `.classpath`, `.settings/` should be gitignored
|
||||
|
||||
---
|
||||
|
||||
## ✅ ЗАДАЧА ВЫПОЛНЕНА: Thread-Safety для ConfigManager
|
||||
## 📋 KNOWN ISSUES
|
||||
|
||||
### ✅ РЕЗУЛЬТАТ:
|
||||
- Добавлен `volatile` для всех конфигов (config, appearanceConfig, messagesConfig, muteConfig, filtersConfig, soundsConfig)
|
||||
- Метод `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`
|
||||
- Простая и понятная структура
|
||||
- Gradients may not display correctly on clients < 1.16
|
||||
- Some filters may block legitimate messages (configurable in `config/filters.yml`)
|
||||
|
|
|
|||
|
|
@ -2,10 +2,11 @@ plugins {
|
|||
java
|
||||
id("xyz.jpenilla.run-paper") version "2.3.1"
|
||||
jacoco
|
||||
checkstyle
|
||||
}
|
||||
|
||||
group = "com.loki"
|
||||
version = "1.5.5-1.21.8"
|
||||
version = "1.5.5-1.21.x"
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
|
|
@ -30,6 +31,14 @@ dependencies {
|
|||
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 {
|
||||
toolchain {
|
||||
languageVersion.set(JavaLanguageVersion.of(21))
|
||||
|
|
@ -63,13 +72,12 @@ jacoco {
|
|||
}
|
||||
|
||||
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) })
|
||||
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
|
||||
}
|
||||
|
||||
// Локальный Paper для тестов: .\gradlew.bat runServer
|
||||
tasks.runServer {
|
||||
minecraftVersion("1.21.4")
|
||||
// Совпадает с compileOnly("io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT")
|
||||
minecraftVersion("1.21.4") // lowest supported; runs on any 1.21.x Paper server
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,83 +1,115 @@
|
|||
# Checkstyle Configuration
|
||||
# Checkstyle Configuration | Конфигурация Checkstyle
|
||||
|
||||
Автоматическая проверка качества кода во время билда.
|
||||
This project uses **Google Java Style** for code quality enforcement.
|
||||
Проект использует **Google Java Style** для контроля качества кода.
|
||||
|
||||
## Правила
|
||||
---
|
||||
|
||||
### Размеры
|
||||
- **Файл**: максимум 150 строк
|
||||
- **Метод**: максимум 30 строк
|
||||
- **Строка**: максимум 120 символов
|
||||
- **Параметры**: максимум 5 параметров
|
||||
## 🇬🇧 English
|
||||
|
||||
### Сложность
|
||||
- **Cyclomatic Complexity**: максимум 10
|
||||
- **Вложенность if**: максимум 3 уровня
|
||||
- **Вложенность try**: максимум 2 уровня
|
||||
### Rules
|
||||
|
||||
### Качество кода
|
||||
- Нет дублирования строк (макс 2 повтора)
|
||||
- Нет магических чисел (кроме -1, 0, 1, 2, 3, 4, 5, 10, 20, 100)
|
||||
- Нет * импортов
|
||||
- Нет неиспользуемых импортов
|
||||
- Упрощение boolean выражений
|
||||
- equals() и hashCode() вместе
|
||||
Based on [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html):
|
||||
|
||||
### Форматирование
|
||||
- Отступы: 4 пробела
|
||||
- Скобки обязательны для if/for/while
|
||||
- Один оператор на строку
|
||||
- Пробелы вокруг операторов
|
||||
| Category | Rule | Value |
|
||||
|----------|------|-------|
|
||||
| **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
|
||||
# Проверить весь проект
|
||||
# Full check
|
||||
./gradlew check
|
||||
|
||||
# Проверить только LoChat
|
||||
# Only LoChat
|
||||
./gradlew checkstyleMain
|
||||
|
||||
# Проверить только LoHub
|
||||
./gradlew :lohub:checkstyleMain
|
||||
|
||||
# Проверить только LoVelocity
|
||||
./gradlew :lovelocity:checkstyleMain
|
||||
```
|
||||
|
||||
## Отчеты
|
||||
### Reports
|
||||
|
||||
После проверки отчеты доступны в:
|
||||
After check, reports are available at:
|
||||
- `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
|
||||
// CHECKSTYLE:OFF
|
||||
public class MyClass {
|
||||
// код без проверки
|
||||
// code without checks
|
||||
}
|
||||
// CHECKSTYLE:ON
|
||||
```
|
||||
|
||||
Или для конкретной строки:
|
||||
|
||||
```java
|
||||
// Per line:
|
||||
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"
|
||||
"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">
|
||||
<property name="charset" value="UTF-8"/>
|
||||
<property name="severity" value="warning"/>
|
||||
<property name="fileExtensions" value="java"/>
|
||||
|
||||
<!-- File length: max 600 lines -->
|
||||
<module name="FileLength">
|
||||
<property name="max" value="600"/>
|
||||
</module>
|
||||
|
||||
<!-- Line length: max 100 characters (Google style) -->
|
||||
<module name="LineLength">
|
||||
<property name="max" value="140"/>
|
||||
<property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
|
||||
<property name="max" value="100"/>
|
||||
<property name="ignorePattern"
|
||||
value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
|
||||
</module>
|
||||
|
||||
<!-- No tabs allowed (Google style: spaces only) -->
|
||||
<module name="FileTabCharacter"/>
|
||||
|
||||
<module name="TreeWalker">
|
||||
|
||||
<module name="MethodLength">
|
||||
<property name="max" value="60"/>
|
||||
<property name="countEmpty" value="false"/>
|
||||
|
||||
<!-- ========== Google Style: Indentation ========== -->
|
||||
<!-- Basic offset: 2, continuation indent: 4 (Google style) -->
|
||||
<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 name="CyclomaticComplexity">
|
||||
<property name="max" value="15"/>
|
||||
<!-- ========== Google Style: Braces ========== -->
|
||||
<!-- 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 name="ParameterNumber">
|
||||
<property name="max" value="7"/>
|
||||
<!-- ========== Google Style: Whitespace ========== -->
|
||||
<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 name="NestedIfDepth">
|
||||
<property name="max" value="3"/>
|
||||
<module name="WhitespaceAfter"/>
|
||||
<module name="NoWhitespaceBefore">
|
||||
<property name="tokens" value="COMMA, SEMI, POST_INC, POST_DEC, DOT, METHOD_REF"/>
|
||||
</module>
|
||||
|
||||
<module name="NestedTryDepth">
|
||||
<property name="max" value="2"/>
|
||||
<module name="NoWhitespaceAfter">
|
||||
<property name="tokens"
|
||||
value="BNOT, DEC, DOT, INC, LNOT, UNARY_MINUS, UNARY_PLUS, ARRAY_DECLARATOR"/>
|
||||
</module>
|
||||
<module name="GenericWhitespace"/>
|
||||
<module name="MethodParamPad"/>
|
||||
<module name="ParenPad"/>
|
||||
<module name="TypecastParenPad"/>
|
||||
<module name="NoLineWrap"/>
|
||||
|
||||
|
||||
<module name="AvoidStarImport"/> <module name="UnusedImports"/>
|
||||
<module name="RedundantImport"/>
|
||||
|
||||
|
||||
<!-- ========== Google Style: Naming ========== -->
|
||||
<module name="PackageName">
|
||||
<property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
|
||||
</module>
|
||||
<module name="TypeName"/>
|
||||
<module name="MethodName"/>
|
||||
<module name="MemberName"/> <module name="ParameterName"/>
|
||||
<module name="MemberName"/>
|
||||
<module name="ParameterName"/>
|
||||
<module name="LocalVariableName"/>
|
||||
<module name="ConstantName"/>
|
||||
|
||||
|
||||
<module name="NeedBraces"/>
|
||||
<module name="LeftCurly"/>
|
||||
<module name="RightCurly"/>
|
||||
|
||||
<module name="WhitespaceAround">
|
||||
<property name="allowEmptyConstructors" value="true"/>
|
||||
<property name="allowEmptyMethods" value="true"/>
|
||||
<module name="CatchParameterName"/>
|
||||
<module name="ClassTypeParameterName"/>
|
||||
<module name="MethodTypeParameterName"/>
|
||||
<module name="InterfaceTypeParameterName"/>
|
||||
<module name="LambdaParameterName"/>
|
||||
<module name="PatternVariableName"/>
|
||||
<module name="RecordComponentName"/>
|
||||
<module name="LocalFinalVariableName"/>
|
||||
<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 name="ModifierOrder"/> <module name="EmptyStatement"/>
|
||||
<module name="EqualsHashCode"/> <module name="SimplifyBooleanExpression"/>
|
||||
|
||||
<!-- ========== Google Style: Imports ========== -->
|
||||
<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="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>
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -1,143 +1,114 @@
|
|||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
||||
# ║ LoChat Configuration ║
|
||||
# ║ Единый конфиг плагина ║
|
||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
||||
# LoChat main configuration
|
||||
# All settings for chat, gradients, moderation, RP commands, sounds, and filters.
|
||||
|
||||
config-version: 5
|
||||
prefix: "�D4FF[LoChat]"
|
||||
config-version: 6
|
||||
|
||||
# ── General ────────────────────────────────────────────────────────────────────
|
||||
|
||||
prefix: "&8[&3LoChat&8]"
|
||||
|
||||
# ── Chat System ────────────────────────────────────────────────────────────────
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Режимы чата │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
chat:
|
||||
# Глобальный чат (все видят, активируется через "!")
|
||||
global:
|
||||
enabled: true
|
||||
cooldown: 3
|
||||
|
||||
# Локальный чат (только в радиусе)
|
||||
|
||||
local:
|
||||
enabled: true
|
||||
cooldown: 1
|
||||
radius: 100
|
||||
|
||||
# Личные сообщения
|
||||
|
||||
pm:
|
||||
enabled: true
|
||||
cooldown: 2
|
||||
|
||||
# Лимиты сообщений
|
||||
min_message_length: 1
|
||||
max_message_length: 2000
|
||||
clear_lines: 100
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Внешний вид чата (префиксы, форматы, цвета) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
min-message-length: 1
|
||||
max-message-length: 2000
|
||||
clear-lines: 100
|
||||
|
||||
# ── Chat Appearance ────────────────────────────────────────────────────────────
|
||||
|
||||
appearance:
|
||||
# Префиксы чата (GLOBAL / LOCAL)
|
||||
prefixes:
|
||||
global:
|
||||
emoji: "✦"
|
||||
emoji: "&b\u2726"
|
||||
text: "GLOBAL"
|
||||
colors: ["#B798A8", "#7858E9"]
|
||||
separator:
|
||||
text: " ▶ "
|
||||
color: "#9878C9"
|
||||
message-color: "#E8E0F0"
|
||||
|
||||
separator: " &8\u25B6 "
|
||||
message-color: "&7"
|
||||
|
||||
local:
|
||||
emoji: "◆"
|
||||
emoji: "&d\u25C6"
|
||||
text: "LOCAL"
|
||||
colors: ["#9878C9", "#7858E9"]
|
||||
separator:
|
||||
text: " ▶ "
|
||||
color: "#8B6BD6"
|
||||
message-color: "#E8E0F0"
|
||||
|
||||
# Формат сообщений
|
||||
# {emoji} {prefix} {separator} {player_prefix} {player} {player_suffix} {message}
|
||||
separator: " &8\u25B6 "
|
||||
message-color: "&7"
|
||||
|
||||
chat-format:
|
||||
global: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix}: {message}"
|
||||
local: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix}: {message}"
|
||||
|
||||
# Hover при наведении на ник
|
||||
global: "{emoji} {prefix}{separator}{player_prefix}{player}{player_suffix}&f: {message}"
|
||||
local: "{emoji} {prefix}{separator}{player_prefix}{player}{player_suffix}&f: {message}"
|
||||
|
||||
hover:
|
||||
enabled: true
|
||||
format:
|
||||
- "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
||||
- "&#B798A8✦ &f{player}"
|
||||
- "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
|
||||
- " &b\u2726 &f{player}"
|
||||
- ""
|
||||
- "⚖C9⏱ &fПинг: ẲE9{ping}ms"
|
||||
- "⚖C9❤ &fЗдоровье: ẲE9{health}/20"
|
||||
- "⚖C9🍖 &fГолод: ẲE9{food}/20"
|
||||
- " &7Ping: &b{ping}ms"
|
||||
- " &7Health: &a{health}&7/20"
|
||||
- " &7Food: &6{food}&7/20"
|
||||
- ""
|
||||
- "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
||||
- "&#B798A8✦ &fНажми чтобы написать"
|
||||
|
||||
# Эмодзи (текстовые замены)
|
||||
- "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
|
||||
- " &7Click to message"
|
||||
|
||||
emojis:
|
||||
":heart:": "❤"
|
||||
":star:": "★"
|
||||
":diamond:": "♦"
|
||||
":check:": "✓"
|
||||
":cross:": "✗"
|
||||
":arrow:": "→"
|
||||
":heart:": "\u2764"
|
||||
":star:": "\u2605"
|
||||
":diamond:": "\u2666"
|
||||
":check:": "\u2713"
|
||||
":cross:": "\u2717"
|
||||
":arrow:": "\u2192"
|
||||
":smile:": ":)"
|
||||
":sad:": ":("
|
||||
":shrug:": "¯\\_(ツ)_/¯"
|
||||
|
||||
# Цвета системных сообщений
|
||||
colors:
|
||||
nobody_heard: "#9878C9"
|
||||
error: "#CF6679"
|
||||
success: "#9878C9"
|
||||
warning: "#B798A8"
|
||||
info: "#A485BC"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Градиентные ники и префиксы │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Gradient Nicknames & Prefixes ──────────────────────────────────────────────
|
||||
|
||||
gradient:
|
||||
enabled: true
|
||||
use-gradient-name: true
|
||||
use-custom-prefix: true
|
||||
|
||||
# Настройки отображения
|
||||
|
||||
display:
|
||||
update-display-name: true
|
||||
update-tab-list: true
|
||||
|
||||
# Лимиты
|
||||
min-colors: 1
|
||||
max-colors: 7
|
||||
max-prefix-length: 16
|
||||
|
||||
# Цены (PlayerPoints)
|
||||
price-per-color: 50
|
||||
prefix-price: 500
|
||||
prefix-one-time-purchase: true
|
||||
use-permission-instead-of-cost: false
|
||||
|
||||
# Кулдауны (секунды)
|
||||
color-cooldown: 60
|
||||
prefix-cooldown: 120
|
||||
|
||||
# Форматирование
|
||||
prefix-format: "[{prefix}] "
|
||||
gradient-on-prefix: true
|
||||
gradient-on-luckperms-prefix: true
|
||||
gradient-on-luckperms-suffix: true
|
||||
continuous-gradient: true
|
||||
use-legacy-rgb-format: true
|
||||
|
||||
# Хранилище (file / sqlite)
|
||||
storage-type: "file"
|
||||
sqlite-file: "gradient-data.db"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ RP команды (/me, /do, /try, /roll) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
limits:
|
||||
min-colors: 1
|
||||
max-colors: 7
|
||||
max-prefix-length: 16
|
||||
|
||||
pricing:
|
||||
price-per-color: 50
|
||||
prefix-price: 500
|
||||
prefix-one-time-purchase: true
|
||||
use-permission-instead-of-cost: false
|
||||
|
||||
cooldowns:
|
||||
color: 60
|
||||
prefix: 120
|
||||
|
||||
formatting:
|
||||
prefix-format: "[{prefix}] "
|
||||
gradient-on-prefix: true
|
||||
gradient-on-luckperms-prefix: true
|
||||
gradient-on-luckperms-suffix: true
|
||||
continuous-gradient: true
|
||||
|
||||
storage:
|
||||
type: file
|
||||
sqlite-file: "gradient-data.db"
|
||||
|
||||
# ── RP Commands ────────────────────────────────────────────────────────────────
|
||||
|
||||
rp:
|
||||
radius: 100
|
||||
cooldowns:
|
||||
|
|
@ -146,126 +117,92 @@ rp:
|
|||
do: 3
|
||||
roll: 2
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Фильтры чата │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Chat Filters ───────────────────────────────────────────────────────────────
|
||||
|
||||
filters:
|
||||
# Мат-фильтр
|
||||
swear:
|
||||
enabled: true
|
||||
replace: false
|
||||
replacement: "***"
|
||||
words:
|
||||
- "хуй"
|
||||
- "пизда"
|
||||
- "ебать"
|
||||
|
||||
# URL фильтр
|
||||
|
||||
url:
|
||||
enabled: true
|
||||
replacement: "[ссылка скрыта]"
|
||||
|
||||
# IP фильтр
|
||||
replacement: "&7[URL hidden]"
|
||||
|
||||
ip:
|
||||
enabled: true
|
||||
replacement: "[IP скрыт]"
|
||||
|
||||
# Скрытые URL (discord.gg и т.д.)
|
||||
replacement: "&7[IP hidden]"
|
||||
|
||||
hidden-urls:
|
||||
enabled: true
|
||||
patterns:
|
||||
- "discord\\.gg"
|
||||
- "dsc\\.gg"
|
||||
|
||||
# Анти-спам
|
||||
- "bit\\.ly"
|
||||
- "tinyurl\\.com"
|
||||
|
||||
spam:
|
||||
enabled: true
|
||||
max-repeating-chars: 5
|
||||
|
||||
# Анти-флуд
|
||||
|
||||
flood:
|
||||
enabled: true
|
||||
max-same-messages: 3
|
||||
|
||||
# Капс
|
||||
|
||||
caps:
|
||||
enabled: true
|
||||
max-caps-percent: 70
|
||||
min-length: 5
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Модерация (муты, баны, варны) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
moderation:
|
||||
# Дефолтные значения
|
||||
default-mute-duration: "7d"
|
||||
default-mute-reason: "Без причины"
|
||||
default-ban-reason: "Без причины"
|
||||
|
||||
# Команда после мута (для голосового чата)
|
||||
voice-mute-console-command: ""
|
||||
|
||||
# Сообщение при кике забаненного
|
||||
ban-kick-message: "&#CF6679Вы забанены! &#B798A8Причина: ẲE9{reason}"
|
||||
# ── Moderation ─────────────────────────────────────────────────────────────────
|
||||
|
||||
moderation:
|
||||
default-mute-duration: "7d"
|
||||
default-mute-reason: "No reason specified"
|
||||
default-ban-reason: "No reason specified"
|
||||
voice-mute-console-command: ""
|
||||
ban-kick-message: "&cYou have been banned!\n&7Reason: &f{reason}"
|
||||
|
||||
# ── Sounds ─────────────────────────────────────────────────────────────────────
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Звуки │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
sounds:
|
||||
# Упоминание в чате
|
||||
mention:
|
||||
enabled: true
|
||||
sound: "BLOCK_NOTE_BLOCK_PLING"
|
||||
sound: BLOCK_NOTE_BLOCK_PLING
|
||||
volume: 1.0
|
||||
pitch: 1.5
|
||||
|
||||
# Личное сообщение
|
||||
|
||||
pm:
|
||||
enabled: true
|
||||
sound: "ENTITY_EXPERIENCE_ORB_PICKUP"
|
||||
sound: ENTITY_EXPERIENCE_ORB_PICKUP
|
||||
volume: 0.8
|
||||
pitch: 1.2
|
||||
|
||||
# Команды
|
||||
|
||||
command:
|
||||
enabled: false
|
||||
sound: "UI_BUTTON_CLICK"
|
||||
sound: UI_BUTTON_CLICK
|
||||
volume: 0.5
|
||||
pitch: 1.0
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Сообщения входа/выхода/смерти │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Join / Quit / Death Messages ──────────────────────────────────────────────
|
||||
|
||||
messages:
|
||||
# Сообщение при входе
|
||||
# {player} - ник игрока
|
||||
join:
|
||||
enabled: true
|
||||
format: "⚖C9✦ &#B798A8{player} ẲE9зашел на сервер"
|
||||
|
||||
# Сообщение при выходе
|
||||
format: "&7\u2726 &b{player} &7joined the server"
|
||||
|
||||
quit:
|
||||
enabled: true
|
||||
format: "⚖C9✦ &#B798A8{player} ẲE9вышел с сервера"
|
||||
|
||||
# Сообщение при смерти
|
||||
# {player} - ник игрока
|
||||
# {killer} - ник убийцы (если есть)
|
||||
# {weapon} - название оружия (если есть)
|
||||
# {death_message} - стандартное сообщение смерти
|
||||
format: "&7\u2726 &b{player} &7left the server"
|
||||
|
||||
death:
|
||||
enabled: true
|
||||
# Убийство игроком
|
||||
player_kill: "&#CF6679☠ &#B798A8{player} ẲE9был убит игроком &#B798A8{killer} ⚖C9({weapon})"
|
||||
# Смерть от моба
|
||||
mob_kill: "&#CF6679☠ &#B798A8{player} ẲE9был убит мобом &#B798A8{killer}"
|
||||
# Обычная смерть
|
||||
default: "&#CF6679☠ &#B798A8{player} ẲE9{death_message}"
|
||||
player-kill: "&c\u2620 &7{player} was killed by &f{killer} &7(&f{weapon}&7)"
|
||||
mob-kill: "&c\u2620 &7{player} was slain by &f{killer}"
|
||||
default: "&c\u2620 &7{player} {death_message}"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Прочее │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# Hub команда
|
||||
hub_command:
|
||||
# ── Hub Command ────────────────────────────────────────────────────────────────
|
||||
|
||||
hub-command:
|
||||
enabled: true
|
||||
server: "hub"
|
||||
|
|
|
|||
|
|
@ -1,136 +1,98 @@
|
|||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
||||
# ║ LoChat — config/appearance.yml ║
|
||||
# ║ In-game chat look: prefixes, format, hover, emoji shortcuts, Discord UI ║
|
||||
# ║ Palette (Spacelegacy): #B798A8 (dusty rose) → #7858E9 (violet) ║
|
||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
||||
# LoChat chat appearance
|
||||
# Controls how messages look in-game: prefixes, format, hover, emojis.
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ 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).
|
||||
# ── Chat Prefixes ──────────────────────────────────────────────────────────────
|
||||
|
||||
prefixes:
|
||||
global:
|
||||
emoji: "✦"
|
||||
emoji: "\u2726"
|
||||
text: "GLOBAL"
|
||||
colors:
|
||||
- "#B798A8"
|
||||
- "#7858E9"
|
||||
separator:
|
||||
text: " ▶ "
|
||||
color: "#9878C9"
|
||||
message-color: "#E8E0F0"
|
||||
separator: " \u25B6 "
|
||||
message-color: "&7"
|
||||
|
||||
local:
|
||||
emoji: "◆"
|
||||
emoji: "\u25C6"
|
||||
text: "LOCAL"
|
||||
colors:
|
||||
- "#9878C9"
|
||||
- "#7858E9"
|
||||
separator:
|
||||
text: " ▶ "
|
||||
color: "#8B6BD6"
|
||||
message-color: "#E8E0F0"
|
||||
separator: " \u25B6 "
|
||||
message-color: "&7"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Rendered chat line layout │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
#
|
||||
# ── Chat Format ────────────────────────────────────────────────────────────────
|
||||
# Placeholders:
|
||||
# {emoji} — prefix emoji (✦ / ◆)
|
||||
# {prefix} — gradient prefix text (GLOBAL / LOCAL)
|
||||
# {separator} — separator (e.g. ▶)
|
||||
# {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}
|
||||
# {emoji}, {prefix}, {separator}
|
||||
# {player_prefix}, {player}, {player_suffix}
|
||||
# {message}
|
||||
|
||||
chat-format:
|
||||
global: "{emoji} {prefix} {separator} {player_prefix}{player}{player_suffix} : {message}"
|
||||
local: "{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}&f: {message}"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Hover shown when pointing at the player name in chat │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Hover on Player Name ───────────────────────────────────────────────────────
|
||||
|
||||
hover:
|
||||
enabled: true
|
||||
format:
|
||||
- "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
||||
- "&#B798A8✦ &f{player}"
|
||||
- "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
|
||||
- " \u2726 &f{player}"
|
||||
- ""
|
||||
- "⚖C9⏱ &fПинг: ẲE9{ping}ms"
|
||||
- "⚖C9❤ &fЗдоровье: ẲE9{health}/20"
|
||||
- "⚖C9🍖 &fГолод: ẲE9{food}/20"
|
||||
- " &7Ping: &b{ping}ms"
|
||||
- " &7Health: &a{health}&7/20"
|
||||
- " &7Food: &6{food}&7/20"
|
||||
- ""
|
||||
- "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
||||
- "&#B798A8✦ &fНажми чтобы написать"
|
||||
- "&8\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550"
|
||||
- " &7Click to message"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Text shortcuts → unicode (applied to outgoing chat before URLs / mentions) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Emoji Shortcuts ────────────────────────────────────────────────────────────
|
||||
# Text shortcuts replaced in outgoing messages before processing.
|
||||
|
||||
emojis:
|
||||
":heart:": "❤"
|
||||
":hearts:": "♥"
|
||||
":star:": "★"
|
||||
":stars:": "✦"
|
||||
":diamond:": "♦"
|
||||
":check:": "✓"
|
||||
":cross:": "✗"
|
||||
":arrow:": "→"
|
||||
":up:": "↑"
|
||||
":down:": "↓"
|
||||
":left:": "←"
|
||||
":right:": "→"
|
||||
":music:": "♪"
|
||||
":note:": "♫"
|
||||
":heart:": "\u2764"
|
||||
":hearts:": "\u2665"
|
||||
":star:": "\u2605"
|
||||
":stars:": "\u2726"
|
||||
":diamond:": "\u2666"
|
||||
":check:": "\u2713"
|
||||
":cross:": "\u2717"
|
||||
":arrow:": "\u2192"
|
||||
":up:": "\u2191"
|
||||
":down:": "\u2193"
|
||||
":left:": "\u2190"
|
||||
":right:": "\u2192"
|
||||
":music:": "\u266A"
|
||||
":note:": "\u266B"
|
||||
":smile:": ":)"
|
||||
":sad:": ":("
|
||||
":wink:": ";)"
|
||||
":shrug:": "¯\\_(ツ)_/¯"
|
||||
":shrug:": "\u00AF\\_(\u30C4)_/\u00AF"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Radius, length limits, and misc chat UI colors (plugin internals) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Chat Settings ──────────────────────────────────────────────────────────────
|
||||
|
||||
chat:
|
||||
local_radius: 100
|
||||
clear_lines: 100
|
||||
min_message_length: 1
|
||||
max_message_length: 2000
|
||||
local-radius: 100
|
||||
clear-lines: 100
|
||||
min-message-length: 1
|
||||
max-message-length: 2000
|
||||
colors:
|
||||
nobody_heard: "#9878C9"
|
||||
error: "#CF6679"
|
||||
success: "#9878C9"
|
||||
warning: "#B798A8"
|
||||
info: "#A485BC"
|
||||
nobody-heard: "&7"
|
||||
error: "&c"
|
||||
success: "&a"
|
||||
warning: "&6"
|
||||
info: "&7"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Discord webhook embeds (see also config/discord.yml for webhooks) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Discord Embeds ─────────────────────────────────────────────────────────────
|
||||
|
||||
discord:
|
||||
emojis:
|
||||
global_chat: "✦"
|
||||
local_chat: "◆"
|
||||
player_join: "♦"
|
||||
player_quit: "◈"
|
||||
player_death: "✗"
|
||||
avatar_urls:
|
||||
global-chat: "\u2726"
|
||||
local-chat: "\u25C6"
|
||||
player-join: "\u25C6"
|
||||
player-quit: "\u25C7"
|
||||
player-death: "\u2717"
|
||||
avatar-urls:
|
||||
default: "https://mc-heads.net/avatar/minecraft/64"
|
||||
player: "https://mc-heads.net/avatar/{player}/64"
|
||||
default_embed_color: "7858E9"
|
||||
event_titles:
|
||||
join: "♦ Игрок зашел на сервер"
|
||||
quit: "◈ Игрок покинул сервер"
|
||||
death: "✗ Смерть игрока"
|
||||
global_chat: "✦ Глобальный чат"
|
||||
local_chat: "◆ Локальный чат"
|
||||
default-embed-color: "3498DB"
|
||||
event-titles:
|
||||
join: "Player joined"
|
||||
quit: "Player left"
|
||||
death: "Player died"
|
||||
global-chat: "Global Chat"
|
||||
local-chat: "Local Chat"
|
||||
|
|
|
|||
|
|
@ -1,110 +1,73 @@
|
|||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
||||
# ║ Discord Integration ║
|
||||
# ║ Интеграция с Discord ║
|
||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
||||
# LoChat Discord integration
|
||||
# Relays chat messages and server events to a Discord channel via webhook.
|
||||
|
||||
# ── General ────────────────────────────────────────────────────────────────────
|
||||
|
||||
# Включить интеграцию с Discord
|
||||
enabled: true
|
||||
|
||||
# Настройки вебхука
|
||||
# ── Webhook ────────────────────────────────────────────────────────────────────
|
||||
|
||||
webhook:
|
||||
# URL вебхука Discord (получить в настройках канала)
|
||||
url: "https://discord.com/api/webhooks/YOUR_WEBHOOK_ID/YOUR_WEBHOOK_TOKEN"
|
||||
|
||||
# Имя бота в Discord
|
||||
username: "Minecraft Server"
|
||||
|
||||
# Аватар бота (URL изображения)
|
||||
avatar_url: "https://mc-heads.net/avatar/minecraft/64"
|
||||
username: "Minecraft"
|
||||
avatar-url: "https://mc-heads.net/avatar/minecraft/64"
|
||||
|
||||
# ── Chat Relay ─────────────────────────────────────────────────────────────────
|
||||
|
||||
# Настройки чата
|
||||
chat:
|
||||
# Отправлять сообщения чата в Discord
|
||||
enabled: true
|
||||
|
||||
# Отправлять только глобальный чат (true) или весь чат (false)
|
||||
global_only: true
|
||||
|
||||
# Формат сообщения чата
|
||||
global-only: true
|
||||
format: "**{player}**: {message}"
|
||||
|
||||
# Цвет embed для сообщений чата (hex без #)
|
||||
embed_color: "5865F2"
|
||||
|
||||
# Использовать embed или обычное сообщение
|
||||
use_embed: true
|
||||
embed-color: "5865F2"
|
||||
use-embed: true
|
||||
|
||||
# ── Events ─────────────────────────────────────────────────────────────────────
|
||||
|
||||
# Настройки событий игроков
|
||||
events:
|
||||
# Отправлять события входа/выхода
|
||||
enabled: true
|
||||
|
||||
# Настройки входа на сервер
|
||||
# {player} - ник игрока
|
||||
|
||||
join:
|
||||
enabled: true
|
||||
title: "🟢 Игрок зашел на сервер"
|
||||
description: "**{player}** присоединился к серверу"
|
||||
title: "Player joined"
|
||||
description: "**{player}** joined the server"
|
||||
color: "00FF00"
|
||||
thumbnail: "https://mc-heads.net/avatar/{player}/64"
|
||||
|
||||
# Настройки выхода с сервера
|
||||
# {player} - ник игрока
|
||||
|
||||
quit:
|
||||
enabled: true
|
||||
title: "🔴 Игрок покинул сервер"
|
||||
description: "**{player}** покинул сервер"
|
||||
title: "Player left"
|
||||
description: "**{player}** left the server"
|
||||
color: "FF0000"
|
||||
thumbnail: "https://mc-heads.net/avatar/{player}/64"
|
||||
|
||||
# Настройки смерти игрока
|
||||
# {player} - ник игрока
|
||||
# {killer} - ник убийцы (если есть)
|
||||
# {weapon} - название оружия (если есть)
|
||||
# {death_message} - стандартное сообщение смерти
|
||||
|
||||
death:
|
||||
enabled: true
|
||||
# Убийство игроком
|
||||
player_kill:
|
||||
title: "⚔️ PvP убийство"
|
||||
description: "**{player}** был убит игроком **{killer}** с помощью **{weapon}**"
|
||||
player-kill:
|
||||
title: "PvP kill"
|
||||
description: "**{player}** was killed by **{killer}** using **{weapon}**"
|
||||
color: "FF0000"
|
||||
# Смерть от моба
|
||||
mob_kill:
|
||||
title: "💀 Смерть от моба"
|
||||
description: "**{player}** был убит мобом **{killer}**"
|
||||
mob-kill:
|
||||
title: "Mob kill"
|
||||
description: "**{player}** was slain by **{killer}**"
|
||||
color: "800080"
|
||||
# Обычная смерть
|
||||
default:
|
||||
title: "💀 Смерть игрока"
|
||||
title: "Player died"
|
||||
description: "**{player}** {death_message}"
|
||||
color: "800080"
|
||||
thumbnail: "https://mc-heads.net/avatar/{player}/64"
|
||||
|
||||
# Настройки фильтрации
|
||||
filter:
|
||||
# Игнорировать сообщения от ботов
|
||||
ignore_bots: true
|
||||
|
||||
# Минимальная длина сообщения для отправки
|
||||
min_message_length: 1
|
||||
|
||||
# Максимальная длина сообщения (обрезать если больше)
|
||||
max_message_length: 2000
|
||||
|
||||
# Заменять @everyone и @here на безопасные варианты
|
||||
sanitize_mentions: true
|
||||
# ── Filtering ──────────────────────────────────────────────────────────────────
|
||||
|
||||
filter:
|
||||
ignore-bots: true
|
||||
min-message-length: 1
|
||||
max-message-length: 2000
|
||||
sanitize-mentions: true
|
||||
|
||||
# ── Performance ────────────────────────────────────────────────────────────────
|
||||
|
||||
# Настройки производительности
|
||||
performance:
|
||||
# Асинхронная отправка (рекомендуется)
|
||||
async: true
|
||||
|
||||
# Таймаут подключения (секунды)
|
||||
timeout: 10
|
||||
|
||||
# Повторные попытки при ошибке
|
||||
retry_attempts: 3
|
||||
|
||||
# Задержка между попытками (миллисекунды)
|
||||
retry_delay: 1000
|
||||
retry-attempts: 3
|
||||
retry-delay: 1000
|
||||
|
|
|
|||
|
|
@ -1,44 +1,34 @@
|
|||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
||||
# ║ LoChat — Фильтры чата ║
|
||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
||||
# LoChat chat filters
|
||||
# Control spam, swearing, URLs, and other unwanted content.
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Мат-фильтр │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# Использует badwords.txt для списка слов
|
||||
# Автоматически ловит замены букв: х->x, о->o, е->e и т.д.
|
||||
# Обход: lochat.bypass.swear
|
||||
# ── Swear Filter ───────────────────────────────────────────────────────────────
|
||||
# Uses badwords.txt for the word list.
|
||||
# Bypass permission: lochat.bypass.swear
|
||||
|
||||
swear:
|
||||
enabled: true
|
||||
replace: false # true = заменять на ***, false = блокировать сообщение
|
||||
replace: false
|
||||
replacement: "***"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ URL фильтр │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# Блокирует ссылки в чате
|
||||
# Обход: lochat.bypass.urlfilter
|
||||
# ── URL Filter ─────────────────────────────────────────────────────────────────
|
||||
# Blocks URLs in messages.
|
||||
# Bypass permission: lochat.bypass.urlfilter
|
||||
|
||||
url:
|
||||
enabled: true
|
||||
replacement: "[ссылка скрыта]"
|
||||
replacement: "&7[URL hidden]"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ IP фильтр │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# Блокирует IP адреса в чате
|
||||
# Обход: lochat.bypass.ipfilter
|
||||
# ── IP Filter ──────────────────────────────────────────────────────────────────
|
||||
# Blocks IP addresses in messages.
|
||||
# Bypass permission: lochat.bypass.ipfilter
|
||||
|
||||
ip:
|
||||
enabled: true
|
||||
replacement: "[IP скрыт]"
|
||||
replacement: "&7[IP hidden]"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Скрытые URL (discord.gg и т.д.) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# Блокирует популярные сокращенные ссылки
|
||||
# Обход: lochat.bypass.hiddenurls
|
||||
# ── Hidden URL Filter ──────────────────────────────────────────────────────────
|
||||
# Blocks known link shorteners and invite links.
|
||||
# Bypass permission: lochat.bypass.hiddenurls
|
||||
|
||||
hidden-urls:
|
||||
enabled: true
|
||||
|
|
@ -49,33 +39,27 @@ hidden-urls:
|
|||
- "tinyurl\\.com"
|
||||
- "goo\\.gl"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Анти-спам │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# Блокирует повторяющиеся символы (ааааааа, хххххх)
|
||||
# Обход: lochat.bypass.spam
|
||||
# ── Spam Filter ────────────────────────────────────────────────────────────────
|
||||
# Blocks messages with excessive repeated characters.
|
||||
# Bypass permission: lochat.bypass.spam
|
||||
|
||||
spam:
|
||||
enabled: true
|
||||
max-repeating-chars: 5 # Максимум повторений одного символа
|
||||
max-repeating-chars: 5
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Анти-флуд │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# Блокирует одинаковые сообщения подряд
|
||||
# Обход: lochat.bypass.flood
|
||||
# ── Flood Filter ───────────────────────────────────────────────────────────────
|
||||
# Blocks identical messages sent in quick succession.
|
||||
# Bypass permission: lochat.bypass.flood
|
||||
|
||||
flood:
|
||||
enabled: true
|
||||
max-same-messages: 3 # Сколько раз можно отправить одно и то же
|
||||
max-same-messages: 3
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Капс-фильтр │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# Блокирует сообщения с большим количеством заглавных букв
|
||||
# Обход: lochat.bypass.caps
|
||||
# ── CAPS Filter ────────────────────────────────────────────────────────────────
|
||||
# Blocks messages with too many capital letters.
|
||||
# Bypass permission: lochat.bypass.caps
|
||||
|
||||
caps:
|
||||
enabled: true
|
||||
max-caps-percent: 70 # Максимум % заглавных букв
|
||||
min-length: 5 # Минимальная длина для проверки
|
||||
max-caps-percent: 70
|
||||
min-length: 5
|
||||
|
|
|
|||
|
|
@ -1,137 +1,123 @@
|
|||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
||||
# ║ LoChat Hardcoded Messages ║
|
||||
# ║ Цветовая гамма: Spacelegacy ║
|
||||
# ║ #B798A8 → #7858E9 ║
|
||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
||||
# LoChat system messages
|
||||
# Internal messages for commands, filters, moderation, and general feedback.
|
||||
|
||||
# ── Commands ───────────────────────────────────────────────────────────────────
|
||||
|
||||
commands:
|
||||
mute:
|
||||
usage: "&#B798A8Использование: ẲE9/mute <ник> [время] [-s] [причина]"
|
||||
time_help: "⚖C9Время: ẲE91d⚖C9, ẲE92h⚖C9, ẲE930m⚖C9, ẲE960s⚖C9, ẲE9perm"
|
||||
silent_help: "&#B798A8-s ⚖C9— тихий мут (право ẲE9lochat.mute.silent⚖C9)"
|
||||
no_silent_permission: "&#CF6679Нет права на тихий мут"
|
||||
default_reason: "Без причины"
|
||||
default_duration: "7d"
|
||||
usage: "&cUsage: &f/mute <player> [time] [-s] [reason]"
|
||||
time-help: "&7Time format: &f1d&7, &f2h&7, &f30m&7, &f60s&7, &fperm"
|
||||
silent-help: "&7-s &7= silent mute (requires &flochat.mute.silent&7)"
|
||||
no-silent-permission: "&cNo permission for silent mute"
|
||||
default-reason: "No reason specified"
|
||||
default-duration: "7d"
|
||||
|
||||
cooldown:
|
||||
message: "&#B798A8Подождите ẲE9{remaining} &#B798A8сек"
|
||||
message: "&cPlease wait &f{remaining} &cseconds"
|
||||
|
||||
clear_chat:
|
||||
lines_cleared: "⚖C9Чат очищен ẲE9({lines} строк⚖C9)"
|
||||
no_permission: "&#CF6679Нет прав для очистки чата"
|
||||
clear-chat:
|
||||
lines-cleared: "&aChat cleared &7({lines} lines)"
|
||||
no-permission: "&cNo permission to clear chat"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ЛОКАЛЬНЫЙ ЧАТ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Local Chat ─────────────────────────────────────────────────────────────────
|
||||
|
||||
local_chat:
|
||||
nobody_heard: "⚖C9Вас никто не услышал &#B798A8— рядом нет игроков"
|
||||
no_players_nearby: "&#B798A8Рядом нет игроков"
|
||||
local-chat:
|
||||
nobody-heard: "&7Nobody heard you — no players nearby"
|
||||
no-players-nearby: "&7No players nearby"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ФИЛЬТРЫ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Filters ────────────────────────────────────────────────────────────────────
|
||||
|
||||
filters:
|
||||
caps:
|
||||
min_length: 3
|
||||
blocked_message: "&#CF6679Не кричите в чате"
|
||||
auto_lowercase_notice: "&#B798A8Сообщение автоматически исправлено"
|
||||
min-length: 3
|
||||
blocked-message: "&cPlease don't shout"
|
||||
auto-lowercase-notice: "&7Message auto-corrected"
|
||||
spam:
|
||||
blocked_message: "&#CF6679Не спамьте"
|
||||
similar_message: "&#CF6679Вы уже отправляли похожее сообщение"
|
||||
blocked-message: "&cDo not spam"
|
||||
similar-message: "&cYou already sent a similar message"
|
||||
swear:
|
||||
blocked_message: "&#CF6679Запрещённые слова"
|
||||
replaced_notice: "&#B798A8Некоторые слова заменены"
|
||||
blocked-message: "&cInappropriate language"
|
||||
replaced-notice: "&7Some words were replaced"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ МУТИРОВАНИЕ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Mute Messages ──────────────────────────────────────────────────────────────
|
||||
|
||||
mute:
|
||||
muted_message: "&#CF6679Вы замучены! &#B798A8Причина: ẲE9{reason}&#B798A8. Осталось: ẲE9{time}"
|
||||
muted_permanent: "&#CF6679Вы замучены навсегда! &#B798A8Причина: ẲE9{reason}"
|
||||
player_muted: "⚖C9Игрок ẲE9{player} ⚖C9замучен на ẲE9{time}⚖C9. Причина: &#B798A8{reason}"
|
||||
player_muted_permanent: "⚖C9Игрок ẲE9{player} ⚖C9замучен навсегда. Причина: &#B798A8{reason}"
|
||||
player_muted_silent: "&#B798A8[⚖C9ТИХИЙ МУТ&#B798A8] ẲE9{player} &#B798A8замучен на ẲE9{time}"
|
||||
player_unmuted: "⚖C9Игрок ẲE9{player} ⚖C9размучен"
|
||||
not_muted: "&#B798A8Игрок ẲE9{player} &#B798A8не замучен"
|
||||
player_not_found: "&#CF6679Игрок не найден!"
|
||||
invalid_time: "&#CF6679Неверный формат времени!"
|
||||
already_muted: "&#CF6679Игрок уже замучен!"
|
||||
no_silent_unmute_permission: "&#CF6679Нет права на тихий размут!"
|
||||
player_not_muted_simple: "&#CF6679Игрок не замучен!"
|
||||
muted-message: "&cYou are muted! &7Reason: &f{reason}&7. Remaining: &f{time}"
|
||||
muted-permanent: "&cYou are permanently muted! &7Reason: &f{reason}"
|
||||
player-muted: "&aPlayer &f{player} &amuted for &f{time}&a. Reason: &7{reason}"
|
||||
player-muted-permanent: "&aPlayer &f{player} &amuted permanently. Reason: &7{reason}"
|
||||
player-muted-silent: "&8[&7SILENT&8] &f{player} &7muted for &f{time}"
|
||||
player-unmuted: "&aPlayer &f{player} &aunmuted"
|
||||
not-muted: "&7Player &f{player} &7is not muted"
|
||||
player-not-found: "&cPlayer not found!"
|
||||
invalid-time: "&cInvalid time format!"
|
||||
already-muted: "&cPlayer is already muted!"
|
||||
no-silent-unmute-permission: "&cNo permission for silent unmute"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ИГРОВЫЕ РЕЖИМЫ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Gamemodes ──────────────────────────────────────────────────────────────────
|
||||
|
||||
gamemodes:
|
||||
survival: "Выживание"
|
||||
creative: "Творчество"
|
||||
adventure: "Приключение"
|
||||
spectator: "Наблюдатель"
|
||||
survival: "Survival"
|
||||
creative: "Creative"
|
||||
adventure: "Adventure"
|
||||
spectator: "Spectator"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ЛИЧНЫЕ СООБЩЕНИЯ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Private Messages ───────────────────────────────────────────────────────────
|
||||
|
||||
private_messages:
|
||||
no_reply_target: "&#CF6679Нет цели для ответа"
|
||||
message_sent: "&#B798A8Сообщение отправлено ẲE9{player}"
|
||||
player_offline: "&#CF6679Игрок ẲE9{player} &#CF6679не в сети"
|
||||
cannot_message_self: "&#CF6679Нельзя писать самому себе"
|
||||
private-messages:
|
||||
no-reply-target: "&cNobody to reply to"
|
||||
message-sent: "&aMessage sent to &f{player}"
|
||||
player-offline: "&cPlayer &f{player} &cis not online"
|
||||
cannot-message-self: "&cYou cannot message yourself"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ИГНОРИРОВАНИЕ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Ignore ─────────────────────────────────────────────────────────────────────
|
||||
|
||||
ignore:
|
||||
player_ignored: "⚖C9Игрок ẲE9{player} ⚖C9добавлен в игнор"
|
||||
player_unignored: "⚖C9Игрок ẲE9{player} ⚖C9убран из игнора"
|
||||
already_ignored: "&#B798A8Игрок ẲE9{player} &#B798A8уже в игноре"
|
||||
not_ignored: "&#B798A8Игрок ẲE9{player} &#B798A8не в игноре"
|
||||
cannot_ignore_self: "&#CF6679Нельзя игнорировать самого себя"
|
||||
ignore_list_empty: "&#B798A8Список игнора пуст"
|
||||
ignore_list_header: "&#B798A8Игнорируемые игроки⚖C9:"
|
||||
player-ignored: "&aPlayer &f{player} &ais now ignored"
|
||||
player-unignored: "&aPlayer &f{player} &ais no longer ignored"
|
||||
already-ignored: "&7Player &f{player} &7is already ignored"
|
||||
not-ignored: "&7Player &f{player} &7is not ignored"
|
||||
cannot-ignore-self: "&cYou cannot ignore yourself"
|
||||
ignore-list-empty: "&7Your ignore list is empty"
|
||||
ignore-list-header: "&7Ignored players:"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ОБЩИЕ СООБЩЕНИЯ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── General ────────────────────────────────────────────────────────────────────
|
||||
|
||||
general:
|
||||
no_permission: "&#CF6679Нет прав!"
|
||||
player_only: "&#CF6679Только для игроков!"
|
||||
invalid_arguments: "&#CF6679Неверные аргументы!"
|
||||
command_disabled: "&#CF6679Команда отключена!"
|
||||
feature_disabled: "&#CF6679Функция отключена!"
|
||||
player_not_found: "&#CF6679Игрок не найден!"
|
||||
time_formats:
|
||||
seconds: "сек"
|
||||
minutes: "мин"
|
||||
hours: "ч"
|
||||
days: "д"
|
||||
permanent: "навсегда"
|
||||
enabled: "ẲE9Включено"
|
||||
disabled: "&#B798A8Отключено"
|
||||
online: "⚖C9В сети"
|
||||
offline: "&#B798A8Не в сети"
|
||||
no-permission: "&cNo permission!"
|
||||
player-only: "&cPlayers only!"
|
||||
invalid-arguments: "&cInvalid arguments!"
|
||||
command-disabled: "&cCommand disabled!"
|
||||
feature-disabled: "&cFeature disabled!"
|
||||
player-not-found: "&cPlayer not found!"
|
||||
time-formats:
|
||||
seconds: "s"
|
||||
minutes: "m"
|
||||
hours: "h"
|
||||
days: "d"
|
||||
permanent: "permanent"
|
||||
enabled: "&aEnabled"
|
||||
disabled: "&7Disabled"
|
||||
online: "&aOnline"
|
||||
offline: "&7Offline"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ВАРНЫ / БАНЫ (LoChat) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Moderation ─────────────────────────────────────────────────────────────────
|
||||
|
||||
moderation:
|
||||
default_reason: "Без причины"
|
||||
duration_permanent: "навсегда"
|
||||
warn_received: "&#CF6679⚠ Вам выдано предупреждение! &#B798A8Причина: ẲE9{reason}"
|
||||
warn_staff_confirm: "⚖C9Игроку ẲE9{player} ⚖C9выдан варн. &#B798A8Причина: ẲE9{reason}"
|
||||
silent_warn_staff: "&#B798A8[⚖C9ТИХИЙ ВАРН&#B798A8] ẲE9{player}⚖C9: &#B798A8{reason}"
|
||||
ban_usage: "&#B798A8Использование: ẲE9/lban <ник> [время|perm] [причина]"
|
||||
ban_confirm: "⚖C9Игрок ẲE9{player} ⚖C9забанен. &#B798A8Срок: ẲE9{duration}"
|
||||
unban_confirm: "⚖C9Бан снят с ẲE9{player}"
|
||||
not_banned: "&#CF6679Игрок не забанен!"
|
||||
already_banned: "&#CF6679Игрок уже забанен!"
|
||||
warn_usage: "&#B798A8Использование: ẲE9/warn <ник> [причина]"
|
||||
silent_warn_usage: "&#B798A8Использование: ẲE9/silentwarn <ник> [причина]"
|
||||
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>"
|
||||
default-reason: "No reason specified"
|
||||
duration-permanent: "permanent"
|
||||
warn-received: "&6\u26A0 &cYou received a warning! &7Reason: &f{reason}"
|
||||
warn-staff-confirm: "&aPlayer &f{player} &awarned. &7Reason: &f{reason}"
|
||||
silent-warn-staff: "&8[&7SILENT&8] &f{player}&7: &7{reason}"
|
||||
ban-usage: "&cUsage: &f/lban <player> [time|perm] [reason]"
|
||||
ban-confirm: "&aPlayer &f{player} &abanned. &7Duration: &f{duration}"
|
||||
unban-confirm: "&aBan lifted for &f{player}"
|
||||
not-banned: "&cPlayer is not banned!"
|
||||
already-banned: "&cPlayer is already banned!"
|
||||
warn-usage: "&cUsage: &f/warn <player> [reason]"
|
||||
silent-warn-usage: "&cUsage: &f/silentwarn <player> [reason]"
|
||||
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 Configuration ║
|
||||
# ║ Конфигурация мутов ║
|
||||
# ║ Версия: 1.5.5-1.20.1 ║
|
||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
||||
# LoChat mute system configuration
|
||||
# Controls mute durations, automatic mutes, escalation, and notifications.
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ОСНОВНЫЕ НАСТРОЙКИ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── General Settings ───────────────────────────────────────────────────────────
|
||||
|
||||
settings:
|
||||
# Причина мута по умолчанию
|
||||
default-reason: "Нарушение правил чата"
|
||||
|
||||
# Длительность мута по умолчанию
|
||||
default-reason: "Chat rule violation"
|
||||
default-duration: "1h"
|
||||
|
||||
# Максимальная длина причины мута
|
||||
max-reason-length: 100
|
||||
|
||||
# Показывать причину мута игроку
|
||||
show-reason: true
|
||||
|
||||
# Показывать оставшееся время мута
|
||||
show-remaining-time: true
|
||||
|
||||
# Автоматически размучивать при истечении времени
|
||||
auto-unmute: true
|
||||
|
||||
# Сохранять историю мутов
|
||||
save-history: true
|
||||
|
||||
# Максимальное количество записей в истории на игрока
|
||||
max-history-entries: 50
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ДОСТУПНЫЕ ДЛИТЕЛЬНОСТИ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Available Durations ────────────────────────────────────────────────────────
|
||||
# Each duration requires a permission. Empty permission = no restriction.
|
||||
|
||||
durations:
|
||||
# Формат: "время": "право для использования"
|
||||
"5m":
|
||||
permission: "lochat.mute.dur.5m"
|
||||
display: "5 минут"
|
||||
|
||||
display: "5 minutes"
|
||||
|
||||
"10m":
|
||||
permission: "lochat.mute.dur.10m"
|
||||
display: "10 минут"
|
||||
|
||||
display: "10 minutes"
|
||||
|
||||
"30m":
|
||||
permission: "lochat.mute.dur.30m"
|
||||
display: "30 минут"
|
||||
|
||||
display: "30 minutes"
|
||||
|
||||
"1h":
|
||||
permission: "lochat.mute.dur.1h"
|
||||
display: "1 час"
|
||||
|
||||
display: "1 hour"
|
||||
|
||||
"3h":
|
||||
permission: "lochat.mute.dur.3h"
|
||||
display: "3 часа"
|
||||
|
||||
display: "3 hours"
|
||||
|
||||
"6h":
|
||||
permission: "lochat.mute.dur.6h"
|
||||
display: "6 часов"
|
||||
|
||||
display: "6 hours"
|
||||
|
||||
"12h":
|
||||
permission: "lochat.mute.dur.12h"
|
||||
display: "12 часов"
|
||||
|
||||
display: "12 hours"
|
||||
|
||||
"1d":
|
||||
permission: "lochat.mute.dur.1d"
|
||||
display: "1 день"
|
||||
|
||||
display: "1 day"
|
||||
|
||||
"3d":
|
||||
permission: "lochat.mute.dur.3d"
|
||||
display: "3 дня"
|
||||
|
||||
display: "3 days"
|
||||
|
||||
"7d":
|
||||
permission: "lochat.mute.dur.7d"
|
||||
display: "7 дней"
|
||||
|
||||
display: "7 days"
|
||||
|
||||
"14d":
|
||||
permission: "lochat.mute.dur.14d"
|
||||
display: "14 дней"
|
||||
|
||||
display: "14 days"
|
||||
|
||||
"30d":
|
||||
permission: "lochat.mute.dur.30d"
|
||||
display: "30 дней"
|
||||
|
||||
display: "30 days"
|
||||
|
||||
"perm":
|
||||
permission: "lochat.mute.dur.perm"
|
||||
display: "Навсегда"
|
||||
display: "Permanent"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ГОТОВЫЕ ПРИЧИНЫ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Preset Reasons ─────────────────────────────────────────────────────────────
|
||||
|
||||
reasons:
|
||||
spam:
|
||||
text: "Спам в чате"
|
||||
text: "Spam"
|
||||
duration: "30m"
|
||||
permission: "lochat.mute.reason.spam"
|
||||
|
||||
|
||||
caps:
|
||||
text: "Злоупотребление заглавными буквами"
|
||||
text: "Excessive caps"
|
||||
duration: "15m"
|
||||
permission: "lochat.mute.reason.caps"
|
||||
|
||||
|
||||
swear:
|
||||
text: "Использование нецензурной лексики"
|
||||
text: "Inappropriate language"
|
||||
duration: "1h"
|
||||
permission: "lochat.mute.reason.swear"
|
||||
|
||||
|
||||
flood:
|
||||
text: "Флуд в чате"
|
||||
text: "Flood"
|
||||
duration: "20m"
|
||||
permission: "lochat.mute.reason.flood"
|
||||
|
||||
|
||||
advertising:
|
||||
text: "Реклама"
|
||||
text: "Advertising"
|
||||
duration: "3h"
|
||||
permission: "lochat.mute.reason.advertising"
|
||||
|
||||
|
||||
insult:
|
||||
text: "Оскорбления игроков"
|
||||
text: "Insulting players"
|
||||
duration: "2h"
|
||||
permission: "lochat.mute.reason.insult"
|
||||
|
||||
toxicity:
|
||||
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
|
||||
|
||||
# Мут за спам
|
||||
|
||||
spam:
|
||||
enabled: true
|
||||
threshold: 5 # Количество сообщений
|
||||
time-window: 10 # За какое время (секунды)
|
||||
threshold: 5
|
||||
time-window: 10
|
||||
duration: "10m"
|
||||
reason: "Автомут: спам в чате"
|
||||
|
||||
# Мут за мат
|
||||
reason: "Auto-mute: spam"
|
||||
|
||||
swear:
|
||||
enabled: true
|
||||
threshold: 3 # Количество нарушений
|
||||
threshold: 3
|
||||
duration: "30m"
|
||||
reason: "Автомут: использование мата"
|
||||
|
||||
# Мут за заглавные буквы
|
||||
reason: "Auto-mute: inappropriate language"
|
||||
|
||||
caps:
|
||||
enabled: true
|
||||
threshold: 5 # Количество нарушений
|
||||
threshold: 5
|
||||
duration: "5m"
|
||||
reason: "Автомут: злоупотребление CAPS"
|
||||
|
||||
# Мут за рекламу
|
||||
reason: "Auto-mute: excessive caps"
|
||||
|
||||
advertising:
|
||||
enabled: true
|
||||
threshold: 1 # Одно нарушение
|
||||
threshold: 1
|
||||
duration: "1h"
|
||||
reason: "Автомут: реклама"
|
||||
reason: "Auto-mute: advertising"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ЭСКАЛАЦИЯ НАКАЗАНИЙ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Punishment Escalation ──────────────────────────────────────────────────────
|
||||
|
||||
escalation:
|
||||
# Включить эскалацию наказаний
|
||||
enabled: true
|
||||
|
||||
# Период для подсчета нарушений (дни)
|
||||
period: 30
|
||||
|
||||
# Уровни наказаний
|
||||
|
||||
levels:
|
||||
1:
|
||||
duration: "30m"
|
||||
reason: "Первое нарушение"
|
||||
|
||||
reason: "First offense"
|
||||
|
||||
2:
|
||||
duration: "2h"
|
||||
reason: "Повторное нарушение"
|
||||
|
||||
reason: "Second offense"
|
||||
|
||||
3:
|
||||
duration: "12h"
|
||||
reason: "Третье нарушение"
|
||||
|
||||
reason: "Third offense"
|
||||
|
||||
4:
|
||||
duration: "3d"
|
||||
reason: "Четвертое нарушение"
|
||||
|
||||
reason: "Fourth offense"
|
||||
|
||||
5:
|
||||
duration: "7d"
|
||||
reason: "Пятое нарушение"
|
||||
|
||||
reason: "Fifth offense"
|
||||
|
||||
6:
|
||||
duration: "perm"
|
||||
reason: "Систематические нарушения"
|
||||
reason: "Systematic violations"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ УВЕДОМЛЕНИЯ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Notifications ──────────────────────────────────────────────────────────────
|
||||
|
||||
notifications:
|
||||
# Уведомлять администраторов о мутах
|
||||
notify-staff: true
|
||||
|
||||
# Право для получения уведомлений
|
||||
staff-permission: "lochat.mute.notify"
|
||||
|
||||
# Публичные уведомления о мутах
|
||||
public-mute: false
|
||||
|
||||
# Публичные уведомления о размутах
|
||||
public-unmute: false
|
||||
|
||||
# Скрытые муты (с флагом -s)
|
||||
|
||||
silent-mute:
|
||||
enabled: true
|
||||
permission: "lochat.mute.silent"
|
||||
notify-permission: "lochat.mute.see-silent"
|
||||
|
||||
# Формат уведомлений
|
||||
formats:
|
||||
mute: "&#FF6B6B{moderator} замутил {player} на {duration}. Причина: {reason}"
|
||||
unmute: "BCB77{moderator} размутил {player}"
|
||||
silent-mute: "&#FFA726[ТИХО] {moderator} замутил {player} на {duration}. Причина: {reason}"
|
||||
auto-mute: "&#FF6B6B[АВТО] {player} замучен на {duration}. Причина: {reason}"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ИНТЕГРАЦИИ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
formats:
|
||||
mute: "&c{moderator} &7muted &f{player} &7for &f{duration}&7. Reason: &f{reason}"
|
||||
unmute: "&a{moderator} &7unmuted &f{player}"
|
||||
silent-mute: "&6[SILENT] &f{moderator} &7muted &f{player} &7for &f{duration}"
|
||||
auto-mute: "&c[AUTO] &f{player} &7muted for &f{duration}&7. Reason: &f{reason}"
|
||||
|
||||
# ── Integrations ───────────────────────────────────────────────────────────────
|
||||
|
||||
integrations:
|
||||
# LibertyBans
|
||||
libertybans:
|
||||
enabled: false
|
||||
sync-mutes: true
|
||||
|
||||
# AdvancedBan
|
||||
|
||||
advancedban:
|
||||
enabled: false
|
||||
sync-mutes: true
|
||||
|
||||
# LiteBans
|
||||
|
||||
litebans:
|
||||
enabled: false
|
||||
sync-mutes: true
|
||||
|
||||
# Discord уведомления
|
||||
|
||||
discord:
|
||||
enabled: false
|
||||
webhook-url: ""
|
||||
format: "**{moderator}** замутил **{player}** на **{duration}**\nПричина: {reason}"
|
||||
format: "**{moderator}** muted **{player}** for **{duration}**\nReason: {reason}"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ХРАНЕНИЕ ДАННЫХ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Storage ────────────────────────────────────────────────────────────────────
|
||||
|
||||
storage:
|
||||
# Тип хранения: file, mysql, sqlite
|
||||
type: "file"
|
||||
|
||||
# Настройки MySQL
|
||||
type: file
|
||||
|
||||
mysql:
|
||||
host: "localhost"
|
||||
port: 3306
|
||||
|
|
@ -292,45 +214,36 @@ storage:
|
|||
username: "root"
|
||||
password: "password"
|
||||
table-prefix: "lochat_"
|
||||
|
||||
# Настройки SQLite
|
||||
|
||||
sqlite:
|
||||
file: "plugins/LoChat/mutes.db"
|
||||
|
||||
# Автоматическая очистка старых записей
|
||||
|
||||
cleanup:
|
||||
enabled: true
|
||||
days: 90 # Удалять записи старше N дней
|
||||
days: 90
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Extra Features ─────────────────────────────────────────────────────────────
|
||||
|
||||
features:
|
||||
# Временные муты (автоматически снимаются)
|
||||
temporary-mutes: true
|
||||
|
||||
# IP муты (мутить по IP адресу)
|
||||
|
||||
ip-mutes:
|
||||
enabled: false
|
||||
permission: "lochat.mute.ip"
|
||||
|
||||
# Мут команд (блокировать определенные команды)
|
||||
|
||||
command-mute:
|
||||
enabled: false
|
||||
blocked-commands:
|
||||
- "me"
|
||||
- "say"
|
||||
- "tell"
|
||||
|
||||
# Предупреждения перед мутом
|
||||
|
||||
warnings:
|
||||
enabled: true
|
||||
max-warnings: 3
|
||||
reset-time: 3600 # Сброс предупреждений (секунды)
|
||||
|
||||
# Апелляции на муты
|
||||
reset-time: 3600
|
||||
|
||||
appeals:
|
||||
enabled: false
|
||||
command: "/appeal"
|
||||
permission: "lochat.appeal"
|
||||
permission: "lochat.appeal"
|
||||
|
|
|
|||
|
|
@ -1,313 +1,158 @@
|
|||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
||||
# ║ LoChat Sounds Configuration ║
|
||||
# ║ Конфигурация звуков ║
|
||||
# ║ Версия: 1.5.5-1.20.1 ║
|
||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
||||
# LoChat sound configuration
|
||||
# Controls sound effects for chat events, moderation, and system actions.
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ОСНОВНЫЕ НАСТРОЙКИ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── General ────────────────────────────────────────────────────────────────────
|
||||
|
||||
settings:
|
||||
# Включить звуки
|
||||
enabled: true
|
||||
|
||||
# Глобальная громкость (0.0 - 1.0)
|
||||
global-volume: 0.5
|
||||
|
||||
# Глобальная высота тона (0.5 - 2.0)
|
||||
global-pitch: 1.0
|
||||
|
||||
# Разрешить игрокам отключать звуки
|
||||
allow-disable: true
|
||||
|
||||
# Команда для управления звуками
|
||||
toggle-command: "/sounds"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ЗВУКИ СООБЩЕНИЙ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Message Sounds ─────────────────────────────────────────────────────────────
|
||||
|
||||
messages:
|
||||
# Личные сообщения
|
||||
private-message:
|
||||
enabled: true
|
||||
sound: "BLOCK_NOTE_BLOCK_PLING"
|
||||
sound: BLOCK_NOTE_BLOCK_PLING
|
||||
volume: 0.8
|
||||
pitch: 1.2
|
||||
# Играть только получателю
|
||||
receiver-only: true
|
||||
|
||||
# Упоминания в чате
|
||||
|
||||
mention:
|
||||
enabled: true
|
||||
sound: "BLOCK_NOTE_BLOCK_BELL"
|
||||
sound: BLOCK_NOTE_BLOCK_BELL
|
||||
volume: 0.7
|
||||
pitch: 1.5
|
||||
# Дополнительный звук для @everyone
|
||||
everyone-sound: "BLOCK_NOTE_BLOCK_CHIME"
|
||||
|
||||
# Глобальный чат
|
||||
everyone-sound: BLOCK_NOTE_BLOCK_CHIME
|
||||
|
||||
global-chat:
|
||||
enabled: false
|
||||
sound: "UI_BUTTON_CLICK"
|
||||
sound: UI_BUTTON_CLICK
|
||||
volume: 0.3
|
||||
pitch: 1.0
|
||||
|
||||
# Локальный чат
|
||||
|
||||
local-chat:
|
||||
enabled: false
|
||||
sound: "UI_BUTTON_CLICK"
|
||||
sound: UI_BUTTON_CLICK
|
||||
volume: 0.2
|
||||
pitch: 0.8
|
||||
|
||||
# Объявления
|
||||
|
||||
announcement:
|
||||
enabled: true
|
||||
sound: "BLOCK_NOTE_BLOCK_CHIME"
|
||||
sound: BLOCK_NOTE_BLOCK_CHIME
|
||||
volume: 1.0
|
||||
pitch: 1.0
|
||||
# Дополнительные звуки для важных объявлений
|
||||
important-sound: "ENTITY_ENDER_DRAGON_GROWL"
|
||||
important-sound: ENTITY_ENDER_DRAGON_GROWL
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ЗВУКИ СИСТЕМЫ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── System Sounds ──────────────────────────────────────────────────────────────
|
||||
|
||||
system:
|
||||
# Подключение к серверу
|
||||
join:
|
||||
enabled: false
|
||||
sound: "ENTITY_PLAYER_LEVELUP"
|
||||
sound: ENTITY_PLAYER_LEVELUP
|
||||
volume: 0.5
|
||||
pitch: 1.0
|
||||
# Играть только подключившемуся игроку
|
||||
self-only: true
|
||||
|
||||
# Отключение от сервера
|
||||
|
||||
quit:
|
||||
enabled: false
|
||||
sound: "BLOCK_NOTE_BLOCK_BASS"
|
||||
sound: BLOCK_NOTE_BLOCK_BASS
|
||||
volume: 0.3
|
||||
pitch: 0.8
|
||||
|
||||
# Мут игрока
|
||||
|
||||
mute:
|
||||
enabled: true
|
||||
sound: "BLOCK_ANVIL_LAND"
|
||||
sound: BLOCK_ANVIL_LAND
|
||||
volume: 0.6
|
||||
pitch: 0.5
|
||||
# Играть замученному игроку
|
||||
target-sound: "ENTITY_VILLAGER_NO"
|
||||
|
||||
# Размут игрока
|
||||
target-sound: ENTITY_VILLAGER_NO
|
||||
|
||||
unmute:
|
||||
enabled: true
|
||||
sound: "ENTITY_PLAYER_LEVELUP"
|
||||
sound: ENTITY_PLAYER_LEVELUP
|
||||
volume: 0.7
|
||||
pitch: 1.2
|
||||
# Играть размученному игроку
|
||||
target-sound: "ENTITY_VILLAGER_YES"
|
||||
|
||||
# Очистка чата
|
||||
target-sound: ENTITY_VILLAGER_YES
|
||||
|
||||
clear-chat:
|
||||
enabled: true
|
||||
sound: "ITEM_BUCKET_EMPTY"
|
||||
sound: ITEM_BUCKET_EMPTY
|
||||
volume: 0.5
|
||||
pitch: 1.5
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ЗВУКИ ГРАДИЕНТОВ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Gradient Sounds ────────────────────────────────────────────────────────────
|
||||
|
||||
gradient:
|
||||
# Установка градиента
|
||||
color-set:
|
||||
enabled: true
|
||||
sound: "BLOCK_NOTE_BLOCK_HARP"
|
||||
sound: BLOCK_NOTE_BLOCK_HARP
|
||||
volume: 0.6
|
||||
pitch: 1.3
|
||||
|
||||
# Сброс градиента
|
||||
|
||||
color-reset:
|
||||
enabled: true
|
||||
sound: "BLOCK_NOTE_BLOCK_BASS"
|
||||
sound: BLOCK_NOTE_BLOCK_BASS
|
||||
volume: 0.4
|
||||
pitch: 0.7
|
||||
|
||||
# Установка префикса
|
||||
|
||||
prefix-set:
|
||||
enabled: true
|
||||
sound: "BLOCK_NOTE_BLOCK_CHIME"
|
||||
sound: BLOCK_NOTE_BLOCK_CHIME
|
||||
volume: 0.7
|
||||
pitch: 1.4
|
||||
|
||||
# Ошибка (недостаточно средств, кулдаун и т.д.)
|
||||
|
||||
error:
|
||||
enabled: true
|
||||
sound: "ENTITY_VILLAGER_NO"
|
||||
sound: ENTITY_VILLAGER_NO
|
||||
volume: 0.5
|
||||
pitch: 0.8
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ЗВУКИ КОМАНД │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Command Sounds ─────────────────────────────────────────────────────────────
|
||||
|
||||
commands:
|
||||
# Успешное выполнение команды
|
||||
success:
|
||||
enabled: false
|
||||
sound: "ENTITY_EXPERIENCE_ORB_PICKUP"
|
||||
sound: ENTITY_EXPERIENCE_ORB_PICKUP
|
||||
volume: 0.4
|
||||
pitch: 1.2
|
||||
|
||||
# Ошибка выполнения команды
|
||||
|
||||
error:
|
||||
enabled: true
|
||||
sound: "ENTITY_VILLAGER_NO"
|
||||
sound: ENTITY_VILLAGER_NO
|
||||
volume: 0.5
|
||||
pitch: 0.8
|
||||
|
||||
# Недостаточно прав
|
||||
|
||||
no-permission:
|
||||
enabled: true
|
||||
sound: "BLOCK_NOTE_BLOCK_BASS"
|
||||
sound: BLOCK_NOTE_BLOCK_BASS
|
||||
volume: 0.6
|
||||
pitch: 0.5
|
||||
|
||||
# Игрок не найден
|
||||
|
||||
player-not-found:
|
||||
enabled: true
|
||||
sound: "ENTITY_ITEM_BREAK"
|
||||
sound: ENTITY_ITEM_BREAK
|
||||
volume: 0.4
|
||||
pitch: 0.6
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ЗВУКИ ФИЛЬТРОВ │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Filter Sounds ──────────────────────────────────────────────────────────────
|
||||
|
||||
filters:
|
||||
# Сообщение заблокировано фильтром
|
||||
blocked:
|
||||
enabled: true
|
||||
sound: "ENTITY_VILLAGER_NO"
|
||||
sound: ENTITY_VILLAGER_NO
|
||||
volume: 0.6
|
||||
pitch: 0.7
|
||||
|
||||
# Предупреждение от фильтра
|
||||
|
||||
warning:
|
||||
enabled: true
|
||||
sound: "BLOCK_NOTE_BLOCK_PLING"
|
||||
sound: BLOCK_NOTE_BLOCK_PLING
|
||||
volume: 0.5
|
||||
pitch: 0.9
|
||||
|
||||
# Автоматическое исправление (например, caps)
|
||||
|
||||
auto-fix:
|
||||
enabled: false
|
||||
sound: "UI_BUTTON_CLICK"
|
||||
sound: UI_BUTTON_CLICK
|
||||
volume: 0.3
|
||||
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 @@
|
|||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
||||
# ║ Custom Commands Configuration ║
|
||||
# ║ Конфигурация кастомных команд ║
|
||||
# ╚══════════════════════════════════════════════════════════════════════════════╝
|
||||
# LoChat custom commands
|
||||
# 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:
|
||||
enabled: true
|
||||
message: |
|
||||
<gradient:#FFD700:#FFA500><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
|
||||
<gradient:#87CEEB:#4169E1><bold>📚 Помощь по серверу</bold></gradient>
|
||||
|
||||
<#FFEB3B>🏠 Основные команды:</color>
|
||||
<#9E9E9E>• <#FFFFFF>/spawn</color> - телепорт на спавн
|
||||
<#9E9E9E>• <#FFFFFF>/home</color> - телепорт домой
|
||||
<#9E9E9E>• <#FFFFFF>/sethome</color> - установить дом
|
||||
|
||||
<#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"
|
||||
<gray>Available commands:</gray>
|
||||
<gray>\u2022 <white>/spawn</white> - teleport to spawn
|
||||
<gray>\u2022 <white>/msg <player></white> - private message
|
||||
<gray>\u2022 <white>/color</white> - gradient nickname
|
||||
<gray>\u2022 <white>/prefix</white> - custom prefix
|
||||
aliases: []
|
||||
type: chat
|
||||
target: sender
|
||||
|
||||
rules:
|
||||
enabled: true
|
||||
message: |
|
||||
<gradient:#FF6B6B:#FF4500><bold>▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬</bold></gradient>
|
||||
<gradient:#87CEEB:#4169E1><bold>📋 Правила сервера</bold></gradient>
|
||||
|
||||
<#F44336><bold>🚫 Запрещено:</bold></color>
|
||||
<#9E9E9E>• Читерство и использование модов
|
||||
<#9E9E9E>• Гриферство и воровство
|
||||
<#9E9E9E>• Мат и оскорбления
|
||||
<#9E9E9E>• Спам в чате
|
||||
<#9E9E9E>• Реклама других серверов
|
||||
|
||||
<#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"
|
||||
<red><bold>Server Rules</bold></red>
|
||||
<gray>1. No cheating or hacking</gray>
|
||||
<gray>2. No griefing or stealing</gray>
|
||||
<gray>3. No swearing or insults</gray>
|
||||
<gray>4. No spam</gray>
|
||||
<gray>5. No advertising</gray>
|
||||
aliases: []
|
||||
type: chat
|
||||
target: sender
|
||||
|
||||
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"
|
||||
<color:#5865F2><bold>Join our Discord!</bold></color>
|
||||
<click:open_url:'https://discord.gg/yourserver'><u><color:#00BFFF>discord.gg/yourserver</color></u></click>
|
||||
aliases: ["ds"]
|
||||
type: chat
|
||||
target: sender
|
||||
|
||||
coords:
|
||||
enabled: true
|
||||
message: "<#FFEB3B>📍 <bold>Ваши координаты:</bold></color> <#9E9E9E>X: <#FFFFFF>{x}</color> Y: <#FFFFFF>{y}</color> Z: <#FFFFFF>{z}</color> <#9E9E9E>Мир: <#4CAF50>{world}</color>"
|
||||
aliases: ["координаты", "pos", "position"]
|
||||
type: "chat"
|
||||
target: "sender"
|
||||
message: "<gold>\u25B6 <white>X: {x} Y: {y} Z: {z} <dark_gray>World: <green>{world}</green>"
|
||||
aliases: ["pos", "position"]
|
||||
type: chat
|
||||
target: sender
|
||||
|
||||
ping:
|
||||
enabled: true
|
||||
message: "<#FFEB3B>📶 <bold>Ваш пинг:</bold></color> <#4CAF50>{ping}ms</color>"
|
||||
aliases: ["пинг"]
|
||||
type: "chat"
|
||||
target: "sender"
|
||||
type: "chat"
|
||||
target: "sender"
|
||||
message: "<gold>\u25B6 <white>Your ping: <green>{ping}ms</green>"
|
||||
aliases: []
|
||||
type: chat
|
||||
target: sender
|
||||
|
||||
hub:
|
||||
enabled: true
|
||||
message: "<#4CAF50>🏠 Подключение к хабу...</color>"
|
||||
aliases: ["lobby", "хаб"]
|
||||
type: "bungee"
|
||||
target: "sender"
|
||||
server: "hub"
|
||||
message: "<green>Connecting to hub...</green>"
|
||||
aliases: ["lobby"]
|
||||
type: bungee
|
||||
target: sender
|
||||
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:
|
||||
enabled: true
|
||||
permission: "lochat.broadcast"
|
||||
message: "{message}"
|
||||
aliases: ["bc", "объявить"]
|
||||
type: "broadcast"
|
||||
target: "all"
|
||||
aliases: ["bc"]
|
||||
type: broadcast
|
||||
target: all
|
||||
|
||||
maintenance:
|
||||
enabled: false
|
||||
permission: "lochat.maintenance"
|
||||
message: "<#FFA726><bold>🔧 Сервер переведен в режим технических работ</bold></color>"
|
||||
aliases: ["тех-работы", "техработы"]
|
||||
type: "title"
|
||||
target: "all"
|
||||
message: "<gold><bold>Server is now in maintenance mode</bold></gold>"
|
||||
aliases: []
|
||||
type: title
|
||||
target: all
|
||||
|
|
|
|||
|
|
@ -1,225 +1,166 @@
|
|||
# ╔══════════════════════════════════════════════════════════════════════════════╗
|
||||
# ║ LoChat — messages.yml ║
|
||||
# ║ 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)
|
||||
# LoChat player messages
|
||||
# All messages sent to players. Supports & color codes and placeholders.
|
||||
|
||||
prefix: "ẲE9[⚖C9LB6BD6oẲE9CⅵDChB6BD6a⚖C9tẲE9]"
|
||||
prefix: "&8[&3LoChat&8]"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Global chat (toggle messages, server-disabled notice) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Global Chat ────────────────────────────────────────────────────────────────
|
||||
|
||||
global:
|
||||
toggled-on: "⚖C9Глобальный чат ẲE9включён"
|
||||
toggled-off: "⚖C9Глобальный чат ẲE9отключён"
|
||||
disabled: "&#CF6679Глобальный чат отключён на этом сервере"
|
||||
toggled-on: "&aGlobal chat enabled"
|
||||
toggled-off: "&cGlobal chat disabled"
|
||||
disabled: "&cGlobal chat is disabled on this server"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Local chat (no recipients nearby) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Local Chat ─────────────────────────────────────────────────────────────────
|
||||
|
||||
local:
|
||||
no-players: "ẲE9Рядом нет игроков"
|
||||
nobody-heard: "⚖C9Вас никто не услышал ẲE9— рядом нет игроков"
|
||||
no-players: "&cNo players nearby"
|
||||
nobody-heard: "&7Nobody heard you — no players nearby"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Private messages (/msg, /reply) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Private Messages ───────────────────────────────────────────────────────────
|
||||
|
||||
pm:
|
||||
format-sent: "ẲE9[⚖C9→ẲE9] ⚖C9Вы ẲE9→ {receiver_display}ẲE9: &f{message}"
|
||||
format-received: "ẲE9[⚖C9←ẲE9] {sender_display} ẲE9→ ⚖C9ВыẲE9: &f{message}"
|
||||
use-gradient-names: true
|
||||
sent: "ẲE9[⚖C9→ẲE9] ⚖C9Вы ẲE9→ &f{player}ẲE9: &f{message}"
|
||||
received: "ẲE9[⚖C9←ẲE9] &f{player} ẲE9→ ⚖C9ВыẲE9: &f{message}"
|
||||
no-reply: "&#CF6679Некому ответить"
|
||||
ignored: "&#CF6679Этот игрок вас игнорирует"
|
||||
player-offline: "&#CF6679Игрок не в сети"
|
||||
self: "&#CF6679Нельзя писать самому себе"
|
||||
format-sent: "&8[&a\u2192&8] &7You &a\u2192 &f{receiver_display}&8: &f{message}"
|
||||
format-received: "&8[&e\u2190&8] &f{sender_display} &e\u2192 &7You&8: &f{message}"
|
||||
no-reply: "&cNobody to reply to"
|
||||
ignored: "&cThis player is ignoring you"
|
||||
player-offline: "&cPlayer is not online"
|
||||
self: "&cYou cannot message yourself"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Ignore list │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Ignore List ────────────────────────────────────────────────────────────────
|
||||
|
||||
ignore:
|
||||
added: "⚖C9Игрок ẲE9{player} ⚖C9добавлен в игнор"
|
||||
removed: "⚖C9Игрок ẲE9{player} ⚖C9убран из игнора"
|
||||
already-ignored: "ẲE9Игрок ẲE9{player} ẲE9уже в игноре"
|
||||
not-ignored: "ẲE9Игрок ẲE9{player} ẲE9не в игноре"
|
||||
self: "&#CF6679Нельзя игнорировать самого себя"
|
||||
list-empty: "ẲE9Ваш список игнора пуст"
|
||||
list-header: "ẲE9▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬"
|
||||
list-footer: "ẲE9Всего: ẲE9{count} ẲE9игроков"
|
||||
added: "&aPlayer &f{player} &ais now ignored"
|
||||
removed: "&aPlayer &f{player} &ais no longer ignored"
|
||||
already-ignored: "&7Player &f{player} &7is already ignored"
|
||||
not-ignored: "&7Player &f{player} &7is not ignored"
|
||||
self: "&cYou cannot ignore yourself"
|
||||
list-empty: "&7Your ignore list is empty"
|
||||
list-header: "&8\u2500\u2500\u2500\u2500\u2500 Ignored Players \u2500\u2500\u2500\u2500\u2500"
|
||||
list-footer: "&7Total: &f{count} &7players"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Announcements │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Announcements ──────────────────────────────────────────────────────────────
|
||||
|
||||
announce:
|
||||
reloaded: "⚖C9Конфигурация ẲE9перезагружена"
|
||||
reloaded: "&aConfiguration reloaded"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Chat spy (moderation) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Chat Spy ───────────────────────────────────────────────────────────────────
|
||||
|
||||
spy:
|
||||
enabled: "⚖C9Режим шпиона ẲE9включён"
|
||||
disabled: "⚖C9Режим шпиона ẲE9отключён"
|
||||
format: "ẲE9[⚖C9SPYẲE9] ẲE9{sender} ẲE9→ ⚖C9{receiver}ẲE9: &f{message}"
|
||||
chat-format: "ẲE9[⚖C9SPYẲE9] ẲE9{type} ẲE9{sender}ẲE9: &f{message}"
|
||||
enabled: "&aSpy mode enabled"
|
||||
disabled: "&cSpy mode disabled"
|
||||
format: "&8[&4SPY&8] &f{sender} &8\u2192 &7{receiver}&8: &f{message}"
|
||||
chat-format: "&8[&4SPY&8] &f{sender}&8: &f{message}"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Message filters │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Filters ────────────────────────────────────────────────────────────────────
|
||||
|
||||
filter:
|
||||
blocked: "&#CF6679Сообщение заблокировано"
|
||||
warning: "ẲE9Предупреждение"
|
||||
blocked: "&cMessage blocked"
|
||||
warning: "&6Warning"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Cooldowns │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Cooldowns ──────────────────────────────────────────────────────────────────
|
||||
|
||||
cooldown:
|
||||
wait: "ẲE9Подождите ẲE9{time} ẲE9сек"
|
||||
wait: "&cPlease wait &f{time} &cseconds"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Anti-spam (caps, repeat, similar messages) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Anti-Spam ──────────────────────────────────────────────────────────────────
|
||||
|
||||
antispam:
|
||||
caps: "&#CF6679Не кричите в чате"
|
||||
repeat: "&#CF6679Не повторяйте символы"
|
||||
similar: "&#CF6679Не отправляйте одинаковые сообщения"
|
||||
caps: "&cPlease don't shout"
|
||||
repeat: "&cPlease don't repeat characters"
|
||||
similar: "&cPlease don't send the same message"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Clear chat │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Clear Chat ─────────────────────────────────────────────────────────────────
|
||||
|
||||
clearchat:
|
||||
cleared: "⚖C9Чат очищен ẲE9администратором ẲE9{player}"
|
||||
cleared: "&aChat cleared by &f{player}"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Command / usage errors │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Errors ─────────────────────────────────────────────────────────────────────
|
||||
|
||||
errors:
|
||||
no-permission: "&#CF6679Нет прав"
|
||||
player-not-found: "&#CF6679Игрок не найден"
|
||||
invalid-usage: "ẲE9Использование: ẲE9{usage}"
|
||||
no-permission: "&cNo permission"
|
||||
player-not-found: "&cPlayer not found"
|
||||
invalid-usage: "&cUsage: &f{usage}"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ General (permissions, reload, hub, etc.) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── General ────────────────────────────────────────────────────────────────────
|
||||
|
||||
general:
|
||||
no-permission: "&#CF6679У вас нет прав!"
|
||||
players-only: "&#CF6679Только для игроков!"
|
||||
config-reloaded: "⚖C9Конфиг ẲE9перезагружен!"
|
||||
invalid-player: "&#CF6679Игрок ẲE9{player} &#CF6679не найден!"
|
||||
cooldown-active: "ẲE9Подождите ẲE9{time}с"
|
||||
command-disabled: "&#CF6679Команда отключена!"
|
||||
no-permission: "&cYou don't have permission!"
|
||||
players-only: "&cThis command is for players only!"
|
||||
config-reloaded: "&aConfiguration reloaded!"
|
||||
invalid-player: "&cPlayer &f{player} &cnot found!"
|
||||
cooldown-active: "&cPlease wait &f{time}&cs"
|
||||
command-disabled: "&cCommand disabled!"
|
||||
|
||||
# ── Hub ────────────────────────────────────────────────────────────────────────
|
||||
|
||||
hub:
|
||||
connecting: "⚖C9Подключение к ẲE9{server}⚖C9..."
|
||||
connecting: "&aConnecting to &f{server}&a..."
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Mutes │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Mute ───────────────────────────────────────────────────────────────────────
|
||||
|
||||
mute:
|
||||
muted: "⚖C9Игрок ẲE9{player} ⚖C9замучен на ẲE9{time}"
|
||||
unmuted: "⚖C9Игрок ẲE9{player} ⚖C9размучен"
|
||||
already-muted: "ẲE9Игрок ẲE9{player} ẲE9уже замучен"
|
||||
not-muted: "ẲE9Игрок ẲE9{player} ẲE9не замучен"
|
||||
you-muted: "&#CF6679Вы замучены! ẲE9Осталось: ẲE9{time}"
|
||||
permanent: "&#CF6679Вы замучены навсегда!"
|
||||
muted: "&aPlayer &f{player} &amuted for &f{time}"
|
||||
unmuted: "&aPlayer &f{player} &aunmuted"
|
||||
already-muted: "&7Player &f{player} &7is already muted"
|
||||
not-muted: "&7Player &f{player} &7is not muted"
|
||||
you-muted: "&cYou are muted! &7Remaining: &f{time}"
|
||||
permanent: "&cYou are permanently muted!"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Gradient nick module (LoPreff) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Gradients ──────────────────────────────────────────────────────────────────
|
||||
|
||||
gradient:
|
||||
color-set: "⚖C9Градиент ẲE9установлен!"
|
||||
color-enabled: "⚖C9Градиентный ник ẲE9включён"
|
||||
color-disabled: "ẲE9Градиентный ник ⚖C9отключён"
|
||||
color-reset: "ẲE9Градиент сброшен"
|
||||
prefix-set: "⚖C9Префикс ẲE9установлен!"
|
||||
prefix-reset: "ẲE9Префикс сброшен"
|
||||
prefix-reset-success: "⚖C9Префикс успешно ẲE9сброшен!"
|
||||
prefix-enabled: "⚖C9Префикс ẲE9включён"
|
||||
prefix-disabled: "ẲE9Префикс ⚖C9отключён"
|
||||
invalid-hex: "&#CF6679Неверный HEX цвет: ẲE9{color}"
|
||||
invalid-color: "&#CF6679Неверный цвет: ẲE9{color}"
|
||||
too-many-colors: "&#CF6679Слишком много цветов! Максимум: ẲE9{max}"
|
||||
too-few-colors: "&#CF6679Слишком мало цветов! Минимум: ẲE9{min}"
|
||||
not-enough-colors: "&#CF6679Слишком мало цветов! Минимум: ẲE9{min}"
|
||||
cooldown: "ẲE9Подождите ẲE9{time} ẲE9сек"
|
||||
not-enough-points: "&#CF6679Недостаточно поинтов! Нужно: ẲE9{price}"
|
||||
not-enough-points-color: "&#CF6679Недостаточно поинтов! Нужно: ẲE9{price}"
|
||||
not-enough-points-prefix: "&#CF6679Недостаточно поинтов! Нужно: ẲE9{price}"
|
||||
player-not-found: "&#CF6679Игрок не найден"
|
||||
color-help: "ẲE9Использование: ẲE9/color <HEX1> <HEX2>"
|
||||
color-success: "⚖C9Градиент успешно ẲE9установлен!"
|
||||
color-no-colors: "ẲE9У вас нет установленных цветов"
|
||||
color-copy-usage: "ẲE9Использование: ẲE9/color copy <игрок>"
|
||||
color-copy-no-colors: "ẲE9У игрока ẲE9{player} ẲE9нет цветов"
|
||||
prefix-help: "ẲE9Использование: ẲE9/prefix <текст> ẲE9или ẲE9/prefix reset"
|
||||
prefix-success: "⚖C9Префикс установлен! ẲE9Стоимость: ẲE9{price} ẲE9поинтов"
|
||||
prefix-success-free: "⚖C9Префикс ẲE9установлен!"
|
||||
prefix-no-prefix: "ẲE9У вас нет префикса"
|
||||
prefix-too-long: "&#CF6679Префикс слишком длинный! Максимум: ẲE9{max}"
|
||||
prefix-no-colors: "&#CF6679Префикс не может содержать цветовые коды!"
|
||||
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}"
|
||||
color-set: "&aGradient set!"
|
||||
color-enabled: "&aGradient nickname enabled"
|
||||
color-disabled: "&7Gradient nickname disabled"
|
||||
color-reset: "&7Gradient reset"
|
||||
prefix-set: "&aPrefix set!"
|
||||
prefix-reset: "&7Prefix reset"
|
||||
prefix-enabled: "&aPrefix enabled"
|
||||
prefix-disabled: "&7Prefix disabled"
|
||||
invalid-hex: "&cInvalid hex color: &f{color}"
|
||||
invalid-color: "&cInvalid color: &f{color}"
|
||||
too-many-colors: "&cToo many colors! Maximum: &f{max}"
|
||||
too-few-colors: "&cToo few colors! Minimum: &f{min}"
|
||||
cooldown: "&cPlease wait &f{time} &cseconds"
|
||||
not-enough-points: "&cNot enough points! Need: &f{price}"
|
||||
player-not-found: "&cPlayer not found"
|
||||
color-help: "&cUsage: &f/color <hex1> <hex2> ..."
|
||||
color-success: "&aGradient applied!"
|
||||
color-no-colors: "&7You have no colors set"
|
||||
prefix-help: "&cUsage: &f/prefix <text>"
|
||||
prefix-success: "&aPrefix set!"
|
||||
prefix-success-free: "&aPrefix set!"
|
||||
prefix-no-prefix: "&7You have no prefix"
|
||||
prefix-too-long: "&cPrefix too long! Max: &f{max}"
|
||||
prefix-no-colors: "&cPrefix cannot contain color codes"
|
||||
only-player: "&cPlayers only!"
|
||||
no-permission: "&cNo permission!"
|
||||
reload-success: "&aConfiguration reloaded!"
|
||||
info-header: "&8\u2500\u2500\u2500\u2500\u2500 &f{player} &8\u2500\u2500\u2500\u2500\u2500"
|
||||
info-prefix: "&7Prefix: &f{prefix}"
|
||||
info-colors: "&7Colors: &f{colors}"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Custom nicknames (/nick) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── Custom Nicknames ───────────────────────────────────────────────────────────
|
||||
|
||||
nick:
|
||||
current: "ẲE9Ваш ник: ẲE9{nick}"
|
||||
usage: "ẲE9Использование: ẲE9/nick <ник> ẲE9или ẲE9/nick reset"
|
||||
reset-usage: "ẲE9Используйте ẲE9/nick reset ẲE9для сброса"
|
||||
set-usage: "ẲE9Используйте ẲE9/nick <ник> ẲE9для установки"
|
||||
no-nick: "ẲE9У вас нет кастомного ника"
|
||||
reset-success: "⚖C9Ник ẲE9сброшен!"
|
||||
set-success: "⚖C9Ник изменён на: &f{nick}"
|
||||
invalid: "&#CF6679Невалидный ник!"
|
||||
requirements-header: "ẲE9Требования:"
|
||||
requirements-length: "⚖C9◆ &fДлина: 3-16 символов"
|
||||
requirements-chars: "⚖C9◆ &fБуквы, цифры, _, русские буквы"
|
||||
requirements-colors: "⚖C9◆ &fЦвета: ẲE9&#RRGGBBẲE9текст"
|
||||
taken: "&#CF6679Этот ник уже занят!"
|
||||
error: "&#CF6679Не удалось установить ник!"
|
||||
current: "&7Your nickname: &f{nick}"
|
||||
usage: "&cUsage: &f/nick <name> &7or &f/nick reset"
|
||||
no-nick: "&7You have no custom nickname"
|
||||
reset-success: "&aNickname reset!"
|
||||
set-success: "&aNickname changed to: &f{nick}"
|
||||
invalid: "&cInvalid nickname!"
|
||||
taken: "&cThis nickname is already taken!"
|
||||
error: "&cFailed to set nickname!"
|
||||
|
||||
# ┌─────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ Roleplay commands (/me, /try, /do, /roll) │
|
||||
# └─────────────────────────────────────────────────────────────────────────────┘
|
||||
# ── RP Commands ────────────────────────────────────────────────────────────────
|
||||
|
||||
rp:
|
||||
me: "<color:#7858E9>* {player} {action}</color>"
|
||||
try-format: "<color:#7858E9>* {player} пытается {action}...</color> {result}"
|
||||
try-success: "<color:#9878C9><bold>[Успех!]</bold></color>"
|
||||
try-fail: "<color:#CF6679><bold>[Провал!]</bold></color>"
|
||||
do-format: "<color:#7858E9>[<color:#7858E9>Сцена</color>]</color> <white>{description}</white> <color:#9878C9>({player})</color>"
|
||||
roll-format: "<color:#7858E9>* {player} бросает кубик и получает </color><color:#7858E9><bold>{result}</bold></color><color:#7858E9> из </color><color:#9878C9>{max}</color>"
|
||||
roll-min-error: "<color:#CF6679>Минимальное значение кубика: 2</color>"
|
||||
roll-max-error: "<color:#CF6679>Максимальное значение: 1000000</color>"
|
||||
roll-invalid-number: "<color:#CF6679>Укажите число: /roll [максимум]</color>"
|
||||
me: "&7* {player} {action}"
|
||||
try-format: "&7* {player} tries {action}... &f{result}"
|
||||
try-success: "&a[Success!]"
|
||||
try-fail: "&c[Fail!]"
|
||||
do-format: "&8[Scene] &f{description} &7({player})"
|
||||
roll-format: "&7* {player} rolls &f{result} &7out of &f{max}"
|
||||
roll-min-error: "&cMinimum dice value: 2"
|
||||
roll-max-error: "&cMaximum dice value: 1000000"
|
||||
roll-invalid-number: "&cPlease specify a number: /roll [max]"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue