diff --git a/README.md b/README.md index 80509b2..6a8c6f0 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,7 @@ - `messages.yml` — сообщения чата - `automessages.yml` — автосообщения - `emojis.yml` — смайлики +- `custom-commands.yml` — кастомные команды - `gradient-config.yml` — настройки градиентов - `gradient-messages.yml` — сообщения градиентов - `ignores.yml` — сохранённые игноры @@ -150,6 +151,111 @@ --- +## Кастомные команды + +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:право +``` + +### Типы команд + +- **chat** — отправляет сообщение в чат +- **broadcast** — отправляет сообщение всем игрокам +- **title** — показывает title (первая строка — заголовок, вторая — подзаголовок, разделяются `\n`) +- **actionbar** — показывает сообщение в actionbar + +### Целевая аудитория (target) + +- **sender** — только отправителю команды +- **all** — всем игрокам на сервере +- **permission:право** — только игрокам с указанным правом (например: `permission:lochat.admin`) + +### Плейсхолдеры + +В сообщениях можно использовать следующие плейсхолдеры: + +- `{player}` — имя игрока +- `{x}`, `{y}`, `{z}` — координаты игрока +- `{world}` — название мира +- `{arg0}`, `{arg1}`, `{arg2}` — аргументы команды (нумерация с 0) +- `{args}` — все аргументы через пробел + +Также поддерживаются плейсхолдеры PlaceholderAPI (если установлен). + +### Примеры + +#### Простая команда помощи +```yaml +help: + message: "Добро пожаловать на сервер!\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: "Добро пожаловать!\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 + +--- + ## Форматирование цветов ### MiniMessage diff --git a/src/main/java/com/loki/lochat/gradient/util/GradientUtil.java b/src/main/java/com/loki/lochat/gradient/util/GradientUtil.java index 3450088..316aadc 100644 --- a/src/main/java/com/loki/lochat/gradient/util/GradientUtil.java +++ b/src/main/java/com/loki/lochat/gradient/util/GradientUtil.java @@ -29,9 +29,15 @@ public final class GradientUtil { StringBuilder result = new StringBuilder(); if (hexColors.size() == 1) { + // Для одного цвета применяем цвет один раз в начале String colorCode = formatHex(hexColors.get(0), useLegacyFormat); - for (char c : chars) { - result.append(colorCode).append(c); + if (useLegacyFormat) { + // В legacy формате цвет применяется к каждому символу, но мы применяем один цвет + // Поэтому применяем цвет один раз в начале и добавляем весь текст + result.append(colorCode).append(text); + } else { + // В MiniMessage формате применяем цвет один раз + result.append(colorCode).append(text).append(""); } } else { Color[] colors = hexColors.stream() diff --git a/src/main/java/com/loki/lochat/managers/CustomCommandManager.java b/src/main/java/com/loki/lochat/managers/CustomCommandManager.java index ffad8fb..3b1189d 100644 --- a/src/main/java/com/loki/lochat/managers/CustomCommandManager.java +++ b/src/main/java/com/loki/lochat/managers/CustomCommandManager.java @@ -145,7 +145,15 @@ public class CustomCommandManager { // PlaceholderAPI если доступен if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { - result = me.clip.placeholderapi.PlaceholderAPI.setPlaceholders(player, result); + try { + // Используем безопасный способ вызова PlaceholderAPI + Class papiClass = Class.forName("me.clip.placeholderapi.PlaceholderAPI"); + java.lang.reflect.Method setPlaceholdersMethod = papiClass.getMethod("setPlaceholders", org.bukkit.entity.Player.class, String.class); + result = (String) setPlaceholdersMethod.invoke(null, player, result); + } catch (Exception e) { + // Если PlaceholderAPI недоступен или произошла ошибка, просто пропускаем + plugin.getLogger().warning("Ошибка при обработке PlaceholderAPI плейсхолдеров: " + e.getMessage()); + } } return result; diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 9ade0a2..a5d047c 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: LoChat -version: '1.5.3' +version: '1.5.4' main: com.loki.lochat.LoChat api-version: '1.21' folia-supported: true