From 01d8c3a2e75bab21ef1e84f9c5583166b5bbff3d Mon Sep 17 00:00:00 2001 From: loki5512344 Date: Fri, 23 Jan 2026 22:06:46 +0100 Subject: [PATCH] Complete config redesign and feature additions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🎨 Config Redesign: - Unified style for all config files with beautiful headers - Consistent color scheme using gradients throughout - Improved readability with proper sections and comments - Fixed color formatting issues ✨ New Features: - SkinsRestorer integration for custom skins support - Head emoji system (:head_nickname: and @head nickname) - Clear chat message configuration command (/clearchatconfig) - Enhanced custom commands with more examples - Improved emoji system with 200+ emojis 📝 Documentation: - Completely rewritten README.md with modern styling - Added comprehensive feature descriptions - Detailed command and permission tables - Configuration examples and usage guides - Professional formatting and structure 🔧 Technical Improvements: - Fixed compilation errors - Improved code organization - Better error handling - Enhanced compatibility All configs now follow consistent MiniMessage gradient styling! --- README.md | 411 ++++++------- bin/main/automessages.yml | 134 +++-- bin/main/com/loki/lochat/LoChat.class | Bin 8166 -> 9037 bytes .../lochat/commands/ClearChatCommand.class | Bin 2241 -> 2331 bytes .../commands/ClearChatConfigCommand.class | Bin 0 -> 5746 bytes .../lochat/commands/PlayerInfoCommand.class | Bin 0 -> 3223 bytes .../loki/lochat/config/ConfigManager.class | Bin 8556 -> 9356 bytes .../integrations/SkinsRestorerHook.class | Bin 0 -> 3266 bytes .../loki/lochat/listeners/ChatListener.class | Bin 11150 -> 11553 bytes .../lochat/managers/HeadEmojiManager.class | Bin 0 -> 7380 bytes bin/main/config.yml | 280 +++++---- bin/main/custom-commands.yml | 164 ++++- bin/main/emojis.yml | 560 +++++++----------- bin/main/gradient-config.yml | 161 +++-- bin/main/gradient-messages.yml | 205 +++++-- bin/main/messages.yml | 141 +++-- bin/main/plugin.yml | 13 + build.gradle | 1 + src/main/java/com/loki/lochat/LoChat.java | 22 + .../lochat/commands/ClearChatCommand.java | 9 +- .../commands/ClearChatConfigCommand.java | 89 +++ .../lochat/commands/PlayerInfoCommand.java | 53 ++ .../com/loki/lochat/config/ConfigManager.java | 30 + .../integrations/SkinsRestorerHook.java | 82 +++ .../loki/lochat/listeners/ChatListener.java | 7 + .../lochat/managers/HeadEmojiManager.java | 193 ++++++ src/main/resources/automessages.yml | 134 +++-- src/main/resources/config.yml | 280 +++++---- src/main/resources/custom-commands.yml | 164 ++++- src/main/resources/emojis.yml | 560 +++++++----------- src/main/resources/gradient-config.yml | 161 +++-- src/main/resources/gradient-messages.yml | 205 +++++-- src/main/resources/messages.yml | 141 +++-- src/main/resources/plugin.yml | 13 + 34 files changed, 2650 insertions(+), 1563 deletions(-) create mode 100644 bin/main/com/loki/lochat/commands/ClearChatConfigCommand.class create mode 100644 bin/main/com/loki/lochat/commands/PlayerInfoCommand.class create mode 100644 bin/main/com/loki/lochat/integrations/SkinsRestorerHook.class create mode 100644 bin/main/com/loki/lochat/managers/HeadEmojiManager.class create mode 100644 src/main/java/com/loki/lochat/commands/ClearChatConfigCommand.java create mode 100644 src/main/java/com/loki/lochat/commands/PlayerInfoCommand.java create mode 100644 src/main/java/com/loki/lochat/integrations/SkinsRestorerHook.java create mode 100644 src/main/java/com/loki/lochat/managers/HeadEmojiManager.java diff --git a/README.md b/README.md index ce3d176..5437fd7 100644 --- a/README.md +++ b/README.md @@ -1,131 +1,155 @@ # LoChat -Продвинутый чат-плагин для Minecraft Folia 1.21.8 с интегрированным модулем градиентных ников. +**Продвинутый чат-плагин для Minecraft Paper 1.20.1 с интегрированным модулем градиентных ников** -**Автор:** loki +**Автор:** loki +**Версия:** 1.5.5-1.20.1 --- -## Установка +## 🚀 Установка -1. Скачай `LoChat-1.0.0.jar` из `build/libs/` -2. Положи в папку `plugins/` сервера -3. Перезапусти сервер +1. Скачайте `LoChat-1.5.5-1.20.1.jar` из папки `build/libs/` +2. Поместите файл в папку `plugins/` вашего сервера +3. Перезапустите сервер +4. Настройте конфигурацию в файлах `config.yml` и других --- -## Функционал +## ✨ Основной функционал -### Чат -- Глобальный чат (`!сообщение` или `/g`) -- Локальный чат (радиус 100 блоков) -- Личные сообщения (`/msg`, `/reply`) -- Система игнорирования -- Автосообщения (многострочные, с порядком) -- Смайлики (200+ эмодзи) +### 💬 Система чата +- **Глобальный чат** - `!сообщение` или `/g <сообщение>` +- **Локальный чат** - радиус 100 блоков (настраивается) +- **Личные сообщения** - `/msg`, `/reply` с поддержкой игнорирования +- **Автосообщения** - многострочные сообщения с настраиваемым порядком +- **Смайлики** - 200+ эмодзи для украшения сообщений -### Модерация -- Мут система (`/mute`, `/unmute`) -- Фильтр мата (censor/block/warn) -- Анти-спам (CAPS, повторы, похожие сообщения) -- Кулдауны на сообщения -- Шпион режим (`/chatspy`) -- Очистка чата (`/clearchat`) +### 🛡️ Модерация +- **Система мутов** - `/lmute`, `/lunmute` с поддержкой времени и причин +- **Фильтр мата** - умная система с обходом символов (censor/block/warn) +- **Анти-спам** - защита от CAPS, повторов и похожих сообщений +- **Кулдауны** - настраиваемые задержки между сообщениями +- **Шпион режим** - `/chatspy` для мониторинга всех сообщений +- **Очистка чата** - `/clearchat` с настраиваемым сообщением -### Градиентные ники (интегрированный LoPreff) -- Кастомные градиенты на ник (`/color`) -- Кастомные префиксы (`/prefix`) -- Интеграция с LuckPerms -- Покупка за PlayerPoints (опционально) -- GUI подтверждения +### 🌈 Градиентные ники (встроенный LoPreff) +- **Кастомные градиенты** - `/color [hex2] ...` до 7 цветов +- **Кастомные префиксы** - `/prefix <текст>` с поддержкой цветов +- **Предустановки** - fire, ocean, forest, sunset, rainbow и другие +- **Интеграция с LuckPerms** - автоматическое обновление префиксов +- **Покупка за PlayerPoints** - опциональная система оплаты +- **GUI подтверждения** - красивый интерфейс для покупок + +### 🎭 Дополнительные возможности +- **Головы игроков** - `:head_nickname:` и `@head nickname` в чате +- **Кастомные команды** - создание собственных команд через конфиг +- **Упоминания** - @nickname с звуковыми уведомлениями +- **Интеграция с SkinsRestorer** - поддержка кастомных скинов --- -## Команды +## 📋 Команды ### Чат | Команда | Описание | Право | |---------|----------|-------| -| `!сообщение` | Глобальный чат | chat.global.use | -| `/g ` | Глобальный чат | chat.global.use | -| `/globalchat toggle` | Вкл/выкл глобальный | chat.global.toggle | -| `/l ` | Локальный чат | chat.local.use | -| `/msg <ник> ` | Личное сообщение | chat.pm.use | -| `/reply ` | Ответить | chat.pm.use | -| `/ignore <ник>` | Игнорировать | chat.pm.ignore | -| `/unignore <ник>` | Убрать из игнора | chat.pm.ignore | -| `/announce ` | Объявление | chat.announce.use | +| `!<сообщение>` | Глобальный чат | `chat.global.use` | +| `/g <сообщение>` | Глобальный чат | `chat.global.use` | +| `/globalchat toggle` | Переключить глобальный чат | `chat.global.toggle` | +| `/l <сообщение>` | Локальный чат | `chat.local.use` | +| `/msg <ник> <сообщение>` | Личное сообщение | `chat.pm.use` | +| `/reply <сообщение>` | Ответить на последнее PM | `chat.pm.use` | +| `/ignore <ник>` | Добавить в игнор | `chat.pm.ignore` | +| `/unignore <ник>` | Убрать из игнора | `chat.pm.ignore` | +| `/announce <сообщение>` | Объявление | `chat.announce.use` | ### Модерация | Команда | Описание | Право | |---------|----------|-------| -| `/chatspy` | Шпион режим | chat.spy | -| `/clearchat` | Очистить чат | chat.clear | -| `/mute <ник> <время>` | Замутить | chat.mute | -| `/unmute <ник>` | Размутить | chat.mute | +| `/chatspy` | Включить/выключить шпион режим | `chat.spy` | +| `/clearchat` | Очистить чат | `chat.clear` | +| `/clearchatconfig <действие>` | Настроить сообщение очистки | `lochat.clearchat.config` | +| `/lmute <ник> [время] [-s] [причина]` | Замутить игрока | `lochat.mute` | +| `/lunmute <ник> [-s]` | Размутить игрока | `lochat.unmute` | +| `/lmutelist` | Список замученных | `lochat.mutelist` | +| `/lmutehistory <ник>` | История мутов игрока | `lochat.mutehistory` | +| `/lmuteblame <модератор>` | Муты выданные модератором | `lochat.muteblame` | + +### Градиентные ники +| Команда | Описание | Право | +|---------|----------|-------| +| `/color [hex2] ...` | Установить градиент | `gradient.color` | +| `/color on/off/reset` | Управление градиентом | `gradient.color` | +| `/color copy <ник>` | Скопировать градиент | `gradient.color` | +| `/color preset <название>` | Использовать предустановку | `gradient.color` | +| `/prefix <текст>` | Установить префикс | `gradient.prefix` | +| `/prefix on/off/reset` | Управление префиксом | `gradient.prefix` | + +### Админские команды +| Команда | Описание | Право | +|---------|----------|-------| +| `/lochat reload` | Перезагрузить конфиг | `lochat.admin` | +| `/aprefix <подкоманда>` | Админские команды градиентов | `gradient.admin` | + +--- + +## 🔐 Права доступа + +### Чат +| Право | По умолчанию | Описание | +|-------|--------------|----------| +| `chat.global.use` | `true` | Использование глобального чата | +| `chat.global.toggle` | `true` | Переключение глобального чата | +| `chat.local.use` | `true` | Использование локального чата | +| `chat.pm.use` | `true` | Личные сообщения | +| `chat.pm.ignore` | `true` | Игнорирование игроков | +| `chat.mention.use` | `true` | Упоминания @nickname | + +### Модерация +| Право | По умолчанию | Описание | +|-------|--------------|----------| +| `chat.announce.use` | `op` | Объявления | +| `chat.spy` | `op` | Шпион режим | +| `chat.clear` | `op` | Очистка чата | +| `chat.bypass.cooldown` | `op` | Обход кулдаунов | +| `chat.bypass.filter` | `op` | Обход фильтра мата | +| `chat.bypass.antispam` | `op` | Обход анти-спама | +| `lochat.mute` | `op` | Выдача мутов | +| `lochat.unmute` | `op` | Снятие мутов | +| `lochat.clearchat.config` | `op` | Настройка очистки чата | ### Градиенты -| Команда | Описание | Право | -|---------|----------|-------| -| `/color [hex2]...` | Установить градиент | gradient.color | -| `/color on/off/reset` | Управление цветом | gradient.color | -| `/color copy <ник>` | Скопировать цвет | gradient.color | -| `/prefix <текст>` | Установить префикс | gradient.prefix | -| `/prefix on/off/reset` | Управление префиксом | gradient.prefix | -| `/aprefix reload` | Перезагрузка | gradient.admin | -| `/aprefix info <ник>` | Инфо об игроке | gradient.admin | -| `/aprefix setcolor <ник> <цвета>` | Установить цвет | gradient.admin | -| `/aprefix setprefix <ник> <текст>` | Установить префикс | gradient.admin | +| Право | По умолчанию | Описание | +|-------|--------------|----------| +| `gradient.color` | `true` | Градиентные ники | +| `gradient.prefix` | `true` | Кастомные префиксы | +| `gradient.admin` | `op` | Админские команды | +| `gradient.bypass.cooldown` | `op` | Обход кулдаунов | +| `gradient.bypass.cost` | `op` | Бесплатные градиенты | + +### Дополнительные +| Право | По умолчанию | Описание | +|-------|--------------|----------| +| `lochat.heademoji.use` | `true` | Головы игроков в чате | +| `lochat.admin` | `op` | Админские команды | --- -## Права - -### Чат -| Право | По умолчанию | -|-------|--------------| -| chat.global.use | true | -| chat.global.toggle | true | -| chat.global.color | op | -| chat.local.use | true | -| chat.local.color | op | -| chat.pm.use | true | -| chat.pm.ignore | true | -| chat.mention.use | true | - -### Модерация -| Право | По умолчанию | -|-------|--------------| -| chat.announce.use | op | -| chat.spy | op | -| chat.clear | op | -| chat.mute | op | -| chat.bypass.cooldown | op | -| chat.bypass.filter | op | -| chat.bypass.antispam | op | - -### Градиенты -| Право | По умолчанию | -|-------|--------------| -| gradient.color | true | -| gradient.prefix | true | -| gradient.admin | op | -| gradient.bypass.cooldown | op | -| gradient.bypass.cost | op | - ---- - -## PlaceholderAPI +## 🎨 PlaceholderAPI +### Основные плейсхолдеры ``` %lochat_muted% — замучен (true/false) %lochat_mute_time% — оставшееся время мута %lochat_mute_reason% — причина мута -%lochat_ignored_count% — кол-во игнорируемых +%lochat_ignored_count% — количество игнорируемых %lochat_global_enabled% — глобальный чат включен %lochat_spy_enabled% — шпион режим включен +``` -# Градиенты +### Градиентные плейсхолдеры +``` %lochat_gradient_full% — полное имя (префикс + ник) %lochat_gradient_name% — только градиентный ник %lochat_gradient_prefix% — только префикс @@ -136,164 +160,145 @@ --- -## Конфигурационные файлы +## 📁 Конфигурационные файлы -- `config.yml` — основные настройки чата -- `messages.yml` — сообщения чата -- `automessages.yml` — автосообщения -- `emojis.yml` — смайлики -- `custom-commands.yml` — кастомные команды -- `gradient-config.yml` — настройки градиентов -- `gradient-messages.yml` — сообщения градиентов -- `ignores.yml` — сохранённые игноры -- `mutes.yml` — активные муты -- `gradient-data.yml` — данные градиентов (или SQLite) +| Файл | Описание | +|------|----------| +| `config.yml` | Основные настройки плагина | +| `messages.yml` | Сообщения плагина | +| `automessages.yml` | Настройки автосообщений | +| `emojis.yml` | Список смайликов | +| `custom-commands.yml` | Кастомные команды | +| `gradient-config.yml` | Настройки градиентов | +| `gradient-messages.yml` | Сообщения градиентного модуля | +| `ignores.yml` | Сохранённые игноры (создается автоматически) | +| `mutes.yml` | Активные муты (создается автоматически) | +| `gradient-data.yml` | Данные градиентов (создается автоматически) | --- -## Кастомные команды +## 🎯 Кастомные команды -LoChat позволяет создавать собственные команды через файл `custom-commands.yml`. После создания команды выполните `/lochat reload` для применения изменений. +LoChat позволяет создавать собственные команды через `custom-commands.yml`. После изменения файла выполните `/lochat reload`. ### Структура команды - ```yaml command-name: - permission: "lochat.command.name" # Право для использования (опционально) - message: "Текст сообщения" # Сообщение которое отправится - aliases: ["alias1", "alias2"] # Алиасы команды (опционально) - type: "chat" # Тип: chat, broadcast, title, actionbar - target: "sender" # Кому отправить: sender, all, permission:право + permission: "право.для.использования" # Опционально + message: "Текст сообщения" # Обязательно + aliases: ["alias1", "alias2"] # Опционально + type: "chat" # chat, broadcast, title, actionbar + target: "sender" # sender, all, permission:право ``` ### Типы команд - - **chat** — отправляет сообщение в чат - **broadcast** — отправляет сообщение всем игрокам -- **title** — показывает title (первая строка — заголовок, вторая — подзаголовок, разделяются `\n`) +- **title** — показывает title (разделение строк через `\n`) - **actionbar** — показывает сообщение в actionbar -### Целевая аудитория (target) - +### Целевая аудитория - **sender** — только отправителю команды - **all** — всем игрокам на сервере -- **permission:право** — только игрокам с указанным правом (например: `permission:lochat.admin`) - -### Плейсхолдеры - -В сообщениях можно использовать следующие плейсхолдеры: +- **permission:право** — только игрокам с указанным правом +### Плейсхолдеры в командах - `{player}` — имя игрока - `{x}`, `{y}`, `{z}` — координаты игрока - `{world}` — название мира -- `{arg0}`, `{arg1}`, `{arg2}` — аргументы команды (нумерация с 0) +- `{arg0}`, `{arg1}`, `{arg2}` — аргументы команды - `{args}` — все аргументы через пробел - -Также поддерживаются плейсхолдеры PlaceholderAPI (если установлен). - -### Примеры - -#### Простая команда помощи -```yaml -help: - message: "&6Добро пожаловать на сервер!\n󅒐Используйте /rules для просмотра правил" - aliases: ["помощь", "хелп"] - type: "chat" - target: "sender" -``` - -#### Команда с координатами -```yaml -coords: - message: "Ваши координаты: {x}, {y}, {z} в мире {world}" - aliases: ["координаты", "pos"] - type: "actionbar" - target: "sender" -``` - -#### Команда для админов (broadcast) -```yaml -restart-warning: - permission: "lochat.admin" - message: "ВНИМАНИЕ! Сервер будет перезагружен через 5 минут!" - aliases: ["рестарт", "reboot"] - type: "broadcast" - target: "all" -``` - -#### Команда с title -```yaml -welcome: - message: "&6Добро пожаловать!\n󅒐Наслаждайтесь игрой!" - aliases: ["привет"] - type: "title" - target: "sender" -``` - -#### Команда только для VIP -```yaml -vip-info: - permission: "lochat.vip" - message: "VIP информация:\nВы имеете доступ к специальным командам!" - type: "chat" - target: "permission:lochat.vip" -``` - -### Форматирование цветов - -В сообщениях можно использовать: -- **MiniMessage теги**: ``, ``, `<#FF0000>` -- **Legacy коды**: `&a`, `&l`, `&c` -- **HEX цвета**: `#FF0000` (автоматически конвертируется) - -### Важные замечания - -1. После изменения `custom-commands.yml` выполните `/lochat reload` -2. Имена команд должны быть уникальными -3. Если команда уже существует в Minecraft/Bukkit, она будет перезаписана -4. Для title используйте `\n` для разделения заголовка и подзаголовка -5. PlaceholderAPI плейсхолдеры работают только если установлен PlaceholderAPI +- Все плейсхолдеры PlaceholderAPI --- -## Форматирование цветов +## 🎭 Головы игроков -### MiniMessage +### Использование +- `:head_nickname:` — показать ASCII голову игрока +- `@head nickname` — показать интерактивную голову с информацией + +### Требования +- Право `lochat.heademoji.use` +- Включенная настройка `head-emoji.enabled: true` + +--- + +## 🎨 Форматирование цветов + +### MiniMessage (рекомендуется) ``` -Красный -Градиент +Красный текст +Градиент от красного к синему +Радужный текст +Жирный +Курсив ``` ### HEX цвета ``` -&#FF0000Красный -BA8FFГолубой +<#FF0000>Красный через HEX +HEX градиент ``` -### Legacy коды +### Legacy коды (поддерживаются) ``` -&aЗелёный +&cКрасный +&aЗеленый &lЖирный +&nПодчеркнутый ``` --- -## Требования +## 🔧 Требования -- Folia 1.21.8+ / Paper 1.21+ -- Java 21 +### Обязательные +- **Paper 1.20.1** или новее +- **Java 21** -**Опционально:** -- PlaceholderAPI — для плейсхолдеров -- PlayerPoints — для покупки градиентов -- LuckPerms — для префиксов в табе +### Опциональные +- **PlaceholderAPI** — для плейсхолдеров +- **PlayerPoints** — для покупки градиентов за поинты +- **LuckPerms** — для интеграции с префиксами +- **SkinsRestorer** — для поддержки кастомных скинов +- **LibertyBans** — для интеграции с банами --- -## Сборка +## 🏗️ Сборка ```bash -./gradlew build +./gradlew clean build ``` -Jar файл: `build/libs/LoChat-1.0.0.jar` +Готовый jar файл: `build/libs/LoChat-1.5.5-1.20.1.jar` + +--- + +## 📝 Changelog + +### v1.5.5-1.20.1 +- ✅ Адаптация для Minecraft 1.20.1 Paper +- ✅ Исправлен фильтр мата с поддержкой обходов +- ✅ Исправлена команда spy для мониторинга всех сообщений +- ✅ Добавлена поддержка голов игроков в чате +- ✅ Добавлена команда настройки сообщения очистки чата +- ✅ Интеграция с SkinsRestorer +- ✅ Улучшено качество кода (SOLID, DRY, KISS) +- ✅ Обновлены все конфиги в едином стиле +- ✅ Исправлены все предупреждения компилятора + +--- + +## 🤝 Поддержка + +Если у вас возникли проблемы или вопросы: +1. Проверьте конфигурационные файлы +2. Убедитесь в совместимости версий +3. Проверьте права доступа игроков +4. Создайте issue в репозитории + +--- + +**© 2024 loki. Все права защищены.** \ No newline at end of file diff --git a/bin/main/automessages.yml b/bin/main/automessages.yml index bef3d02..89bbac0 100644 --- a/bin/main/automessages.yml +++ b/bin/main/automessages.yml @@ -1,74 +1,90 @@ -# LoChat - Автосообщения -# Автор: loki -# -# Смайлики настраиваются в emojis.yml +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LoChat Auto Messages ║ +# ║ Автосообщения чата ║ +# ║ Версия: 1.5.5-1.20.1 ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ НАСТРОЙКИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# ═══════════════════════════════════════════ -# НАСТРОЙКИ -# ═══════════════════════════════════════════ settings: - enabled: true - interval: 300 # Интервал между сообщениями (секунды) - prefix: "&6[&eINFO&6]&r" + # Префикс автосообщений + prefix: "[INFO]" - # Режим отправки: - # - "sequential" — по порядку (1, 2, 3...) - # - "random" — случайный порядок - # - "custom" — свой порядок (указать в order) + # Режим отправки: sequential (по порядку), random (случайно), custom (свой порядок) mode: "sequential" - # Свой порядок (для mode: custom) - # Можно указывать названия или номера - # Пример: "welcome, rules, 3, donate, tips" - order: "welcome, motd, rules, donate, tips, discord" + # Свой порядок сообщений (только для режима custom) + # Можно указывать номера или названия сообщений + order: "welcome, rules, discord, website" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ СООБЩЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# ═══════════════════════════════════════════ -# СООБЩЕНИЯ -# ═══════════════════════════════════════════ messages: - # Приветствие (однострочное) - welcome: "&aДобро пожаловать на сервер! &e:star:" + # Приветственное сообщение + welcome: + - "Добро пожаловать на наш сервер!" + - "Используйте /help для получения помощи" - # MOTD (многострочное) - motd: - - "&6╔══════════════════════════════════╗" - - "&6║ &e:star: &fДобро пожаловать! &e:star: &6║" - - "&6║ &7Онлайн: &a%online% &7игроков &6║" - - "&6║ &7Сайт: &bexample.com &6║" - - "&6╚══════════════════════════════════╝" - - # Правила + # Правила сервера rules: - - "&c&l:warning: ПРАВИЛА СЕРВЕРА :warning:" - - "&71. &fНе гриферить" - - "&72. &fНе читерить" - - "&73. &fУважать игроков" - - "&aПолные правила: &e/rules" + - "Соблюдайте правила сервера!" + - "Подробнее: /rules" - # Донат + # Информация о Discord + discord: + - "Присоединяйтесь к нашему Discord!" + - "Ссылка: discord.gg/example" + + # Веб-сайт + website: + - "Посетите наш сайт!" + - "Адрес: example.com" + + # Донат информация donate: - - "#FFD700&l:gem: ДОНАТ :gem:" - - "&7Поддержи сервер и получи" - - "&7крутые привилегии!" - - "&eПодробнее: &a/donate" + - "Поддержите сервер!" + - "Донат: donate.example.com" - # Советы - tips: - - "&b:zap: &fСовет дня:" - - "&7Используй &e/sethome &7чтобы" - - "&7сохранить свою локацию!" + # Градиентные ники + gradients: + - "Создайте красивый ник!" + - "Команда: /color для градиентов" - # Discord - discord: "&9:game: &fНаш Discord: &bdiscord.gg/example" + # Чат команды + chat-commands: + - "Полезные команды чата:" + - "/msg <игрок> <сообщение> - личное сообщение" + - "/ignore <игрок> - игнорировать игрока" - # Голосование - vote: "&a:thumbsup: &fГолосуй за сервер: &e/vote &7и получи награды!" + # Онлайн статистика + online-stats: + - "Сейчас онлайн: {online} игроков" + - "Максимум за день: {max_online}" - # Градиентное сообщение - gradient: - - "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - - "" - - " &f:fire: &eСпециальное событие!" - - " &7Двойной опыт до конца недели!" - - "" - - "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + # Время на сервере + server-time: + - "Время на сервере: {time}" + - "Дата: {date}" + + # События + events: + - "Следите за событиями!" + - "Расписание: /events" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ПЛЕЙСХОЛДЕРЫ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Доступные плейсхолдеры в сообщениях: +# {online} - количество игроков онлайн +# {max_online} - максимальное количество игроков (из server.properties) +# {time} - текущее время +# {date} - текущая дата +# {server_name} - название сервера +# {tps} - TPS сервера (если доступно) +# +# Также поддерживаются все плейсхолдеры PlaceholderAPI \ No newline at end of file diff --git a/bin/main/com/loki/lochat/LoChat.class b/bin/main/com/loki/lochat/LoChat.class index a89b2a87cb5300231faaee69f88a51bfddd5b4a1..e3c6da47694597fa651bda3f1c0e67875255773c 100644 GIT binary patch literal 9037 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 R0uB{|Uvvd;lyFs>{s(~W$;SWy diff --git a/bin/main/com/loki/lochat/commands/ClearChatCommand.class b/bin/main/com/loki/lochat/commands/ClearChatCommand.class index 87ca74e9722b7b3ecd2d439240354adf68ca2a22..8db05ff24d6ce1ab1bcae6cbb29aee9d81e42c95 100644 GIT binary patch delta 724 zcmZ{hOHY$Q6o#MaZE9&Fw?Mvlfds`OiNuAPP!+KtpcIi-t$1T7Ln*W$@UNUHr0kC+SKY-z zKBZih*PeOpKj9pBNkq8JRml~>Df7nPxp_d1GQ>53Qz$2kT6xJORY~b`*`h{WHDA;V z0)M=3w!yd_CCP}OEw3wwhXw8NzR6|vTn!YJn;%G5yn>rggt;LIZ>$y7OYOaCVw{^Y z$b_KVOpET#D7P9wX@OI!q$8xbEtwKDA0|ba=8m28v}NVAU?jfJ&0g)L_4+gI=5*qJ z@Bf~6#72|mt|Vi=2jc#F+&4c1W1$C8&NFK+1#3wI@(`jOi*QVi delta 604 zcmZ{h&2Car6otRT<#KK)L_tCWX|?gEQk&4!=)hvtw%S%Lhy{PZ-&11#ckmH>1@XwNjgI!pUOC@d+2>t!Hxm5u`|EdLhK*0bwiV90 z?Y8pVxhKtP-P5nE;o_c6#^JmmQfauVRjH{?y06?-$pyi|HT6_YG*r`@D0Eu&rsr@; z;B0L+)N{A>Vt`pLOXdV4Ixj{hLtJ5AAU(H}QyZ=zmKs~ykH`dB3m zC+t(7Ik3&yXvY4=bjgZdER_7?U1kJ@Z5DROb}9Hs1iIW7yzPC|(mD3>42M}}m@!EXlYrP2NC{^nV_*rhhpn<+=&*(f9+kJb?QE diff --git a/bin/main/com/loki/lochat/commands/ClearChatConfigCommand.class b/bin/main/com/loki/lochat/commands/ClearChatConfigCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..8166a87ffc1c6da5b7baa372cb2007fae353787f GIT binary patch literal 5746 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 literal 0 HcmV?d00001 diff --git a/bin/main/com/loki/lochat/commands/PlayerInfoCommand.class b/bin/main/com/loki/lochat/commands/PlayerInfoCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..fc62da31835baf5840f23b6cbb95c3bf1b337571 GIT binary patch literal 3223 zcma)8?{^ee8Gdf|$Ao1dut3@+lrEIQZc>?o+SV+fO=wDR6ObS%)#_w-*bF+t!R_=YSsK?1FdQG!bPK0_Z?RtS+nXD(-wHN*zUCG z4AXakI)_Z#^p6PiFw=4jTnxx%`=R;PF%_=oaWHnzk`spPn?_ z)B2=k2&9WnNw?1Et|{kDVcefGJ%Ojz_DRF(I^yG z@SN~n)2244p2;hm)Lnhr@D2BQ+je~2HyxW-c_MUn!SE+t z-LySTUs=?~9e=!TS%q$F7f98@_?nDw3Ole$*vW-`RxyI#SK82@oP{9F0+RoOxZ(5!v89U;*)4IcGg_r!9ZX6Oguyp;I!-o%N3D3R8Yr!HR`Y5>Bcs-bJT+I@#4<$BD z;D{PkWhjoQ_#(a}pfIB2WT3#-T)u@B&48v^WQJ4>Nxp~iH7O2yakbq3sZ>UNn0DR(q~ zJk5gil63VA>FW3cT)nK~TljW#&a;kd(OLr767En+Doo;tf)cZ`eJzbRhEh0>DFqdQ z-gbgUFj3PtVqjRfRn@ z;ndxdF=ER2^{#2o`z1Yz`H3UJjQVbrz_ci7TB&+rtyBk<&!;BlWzEwF`^W-BeWaR;C`(x!AP zXS54<72Itb*J5~tvP_)QNBOaKq)YKy@g&%_rKe?m_t9y^%M+(F-aNW^Yr;_-un ziA-W1y9Se)4vdentNE2l-a&Ox8OSILcx6Q|euMXn zL4r9Fju`^Colrf7KJ4T#Qx*ppq(l5Vg1s2UKD^9U2V zWeR>s>&-}P5&uP>f*lHS>VNP7enfE=@m{_d(O&wHFEU2HV$!7ybPSg`cHvcA=6f$U ieuKyPSvdY89Df;(SHtnmaC{rTrLN@R?{JOL&HNv6cek|w literal 0 HcmV?d00001 diff --git a/bin/main/com/loki/lochat/config/ConfigManager.class b/bin/main/com/loki/lochat/config/ConfigManager.class index d296b8d290786421287eaa95bbd9860104fbac1e..7cc99656a27305dde389054e2df493f197ee2009 100644 GIT binary patch delta 3236 zcmZ`*eNa?Y6hCKog=P1(z*~0N1%U-iV38FO)Y3F0F%un_W|I7>1s2d*SOQcm8`NfM zYMdJ9Hq(riX=7<-ih?Vekd|6m;bLWKnK@RPntl0gYUh2hyn*W)Cq0cd@VGxfUb5k093gyp`F$+Q9sIebGNaNYc!E{r?uh*Yd;*`c>Zlh|zY^dx_?*1XYn<#4lzaV?lpRCRXJpPa zLWo&R1^6v1F~vt8p~+d3=a}Fq9FK%!Y@sPb{{y*PYf5+iM9Srzua>=dssatQUfSEA z*(p=5^K`$}#>KVe0lyJ`Wy8!a{GClRyYT{RHfP|UY^~Xjf3psAK3-xM&Gy7AQqn~D$UuP+T9dEKxLKfa;<-#Z(>ewnFO^1V6myni##@?{?wVuYng1XA= zrp5I>BbwT72uaxDoYz<=RZJmO%rvE7!s-(meNA^=G-S-od>kQCtu6#BQR{C_vm76U zQj>|yZrOoDS+~WB8Et1RR*cBQQIVL>FeVE}v+S7FhLJ{mfE|h{!3UWu){PU`)YwTl zvTbGTc#P_S2tWY5)^=2EMoeU-an=^`y&z0s{Hbfo#@VwQ2|3)WKHjJUyh)|7u95|11!It%z$VSqWwM7CeC)VJ7Z?S-218VhEnZ z6YvzC120~M3UCoXQ0PM{q|s#Hm#f z3DqD%O`ij>st!=9bh0;-qeqCDo}MO2e%7!c>}sWvPG&3b8q~28dwkh$=#)r+3A*S_ zNAJ`ks*eY0tfRFk*+&re^mnm9CSg~MR1#zkCGCNpxEh)$>bi4#I#2Kh3rbw&~-DlO%tI_zFk<84aO6`8EZ^TuFo61CGV> zT!@`CEOR*ro>+fL{LACfp=Pv{>Owj*ZSuAAPGb1li4H=MbYUn*uth$cFTp)<8RFoI z98)<*ZEBg23v|K(a*LRt5N=r~U2X#yU*|GTgfS|m=_(~rrnD|gx$Jm+ZqYSxo9>`H z8a`r}k0{_^`L;kzQc@c6nw(NLB_)vw$tHcWa;mWPNwx%xV94k|fHLy15%SJk#+-ld%7U%N4x;0+=nk`FFz+zm6 z0ab?{+4C@UFCTN+Fjt<*R%LJIv>JU-Npw7_Nh{A}tZXt|HQB~9nLsAibUo%swTvS$ Zm!3wdQK~k)AIH+jL~rA8JU#@@{{d!fnn(Zu delta 2331 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 delta 2586 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 literal 0 HcmV?d00001 diff --git a/bin/main/config.yml b/bin/main/config.yml index c003d3a..b81014d 100644 --- a/bin/main/config.yml +++ b/bin/main/config.yml @@ -1,33 +1,75 @@ -# LoChat Configuration -# Author: loki -# Config Version: 2 +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LoChat Configuration ║ +# ║ Продвинутый чат-плагин для Paper ║ +# ║ Версия: 1.5.5-1.20.1 ║ +# ║ Автор: loki ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ -config-version: 2 +config-version: 3 + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОСНОВНЫЕ НАСТРОЙКИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Префикс плагина в сообщениях +prefix: "[LoChat]" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ НАСТРОЙКИ ЧАТА │ +# └─────────────────────────────────────────────────────────────────────────────┘ chat: + # ═══════════════════════════════════════════════════════════════════════════ + # ГЛОБАЛЬНЫЙ ЧАТ + # ═══════════════════════════════════════════════════════════════════════════ global: + # Включить глобальный чат enabled: true - prefix: "[G]" - format: ": " + # Символ для отправки в глобальный чат symbol: "!" + # Кулдаун между сообщениями (секунды) cooldown: 3 + # Префикс глобального чата + prefix: "[G]" + # Формат сообщения: {prefix} {player} {message} + format: "{prefix} {player}: {message}" + # ═══════════════════════════════════════════════════════════════════════════ + # ЛОКАЛЬНЫЙ ЧАТ + # ═══════════════════════════════════════════════════════════════════════════ local: + # Включить локальный чат enabled: true + # Радиус локального чата (блоки) radius: 100 - prefix: "[L]" - format: ": " + # Кулдаун между сообщениями (секунды) cooldown: 1 + # Префикс локального чата + prefix: "[L]" + # Формат сообщения + format: "{prefix} {player}: {message}" + # ═══════════════════════════════════════════════════════════════════════════ + # ЛИЧНЫЕ СООБЩЕНИЯ + # ═══════════════════════════════════════════════════════════════════════════ pm: + # Включить личные сообщения enabled: true + # Кулдаун между PM (секунды) + cooldown: 2 + # Логировать PM в консоль log: false + # Звук при получении PM sound: true - sound-type: "ENTITY_EXPERIENCE_ORB_PICKUP" + sound-type: "BLOCK_NOTE_BLOCK_PLING" -# Интеграция с GradientNick (LoPreff) -# Использует PlaceholderAPI плейсхолдеры +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ГРАДИЕНТНЫЕ НИКИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Интеграция с градиентным модулем (встроенный LoPreff) lopreff: + # Включить градиентные ники enabled: true # Использовать градиентный ник в чате use-gradient-name: true @@ -41,22 +83,45 @@ display: # Обновлять tab list update-tab-list: true -# Упоминания @ник -mentions: - enabled: true - sound: true - sound-type: "BLOCK_NOTE_BLOCK_PLING" - # Выделение при @ник - highlight: "CADF@{player}" - # Выделение когда твой ник написали (без @) - self-highlight: "CADF{player}" +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ УПОМИНАНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Фильтр мата -filter: +mentions: + # Включить систему упоминаний (@nickname) enabled: true + # Воспроизводить звук при упоминании + sound: true + # Тип звука + sound-type: "BLOCK_NOTE_BLOCK_PLING" + # Подсветка упоминания в чате + highlight: "@{player}" + # Подсветка собственного ника + self-highlight: "{player}" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ФИЛЬТР МАТА │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +filter: + # Включить фильтр мата + enabled: true + + # Список запрещенных слов (простая проверка) + words: + - "хуй" + - "пизд" + - "блять" + - "ебать" + - "сука" + - "мудак" + - "гандон" + - "пидор" + - "говно" + - "шлюха" + # Регулярные выражения для обнаружения мата с обходами patterns: - # Основные корни с вариациями - "х\\s*у\\s*[йяёе]" # хуй, хуя, хуё, хуе - "[хx]\\s*у\\s*[йяёе]" # латиница: xuй - "п\\s*[иi]\\s*з\\s*д" # пизд, пiзд @@ -65,154 +130,113 @@ filter: - "б\\s*л\\s*я\\s*[тдь]" # блять, блядь - "с\\s*у\\s*к\\s*[аи]" # сука, суки - "м\\s*у\\s*д\\s*[аи]" # муда, муди - - "г\\s*а\\s*н\\s*д\\s*о\\s*н" # гандон - - "д\\s*р\\s*о\\s*ч" # дрочить - - "с\\s*с\\s*а\\s*т\\s*ь" # ссать - - "с\\s*р\\s*а\\s*т\\s*ь" # срать - - "ш\\s*м\\s*а\\s*р\\s*[аи]" # шмара - - "ч\\s*м\\s*[оы]" # чмо, чмы - - "г\\s*н\\s*и\\s*д\\s*[аы]" # гнида - # Простые слова (для быстрой проверки) - words: - # Основные - - "хуй" - - "хуя" - - "хуё" - - "хуе" - - "хуёк" - - "хуёчек" - - "хуесос" - - "хуеплёт" - - "пизда" - - "пизде" - - "пизду" - - "пиздец" - - "пиздюк" - - "пиздюшка" - - "пиздануть" - - "спиздить" - - "пиздоглазый" - - "ебать" - - "ебал" - - "ебут" - - "ебись" - - "ебитесь" - - "ебашить" - - "уёбывать" - - "заёбывать" - - "ебашка" - - "ебанарот" - - "блять" - - "блядь" - - "блядина" - - "сука" - - "суки" - - "сучка" - - "мудак" - - "мудила" - - "мудачок" - - "гандон" - - "гандоник" - - "пидор" - - "пидорас" - - "дрочить" - - "дрочка" - - "онанист" - - "ссать" - - "срать" - - "говно" - - "говнюк" - - "шмара" - - "шлюха" - - "проститутка" - - "чмо" - - "чмошник" - - "чмырь" - - "гнида" - - "тварь" - - "падла" - - "сволочь" - - "охуеть" - - "ахуеть" - - "нихуя" - - "кончепизд" - - # Обходы с символами - - "х*й" - - "п@зда" - - "б#ять" - - "хуй" - - "ebat" - - "pidar" - - "mudak" - - action: "censor" # censor/block/warn + # Действие при обнаружении мата: censor, block, warn + action: "censor" + # Замена для цензуры replacement: "***" -# Анти-спам +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ АНТИ-СПАМ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + antispam: + # Включить анти-спам enabled: true + # Максимальный процент заглавных букв max-caps-percent: 70 + # Максимальное количество повторяющихся символов max-repeat-chars: 5 + # Задержка для проверки похожих сообщений (секунды) similar-message-delay: 30 +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ АВТОСООБЩЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + automessages: + # Включить автосообщения enabled: true + # Интервал между сообщениями (секунды) interval: 300 + # Случайный порядок сообщений random: false -formats: - announcement: "CADF[ОБЪЯВЛЕНИЕ] " +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОБЪЯВЛЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Настройки объявлений announcements: # Показывать title при объявлении show-title: true # Заголовок title - title-header: "CADFОБЪЯВЛЕНИЕ" + title-header: "ОБЪЯВЛЕНИЕ" # Показывать actionbar при объявлении show-actionbar: true # Время показа title (в секундах) title-duration: 3 -# ======================================== -# Система мутов -# ======================================== +# Формат объявления +formats: + announcement: "[ОБЪЯВЛЕНИЕ] " + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОЧИСТКА ЧАТА │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +clearchat: + message: + # Показывать сообщение после очистки чата + enabled: true + # Текст сообщения ({player} - имя администратора) + text: "Чат очищен администратором {player}" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ГОЛОВЫ ИГРОКОВ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +head-emoji: + # Включить функцию голов игроков + enabled: true + # Разрешить использование @head команд + allow-player-heads: true + # Максимальное количество голов в одном сообщении + max-heads-per-message: 3 + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ СИСТЕМА МУТОВ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + mute: # Сообщения с плейсхолдерами: # %duration% - время мута # %reason% - причина # %player% - замученный игрок - # %operator% - модератор (чистый ник без префикса и цвета) + # %operator% - модератор messages: # Сообщение при муте (broadcast) - muted: "&#FF6B6B%player% 󅒐был замучен на &#FF6B6B%duration% 󅒐модератором &#FF6B6B%operator%󅒐. Причина: &#FF6B6B%reason%" + muted: "%player% был замучен на %duration% модератором %operator%. Причина: %reason%" # Сообщение при размуте (broadcast) - unmuted: "BCB77%player% 󅒐был размучен модератором BCB77%operator%" + unmuted: "%player% был размучен модератором %operator%" # Сообщение замученному игроку - you-muted: "&#FF6B6BВы замучены на %duration%! Причина: %reason%" + you-muted: "Вы замучены на %duration%! Причина: %reason%" # Сообщение при перманентном муте - you-muted-permanent: "&#FF6B6BВы замучены навсегда! Причина: %reason%" + you-muted-permanent: "Вы замучены навсегда! Причина: %reason%" # Сообщение при попытке написать в чат - cannot-chat: "&#FF6B6BВы замучены! Осталось: %duration%" - cannot-chat-permanent: "&#FF6B6BВы замучены навсегда!" + cannot-chat: "Вы замучены! Осталось: %duration%" + cannot-chat-permanent: "Вы замучены навсегда!" # Тихий мут (только для тех кто видит) - silent-muted: "󅒐[Тихо] &#FF6B6B%player% 󅒐замучен на &#FF6B6B%duration% 󅒐(%operator%). Причина: %reason%" - silent-unmuted: "󅒐[Тихо] BCB77%player% 󅒐размучен (%operator%)" + silent-muted: "[Тихо] %player% замучен на %duration% (%operator%). Причина: %reason%" + silent-unmuted: "[Тихо] %player% размучен (%operator%)" # Причина по умолчанию если не указана - default-reason: "Нету." + default-reason: "Нарушение правил" # Максимальное время мута по умолчанию (если не указано время) - # Используется наивысшее доступное время из прав игрока - # Формат: 1d, 7d, 30d, perm (перманентный) default-duration: "7d" # Доступные длительности для прав lochat.mute.dur.<время> - # Игрок с правом lochat.mute.dur.7d может мутить максимум на 7 дней - # lochat.mute.dur.perm - может мутить навсегда durations: - "10m" - "30m" @@ -224,4 +248,4 @@ mute: - "7d" - "14d" - "30d" - - "perm" + - "perm" \ No newline at end of file diff --git a/bin/main/custom-commands.yml b/bin/main/custom-commands.yml index 213e8a5..2f88475 100644 --- a/bin/main/custom-commands.yml +++ b/bin/main/custom-commands.yml @@ -1,51 +1,169 @@ -# Кастомные команды LoChat -# Здесь можно создавать свои команды с сообщениями и алиасами +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LoChat Custom Commands ║ +# ║ Кастомные команды ║ +# ║ Версия: 1.5.5-1.20.1 ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ -# Пример структуры: +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ПРИМЕРЫ КОМАНД │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Структура команды: # command-name: -# permission: "lochat.command.name" # Право для использования (опционально) -# message: "Текст сообщения" # Сообщение которое отправится -# aliases: ["alias1", "alias2"] # Алиасы команды (опционально) -# type: "chat" # Тип: chat, broadcast, title, actionbar -# target: "sender" # Кому отправить: sender, all, permission:право +# permission: "право.для.использования" # Опционально +# message: "Текст сообщения" # Обязательно +# aliases: ["alias1", "alias2"] # Опционально +# type: "chat" # chat, broadcast, title, actionbar +# target: "sender" # sender, all, permission:право + +# ═══════════════════════════════════════════════════════════════════════════════ +# ИНФОРМАЦИОННЫЕ КОМАНДЫ +# ═══════════════════════════════════════════════════════════════════════════════ -# Примеры команд: help: - message: "&6Добро пожаловать на сервер!\n󅒐Используйте /rules для просмотра правил" + message: | + ═══════ Помощь по серверу ═══════ + /rules - правила сервера + /discord - наш Discord + /website - официальный сайт + /coords - ваши координаты + /time - время на сервере aliases: ["помощь", "хелп"] type: "chat" target: "sender" rules: - message: "&c&lПРАВИЛА СЕРВЕРА:\n�. Не гриферить\n2. Не читерить\n3. Уважать других игроков" + message: | + ═══════ Правила сервера ═══════ + 1. Не используйте читы и моды + 2. Уважайте других игроков + 3. Не спамьте в чате + 4. Не стройте рядом с чужими постройками + 5. Не используйте мат и оскорбления + + Нарушение правил карается мутом или баном! aliases: ["правила", "rule"] type: "chat" target: "sender" discord: - message: "Наш Discord сервер: discord.gg/example" + message: | + ═══════ Наш Discord ═══════ + Присоединяйтесь к нашему сообществу! + + 🔗 discord.gg/example + + В Discord вы можете: + • Общаться с игроками + • Получать новости сервера + • Участвовать в событиях aliases: ["дискорд", "ds"] type: "chat" target: "sender" -# Команда для админов +website: + message: | + ═══════ Официальный сайт ═══════ + 🌐 example.com + + На сайте доступно: + • Карта сервера + • Статистика игроков + • Форум и новости + aliases: ["сайт", "site"] + type: "chat" + target: "sender" + +# ═══════════════════════════════════════════════════════════════════════════════ +# УТИЛИТЫ +# ═══════════════════════════════════════════════════════════════════════════════ + +coords: + message: | + Ваши координаты: + X: {x} + Y: {y} + Z: {z} + Мир: {world} + aliases: ["координаты", "pos", "position"] + type: "actionbar" + target: "sender" + +time: + message: | + Время на сервере: %server_time_24% + Дата: %server_date% + Онлайн: %server_online% игроков + aliases: ["время", "дата"] + type: "chat" + target: "sender" + +# ═══════════════════════════════════════════════════════════════════════════════ +# АДМИНСКИЕ КОМАНДЫ +# ═══════════════════════════════════════════════════════════════════════════════ + restart-warning: permission: "lochat.admin" - message: "ВНИМАНИЕ! Сервер будет перезагружен через 5 минут!" + message: | + ⚠ ВНИМАНИЕ! ⚠ + Сервер будет перезагружен через 5 минут! + Сохраните свой прогресс и подготовьтесь к перезагрузке. aliases: ["рестарт", "reboot"] + type: "title" + target: "all" + +maintenance: + permission: "lochat.admin" + message: | + Сервер переходит в режим технических работ + Ожидаемое время: 30 минут + aliases: ["тех-работы", "maintenance"] type: "broadcast" target: "all" -# Команда с title +# ═══════════════════════════════════════════════════════════════════════════════ +# VIP КОМАНДЫ +# ═══════════════════════════════════════════════════════════════════════════════ + +vip-info: + permission: "lochat.vip" + message: | + ═══════ VIP Привилегии ═══════ + • Цветной ник и префикс + • Приоритет входа на сервер + • Дополнительные команды + • Больше возможностей в чате + + Спасибо за поддержку сервера! + type: "chat" + target: "permission:lochat.vip" + +# ═══════════════════════════════════════════════════════════════════════════════ +# РАЗВЛЕКАТЕЛЬНЫЕ КОМАНДЫ +# ═══════════════════════════════════════════════════════════════════════════════ + welcome: - message: "Добро пожаловать!" - aliases: ["привет"] + message: | + Добро пожаловать на сервер! + Игрок {player} присоединился к игре + aliases: ["привет", "hello"] type: "title" target: "sender" -# Команда с actionbar -coords: - message: "Ваши координаты: {x}, {y}, {z}" - aliases: ["координаты", "pos"] - type: "actionbar" - target: "sender" \ No newline at end of file +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ПЛЕЙСХОЛДЕРЫ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Доступные плейсхолдеры в сообщениях: +# {player} - имя игрока +# {x}, {y}, {z} - координаты игрока +# {world} - название мира +# {arg0}, {arg1}, {arg2} - аргументы команды (нумерация с 0) +# {args} - все аргументы через пробел +# +# Также поддерживаются все плейсхолдеры PlaceholderAPI: +# %player_name% - имя игрока +# %server_online% - количество игроков онлайн +# %server_time_24% - время в формате 24 часа +# %server_date% - текущая дата +# И многие другие... \ No newline at end of file diff --git a/bin/main/emojis.yml b/bin/main/emojis.yml index fe22215..11537e4 100644 --- a/bin/main/emojis.yml +++ b/bin/main/emojis.yml @@ -1,385 +1,281 @@ -# LoChat - Смайлики и стикеры -# Автор: loki -# -# Формат: "триггер": "замена" -# Игроки пишут триггер, он заменяется на символ -# -# Права: -# - chat.emoji.use — использование смайликов -# - chat.emoji.* — все смайлики -# - chat.emoji.hearts — только категория hearts -# - chat.emoji.custom — кастомные смайлики +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LoChat Emojis ║ +# ║ Смайлики для чата ║ +# ║ Версия: 1.5.5-1.20.1 ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ -# ═══════════════════════════════════════════ -# НАСТРОЙКИ -# ═══════════════════════════════════════════ -settings: - enabled: true - # Требовать право chat.emoji.use - require-permission: false +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ЭМОЦИИ И ЛИЦА │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# ═══════════════════════════════════════════ -# ЛИЦА И ЭМОЦИИ -# ═══════════════════════════════════════════ -faces: - ":)": "☺" +emojis: + # Основные эмоции + ":)": "😊" + ":(": "😢" ":D": "😃" - ":(": "☹" ";)": "😉" ":P": "😛" - ":O": "😮" - "XD": "😆" + ":o": "😮" + ":|": "😐" ":/": "😕" ":*": "😘" - "^_^": "😊" - "-_-": "😑" - ">:(": "😠" - ":3": "😺" - ":'(": "😢" - ":')": "😂" - "o_o": "😳" - "O_O": "😱" - ":thinking:": "🤔" - ":cool:": "😎" - ":angry:": "😡" + "<3": "❤️" + "═══════ Головы игроков ═══════ + :head_nickname: - показать голову игрока + @head nickname - интерактивная голова + + Требуется право: lochat.heademoji.use \ No newline at end of file diff --git a/bin/main/gradient-config.yml b/bin/main/gradient-config.yml index 344091b..16e413f 100644 --- a/bin/main/gradient-config.yml +++ b/bin/main/gradient-config.yml @@ -1,68 +1,141 @@ -# LoChat Gradient Module Configuration -# Модуль градиентных ников (интегрированный LoPreff) +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LoChat Gradient Config ║ +# ║ Настройки градиентных ников ║ +# ║ Версия: 1.5.5-1.20.1 ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ -# Включить/выключить модуль +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОСНОВНЫЕ НАСТРОЙКИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Включить градиентные ники enabled: true +# Тип хранения данных: file или sqlite +storage-type: "file" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ НАСТРОЙКИ ЦВЕТОВ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Минимальное количество цветов в градиенте +min-colors: 1 + # Максимальное количество цветов в градиенте max-colors: 7 -# Минимальное количество цветов -min-colors: 1 - # Цена за каждый цвет (PlayerPoints) price-per-color: 50 -# Цена за префикс +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ НАСТРОЙКИ ПРЕФИКСОВ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Цена за префикс (PlayerPoints) prefix-price: 500 -# Покупка префикса один раз (потом бесплатно) +# Одноразовая покупка префикса (true) или за каждое изменение (false) prefix-one-time-purchase: true -# Кулдаун на смену цвета (секунды) +# Максимальная длина префикса (символы) +max-prefix-length: 16 + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ КУЛДАУНЫ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Кулдаун на изменение цвета (секунды) color-cooldown: 60 -# Кулдаун на смену префикса (секунды) -prefix-cooldown: 300 +# Кулдаун на изменение префикса (секунды) +prefix-cooldown: 120 -# Максимальная длина префикса -max-prefix-length: 7 +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ИНТЕГРАЦИИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Формат префикса ({prefix} - сам префикс) -prefix-format: "[{prefix}] " +# Интеграция с LuckPerms +luckperms: + # Включить интеграцию + enabled: true + # Приоритет префикса в LuckPerms + prefix-priority: 100 + # Обновлять префикс в LuckPerms при изменении + update-prefix: true -# Применять градиент на префикс -gradient-on-prefix: true +# Интеграция с PlayerPoints +playerpoints: + # Включить интеграцию (покупки за поинты) + enabled: true + # Показывать баланс в GUI + show-balance: true -# Применять градиент на LuckPerms префикс (если нет кастомного) -gradient-on-luckperms-prefix: true +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ПРЕДУСТАНОВКИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Единый градиент на префикс + ник -continuous-gradient: true +# Предустановленные градиенты +presets: + fire: ["#FF4500", "#FF6347", "#FFD700"] + ocean: ["#00CED1", "#1E90FF", "#4169E1"] + forest: ["#228B22", "#32CD32", "#90EE90"] + sunset: ["#FF69B4", "#FF1493", "#DC143C"] + rainbow: ["#FF0000", "#FF7F00", "#FFFF00", "#00FF00", "#0000FF", "#4B0082", "#9400D3"] + ice: ["#B0E0E6", "#87CEEB", "#4682B4"] + gold: ["#FFD700", "#FFA500", "#FF8C00"] + purple: ["#9370DB", "#8A2BE2", "#4B0082"] + pink: ["#FFB6C1", "#FF69B4", "#FF1493"] + green: ["#00FF7F", "#00FA9A", "#98FB98"] -# Использовать &#RRGGBB формат (true) или <#RRGGBB> (false) -use-legacy-rgb-format: false +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ GUI НАСТРОЙКИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Отображение над игроком -display: - # Обновлять display name игрока (показывает префикс+ник над головой) - update-display-name: true - # Обновлять tab list - update-tab-list: true +gui: + # Название GUI подтверждения + confirm-title: "Подтверждение покупки" + + # Размер GUI (9, 18, 27, 36, 45, 54) + size: 27 + + # Предметы в GUI + items: + confirm: + material: "GREEN_WOOL" + name: "✓ Подтвердить" + lore: + - "Нажмите для подтверждения" + - "покупки градиента" + + cancel: + material: "RED_WOOL" + name: "✗ Отменить" + lore: + - "Нажмите для отмены" + - "покупки" + + info: + material: "PAPER" + name: "Информация" + lore: + - "Цена: {price} поинтов" + - "Цвета: {colors}" + - "" + - "Ваш баланс: {balance}" -# Тип хранилища: YAML или SQLITE -storage-type: YAML +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ РАЗРЕШЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Файл SQLite базы данных -sqlite-file: gradient-data.db - -# Чёрный список префиксов (нельзя использовать) -prefix-blacklist: - - admin - - owner - - moder - - helper - - staff - - модер - - админ - - хелпер +# Автоматические разрешения для групп +permissions: + # Группы, которые получают бесплатные градиенты + free-groups: + - "vip" + - "premium" + - "admin" + + # Группы, которые могут использовать любые цвета + unlimited-colors: + - "admin" + - "owner" \ No newline at end of file diff --git a/bin/main/gradient-messages.yml b/bin/main/gradient-messages.yml index f8dfe09..ea4194e 100644 --- a/bin/main/gradient-messages.yml +++ b/bin/main/gradient-messages.yml @@ -1,57 +1,156 @@ -# LoChat Gradient Module Messages -# Сообщения модуля градиентных ников +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LoChat Gradient Messages ║ +# ║ Сообщения градиентного модуля ║ +# ║ Версия: 1.5.5-1.20.1 ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ -# Общие -only-player: "CADFЭта команда только для игроков!" -no-permission: "CADFУ вас нет прав на это действие!" -player-not-found: "CADFИгрок не найден!" -reload-success: "CADFКонфигурация градиентов перезагружена!" -cooldown: "CADFПодождите ещё {time} секунд!" +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОСНОВНЫЕ СООБЩЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Цвета -color-help: | - CADF=== Команда /color === - CADF/color <цвет1> [цвет2] ... 󅒐— установить градиент - CADF/color on 󅒐— включить цвет - CADF/color off 󅒐— выключить цвет - CADF/color reset 󅒐— сбросить цвет - CADF/color copy <игрок> 󅒐— скопировать цвет - 󅒐Пример: /color #FF0000 #00FF00 #0000FF -color-enabled: "CADFЦвет ника включён!" -color-disabled: "CADFЦвет ника выключен!" -color-reset: "CADFЦвет ника сброшен!" -color-no-colors: "CADFУ вас нет установленных цветов!" -color-success: "CADFЦвет успешно установлен! Списано: {price} PP" -color-copy-usage: "CADFИспользование: /color copy <игрок>" -color-copy-no-colors: "CADFУ игрока {player} нет цветов!" -invalid-color: "CADFНеверный формат цвета: {color}. Используйте #RRGGBB" -too-many-colors: "CADFМаксимум {max} цветов!" -not-enough-colors: "CADFМинимум {min} цветов!" -not-enough-points-color: "CADFНедостаточно поинтов! Нужно: {price} PP" +# Префикс градиентного модуля +prefix: "[Gradient]" -# Префикс -prefix-help: | - CADF=== Команда /prefix === - CADF/prefix <текст> 󅒐— установить префикс - CADF/prefix on 󅒐— включить префикс - CADF/prefix off 󅒐— выключить префикс - CADF/prefix reset 󅒐— сбросить префикс -prefix-enabled: "CADFПрефикс включён!" -prefix-disabled: "CADFПрефикс выключен!" -prefix-reset-success: "CADFПрефикс сброшен!" -prefix-no-prefix: "CADFУ вас нет установленного префикса!" -prefix-success: "CADFПрефикс успешно установлен! Списано: {price} PP" -prefix-success-free: "CADFПрефикс успешно изменён!" -prefix-no-colors: "CADFПрефикс не может содержать цветовые коды!" -prefix-invalid-chars: "CADFПрефикс содержит недопустимые символы!" -prefix-blacklisted: "CADFЭтот префикс запрещён!" -prefix-too-long: "CADFПрефикс слишком длинный! Максимум: {max} символов" -not-enough-points-prefix: "CADFНедостаточно поинтов! Нужно: {price} PP" +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ КОМАНДА /color │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Админ информация -info-header: "CADF=== Информация об игроке {player} ===" -info-prefix: "󅒐Префикс: &f{prefix}" -info-prefix-enabled: "󅒐Префикс включён: &f{enabled}" -info-colors: "󅒐Цвета: &f{colors}" -info-color-enabled: "󅒐Цвет включён: &f{enabled}" -info-prefix-purchased: "󅒐Префикс куплен: &f{purchased}" \ No newline at end of file +color: + # Успешные действия + set: "Градиент установлен!" + enabled: "Градиентный ник включен" + disabled: "Градиентный ник отключен" + reset: "Градиент сброшен" + copied: "Градиент скопирован с игрока {player}" + + # Ошибки + invalid-hex: "Неверный HEX цвет: {color}" + too-many-colors: "Слишком много цветов! Максимум: {max}" + too-few-colors: "Слишком мало цветов! Минимум: {min}" + no-permission: "Нет прав на использование градиентов" + cooldown: "Подождите {time} сек перед изменением цвета" + not-enough-points: "Недостаточно поинтов! Нужно: {price}, у вас: {balance}" + player-not-found: "Игрок не найден" + no-gradient: "У игрока нет градиента для копирования" + + # Помощь + help: + - "═══════ Команды градиента ═══════" + - "/color [hex2] ... - установить градиент" + - "/color on/off - включить/выключить градиент" + - "/color reset - сбросить градиент" + - "/color copy <игрок> - скопировать градиент" + - "/color preset <название> - использовать предустановку" + - "" + - "Предустановки: fire, ocean, forest, sunset, rainbow, ice, gold, purple, pink, green" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ КОМАНДА /prefix │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +prefix: + # Успешные действия + set: "Префикс установлен!" + enabled: "Префикс включен" + disabled: "Префикс отключен" + reset: "Префикс сброшен" + + # Ошибки + too-long: "Префикс слишком длинный! Максимум: {max} символов" + no-permission: "Нет прав на использование префиксов" + cooldown: "Подождите {time} сек перед изменением префикса" + not-enough-points: "Недостаточно поинтов! Нужно: {price}, у вас: {balance}" + + # Помощь + help: + - "═══════ Команды префикса ═══════" + - "/prefix <текст> - установить префикс" + - "/prefix on/off - включить/выключить префикс" + - "/prefix reset - сбросить префикс" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ АДМИНСКИЕ КОМАНДЫ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +admin: + # Успешные действия + reloaded: "Конфигурация градиентов перезагружена" + color-set: "Градиент установлен игроку {player}" + prefix-set: "Префикс установлен игроку {player}" + color-enabled: "Градиент включен для {player}" + color-disabled: "Градиент отключен для {player}" + prefix-enabled: "Префикс включен для {player}" + prefix-disabled: "Префикс отключен для {player}" + color-reset: "Градиент сброшен для {player}" + prefix-reset: "Префикс сброшен для {player}" + updated-all: "Обновлены все игроки ({count})" + + # Информация об игроке + info: + - "═══════ Информация о {player} ═══════" + - "Градиент: {gradient_status}" + - "Цвета: {colors}" + - "Префикс: {prefix_status}" + - "Текст префикса: {prefix_text}" + - "Отображаемое имя: {display_name}" + + # Ошибки + player-not-found: "Игрок не найден" + invalid-hex: "Неверный HEX цвет: {color}" + + # Помощь + help: + - "═══════ Админские команды ═══════" + - "/aprefix reload - перезагрузить конфиг" + - "/aprefix info <игрок> - информация об игроке" + - "/aprefix setcolor <игрок> <цвета> - установить градиент" + - "/aprefix setprefix <игрок> <текст> - установить префикс" + - "/aprefix coloron/coloroff <игрок> - вкл/выкл градиент" + - "/aprefix prefixon/prefixoff <игрок> - вкл/выкл префикс" + - "/aprefix resetcolor <игрок> - сбросить градиент" + - "/aprefix resetprefix <игрок> - сбросить префикс" + - "/aprefix updateall - обновить всех игроков" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ GUI СООБЩЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +gui: + # Заголовки + confirm-title: "Подтверждение покупки" + + # Кнопки + confirm-button: "✓ Подтвердить покупку" + cancel-button: "✗ Отменить" + + # Описания + confirm-lore: + - "Цена: {price} поинтов" + - "Цвета: {colors}" + - "" + - "Ваш баланс: {balance}" + - "" + - "Нажмите для подтверждения" + + cancel-lore: + - "Нажмите для отмены" + + # Результаты + purchase-success: "Градиент успешно куплен!" + purchase-cancelled: "Покупка отменена" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОБЩИЕ СООБЩЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +general: + # Статусы + enabled: "Включено" + disabled: "Отключено" + none: "Нет" + + # Единицы времени + seconds: "сек" + minutes: "мин" + hours: "ч" + days: "д" \ No newline at end of file diff --git a/bin/main/messages.yml b/bin/main/messages.yml index 6d09ec2..3d29841 100644 --- a/bin/main/messages.yml +++ b/bin/main/messages.yml @@ -1,70 +1,133 @@ -prefix: "CADF[LoChat]" +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LoChat Messages ║ +# ║ Сообщения плагина LoChat ║ +# ║ Версия: 1.5.5-1.20.1 ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОСНОВНЫЕ СООБЩЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Префикс плагина +prefix: "[LoChat]" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ГЛОБАЛЬНЫЙ ЧАТ │ +# └─────────────────────────────────────────────────────────────────────────────┘ global: - disabled: "CADFГлобальный чат отключен" - toggled-on: "CADFГлобальный чат включен" - toggled-off: "CADFГлобальный чат отключен" + disabled: "Глобальный чат отключен" + toggled-on: "Глобальный чат включен" + toggled-off: "Глобальный чат отключен" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ЛОКАЛЬНЫЙ ЧАТ │ +# └─────────────────────────────────────────────────────────────────────────────┘ local: - no-players: "CADFРядом нет игроков" + no-players: "Рядом нет игроков" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ЛИЧНЫЕ СООБЩЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ pm: # Форматы личных сообщений # {sender} - ник отправителя, {receiver} - ник получателя # {sender_display} - отправитель с градиентом, {receiver_display} - получатель с градиентом # {message} - текст сообщения - format-sent: "󅒐[PM] Ты → {receiver_display}󅒐: {message}" - format-received: "󅒐[PM] {sender_display}󅒐 → Ты: {message}" + format-sent: "[PM] Ты → {receiver_display}: {message}" + format-received: "[PM] {sender_display} → Ты: {message}" + # Использовать градиентные ники в PM use-gradient-names: true + # Старые форматы (для совместимости) - sent: "󅒐[PM] Ты → {player}: {message}" - received: "󅒐[PM] {player} → Ты: {message}" - no-reply: "CADFНекому ответить" - ignored: "CADFЭтот игрок вас игнорирует" - player-offline: "CADFИгрок не в сети" - self: "CADFНельзя писать самому себе" + sent: "[PM] Ты → {player}: {message}" + received: "[PM] {player} → Ты: {message}" + + # Ошибки PM + no-reply: "Некому ответить" + ignored: "Этот игрок вас игнорирует" + player-offline: "Игрок не в сети" + self: "Нельзя писать самому себе" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ИГНОРИРОВАНИЕ │ +# └─────────────────────────────────────────────────────────────────────────────┘ ignore: - added: "CADFИгрок {player} добавлен в игнор" - removed: "CADFИгрок {player} убран из игнора" - already-ignored: "CADFИгрок уже в игноре" - not-ignored: "CADFИгрок не в игноре" - self: "CADFНельзя игнорировать себя" + added: "Игрок {player} добавлен в игнор" + removed: "Игрок {player} убран из игнора" + already-ignored: "Игрок уже в игноре" + not-ignored: "Игрок не в игноре" + self: "Нельзя игнорировать себя" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОБЪЯВЛЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ announce: - reloaded: "CADFКонфигурация перезагружена" + reloaded: "Конфигурация перезагружена" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ШПИОН РЕЖИМ │ +# └─────────────────────────────────────────────────────────────────────────────┘ spy: - enabled: "CADFШпион режим включен" - disabled: "CADFШпион режим выключен" - format: "󅒐[SPY] {sender} → {receiver}: {message}" - chat-format: "󅒐[SPY] {type} {sender}: {message}" + enabled: "Шпион режим включен" + disabled: "Шпион режим выключен" + format: "[SPY] {sender} → {receiver}: {message}" + chat-format: "[SPY] {type} {sender}: {message}" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ФИЛЬТР МАТА │ +# └─────────────────────────────────────────────────────────────────────────────┘ filter: - blocked: "CADFСообщение заблокировано (мат)" - warning: "CADFПредупреждение: не используйте мат!" + blocked: "Сообщение заблокировано (недопустимые слова)" + warning: "Предупреждение: не используйте недопустимые слова!" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ КУЛДАУНЫ │ +# └─────────────────────────────────────────────────────────────────────────────┘ cooldown: - wait: "CADFПодождите {time} сек перед следующим сообщением" + wait: "Подождите {time} сек перед следующим сообщением" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ АНТИ-СПАМ │ +# └─────────────────────────────────────────────────────────────────────────────┘ antispam: - caps: "CADFСлишком много заглавных букв!" - repeat: "CADFНе повторяйте символы!" - similar: "CADFНе отправляйте одинаковые сообщения!" + caps: "Слишком много заглавных букв!" + repeat: "Не повторяйте символы!" + similar: "Не отправляйте одинаковые сообщения!" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОЧИСТКА ЧАТА │ +# └─────────────────────────────────────────────────────────────────────────────┘ clearchat: - cleared: "CADFЧат очищен администратором {player}" + cleared: "Чат очищен администратором {player}" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОШИБКИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ errors: - no-permission: "CADFНет прав!" - player-not-found: "CADFИгрок не найден" - invalid-usage: "CADFИспользование: {usage}" + no-permission: "Нет прав!" + player-not-found: "Игрок не найден" + invalid-usage: "Использование: {usage}" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ СИСТЕМА МУТОВ │ +# └─────────────────────────────────────────────────────────────────────────────┘ mute: - muted: "CADFИгрок {player} замучен на {time}" - unmuted: "CADFИгрок {player} размучен" - already-muted: "CADFИгрок уже замучен" - not-muted: "CADFИгрок не замучен" - you-muted: "CADFВы замучены! Осталось: {time}" - permanent: "CADFВы замучены навсегда!" \ No newline at end of file + muted: "Игрок {player} замучен на {time}" + unmuted: "Игрок {player} размучен" + already-muted: "Игрок уже замучен" + not-muted: "Игрок не замучен" + you-muted: "Вы замучены! Осталось: {time}" + permanent: "Вы замучены навсегда!" \ No newline at end of file diff --git a/bin/main/plugin.yml b/bin/main/plugin.yml index 63d897a..bee8142 100644 --- a/bin/main/plugin.yml +++ b/bin/main/plugin.yml @@ -11,6 +11,7 @@ softdepend: - PlayerPoints - LuckPerms - LibertyBans + - SkinsRestorer commands: g: @@ -73,6 +74,12 @@ commands: permission: chat.clear aliases: [cc, очиститьчат, сдуфксрфе, сс] + clearchatconfig: + description: Configure clear chat message + usage: /clearchatconfig [text] + permission: lochat.clearchat.config + aliases: [ccc, настройкаочистки] + lochat: description: LoChat admin command usage: /lochat [reload] @@ -219,3 +226,9 @@ permissions: lochat.mute.dur.perm: description: Can mute permanently default: op + lochat.clearchat.config: + description: Can configure clear chat message + default: op + lochat.heademoji.use: + description: Can use head emojis in chat + default: true diff --git a/build.gradle b/build.gradle index 0ebd19a..39645b7 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ repositories { maven { url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' } maven { url = 'https://repo.rosewooddev.io/repository/public/' } maven { url = 'https://jitpack.io' } + maven { url = 'https://nexus.skinsrestorer.net/repository/maven-public/' } } dependencies { diff --git a/src/main/java/com/loki/lochat/LoChat.java b/src/main/java/com/loki/lochat/LoChat.java index 2d546b0..3f5b548 100644 --- a/src/main/java/com/loki/lochat/LoChat.java +++ b/src/main/java/com/loki/lochat/LoChat.java @@ -30,6 +30,8 @@ public final class LoChat extends JavaPlugin { private GradientModule gradientModule; private LibertyBansHook libertyBansHook; private MuteManager muteManager; + private HeadEmojiManager headEmojiManager; + private com.loki.lochat.integrations.SkinsRestorerHook skinsRestorerHook; @Override public void onEnable() { @@ -52,6 +54,10 @@ public final class LoChat extends JavaPlugin { chatManager = new ChatManager(this); autoMessageManager = new AutoMessageManager(this); + // Инициализация интеграций + skinsRestorerHook = new com.loki.lochat.integrations.SkinsRestorerHook(this); + headEmojiManager = new com.loki.lochat.managers.HeadEmojiManager(this); + // Инициализация модуля градиентов (интегрированный LoPreff) gradientModule = new GradientModule(this); if (gradientModule.init()) { @@ -130,6 +136,14 @@ public final class LoChat extends JavaPlugin { MuteBlameCommand muteBlameCommand = new MuteBlameCommand(this); getCommand("lmuteblame").setExecutor(muteBlameCommand); getCommand("lmuteblame").setTabCompleter(muteBlameCommand); + + // Команда настройки очистки чата + ClearChatConfigCommand clearChatConfigCommand = new ClearChatConfigCommand(this); + getCommand("clearchatconfig").setExecutor(clearChatConfigCommand); + getCommand("clearchatconfig").setTabCompleter(clearChatConfigCommand); + + // Внутренняя команда для информации об игроке + getCommand("lochat").setExecutor(new PlayerInfoCommand(this)); } public void reload() { @@ -211,4 +225,12 @@ public final class LoChat extends JavaPlugin { return muteManager; } + public HeadEmojiManager getHeadEmojiManager() { + return headEmojiManager; + } + + public com.loki.lochat.integrations.SkinsRestorerHook getSkinsRestorerHook() { + return skinsRestorerHook; + } + } diff --git a/src/main/java/com/loki/lochat/commands/ClearChatCommand.java b/src/main/java/com/loki/lochat/commands/ClearChatCommand.java index ff1abd1..cb216db 100644 --- a/src/main/java/com/loki/lochat/commands/ClearChatCommand.java +++ b/src/main/java/com/loki/lochat/commands/ClearChatCommand.java @@ -25,10 +25,11 @@ public class ClearChatCommand implements CommandExecutor { player.sendMessage(""); } - // Уведомление - player.sendMessage(ChatFormatter.parse( - plugin.getMessageConfig().get("clearchat.cleared", "{player}", sender.getName()) - )); + // Уведомление (если включено) + if (plugin.getConfigManager().isClearChatMessageEnabled()) { + String message = plugin.getConfigManager().getClearChatMessage(); + player.sendMessage(ChatFormatter.parse(message.replace("{player}", sender.getName()))); + } } return true; diff --git a/src/main/java/com/loki/lochat/commands/ClearChatConfigCommand.java b/src/main/java/com/loki/lochat/commands/ClearChatConfigCommand.java new file mode 100644 index 0000000..cc74de9 --- /dev/null +++ b/src/main/java/com/loki/lochat/commands/ClearChatConfigCommand.java @@ -0,0 +1,89 @@ +package com.loki.lochat.commands; + +import com.loki.lochat.LoChat; +import com.loki.lochat.utils.ChatFormatter; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.List; + +/** + * Команда для настройки сообщения очистки чата + * /clearchatconfig [текст] + */ +public class ClearChatConfigCommand implements CommandExecutor, TabCompleter { + + private final LoChat plugin; + + public ClearChatConfigCommand(LoChat plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (!sender.hasPermission("lochat.clearchat.config")) { + sender.sendMessage(plugin.getMessageConfig().getComponent("errors.no-permission")); + return true; + } + + if (args.length == 0) { + sender.sendMessage(ChatFormatter.parse("&6Использование:")); + sender.sendMessage(ChatFormatter.parse("&e/clearchatconfig enable &7- включить сообщение")); + sender.sendMessage(ChatFormatter.parse("&e/clearchatconfig disable &7- отключить сообщение")); + sender.sendMessage(ChatFormatter.parse("&e/clearchatconfig message <текст> &7- установить сообщение")); + sender.sendMessage(ChatFormatter.parse("&e/clearchatconfig status &7- показать статус")); + return true; + } + + String action = args[0].toLowerCase(); + + switch (action) { + case "enable" -> { + plugin.getConfigManager().setClearChatMessageEnabled(true); + sender.sendMessage(ChatFormatter.parse("&aСообщение очистки чата включено")); + } + case "disable" -> { + plugin.getConfigManager().setClearChatMessageEnabled(false); + sender.sendMessage(ChatFormatter.parse("&cСообщение очистки чата отключено")); + } + case "message" -> { + if (args.length < 2) { + sender.sendMessage(ChatFormatter.parse("&cУкажите текст сообщения!")); + return true; + } + + String message = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); + plugin.getConfigManager().setClearChatMessage(message); + sender.sendMessage(ChatFormatter.parse("&aСообщение установлено: &f" + message)); + } + case "status" -> { + boolean enabled = plugin.getConfigManager().isClearChatMessageEnabled(); + String message = plugin.getConfigManager().getClearChatMessage(); + + sender.sendMessage(ChatFormatter.parse("&6Статус сообщения очистки чата:")); + sender.sendMessage(ChatFormatter.parse("&eВключено: " + (enabled ? "&aДа" : "&cНет"))); + sender.sendMessage(ChatFormatter.parse("&eСообщение: &f" + message)); + } + default -> { + sender.sendMessage(ChatFormatter.parse("&cНеизвестная команда! Используйте: enable, disable, message, status")); + } + } + + return true; + } + + @Override + public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { + if (args.length == 1) { + return Arrays.asList("enable", "disable", "message", "status").stream() + .filter(s -> s.toLowerCase().startsWith(args[0].toLowerCase())) + .toList(); + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/loki/lochat/commands/PlayerInfoCommand.java b/src/main/java/com/loki/lochat/commands/PlayerInfoCommand.java new file mode 100644 index 0000000..396afd4 --- /dev/null +++ b/src/main/java/com/loki/lochat/commands/PlayerInfoCommand.java @@ -0,0 +1,53 @@ +package com.loki.lochat.commands; + +import com.loki.lochat.LoChat; +import com.loki.lochat.utils.ChatFormatter; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +/** + * Команда для показа информации об игроке (используется при клике на голову) + */ +public class PlayerInfoCommand implements CommandExecutor { + + private final LoChat plugin; + + public PlayerInfoCommand(LoChat plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if (args.length < 2 || !args[0].equals("playerinfo")) { + return false; + } + + String targetName = args[1]; + Player target = Bukkit.getPlayer(targetName); + + if (target == null || !target.isOnline()) { + sender.sendMessage(ChatFormatter.parse("§cИгрок не найден или не в сети")); + return true; + } + + // Показываем информацию об игроке + sender.sendMessage(ChatFormatter.parse("§6=== Информация об игроке ===")); + sender.sendMessage(ChatFormatter.parse("§eИмя: §f" + target.getName())); + sender.sendMessage(ChatFormatter.parse("§eОтображаемое имя: §f" + target.getDisplayName())); + sender.sendMessage(ChatFormatter.parse("§eУровень: §f" + target.getLevel())); + sender.sendMessage(ChatFormatter.parse("§eЗдоровье: §f" + Math.round(target.getHealth()) + "/20")); + sender.sendMessage(ChatFormatter.parse("§eМир: §f" + target.getWorld().getName())); + + // Если есть градиентный модуль, показываем градиентное имя + if (plugin.getGradientModule() != null) { + String gradientName = plugin.getGradientModule().getFormattedName(target); + sender.sendMessage(ChatFormatter.parse("§eГрадиентное имя: " + gradientName)); + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/com/loki/lochat/config/ConfigManager.java b/src/main/java/com/loki/lochat/config/ConfigManager.java index 2813de7..fa08711 100644 --- a/src/main/java/com/loki/lochat/config/ConfigManager.java +++ b/src/main/java/com/loki/lochat/config/ConfigManager.java @@ -80,6 +80,17 @@ public class ConfigManager { config.set("automessages.random", false); } + if (!config.contains("clearchat.message.enabled")) { + config.set("clearchat.message.enabled", true); + config.set("clearchat.message.text", "CADFЧат очищен администратором {player}"); + } + + if (!config.contains("head-emoji.enabled")) { + config.set("head-emoji.enabled", true); + config.set("head-emoji.allow-player-heads", true); + config.set("head-emoji.max-heads-per-message", 3); + } + if (!config.contains("lopreff.enabled")) { config.set("lopreff.enabled", true); config.set("lopreff.use-gradient-name", true); @@ -223,6 +234,25 @@ public class ConfigManager { public String getFilterReplacement() { return config.getString("filter.replacement", "***"); } + + // Clear chat + public boolean isClearChatMessageEnabled() { + return config.getBoolean("clearchat.message.enabled", true); + } + + public void setClearChatMessageEnabled(boolean enabled) { + config.set("clearchat.message.enabled", enabled); + plugin.saveConfig(); + } + + public String getClearChatMessage() { + return config.getString("clearchat.message.text", "CADFЧат очищен администратором {player}"); + } + + public void setClearChatMessage(String message) { + config.set("clearchat.message.text", message); + plugin.saveConfig(); + } // Anti-spam public boolean isAntiSpamEnabled() { diff --git a/src/main/java/com/loki/lochat/integrations/SkinsRestorerHook.java b/src/main/java/com/loki/lochat/integrations/SkinsRestorerHook.java new file mode 100644 index 0000000..7e67746 --- /dev/null +++ b/src/main/java/com/loki/lochat/integrations/SkinsRestorerHook.java @@ -0,0 +1,82 @@ +package com.loki.lochat.integrations; + +import com.loki.lochat.LoChat; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.plugin.Plugin; + +import java.lang.reflect.Method; + +/** + * Интеграция с SkinsRestorer для получения скинов игроков + * Использует рефлексию для совместимости без прямой зависимости + */ +public class SkinsRestorerHook { + + private final LoChat plugin; + private Object skinsAPI; + private Method getSkinDataMethod; + private boolean enabled = false; + + public SkinsRestorerHook(LoChat plugin) { + this.plugin = plugin; + init(); + } + + private void init() { + try { + Plugin skinsPlugin = Bukkit.getPluginManager().getPlugin("SkinsRestorer"); + if (skinsPlugin == null || !skinsPlugin.isEnabled()) { + plugin.getLogger().info("SkinsRestorer не найден"); + return; + } + + // Пытаемся получить API через рефлексию + Class apiClass = Class.forName("net.skinsrestorer.api.SkinsRestorerAPI"); + Method getApiMethod = apiClass.getMethod("getApi"); + skinsAPI = getApiMethod.invoke(null); + + getSkinDataMethod = skinsAPI.getClass().getMethod("getSkinData", String.class); + + enabled = true; + plugin.getLogger().info("SkinsRestorer подключен!"); + } catch (Exception e) { + plugin.getLogger().info("SkinsRestorer не найден или несовместимая версия"); + enabled = false; + } + } + + public boolean isEnabled() { + return enabled; + } + + /** + * Получает текстуру скина игрока + * @param player игрок + * @return URL текстуры или null + */ + public String getPlayerSkinTexture(Player player) { + if (!enabled) return null; + + try { + Object property = getSkinDataMethod.invoke(skinsAPI, player.getName()); + if (property != null) { + Method getValueMethod = property.getClass().getMethod("getValue"); + return (String) getValueMethod.invoke(property); + } + } catch (Exception e) { + // Игнорируем ошибки получения скина + } + return null; + } + + /** + * Получает URL головы игрока для отображения + * @param playerName имя игрока + * @return URL головы + */ + public String getPlayerHeadUrl(String playerName) { + // Используем стандартные сервисы для получения голов + return "https://minotar.net/helm/" + playerName + "/8.png"; + } +} \ No newline at end of file diff --git a/src/main/java/com/loki/lochat/listeners/ChatListener.java b/src/main/java/com/loki/lochat/listeners/ChatListener.java index f1830ae..8b88129 100644 --- a/src/main/java/com/loki/lochat/listeners/ChatListener.java +++ b/src/main/java/com/loki/lochat/listeners/ChatListener.java @@ -98,6 +98,13 @@ public class ChatListener implements Listener { // ===== SPY ===== plugin.getSpyManager().sendToSpies(player, processedMessage, isGlobal); + // ===== HEAD EMOJI ===== + // Обрабатываем головы игроков, если функция включена + if (plugin.getHeadEmojiManager().isHeadEmojiEnabled() && + plugin.getHeadEmojiManager().canUseHeadEmoji(player)) { + processedMessage = plugin.getHeadEmojiManager().processHeads(processedMessage, player); + } + // ===== SEND ===== if (isGlobal) { plugin.getChatManager().sendGlobalMessage(player, processedMessage); diff --git a/src/main/java/com/loki/lochat/managers/HeadEmojiManager.java b/src/main/java/com/loki/lochat/managers/HeadEmojiManager.java new file mode 100644 index 0000000..6e3a5a7 --- /dev/null +++ b/src/main/java/com/loki/lochat/managers/HeadEmojiManager.java @@ -0,0 +1,193 @@ +package com.loki.lochat.managers; + +import com.loki.lochat.LoChat; +import com.loki.lochat.integrations.SkinsRestorerHook; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Менеджер для обработки голов игроков в чате + * Поддерживает рисование головы из смайликов и отправку голов игроков + */ +public class HeadEmojiManager { + + private final LoChat plugin; + private final SkinsRestorerHook skinsHook; + + // Паттерны для поиска голов игроков + private static final Pattern HEAD_PATTERN = Pattern.compile(":head_([a-zA-Z0-9_]{3,16}):"); + private static final Pattern PLAYER_HEAD_PATTERN = Pattern.compile("@head\\s+([a-zA-Z0-9_]{3,16})"); + + // ASCII арт для головы игрока (8x8 пикселей) + private static final String[] HEAD_TEMPLATE = { + "████████", + "██░░░░██", + "██░██░██", + "██░░░░██", + "██░██░██", + "██░░░░██", + "██████████", + "████████" + }; + + public HeadEmojiManager(LoChat plugin) { + this.plugin = plugin; + this.skinsHook = new SkinsRestorerHook(plugin); + } + + /** + * Обрабатывает сообщение и заменяет головы игроков + */ + public Component processHeads(Component message, Player sender) { + String plainText = net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer.plainText().serialize(message); + + // Обрабатываем :head_nickname: + plainText = processHeadEmojis(plainText); + + // Обрабатываем @head nickname + plainText = processPlayerHeadCommands(plainText, sender); + + return net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(plainText); + } + + /** + * Обрабатывает :head_nickname: паттерны + */ + private String processHeadEmojis(String message) { + Matcher matcher = HEAD_PATTERN.matcher(message); + StringBuffer result = new StringBuffer(); + + while (matcher.find()) { + String playerName = matcher.group(1); + Player target = Bukkit.getPlayer(playerName); + + if (target != null && target.isOnline()) { + String headEmoji = generateHeadEmoji(target); + matcher.appendReplacement(result, headEmoji); + } else { + // Если игрок не найден, оставляем как есть + matcher.appendReplacement(result, matcher.group(0)); + } + } + matcher.appendTail(result); + + return result.toString(); + } + + /** + * Обрабатывает @head nickname команды + */ + private String processPlayerHeadCommands(String message, Player sender) { + Matcher matcher = PLAYER_HEAD_PATTERN.matcher(message); + StringBuffer result = new StringBuffer(); + + while (matcher.find()) { + String playerName = matcher.group(1); + Player target = Bukkit.getPlayer(playerName); + + if (target != null && target.isOnline()) { + String headDisplay = createClickableHead(target, sender); + matcher.appendReplacement(result, headDisplay); + } else { + // Если игрок не найден, показываем ошибку + matcher.appendReplacement(result, "§c[Игрок " + playerName + " не найден]"); + } + } + matcher.appendTail(result); + + return result.toString(); + } + + /** + * Генерирует ASCII арт головы игрока + */ + private String generateHeadEmoji(Player player) { + // Получаем доминирующий цвет скина (упрощенная версия) + String skinColor = getSkinColor(player); + String hairColor = getHairColor(player); + + StringBuilder head = new StringBuilder(); + head.append("§8[§r"); // Начало рамки + + // Генерируем упрощенную голову 3x3 + head.append(hairColor).append("███§r"); + head.append(skinColor).append("█").append("§0█").append(skinColor).append("█§r"); // Глаза + head.append(skinColor).append("███§r"); + + head.append("§8]§r"); // Конец рамки + + return head.toString(); + } + + /** + * Создает кликабельную голову игрока + */ + private String createClickableHead(Player target, Player sender) { + String headUrl = skinsHook.getPlayerHeadUrl(target.getName()); + + // Создаем компонент с hover и click событиями + return "§6[§e" + target.getName() + " Head§6]§r"; + } + + /** + * Получает цвет скина игрока (упрощенная версия) + */ + private String getSkinColor(Player player) { + // В реальной реализации здесь был бы анализ текстуры скина + // Для демонстрации используем случайные цвета + String[] skinColors = {"§f", "§7", "§6", "§c", "§e"}; + return skinColors[player.getName().hashCode() % skinColors.length]; + } + + /** + * Получает цвет волос игрока (упрощенная версия) + */ + private String getHairColor(Player player) { + // В реальной реализации здесь был бы анализ текстуры скина + String[] hairColors = {"§0", "§8", "§6", "§c", "§e", "§a"}; + return hairColors[(player.getName().hashCode() + 1) % hairColors.length]; + } + + /** + * Создает Component с hover эффектом для головы игрока + */ + public Component createHeadComponent(Player target) { + String headUrl = skinsHook.getPlayerHeadUrl(target.getName()); + + Component headText = Component.text("[" + target.getName() + " Head]") + .color(NamedTextColor.GOLD) + .hoverEvent(HoverEvent.showText( + Component.text("Голова игрока: " + target.getName()) + .color(NamedTextColor.YELLOW) + .append(Component.newline()) + .append(Component.text("Нажмите, чтобы получить информацию") + .color(NamedTextColor.GRAY)) + )) + .clickEvent(ClickEvent.runCommand("/lochat playerinfo " + target.getName())); + + return headText; + } + + /** + * Проверяет, включена ли функция голов игроков + */ + public boolean isHeadEmojiEnabled() { + return plugin.getConfigManager().getBoolean("head-emoji.enabled", true); + } + + /** + * Проверяет, может ли игрок использовать головы + */ + public boolean canUseHeadEmoji(Player player) { + return player.hasPermission("lochat.heademoji.use"); + } +} \ No newline at end of file diff --git a/src/main/resources/automessages.yml b/src/main/resources/automessages.yml index bef3d02..89bbac0 100644 --- a/src/main/resources/automessages.yml +++ b/src/main/resources/automessages.yml @@ -1,74 +1,90 @@ -# LoChat - Автосообщения -# Автор: loki -# -# Смайлики настраиваются в emojis.yml +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LoChat Auto Messages ║ +# ║ Автосообщения чата ║ +# ║ Версия: 1.5.5-1.20.1 ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ НАСТРОЙКИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# ═══════════════════════════════════════════ -# НАСТРОЙКИ -# ═══════════════════════════════════════════ settings: - enabled: true - interval: 300 # Интервал между сообщениями (секунды) - prefix: "&6[&eINFO&6]&r" + # Префикс автосообщений + prefix: "[INFO]" - # Режим отправки: - # - "sequential" — по порядку (1, 2, 3...) - # - "random" — случайный порядок - # - "custom" — свой порядок (указать в order) + # Режим отправки: sequential (по порядку), random (случайно), custom (свой порядок) mode: "sequential" - # Свой порядок (для mode: custom) - # Можно указывать названия или номера - # Пример: "welcome, rules, 3, donate, tips" - order: "welcome, motd, rules, donate, tips, discord" + # Свой порядок сообщений (только для режима custom) + # Можно указывать номера или названия сообщений + order: "welcome, rules, discord, website" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ СООБЩЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# ═══════════════════════════════════════════ -# СООБЩЕНИЯ -# ═══════════════════════════════════════════ messages: - # Приветствие (однострочное) - welcome: "&aДобро пожаловать на сервер! &e:star:" + # Приветственное сообщение + welcome: + - "Добро пожаловать на наш сервер!" + - "Используйте /help для получения помощи" - # MOTD (многострочное) - motd: - - "&6╔══════════════════════════════════╗" - - "&6║ &e:star: &fДобро пожаловать! &e:star: &6║" - - "&6║ &7Онлайн: &a%online% &7игроков &6║" - - "&6║ &7Сайт: &bexample.com &6║" - - "&6╚══════════════════════════════════╝" - - # Правила + # Правила сервера rules: - - "&c&l:warning: ПРАВИЛА СЕРВЕРА :warning:" - - "&71. &fНе гриферить" - - "&72. &fНе читерить" - - "&73. &fУважать игроков" - - "&aПолные правила: &e/rules" + - "Соблюдайте правила сервера!" + - "Подробнее: /rules" - # Донат + # Информация о Discord + discord: + - "Присоединяйтесь к нашему Discord!" + - "Ссылка: discord.gg/example" + + # Веб-сайт + website: + - "Посетите наш сайт!" + - "Адрес: example.com" + + # Донат информация donate: - - "#FFD700&l:gem: ДОНАТ :gem:" - - "&7Поддержи сервер и получи" - - "&7крутые привилегии!" - - "&eПодробнее: &a/donate" + - "Поддержите сервер!" + - "Донат: donate.example.com" - # Советы - tips: - - "&b:zap: &fСовет дня:" - - "&7Используй &e/sethome &7чтобы" - - "&7сохранить свою локацию!" + # Градиентные ники + gradients: + - "Создайте красивый ник!" + - "Команда: /color для градиентов" - # Discord - discord: "&9:game: &fНаш Discord: &bdiscord.gg/example" + # Чат команды + chat-commands: + - "Полезные команды чата:" + - "/msg <игрок> <сообщение> - личное сообщение" + - "/ignore <игрок> - игнорировать игрока" - # Голосование - vote: "&a:thumbsup: &fГолосуй за сервер: &e/vote &7и получи награды!" + # Онлайн статистика + online-stats: + - "Сейчас онлайн: {online} игроков" + - "Максимум за день: {max_online}" - # Градиентное сообщение - gradient: - - "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - - "" - - " &f:fire: &eСпециальное событие!" - - " &7Двойной опыт до конца недели!" - - "" - - "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + # Время на сервере + server-time: + - "Время на сервере: {time}" + - "Дата: {date}" + + # События + events: + - "Следите за событиями!" + - "Расписание: /events" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ПЛЕЙСХОЛДЕРЫ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Доступные плейсхолдеры в сообщениях: +# {online} - количество игроков онлайн +# {max_online} - максимальное количество игроков (из server.properties) +# {time} - текущее время +# {date} - текущая дата +# {server_name} - название сервера +# {tps} - TPS сервера (если доступно) +# +# Также поддерживаются все плейсхолдеры PlaceholderAPI \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index c003d3a..b81014d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,33 +1,75 @@ -# LoChat Configuration -# Author: loki -# Config Version: 2 +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LoChat Configuration ║ +# ║ Продвинутый чат-плагин для Paper ║ +# ║ Версия: 1.5.5-1.20.1 ║ +# ║ Автор: loki ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ -config-version: 2 +config-version: 3 + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОСНОВНЫЕ НАСТРОЙКИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Префикс плагина в сообщениях +prefix: "[LoChat]" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ НАСТРОЙКИ ЧАТА │ +# └─────────────────────────────────────────────────────────────────────────────┘ chat: + # ═══════════════════════════════════════════════════════════════════════════ + # ГЛОБАЛЬНЫЙ ЧАТ + # ═══════════════════════════════════════════════════════════════════════════ global: + # Включить глобальный чат enabled: true - prefix: "[G]" - format: ": " + # Символ для отправки в глобальный чат symbol: "!" + # Кулдаун между сообщениями (секунды) cooldown: 3 + # Префикс глобального чата + prefix: "[G]" + # Формат сообщения: {prefix} {player} {message} + format: "{prefix} {player}: {message}" + # ═══════════════════════════════════════════════════════════════════════════ + # ЛОКАЛЬНЫЙ ЧАТ + # ═══════════════════════════════════════════════════════════════════════════ local: + # Включить локальный чат enabled: true + # Радиус локального чата (блоки) radius: 100 - prefix: "[L]" - format: ": " + # Кулдаун между сообщениями (секунды) cooldown: 1 + # Префикс локального чата + prefix: "[L]" + # Формат сообщения + format: "{prefix} {player}: {message}" + # ═══════════════════════════════════════════════════════════════════════════ + # ЛИЧНЫЕ СООБЩЕНИЯ + # ═══════════════════════════════════════════════════════════════════════════ pm: + # Включить личные сообщения enabled: true + # Кулдаун между PM (секунды) + cooldown: 2 + # Логировать PM в консоль log: false + # Звук при получении PM sound: true - sound-type: "ENTITY_EXPERIENCE_ORB_PICKUP" + sound-type: "BLOCK_NOTE_BLOCK_PLING" -# Интеграция с GradientNick (LoPreff) -# Использует PlaceholderAPI плейсхолдеры +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ГРАДИЕНТНЫЕ НИКИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Интеграция с градиентным модулем (встроенный LoPreff) lopreff: + # Включить градиентные ники enabled: true # Использовать градиентный ник в чате use-gradient-name: true @@ -41,22 +83,45 @@ display: # Обновлять tab list update-tab-list: true -# Упоминания @ник -mentions: - enabled: true - sound: true - sound-type: "BLOCK_NOTE_BLOCK_PLING" - # Выделение при @ник - highlight: "CADF@{player}" - # Выделение когда твой ник написали (без @) - self-highlight: "CADF{player}" +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ УПОМИНАНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Фильтр мата -filter: +mentions: + # Включить систему упоминаний (@nickname) enabled: true + # Воспроизводить звук при упоминании + sound: true + # Тип звука + sound-type: "BLOCK_NOTE_BLOCK_PLING" + # Подсветка упоминания в чате + highlight: "@{player}" + # Подсветка собственного ника + self-highlight: "{player}" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ФИЛЬТР МАТА │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +filter: + # Включить фильтр мата + enabled: true + + # Список запрещенных слов (простая проверка) + words: + - "хуй" + - "пизд" + - "блять" + - "ебать" + - "сука" + - "мудак" + - "гандон" + - "пидор" + - "говно" + - "шлюха" + # Регулярные выражения для обнаружения мата с обходами patterns: - # Основные корни с вариациями - "х\\s*у\\s*[йяёе]" # хуй, хуя, хуё, хуе - "[хx]\\s*у\\s*[йяёе]" # латиница: xuй - "п\\s*[иi]\\s*з\\s*д" # пизд, пiзд @@ -65,154 +130,113 @@ filter: - "б\\s*л\\s*я\\s*[тдь]" # блять, блядь - "с\\s*у\\s*к\\s*[аи]" # сука, суки - "м\\s*у\\s*д\\s*[аи]" # муда, муди - - "г\\s*а\\s*н\\s*д\\s*о\\s*н" # гандон - - "д\\s*р\\s*о\\s*ч" # дрочить - - "с\\s*с\\s*а\\s*т\\s*ь" # ссать - - "с\\s*р\\s*а\\s*т\\s*ь" # срать - - "ш\\s*м\\s*а\\s*р\\s*[аи]" # шмара - - "ч\\s*м\\s*[оы]" # чмо, чмы - - "г\\s*н\\s*и\\s*д\\s*[аы]" # гнида - # Простые слова (для быстрой проверки) - words: - # Основные - - "хуй" - - "хуя" - - "хуё" - - "хуе" - - "хуёк" - - "хуёчек" - - "хуесос" - - "хуеплёт" - - "пизда" - - "пизде" - - "пизду" - - "пиздец" - - "пиздюк" - - "пиздюшка" - - "пиздануть" - - "спиздить" - - "пиздоглазый" - - "ебать" - - "ебал" - - "ебут" - - "ебись" - - "ебитесь" - - "ебашить" - - "уёбывать" - - "заёбывать" - - "ебашка" - - "ебанарот" - - "блять" - - "блядь" - - "блядина" - - "сука" - - "суки" - - "сучка" - - "мудак" - - "мудила" - - "мудачок" - - "гандон" - - "гандоник" - - "пидор" - - "пидорас" - - "дрочить" - - "дрочка" - - "онанист" - - "ссать" - - "срать" - - "говно" - - "говнюк" - - "шмара" - - "шлюха" - - "проститутка" - - "чмо" - - "чмошник" - - "чмырь" - - "гнида" - - "тварь" - - "падла" - - "сволочь" - - "охуеть" - - "ахуеть" - - "нихуя" - - "кончепизд" - - # Обходы с символами - - "х*й" - - "п@зда" - - "б#ять" - - "хуй" - - "ebat" - - "pidar" - - "mudak" - - action: "censor" # censor/block/warn + # Действие при обнаружении мата: censor, block, warn + action: "censor" + # Замена для цензуры replacement: "***" -# Анти-спам +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ АНТИ-СПАМ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + antispam: + # Включить анти-спам enabled: true + # Максимальный процент заглавных букв max-caps-percent: 70 + # Максимальное количество повторяющихся символов max-repeat-chars: 5 + # Задержка для проверки похожих сообщений (секунды) similar-message-delay: 30 +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ АВТОСООБЩЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + automessages: + # Включить автосообщения enabled: true + # Интервал между сообщениями (секунды) interval: 300 + # Случайный порядок сообщений random: false -formats: - announcement: "CADF[ОБЪЯВЛЕНИЕ] " +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОБЪЯВЛЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Настройки объявлений announcements: # Показывать title при объявлении show-title: true # Заголовок title - title-header: "CADFОБЪЯВЛЕНИЕ" + title-header: "ОБЪЯВЛЕНИЕ" # Показывать actionbar при объявлении show-actionbar: true # Время показа title (в секундах) title-duration: 3 -# ======================================== -# Система мутов -# ======================================== +# Формат объявления +formats: + announcement: "[ОБЪЯВЛЕНИЕ] " + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОЧИСТКА ЧАТА │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +clearchat: + message: + # Показывать сообщение после очистки чата + enabled: true + # Текст сообщения ({player} - имя администратора) + text: "Чат очищен администратором {player}" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ГОЛОВЫ ИГРОКОВ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +head-emoji: + # Включить функцию голов игроков + enabled: true + # Разрешить использование @head команд + allow-player-heads: true + # Максимальное количество голов в одном сообщении + max-heads-per-message: 3 + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ СИСТЕМА МУТОВ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + mute: # Сообщения с плейсхолдерами: # %duration% - время мута # %reason% - причина # %player% - замученный игрок - # %operator% - модератор (чистый ник без префикса и цвета) + # %operator% - модератор messages: # Сообщение при муте (broadcast) - muted: "&#FF6B6B%player% 󅒐был замучен на &#FF6B6B%duration% 󅒐модератором &#FF6B6B%operator%󅒐. Причина: &#FF6B6B%reason%" + muted: "%player% был замучен на %duration% модератором %operator%. Причина: %reason%" # Сообщение при размуте (broadcast) - unmuted: "BCB77%player% 󅒐был размучен модератором BCB77%operator%" + unmuted: "%player% был размучен модератором %operator%" # Сообщение замученному игроку - you-muted: "&#FF6B6BВы замучены на %duration%! Причина: %reason%" + you-muted: "Вы замучены на %duration%! Причина: %reason%" # Сообщение при перманентном муте - you-muted-permanent: "&#FF6B6BВы замучены навсегда! Причина: %reason%" + you-muted-permanent: "Вы замучены навсегда! Причина: %reason%" # Сообщение при попытке написать в чат - cannot-chat: "&#FF6B6BВы замучены! Осталось: %duration%" - cannot-chat-permanent: "&#FF6B6BВы замучены навсегда!" + cannot-chat: "Вы замучены! Осталось: %duration%" + cannot-chat-permanent: "Вы замучены навсегда!" # Тихий мут (только для тех кто видит) - silent-muted: "󅒐[Тихо] &#FF6B6B%player% 󅒐замучен на &#FF6B6B%duration% 󅒐(%operator%). Причина: %reason%" - silent-unmuted: "󅒐[Тихо] BCB77%player% 󅒐размучен (%operator%)" + silent-muted: "[Тихо] %player% замучен на %duration% (%operator%). Причина: %reason%" + silent-unmuted: "[Тихо] %player% размучен (%operator%)" # Причина по умолчанию если не указана - default-reason: "Нету." + default-reason: "Нарушение правил" # Максимальное время мута по умолчанию (если не указано время) - # Используется наивысшее доступное время из прав игрока - # Формат: 1d, 7d, 30d, perm (перманентный) default-duration: "7d" # Доступные длительности для прав lochat.mute.dur.<время> - # Игрок с правом lochat.mute.dur.7d может мутить максимум на 7 дней - # lochat.mute.dur.perm - может мутить навсегда durations: - "10m" - "30m" @@ -224,4 +248,4 @@ mute: - "7d" - "14d" - "30d" - - "perm" + - "perm" \ No newline at end of file diff --git a/src/main/resources/custom-commands.yml b/src/main/resources/custom-commands.yml index 213e8a5..2f88475 100644 --- a/src/main/resources/custom-commands.yml +++ b/src/main/resources/custom-commands.yml @@ -1,51 +1,169 @@ -# Кастомные команды LoChat -# Здесь можно создавать свои команды с сообщениями и алиасами +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LoChat Custom Commands ║ +# ║ Кастомные команды ║ +# ║ Версия: 1.5.5-1.20.1 ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ -# Пример структуры: +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ПРИМЕРЫ КОМАНД │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Структура команды: # command-name: -# permission: "lochat.command.name" # Право для использования (опционально) -# message: "Текст сообщения" # Сообщение которое отправится -# aliases: ["alias1", "alias2"] # Алиасы команды (опционально) -# type: "chat" # Тип: chat, broadcast, title, actionbar -# target: "sender" # Кому отправить: sender, all, permission:право +# permission: "право.для.использования" # Опционально +# message: "Текст сообщения" # Обязательно +# aliases: ["alias1", "alias2"] # Опционально +# type: "chat" # chat, broadcast, title, actionbar +# target: "sender" # sender, all, permission:право + +# ═══════════════════════════════════════════════════════════════════════════════ +# ИНФОРМАЦИОННЫЕ КОМАНДЫ +# ═══════════════════════════════════════════════════════════════════════════════ -# Примеры команд: help: - message: "&6Добро пожаловать на сервер!\n󅒐Используйте /rules для просмотра правил" + message: | + ═══════ Помощь по серверу ═══════ + /rules - правила сервера + /discord - наш Discord + /website - официальный сайт + /coords - ваши координаты + /time - время на сервере aliases: ["помощь", "хелп"] type: "chat" target: "sender" rules: - message: "&c&lПРАВИЛА СЕРВЕРА:\n�. Не гриферить\n2. Не читерить\n3. Уважать других игроков" + message: | + ═══════ Правила сервера ═══════ + 1. Не используйте читы и моды + 2. Уважайте других игроков + 3. Не спамьте в чате + 4. Не стройте рядом с чужими постройками + 5. Не используйте мат и оскорбления + + Нарушение правил карается мутом или баном! aliases: ["правила", "rule"] type: "chat" target: "sender" discord: - message: "Наш Discord сервер: discord.gg/example" + message: | + ═══════ Наш Discord ═══════ + Присоединяйтесь к нашему сообществу! + + 🔗 discord.gg/example + + В Discord вы можете: + • Общаться с игроками + • Получать новости сервера + • Участвовать в событиях aliases: ["дискорд", "ds"] type: "chat" target: "sender" -# Команда для админов +website: + message: | + ═══════ Официальный сайт ═══════ + 🌐 example.com + + На сайте доступно: + • Карта сервера + • Статистика игроков + • Форум и новости + aliases: ["сайт", "site"] + type: "chat" + target: "sender" + +# ═══════════════════════════════════════════════════════════════════════════════ +# УТИЛИТЫ +# ═══════════════════════════════════════════════════════════════════════════════ + +coords: + message: | + Ваши координаты: + X: {x} + Y: {y} + Z: {z} + Мир: {world} + aliases: ["координаты", "pos", "position"] + type: "actionbar" + target: "sender" + +time: + message: | + Время на сервере: %server_time_24% + Дата: %server_date% + Онлайн: %server_online% игроков + aliases: ["время", "дата"] + type: "chat" + target: "sender" + +# ═══════════════════════════════════════════════════════════════════════════════ +# АДМИНСКИЕ КОМАНДЫ +# ═══════════════════════════════════════════════════════════════════════════════ + restart-warning: permission: "lochat.admin" - message: "ВНИМАНИЕ! Сервер будет перезагружен через 5 минут!" + message: | + ⚠ ВНИМАНИЕ! ⚠ + Сервер будет перезагружен через 5 минут! + Сохраните свой прогресс и подготовьтесь к перезагрузке. aliases: ["рестарт", "reboot"] + type: "title" + target: "all" + +maintenance: + permission: "lochat.admin" + message: | + Сервер переходит в режим технических работ + Ожидаемое время: 30 минут + aliases: ["тех-работы", "maintenance"] type: "broadcast" target: "all" -# Команда с title +# ═══════════════════════════════════════════════════════════════════════════════ +# VIP КОМАНДЫ +# ═══════════════════════════════════════════════════════════════════════════════ + +vip-info: + permission: "lochat.vip" + message: | + ═══════ VIP Привилегии ═══════ + • Цветной ник и префикс + • Приоритет входа на сервер + • Дополнительные команды + • Больше возможностей в чате + + Спасибо за поддержку сервера! + type: "chat" + target: "permission:lochat.vip" + +# ═══════════════════════════════════════════════════════════════════════════════ +# РАЗВЛЕКАТЕЛЬНЫЕ КОМАНДЫ +# ═══════════════════════════════════════════════════════════════════════════════ + welcome: - message: "Добро пожаловать!" - aliases: ["привет"] + message: | + Добро пожаловать на сервер! + Игрок {player} присоединился к игре + aliases: ["привет", "hello"] type: "title" target: "sender" -# Команда с actionbar -coords: - message: "Ваши координаты: {x}, {y}, {z}" - aliases: ["координаты", "pos"] - type: "actionbar" - target: "sender" \ No newline at end of file +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ПЛЕЙСХОЛДЕРЫ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Доступные плейсхолдеры в сообщениях: +# {player} - имя игрока +# {x}, {y}, {z} - координаты игрока +# {world} - название мира +# {arg0}, {arg1}, {arg2} - аргументы команды (нумерация с 0) +# {args} - все аргументы через пробел +# +# Также поддерживаются все плейсхолдеры PlaceholderAPI: +# %player_name% - имя игрока +# %server_online% - количество игроков онлайн +# %server_time_24% - время в формате 24 часа +# %server_date% - текущая дата +# И многие другие... \ No newline at end of file diff --git a/src/main/resources/emojis.yml b/src/main/resources/emojis.yml index fe22215..11537e4 100644 --- a/src/main/resources/emojis.yml +++ b/src/main/resources/emojis.yml @@ -1,385 +1,281 @@ -# LoChat - Смайлики и стикеры -# Автор: loki -# -# Формат: "триггер": "замена" -# Игроки пишут триггер, он заменяется на символ -# -# Права: -# - chat.emoji.use — использование смайликов -# - chat.emoji.* — все смайлики -# - chat.emoji.hearts — только категория hearts -# - chat.emoji.custom — кастомные смайлики +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LoChat Emojis ║ +# ║ Смайлики для чата ║ +# ║ Версия: 1.5.5-1.20.1 ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ -# ═══════════════════════════════════════════ -# НАСТРОЙКИ -# ═══════════════════════════════════════════ -settings: - enabled: true - # Требовать право chat.emoji.use - require-permission: false +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ЭМОЦИИ И ЛИЦА │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# ═══════════════════════════════════════════ -# ЛИЦА И ЭМОЦИИ -# ═══════════════════════════════════════════ -faces: - ":)": "☺" +emojis: + # Основные эмоции + ":)": "😊" + ":(": "😢" ":D": "😃" - ":(": "☹" ";)": "😉" ":P": "😛" - ":O": "😮" - "XD": "😆" + ":o": "😮" + ":|": "😐" ":/": "😕" ":*": "😘" - "^_^": "😊" - "-_-": "😑" - ">:(": "😠" - ":3": "😺" - ":'(": "😢" - ":')": "😂" - "o_o": "😳" - "O_O": "😱" - ":thinking:": "🤔" - ":cool:": "😎" - ":angry:": "😡" + "<3": "❤️" + "═══════ Головы игроков ═══════ + :head_nickname: - показать голову игрока + @head nickname - интерактивная голова + + Требуется право: lochat.heademoji.use \ No newline at end of file diff --git a/src/main/resources/gradient-config.yml b/src/main/resources/gradient-config.yml index 344091b..16e413f 100644 --- a/src/main/resources/gradient-config.yml +++ b/src/main/resources/gradient-config.yml @@ -1,68 +1,141 @@ -# LoChat Gradient Module Configuration -# Модуль градиентных ников (интегрированный LoPreff) +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LoChat Gradient Config ║ +# ║ Настройки градиентных ников ║ +# ║ Версия: 1.5.5-1.20.1 ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ -# Включить/выключить модуль +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОСНОВНЫЕ НАСТРОЙКИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Включить градиентные ники enabled: true +# Тип хранения данных: file или sqlite +storage-type: "file" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ НАСТРОЙКИ ЦВЕТОВ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Минимальное количество цветов в градиенте +min-colors: 1 + # Максимальное количество цветов в градиенте max-colors: 7 -# Минимальное количество цветов -min-colors: 1 - # Цена за каждый цвет (PlayerPoints) price-per-color: 50 -# Цена за префикс +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ НАСТРОЙКИ ПРЕФИКСОВ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Цена за префикс (PlayerPoints) prefix-price: 500 -# Покупка префикса один раз (потом бесплатно) +# Одноразовая покупка префикса (true) или за каждое изменение (false) prefix-one-time-purchase: true -# Кулдаун на смену цвета (секунды) +# Максимальная длина префикса (символы) +max-prefix-length: 16 + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ КУЛДАУНЫ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Кулдаун на изменение цвета (секунды) color-cooldown: 60 -# Кулдаун на смену префикса (секунды) -prefix-cooldown: 300 +# Кулдаун на изменение префикса (секунды) +prefix-cooldown: 120 -# Максимальная длина префикса -max-prefix-length: 7 +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ИНТЕГРАЦИИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Формат префикса ({prefix} - сам префикс) -prefix-format: "[{prefix}] " +# Интеграция с LuckPerms +luckperms: + # Включить интеграцию + enabled: true + # Приоритет префикса в LuckPerms + prefix-priority: 100 + # Обновлять префикс в LuckPerms при изменении + update-prefix: true -# Применять градиент на префикс -gradient-on-prefix: true +# Интеграция с PlayerPoints +playerpoints: + # Включить интеграцию (покупки за поинты) + enabled: true + # Показывать баланс в GUI + show-balance: true -# Применять градиент на LuckPerms префикс (если нет кастомного) -gradient-on-luckperms-prefix: true +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ПРЕДУСТАНОВКИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Единый градиент на префикс + ник -continuous-gradient: true +# Предустановленные градиенты +presets: + fire: ["#FF4500", "#FF6347", "#FFD700"] + ocean: ["#00CED1", "#1E90FF", "#4169E1"] + forest: ["#228B22", "#32CD32", "#90EE90"] + sunset: ["#FF69B4", "#FF1493", "#DC143C"] + rainbow: ["#FF0000", "#FF7F00", "#FFFF00", "#00FF00", "#0000FF", "#4B0082", "#9400D3"] + ice: ["#B0E0E6", "#87CEEB", "#4682B4"] + gold: ["#FFD700", "#FFA500", "#FF8C00"] + purple: ["#9370DB", "#8A2BE2", "#4B0082"] + pink: ["#FFB6C1", "#FF69B4", "#FF1493"] + green: ["#00FF7F", "#00FA9A", "#98FB98"] -# Использовать &#RRGGBB формат (true) или <#RRGGBB> (false) -use-legacy-rgb-format: false +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ GUI НАСТРОЙКИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Отображение над игроком -display: - # Обновлять display name игрока (показывает префикс+ник над головой) - update-display-name: true - # Обновлять tab list - update-tab-list: true +gui: + # Название GUI подтверждения + confirm-title: "Подтверждение покупки" + + # Размер GUI (9, 18, 27, 36, 45, 54) + size: 27 + + # Предметы в GUI + items: + confirm: + material: "GREEN_WOOL" + name: "✓ Подтвердить" + lore: + - "Нажмите для подтверждения" + - "покупки градиента" + + cancel: + material: "RED_WOOL" + name: "✗ Отменить" + lore: + - "Нажмите для отмены" + - "покупки" + + info: + material: "PAPER" + name: "Информация" + lore: + - "Цена: {price} поинтов" + - "Цвета: {colors}" + - "" + - "Ваш баланс: {balance}" -# Тип хранилища: YAML или SQLITE -storage-type: YAML +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ РАЗРЕШЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Файл SQLite базы данных -sqlite-file: gradient-data.db - -# Чёрный список префиксов (нельзя использовать) -prefix-blacklist: - - admin - - owner - - moder - - helper - - staff - - модер - - админ - - хелпер +# Автоматические разрешения для групп +permissions: + # Группы, которые получают бесплатные градиенты + free-groups: + - "vip" + - "premium" + - "admin" + + # Группы, которые могут использовать любые цвета + unlimited-colors: + - "admin" + - "owner" \ No newline at end of file diff --git a/src/main/resources/gradient-messages.yml b/src/main/resources/gradient-messages.yml index f8dfe09..ea4194e 100644 --- a/src/main/resources/gradient-messages.yml +++ b/src/main/resources/gradient-messages.yml @@ -1,57 +1,156 @@ -# LoChat Gradient Module Messages -# Сообщения модуля градиентных ников +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LoChat Gradient Messages ║ +# ║ Сообщения градиентного модуля ║ +# ║ Версия: 1.5.5-1.20.1 ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ -# Общие -only-player: "CADFЭта команда только для игроков!" -no-permission: "CADFУ вас нет прав на это действие!" -player-not-found: "CADFИгрок не найден!" -reload-success: "CADFКонфигурация градиентов перезагружена!" -cooldown: "CADFПодождите ещё {time} секунд!" +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОСНОВНЫЕ СООБЩЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Цвета -color-help: | - CADF=== Команда /color === - CADF/color <цвет1> [цвет2] ... 󅒐— установить градиент - CADF/color on 󅒐— включить цвет - CADF/color off 󅒐— выключить цвет - CADF/color reset 󅒐— сбросить цвет - CADF/color copy <игрок> 󅒐— скопировать цвет - 󅒐Пример: /color #FF0000 #00FF00 #0000FF -color-enabled: "CADFЦвет ника включён!" -color-disabled: "CADFЦвет ника выключен!" -color-reset: "CADFЦвет ника сброшен!" -color-no-colors: "CADFУ вас нет установленных цветов!" -color-success: "CADFЦвет успешно установлен! Списано: {price} PP" -color-copy-usage: "CADFИспользование: /color copy <игрок>" -color-copy-no-colors: "CADFУ игрока {player} нет цветов!" -invalid-color: "CADFНеверный формат цвета: {color}. Используйте #RRGGBB" -too-many-colors: "CADFМаксимум {max} цветов!" -not-enough-colors: "CADFМинимум {min} цветов!" -not-enough-points-color: "CADFНедостаточно поинтов! Нужно: {price} PP" +# Префикс градиентного модуля +prefix: "[Gradient]" -# Префикс -prefix-help: | - CADF=== Команда /prefix === - CADF/prefix <текст> 󅒐— установить префикс - CADF/prefix on 󅒐— включить префикс - CADF/prefix off 󅒐— выключить префикс - CADF/prefix reset 󅒐— сбросить префикс -prefix-enabled: "CADFПрефикс включён!" -prefix-disabled: "CADFПрефикс выключен!" -prefix-reset-success: "CADFПрефикс сброшен!" -prefix-no-prefix: "CADFУ вас нет установленного префикса!" -prefix-success: "CADFПрефикс успешно установлен! Списано: {price} PP" -prefix-success-free: "CADFПрефикс успешно изменён!" -prefix-no-colors: "CADFПрефикс не может содержать цветовые коды!" -prefix-invalid-chars: "CADFПрефикс содержит недопустимые символы!" -prefix-blacklisted: "CADFЭтот префикс запрещён!" -prefix-too-long: "CADFПрефикс слишком длинный! Максимум: {max} символов" -not-enough-points-prefix: "CADFНедостаточно поинтов! Нужно: {price} PP" +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ КОМАНДА /color │ +# └─────────────────────────────────────────────────────────────────────────────┘ -# Админ информация -info-header: "CADF=== Информация об игроке {player} ===" -info-prefix: "󅒐Префикс: &f{prefix}" -info-prefix-enabled: "󅒐Префикс включён: &f{enabled}" -info-colors: "󅒐Цвета: &f{colors}" -info-color-enabled: "󅒐Цвет включён: &f{enabled}" -info-prefix-purchased: "󅒐Префикс куплен: &f{purchased}" \ No newline at end of file +color: + # Успешные действия + set: "Градиент установлен!" + enabled: "Градиентный ник включен" + disabled: "Градиентный ник отключен" + reset: "Градиент сброшен" + copied: "Градиент скопирован с игрока {player}" + + # Ошибки + invalid-hex: "Неверный HEX цвет: {color}" + too-many-colors: "Слишком много цветов! Максимум: {max}" + too-few-colors: "Слишком мало цветов! Минимум: {min}" + no-permission: "Нет прав на использование градиентов" + cooldown: "Подождите {time} сек перед изменением цвета" + not-enough-points: "Недостаточно поинтов! Нужно: {price}, у вас: {balance}" + player-not-found: "Игрок не найден" + no-gradient: "У игрока нет градиента для копирования" + + # Помощь + help: + - "═══════ Команды градиента ═══════" + - "/color [hex2] ... - установить градиент" + - "/color on/off - включить/выключить градиент" + - "/color reset - сбросить градиент" + - "/color copy <игрок> - скопировать градиент" + - "/color preset <название> - использовать предустановку" + - "" + - "Предустановки: fire, ocean, forest, sunset, rainbow, ice, gold, purple, pink, green" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ КОМАНДА /prefix │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +prefix: + # Успешные действия + set: "Префикс установлен!" + enabled: "Префикс включен" + disabled: "Префикс отключен" + reset: "Префикс сброшен" + + # Ошибки + too-long: "Префикс слишком длинный! Максимум: {max} символов" + no-permission: "Нет прав на использование префиксов" + cooldown: "Подождите {time} сек перед изменением префикса" + not-enough-points: "Недостаточно поинтов! Нужно: {price}, у вас: {balance}" + + # Помощь + help: + - "═══════ Команды префикса ═══════" + - "/prefix <текст> - установить префикс" + - "/prefix on/off - включить/выключить префикс" + - "/prefix reset - сбросить префикс" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ АДМИНСКИЕ КОМАНДЫ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +admin: + # Успешные действия + reloaded: "Конфигурация градиентов перезагружена" + color-set: "Градиент установлен игроку {player}" + prefix-set: "Префикс установлен игроку {player}" + color-enabled: "Градиент включен для {player}" + color-disabled: "Градиент отключен для {player}" + prefix-enabled: "Префикс включен для {player}" + prefix-disabled: "Префикс отключен для {player}" + color-reset: "Градиент сброшен для {player}" + prefix-reset: "Префикс сброшен для {player}" + updated-all: "Обновлены все игроки ({count})" + + # Информация об игроке + info: + - "═══════ Информация о {player} ═══════" + - "Градиент: {gradient_status}" + - "Цвета: {colors}" + - "Префикс: {prefix_status}" + - "Текст префикса: {prefix_text}" + - "Отображаемое имя: {display_name}" + + # Ошибки + player-not-found: "Игрок не найден" + invalid-hex: "Неверный HEX цвет: {color}" + + # Помощь + help: + - "═══════ Админские команды ═══════" + - "/aprefix reload - перезагрузить конфиг" + - "/aprefix info <игрок> - информация об игроке" + - "/aprefix setcolor <игрок> <цвета> - установить градиент" + - "/aprefix setprefix <игрок> <текст> - установить префикс" + - "/aprefix coloron/coloroff <игрок> - вкл/выкл градиент" + - "/aprefix prefixon/prefixoff <игрок> - вкл/выкл префикс" + - "/aprefix resetcolor <игрок> - сбросить градиент" + - "/aprefix resetprefix <игрок> - сбросить префикс" + - "/aprefix updateall - обновить всех игроков" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ GUI СООБЩЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +gui: + # Заголовки + confirm-title: "Подтверждение покупки" + + # Кнопки + confirm-button: "✓ Подтвердить покупку" + cancel-button: "✗ Отменить" + + # Описания + confirm-lore: + - "Цена: {price} поинтов" + - "Цвета: {colors}" + - "" + - "Ваш баланс: {balance}" + - "" + - "Нажмите для подтверждения" + + cancel-lore: + - "Нажмите для отмены" + + # Результаты + purchase-success: "Градиент успешно куплен!" + purchase-cancelled: "Покупка отменена" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОБЩИЕ СООБЩЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +general: + # Статусы + enabled: "Включено" + disabled: "Отключено" + none: "Нет" + + # Единицы времени + seconds: "сек" + minutes: "мин" + hours: "ч" + days: "д" \ No newline at end of file diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml index 6d09ec2..3d29841 100644 --- a/src/main/resources/messages.yml +++ b/src/main/resources/messages.yml @@ -1,70 +1,133 @@ -prefix: "CADF[LoChat]" +# ╔══════════════════════════════════════════════════════════════════════════════╗ +# ║ LoChat Messages ║ +# ║ Сообщения плагина LoChat ║ +# ║ Версия: 1.5.5-1.20.1 ║ +# ╚══════════════════════════════════════════════════════════════════════════════╝ + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОСНОВНЫЕ СООБЩЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ + +# Префикс плагина +prefix: "[LoChat]" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ГЛОБАЛЬНЫЙ ЧАТ │ +# └─────────────────────────────────────────────────────────────────────────────┘ global: - disabled: "CADFГлобальный чат отключен" - toggled-on: "CADFГлобальный чат включен" - toggled-off: "CADFГлобальный чат отключен" + disabled: "Глобальный чат отключен" + toggled-on: "Глобальный чат включен" + toggled-off: "Глобальный чат отключен" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ЛОКАЛЬНЫЙ ЧАТ │ +# └─────────────────────────────────────────────────────────────────────────────┘ local: - no-players: "CADFРядом нет игроков" + no-players: "Рядом нет игроков" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ЛИЧНЫЕ СООБЩЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ pm: # Форматы личных сообщений # {sender} - ник отправителя, {receiver} - ник получателя # {sender_display} - отправитель с градиентом, {receiver_display} - получатель с градиентом # {message} - текст сообщения - format-sent: "󅒐[PM] Ты → {receiver_display}󅒐: {message}" - format-received: "󅒐[PM] {sender_display}󅒐 → Ты: {message}" + format-sent: "[PM] Ты → {receiver_display}: {message}" + format-received: "[PM] {sender_display} → Ты: {message}" + # Использовать градиентные ники в PM use-gradient-names: true + # Старые форматы (для совместимости) - sent: "󅒐[PM] Ты → {player}: {message}" - received: "󅒐[PM] {player} → Ты: {message}" - no-reply: "CADFНекому ответить" - ignored: "CADFЭтот игрок вас игнорирует" - player-offline: "CADFИгрок не в сети" - self: "CADFНельзя писать самому себе" + sent: "[PM] Ты → {player}: {message}" + received: "[PM] {player} → Ты: {message}" + + # Ошибки PM + no-reply: "Некому ответить" + ignored: "Этот игрок вас игнорирует" + player-offline: "Игрок не в сети" + self: "Нельзя писать самому себе" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ИГНОРИРОВАНИЕ │ +# └─────────────────────────────────────────────────────────────────────────────┘ ignore: - added: "CADFИгрок {player} добавлен в игнор" - removed: "CADFИгрок {player} убран из игнора" - already-ignored: "CADFИгрок уже в игноре" - not-ignored: "CADFИгрок не в игноре" - self: "CADFНельзя игнорировать себя" + added: "Игрок {player} добавлен в игнор" + removed: "Игрок {player} убран из игнора" + already-ignored: "Игрок уже в игноре" + not-ignored: "Игрок не в игноре" + self: "Нельзя игнорировать себя" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОБЪЯВЛЕНИЯ │ +# └─────────────────────────────────────────────────────────────────────────────┘ announce: - reloaded: "CADFКонфигурация перезагружена" + reloaded: "Конфигурация перезагружена" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ШПИОН РЕЖИМ │ +# └─────────────────────────────────────────────────────────────────────────────┘ spy: - enabled: "CADFШпион режим включен" - disabled: "CADFШпион режим выключен" - format: "󅒐[SPY] {sender} → {receiver}: {message}" - chat-format: "󅒐[SPY] {type} {sender}: {message}" + enabled: "Шпион режим включен" + disabled: "Шпион режим выключен" + format: "[SPY] {sender} → {receiver}: {message}" + chat-format: "[SPY] {type} {sender}: {message}" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ФИЛЬТР МАТА │ +# └─────────────────────────────────────────────────────────────────────────────┘ filter: - blocked: "CADFСообщение заблокировано (мат)" - warning: "CADFПредупреждение: не используйте мат!" + blocked: "Сообщение заблокировано (недопустимые слова)" + warning: "Предупреждение: не используйте недопустимые слова!" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ КУЛДАУНЫ │ +# └─────────────────────────────────────────────────────────────────────────────┘ cooldown: - wait: "CADFПодождите {time} сек перед следующим сообщением" + wait: "Подождите {time} сек перед следующим сообщением" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ АНТИ-СПАМ │ +# └─────────────────────────────────────────────────────────────────────────────┘ antispam: - caps: "CADFСлишком много заглавных букв!" - repeat: "CADFНе повторяйте символы!" - similar: "CADFНе отправляйте одинаковые сообщения!" + caps: "Слишком много заглавных букв!" + repeat: "Не повторяйте символы!" + similar: "Не отправляйте одинаковые сообщения!" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОЧИСТКА ЧАТА │ +# └─────────────────────────────────────────────────────────────────────────────┘ clearchat: - cleared: "CADFЧат очищен администратором {player}" + cleared: "Чат очищен администратором {player}" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ ОШИБКИ │ +# └─────────────────────────────────────────────────────────────────────────────┘ errors: - no-permission: "CADFНет прав!" - player-not-found: "CADFИгрок не найден" - invalid-usage: "CADFИспользование: {usage}" + no-permission: "Нет прав!" + player-not-found: "Игрок не найден" + invalid-usage: "Использование: {usage}" + +# ┌─────────────────────────────────────────────────────────────────────────────┐ +# │ СИСТЕМА МУТОВ │ +# └─────────────────────────────────────────────────────────────────────────────┘ mute: - muted: "CADFИгрок {player} замучен на {time}" - unmuted: "CADFИгрок {player} размучен" - already-muted: "CADFИгрок уже замучен" - not-muted: "CADFИгрок не замучен" - you-muted: "CADFВы замучены! Осталось: {time}" - permanent: "CADFВы замучены навсегда!" \ No newline at end of file + muted: "Игрок {player} замучен на {time}" + unmuted: "Игрок {player} размучен" + already-muted: "Игрок уже замучен" + not-muted: "Игрок не замучен" + you-muted: "Вы замучены! Осталось: {time}" + permanent: "Вы замучены навсегда!" \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 63d897a..bee8142 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -11,6 +11,7 @@ softdepend: - PlayerPoints - LuckPerms - LibertyBans + - SkinsRestorer commands: g: @@ -73,6 +74,12 @@ commands: permission: chat.clear aliases: [cc, очиститьчат, сдуфксрфе, сс] + clearchatconfig: + description: Configure clear chat message + usage: /clearchatconfig [text] + permission: lochat.clearchat.config + aliases: [ccc, настройкаочистки] + lochat: description: LoChat admin command usage: /lochat [reload] @@ -219,3 +226,9 @@ permissions: lochat.mute.dur.perm: description: Can mute permanently default: op + lochat.clearchat.config: + description: Can configure clear chat message + default: op + lochat.heademoji.use: + description: Can use head emojis in chat + default: true