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 a89b2a8..e3c6da4 100644 Binary files a/bin/main/com/loki/lochat/LoChat.class and b/bin/main/com/loki/lochat/LoChat.class differ diff --git a/bin/main/com/loki/lochat/commands/ClearChatCommand.class b/bin/main/com/loki/lochat/commands/ClearChatCommand.class index 87ca74e..8db05ff 100644 Binary files a/bin/main/com/loki/lochat/commands/ClearChatCommand.class and b/bin/main/com/loki/lochat/commands/ClearChatCommand.class differ 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 0000000..8166a87 Binary files /dev/null and b/bin/main/com/loki/lochat/commands/ClearChatConfigCommand.class differ 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 0000000..fc62da3 Binary files /dev/null and b/bin/main/com/loki/lochat/commands/PlayerInfoCommand.class differ diff --git a/bin/main/com/loki/lochat/config/ConfigManager.class b/bin/main/com/loki/lochat/config/ConfigManager.class index d296b8d..7cc9965 100644 Binary files a/bin/main/com/loki/lochat/config/ConfigManager.class and b/bin/main/com/loki/lochat/config/ConfigManager.class differ diff --git a/bin/main/com/loki/lochat/integrations/SkinsRestorerHook.class b/bin/main/com/loki/lochat/integrations/SkinsRestorerHook.class new file mode 100644 index 0000000..e05a44c Binary files /dev/null and b/bin/main/com/loki/lochat/integrations/SkinsRestorerHook.class differ diff --git a/bin/main/com/loki/lochat/listeners/ChatListener.class b/bin/main/com/loki/lochat/listeners/ChatListener.class index 04b27a7..eeff48b 100644 Binary files a/bin/main/com/loki/lochat/listeners/ChatListener.class and b/bin/main/com/loki/lochat/listeners/ChatListener.class differ diff --git a/bin/main/com/loki/lochat/managers/HeadEmojiManager.class b/bin/main/com/loki/lochat/managers/HeadEmojiManager.class new file mode 100644 index 0000000..a5ee6a1 Binary files /dev/null and b/bin/main/com/loki/lochat/managers/HeadEmojiManager.class differ 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