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