Исправлены баги: zip file closed в кастомных командах, рандомные цвета в GUI, обновлена версия до 1.5.4, добавлена инструкция по кастомным командам в README

This commit is contained in:
loki5512344 2025-12-30 20:40:09 +01:00
parent 1d75327a4d
commit d49261988e
4 changed files with 124 additions and 4 deletions

106
README.md
View file

@ -142,6 +142,7 @@
- `messages.yml` — сообщения чата - `messages.yml` — сообщения чата
- `automessages.yml` — автосообщения - `automessages.yml` — автосообщения
- `emojis.yml` — смайлики - `emojis.yml` — смайлики
- `custom-commands.yml` — кастомные команды
- `gradient-config.yml` — настройки градиентов - `gradient-config.yml` — настройки градиентов
- `gradient-messages.yml` — сообщения градиентов - `gradient-messages.yml` — сообщения градиентов
- `ignores.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: "<gold>Добро пожаловать на сервер!</gold>\n<gray>Используйте /rules для просмотра правил</gray>"
aliases: ["помощь", "хелп"]
type: "chat"
target: "sender"
```
#### Команда с координатами
```yaml
coords:
message: "Ваши координаты: <green>{x}</green>, <green>{y}</green>, <green>{z}</green> в мире <yellow>{world}</yellow>"
aliases: ["координаты", "pos"]
type: "actionbar"
target: "sender"
```
#### Команда для админов (broadcast)
```yaml
restart-warning:
permission: "lochat.admin"
message: "<red><bold>ВНИМАНИЕ!</bold></red> <yellow>Сервер будет перезагружен через 5 минут!</yellow>"
aliases: ["рестарт", "reboot"]
type: "broadcast"
target: "all"
```
#### Команда с title
```yaml
welcome:
message: "<gold>Добро пожаловать!</gold>\n<gray>Наслаждайтесь игрой!</gray>"
aliases: ["привет"]
type: "title"
target: "sender"
```
#### Команда только для VIP
```yaml
vip-info:
permission: "lochat.vip"
message: "<gold>VIP информация:</gold>\n<yellow>Вы имеете доступ к специальным командам!</yellow>"
type: "chat"
target: "permission:lochat.vip"
```
### Форматирование цветов
В сообщениях можно использовать:
- **MiniMessage теги**: `<red>`, `<bold>`, `<#FF0000>`
- **Legacy коды**: `&a`, `&l`, `&c`
- **HEX цвета**: `#FF0000` (автоматически конвертируется)
### Важные замечания
1. После изменения `custom-commands.yml` выполните `/lochat reload`
2. Имена команд должны быть уникальными
3. Если команда уже существует в Minecraft/Bukkit, она будет перезаписана
4. Для title используйте `\n` для разделения заголовка и подзаголовка
5. PlaceholderAPI плейсхолдеры работают только если установлен PlaceholderAPI
---
## Форматирование цветов ## Форматирование цветов
### MiniMessage ### MiniMessage

View file

@ -29,9 +29,15 @@ public final class GradientUtil {
StringBuilder result = new StringBuilder(); StringBuilder result = new StringBuilder();
if (hexColors.size() == 1) { if (hexColors.size() == 1) {
// Для одного цвета применяем цвет один раз в начале
String colorCode = formatHex(hexColors.get(0), useLegacyFormat); String colorCode = formatHex(hexColors.get(0), useLegacyFormat);
for (char c : chars) { if (useLegacyFormat) {
result.append(colorCode).append(c); // В legacy формате цвет применяется к каждому символу, но мы применяем один цвет
// Поэтому применяем цвет один раз в начале и добавляем весь текст
result.append(colorCode).append(text);
} else {
// В MiniMessage формате применяем цвет один раз
result.append(colorCode).append(text).append("</color>");
} }
} else { } else {
Color[] colors = hexColors.stream() Color[] colors = hexColors.stream()

View file

@ -145,7 +145,15 @@ public class CustomCommandManager {
// PlaceholderAPI если доступен // PlaceholderAPI если доступен
if (Bukkit.getPluginManager().isPluginEnabled("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; return result;

View file

@ -1,5 +1,5 @@
name: LoChat name: LoChat
version: '1.5.3' version: '1.5.4'
main: com.loki.lochat.LoChat main: com.loki.lochat.LoChat
api-version: '1.21' api-version: '1.21'
folia-supported: true folia-supported: true