v1.5.0: Добавлены кастомные команды, алиасы, цвета чата, многоядерная сборка

- Система кастомных команд с алиасами (custom-commands.yml)
- Команда /chatcolor для установки цвета сообщений
- Исправлена ошибка с legacy кодами в PM
- Настройки объявлений (title, actionbar)
- Автообновление конфигов
- Отображение префикса над игроком
- Многоядерная сборка Gradle
- Добавлены алиасы для команд (русские и английские)
- Права на использование цветовых кодов
This commit is contained in:
loki5512344 2025-12-30 12:29:39 +01:00
parent dfc1c901ab
commit f52bd29e7d
17 changed files with 808 additions and 33 deletions

View file

@ -43,16 +43,24 @@ public class AnnounceCommand implements CommandExecutor {
for (Player player : Bukkit.getOnlinePlayers()) {
player.sendMessage(formatted);
// ActionBar
player.sendActionBar(formatted);
// ActionBar (если включен)
if (plugin.getConfigManager().isAnnouncementActionBarEnabled()) {
player.sendActionBar(formatted);
}
// Title
Title title = Title.title(
ChatFormatter.parse("<gold>ОБЪЯВЛЕНИЕ</gold>"),
ChatFormatter.parse(message),
Title.Times.times(Duration.ofMillis(500), Duration.ofSeconds(3), Duration.ofMillis(500))
);
player.showTitle(title);
// Title (если включен)
if (plugin.getConfigManager().isAnnouncementTitleEnabled()) {
Title title = Title.title(
ChatFormatter.parse(plugin.getConfigManager().getAnnouncementTitleHeader()),
ChatFormatter.parse(message),
Title.Times.times(
Duration.ofMillis(500),
Duration.ofSeconds(plugin.getConfigManager().getAnnouncementTitleDuration()),
Duration.ofMillis(500)
)
);
player.showTitle(title);
}
}
plugin.getLogger().info("[ANNOUNCE] " + sender.getName() + ": " + ChatFormatter.stripTags(message));

View file

@ -0,0 +1,86 @@
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.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ChatColorCommand implements CommandExecutor, TabCompleter {
private final LoChat plugin;
public ChatColorCommand(LoChat plugin) {
this.plugin = plugin;
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!(sender instanceof Player player)) {
sender.sendMessage("Только для игроков!");
return true;
}
if (!player.hasPermission("lochat.chatcolor")) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getNoPermission()));
return true;
}
if (args.length == 0) {
player.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getInvalidUsage("/chatcolor <цвет>")));
player.sendMessage(ChatFormatter.parse("<gray>Доступные цвета: <red>red</red>, <blue>blue</blue>, <green>green</green>, <yellow>yellow</yellow>, <gold>gold</gold>, <aqua>aqua</aqua>, <light_purple>light_purple</light_purple>, <white>white</white>, <gray>gray</gray>, <dark_gray>dark_gray</dark_gray>"));
return true;
}
String color = args[0].toLowerCase();
// Проверяем валидность цвета
if (!isValidColor(color)) {
player.sendMessage(ChatFormatter.parse("<red>Неверный цвет! Используйте один из доступных цветов.</red>"));
return true;
}
// Сохраняем цвет чата игрока
plugin.getChatColorManager().setChatColor(player.getUniqueId(), color);
player.sendMessage(ChatFormatter.parse("<green>Цвет чата установлен на <" + color + ">" + color + "</color>!"));
return true;
}
private boolean isValidColor(String color) {
List<String> validColors = Arrays.asList(
"red", "blue", "green", "yellow", "gold", "aqua",
"light_purple", "white", "gray", "dark_gray", "black",
"dark_red", "dark_green", "dark_blue", "dark_aqua", "dark_purple"
);
return validColors.contains(color);
}
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) {
if (args.length == 1) {
List<String> colors = Arrays.asList(
"red", "blue", "green", "yellow", "gold", "aqua",
"light_purple", "white", "gray", "dark_gray"
);
List<String> completions = new ArrayList<>();
String input = args[0].toLowerCase();
for (String color : colors) {
if (color.startsWith(input)) {
completions.add(color);
}
}
return completions;
}
return new ArrayList<>();
}
}

View file

@ -0,0 +1,38 @@
package com.loki.lochat.commands;
import com.loki.lochat.managers.CustomCommandManager;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
public class CustomCommand extends Command {
private final CustomCommandManager manager;
public CustomCommand(String name, CustomCommandManager manager) {
super(name);
this.manager = manager;
this.setDescription("Кастомная команда LoChat");
this.setUsage("/" + name);
}
@Override
public boolean execute(@NotNull CommandSender sender, @NotNull String commandLabel, @NotNull String[] args) {
if (!(sender instanceof Player player)) {
sender.sendMessage("Только для игроков!");
return true;
}
return manager.executeCustomCommand(commandLabel, player, args);
}
@Override
public @NotNull List<String> tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) throws IllegalArgumentException {
// Базовое автодополнение - можно расширить при необходимости
return new ArrayList<>();
}
}

View file

@ -1,6 +1,7 @@
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;
@ -8,6 +9,7 @@ import org.bukkit.command.TabCompleter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
public class LoChatCommand implements CommandExecutor, TabCompleter {
@ -21,35 +23,75 @@ public class LoChatCommand implements CommandExecutor, TabCompleter {
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command,
@NotNull String label, @NotNull String[] args) {
if (!sender.hasPermission("lochat.admin")) {
sender.sendMessage(ChatFormatter.parse(plugin.getMessageConfig().getNoPermission()));
return true;
}
if (args.length == 0) {
sender.sendMessage("§e=== LoChat v" + plugin.getDescription().getVersion() + " ===");
sender.sendMessage("§e/lochat reload §7— перезагрузить конфиги");
sender.sendMessage(ChatFormatter.parse("<gold>LoChat v" + plugin.getDescription().getVersion() + "</gold>"));
sender.sendMessage(ChatFormatter.parse("<gray>Команды:</gray>"));
sender.sendMessage(ChatFormatter.parse("<yellow>/lochat reload</yellow> - Перезагрузить конфиги"));
sender.sendMessage(ChatFormatter.parse("<yellow>/lochat commands</yellow> - Список кастомных команд"));
sender.sendMessage(ChatFormatter.parse("<yellow>/lochat commands reload</yellow> - Перезагрузить кастомные команды"));
return true;
}
if (args[0].equalsIgnoreCase("reload")) {
if (!sender.hasPermission("lochat.admin")) {
sender.sendMessage(plugin.getMessageConfig().get("errors.no-permission"));
return true;
switch (args[0].toLowerCase()) {
case "reload" -> {
plugin.reload();
sender.sendMessage(ChatFormatter.parse("<green>Конфигурация перезагружена!</green>"));
}
plugin.reload();
sender.sendMessage("§aLoChat перезагружен!");
return true;
case "commands" -> {
if (args.length > 1 && args[1].equalsIgnoreCase("reload")) {
plugin.getCustomCommandManager().reload();
sender.sendMessage(ChatFormatter.parse("<green>Кастомные команды перезагружены!</green>"));
} else {
var commands = plugin.getCustomCommandManager().getCommands();
sender.sendMessage(ChatFormatter.parse("<gold>Кастомные команды (" + commands.size() + "):</gold>"));
for (var cmd : commands.values()) {
sender.sendMessage(ChatFormatter.parse("<yellow>/" + cmd.name + "</yellow> <gray>(" + cmd.type + ")</gray>"));
if (!cmd.aliases.isEmpty()) {
sender.sendMessage(ChatFormatter.parse("<gray> Алиасы: " + String.join(", ", cmd.aliases) + "</gray>"));
}
}
}
}
default -> sender.sendMessage(ChatFormatter.parse("<red>Неизвестная команда. Используйте /lochat для помощи.</red>"));
}
sender.sendMessage("§cНеизвестная команда. Используй /lochat reload");
return true;
}
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command,
@NotNull String alias, @NotNull String[] args) {
if (args.length == 1 && sender.hasPermission("lochat.admin")) {
return List.of("reload").stream()
.filter(s -> s.startsWith(args[0].toLowerCase()))
.toList();
if (!sender.hasPermission("lochat.admin")) {
return new ArrayList<>();
}
return List.of();
if (args.length == 1) {
List<String> completions = new ArrayList<>();
String input = args[0].toLowerCase();
for (String cmd : List.of("reload", "commands")) {
if (cmd.startsWith(input)) {
completions.add(cmd);
}
}
return completions;
}
if (args.length == 2 && args[0].equalsIgnoreCase("commands")) {
List<String> completions = new ArrayList<>();
String input = args[1].toLowerCase();
if ("reload".startsWith(input)) {
completions.add("reload");
}
return completions;
}
return new ArrayList<>();
}
}