fix: colors, /dbd join flow, world creation, role assign, action bar lobby, /dbdadmin world, tab complete

This commit is contained in:
loki5512344 2026-06-03 19:34:10 +02:00
parent 327ad9b906
commit 1adb8c84fd
19 changed files with 874 additions and 112 deletions

View file

@ -2,6 +2,7 @@ package dev.loki.command;
import dev.loki.data.GeneratorDataManager;
import dev.loki.mdbd;
import dev.loki.util.TextUtil;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.minimessage.MiniMessage;
@ -43,7 +44,7 @@ public class DBDAdminCommand implements TabExecutor {
Player p = Bukkit.getPlayer(uuid);
if (p != null && p.isOnline()) {
p.sendActionBar(mm.deserialize(
"&#FFA500⚒ Режим установки: &#00FF00сломайте блок для генератора &#FFA500⚒"));
"<#FFA500>⚒ Режим установки: <#00FF00>сломайте блок для генератора <#FFA500>⚒"));
}
}
}, 0L, 20L);
@ -72,6 +73,7 @@ public class DBDAdminCommand implements TabExecutor {
case "list" -> handleList(player);
case "remove" -> handleRemove(player, args);
case "clear" -> handleClear(player);
case "world" -> handleWorld(player, args);
default -> {
sendUsage(sender);
yield true;
@ -82,7 +84,7 @@ public class DBDAdminCommand implements TabExecutor {
@SuppressWarnings("UnreachableBranchError")
private boolean handleCreate(Player player, String[] args) {
if (args.length < 2) {
player.sendMessage(Component.text("&#FF0000Использование: /dbdadmin create <generator>"));
player.sendMessage(TextUtil.color("<#FF0000>Использование: /dbdadmin create <generator>"));
return true;
}
@ -91,18 +93,18 @@ public class DBDAdminCommand implements TabExecutor {
case "generator" -> {
if (selectingGenerator.contains(player.getUniqueId())) {
selectingGenerator.remove(player.getUniqueId());
player.sendMessage(Component.text("&#FFA500Режим выбора генератора отключен"));
player.sendMessage(TextUtil.color("<#FFA500>Режим выбора генератора отключен"));
} else {
selectingGenerator.add(player.getUniqueId());
player.sendMessage(Component.text("&#00FF00Режим выбора генератора включен!"));
player.sendMessage(Component.text("&#FFD700Сломайте блок, чтобы установить генератор"));
player.sendMessage(Component.text("&#FFD700(блок не сломается, а сохранятся его координаты)"));
player.sendMessage(Component.text("&#FFA500Введите /dbdadmin create generator снова, чтобы отключить режим"));
player.sendMessage(TextUtil.color("<#00FF00>Режим выбора генератора включен!"));
player.sendMessage(TextUtil.color("<#FFD700>Сломайте блок, чтобы установить генератор"));
player.sendMessage(TextUtil.color("<#FFD700>(блок не сломается, а сохранятся его координаты)"));
player.sendMessage(TextUtil.color("<#FFA500>Введите /dbdadmin create generator снова, чтобы отключить режим"));
}
return true;
}
default -> {
player.sendMessage(Component.text("&#FF0000Неизвестный тип: " + type));
player.sendMessage(TextUtil.color("<#FF0000>Неизвестный тип: " + type));
return true;
}
}
@ -110,12 +112,12 @@ public class DBDAdminCommand implements TabExecutor {
private boolean handleList(Player player) {
var entries = generatorData.getGeneratorEntries();
player.sendMessage(Component.text("&#FFD700=== Генераторы (" + entries.size() + ") ==="));
player.sendMessage(TextUtil.color("<#FFD700>=== Генераторы (" + entries.size() + ") ==="));
if (entries.isEmpty()) {
player.sendMessage(Component.text("&#808000Нет установленных генераторов"));
player.sendMessage(TextUtil.color("<#808000>Нет установленных генераторов"));
} else {
for (int i = 0; i < entries.size(); i++) {
player.sendMessage(Component.text("&#00CED1[" + i + "] " + entries.get(i)));
player.sendMessage(TextUtil.color("<#00CED1>[" + i + "] " + entries.get(i)));
}
}
return true;
@ -123,7 +125,7 @@ public class DBDAdminCommand implements TabExecutor {
private boolean handleRemove(Player player, String[] args) {
if (args.length < 2) {
player.sendMessage(Component.text("&#FF0000Использование: /dbdadmin remove <id>"));
player.sendMessage(TextUtil.color("<#FF0000>Использование: /dbdadmin remove <id>"));
return true;
}
@ -131,30 +133,65 @@ public class DBDAdminCommand implements TabExecutor {
int id = Integer.parseInt(args[1]);
var entries = generatorData.getGeneratorEntries();
if (id < 0 || id >= entries.size()) {
player.sendMessage(Component.text("&#FF0000Генератор с ID " + id + " не найден"));
player.sendMessage(TextUtil.color("<#FF0000>Генератор с ID " + id + " не найден"));
return true;
}
String removed = entries.get(id);
generatorData.removeGenerator(id);
player.sendMessage(Component.text("&#00FF00Генератор удален: " + removed));
player.sendMessage(TextUtil.color("<#00FF00>Генератор удален: " + removed));
} catch (NumberFormatException e) {
player.sendMessage(Component.text("&#FF0000ID должен быть числом"));
player.sendMessage(TextUtil.color("<#FF0000>ID должен быть числом"));
}
return true;
}
private boolean handleClear(Player player) {
generatorData.clearGenerators();
player.sendMessage(Component.text("&#FFA500Все генераторы удалены"));
player.sendMessage(TextUtil.color("<#FFA500>Все генераторы удалены"));
return true;
}
private boolean handleWorld(Player player, String[] args) {
if (args.length < 2) {
player.sendMessage(TextUtil.color("<#FF0000>Использование: /dbdadmin world <lobby|game|<название мира>>"));
return true;
}
String worldArg = args[1].toLowerCase();
org.bukkit.World target;
if (worldArg.equals("lobby")) {
target = plugin.getLobbyManager().getLobbyWorld();
if (target == null) {
player.sendMessage(TextUtil.color("<#FF0000>Мир lobby не загружен!"));
return true;
}
} else if (worldArg.equals("game")) {
target = plugin.getLobbyManager().getGameWorld();
if (target == null) {
player.sendMessage(TextUtil.color("<#FF0000>Мир game не загружен!"));
return true;
}
} else {
target = org.bukkit.Bukkit.getWorld(args[1]);
if (target == null) {
player.sendMessage(TextUtil.color("<#FF0000>Мир не найден: " + args[1]));
return true;
}
}
player.teleport(target.getSpawnLocation());
player.sendMessage(TextUtil.color("<#00FF00>Телепортирован в мир: <#FFD700>" + target.getName()));
return true;
}
private void sendUsage(CommandSender sender) {
sender.sendMessage(Component.text("&#FF6B00=== DBD Admin ==="));
sender.sendMessage(Component.text("&#FFD700/dbdadmin create generator — Режим установки генератора"));
sender.sendMessage(Component.text("&#FFD700/dbdadmin list — Список генераторов"));
sender.sendMessage(Component.text("&#FFD700/dbdadmin remove <id> — Удалить генератор"));
sender.sendMessage(Component.text("&#FFD700/dbdadmin clear — Очистить все генераторы"));
sender.sendMessage(TextUtil.color("<#FF6B00>=== DBD Admin ==="));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdadmin create generator — Режим установки генератора"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdadmin list — Список генераторов"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdadmin remove <id> — Удалить генератор"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdadmin clear — Очистить все генераторы"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdadmin world <lobby|game|мир> — Телепорт в мир"));
}
public boolean isSelectingGenerator(UUID uuid) {
@ -175,7 +212,7 @@ public class DBDAdminCommand implements TabExecutor {
if (!sender.hasPermission("mdbd.admin")) return List.of();
if (args.length == 1) {
return Arrays.asList("create", "list", "remove", "clear").stream()
return Arrays.asList("create", "list", "remove", "clear", "world").stream()
.filter(s -> s.startsWith(args[0].toLowerCase()))
.toList();
}
@ -186,6 +223,12 @@ public class DBDAdminCommand implements TabExecutor {
.toList();
}
if (args.length == 2 && args[0].equalsIgnoreCase("world")) {
return Arrays.asList("lobby", "game").stream()
.filter(s -> s.startsWith(args[1].toLowerCase()))
.toList();
}
if (args.length == 2 && args[0].equalsIgnoreCase("remove")) {
var entries = generatorData.getGeneratorEntries();
List<String> ids = new ArrayList<>();

View file

@ -173,7 +173,7 @@ public class DBDCommand implements TabExecutor {
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command,
@NotNull String label, @NotNull String[] args) {
if (args.length == 1) {
List<String> completions = new ArrayList<>(Arrays.asList("join", "leave"));
List<String> completions = new ArrayList<>(Arrays.asList("join", "leave", "lobby"));
if (sender.hasPermission("mdbd.admin")) {
completions.addAll(Arrays.asList("create", "forcestart", "stop", "reload", "setlobby"));
}

View file

@ -1,6 +1,7 @@
package dev.loki.command;
import dev.loki.mdbd;
import dev.loki.util.TextUtil;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.Location;
@ -8,11 +9,9 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import org.bukkit.util.BlockVector;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@ -65,14 +64,14 @@ public class SetupCommand implements TabExecutor {
private boolean giveWand(Player player) {
var wand = new org.bukkit.inventory.ItemStack(org.bukkit.Material.STICK);
wand.editMeta(meta -> {
meta.displayName(Component.text("&#FF6B00DBD Wand").append(Component.text(" (Выделение)")));
meta.displayName(TextUtil.color("<#FF6B00>DBD Wand <white>(Выделение)"));
meta.lore(List.of(
Component.text("&#FFD700ЛКМ — Первая точка"),
Component.text("&#FFD700ПКМ — Вторая точка")
TextUtil.color("<#FFD700>ЛКМ — Первая точка"),
TextUtil.color("<#FFD700>ПКМ — Вторая точка")
));
});
player.getInventory().addItem(wand);
player.sendMessage(Component.text("&#00FF00Получена палочка выделения!", NamedTextColor.GREEN));
player.sendMessage(TextUtil.color("<#00FF00>Получена палочка выделения!"));
return true;
}
@ -80,13 +79,13 @@ public class SetupCommand implements TabExecutor {
String key = player.getUniqueId().toString();
Location loc = player.getLocation().getBlock().getLocation();
selectionCorners.put(key + "_pos" + num, loc);
player.sendMessage(Component.text("&#00FF00Установлена точка " + num + ": " + formatLoc(loc)));
player.sendMessage(TextUtil.color("<#00FF00>Установлена точка " + num + ": " + formatLoc(loc)));
return true;
}
private boolean saveTemplate(Player player, String[] args) {
if (args.length < 2) {
player.sendMessage(Component.text("&#FF0000Использование: /dbdsetup save <name>"));
player.sendMessage(TextUtil.color("<#FF0000>Использование: /dbdsetup save <name>"));
return true;
}
String key = player.getUniqueId().toString();
@ -94,38 +93,38 @@ public class SetupCommand implements TabExecutor {
Location pos2 = selectionCorners.get(key + "_pos2");
if (pos1 == null || pos2 == null) {
player.sendMessage(Component.text("&#FF0000Сначала установите обе точки!"));
player.sendMessage(TextUtil.color("<#FF0000>Сначала установите обе точки!"));
return true;
}
plugin.getTemplateManager().saveTemplate(args[1], pos1, pos2);
player.sendMessage(Component.text("&#00FF00Шаблон '" + args[1] + "' сохранен!"));
player.sendMessage(TextUtil.color("<#00FF00>Шаблон '" + args[1] + "' сохранен!"));
return true;
}
private boolean loadTemplate(Player player, String[] args) {
if (args.length < 2) {
player.sendMessage(Component.text("&#FF0000Использование: /dbdsetup load <name>"));
player.sendMessage(TextUtil.color("<#FF0000>Использование: /dbdsetup load <name>"));
return true;
}
var template = plugin.getTemplateManager().getTemplate(args[1]);
if (template == null) {
player.sendMessage(Component.text("&#FF0000Шаблон не найден!"));
player.sendMessage(TextUtil.color("<#FF0000>Шаблон не найден!"));
return true;
}
template.place(player.getLocation(), false);
player.sendMessage(Component.text("&#00FF00Шаблон '" + args[1] + "' загружен!"));
player.sendMessage(TextUtil.color("<#00FF00>Шаблон '" + args[1] + "' загружен!"));
return true;
}
private boolean listTemplates(CommandSender sender) {
var templates = plugin.getTemplateManager().getAllTemplates();
sender.sendMessage(Component.text("&#FFD700=== Шаблоны ==="));
sender.sendMessage(TextUtil.color("<#FFD700>=== Шаблоны ==="));
if (templates.isEmpty()) {
sender.sendMessage(Component.text("&#808080Нет шаблонов"));
sender.sendMessage(TextUtil.color("<#808080>Нет шаблонов"));
} else {
templates.keySet().forEach(name ->
sender.sendMessage(Component.text("&#00CED1- " + name))
sender.sendMessage(TextUtil.color("<#00CED1>- " + name))
);
}
return true;
@ -133,7 +132,7 @@ public class SetupCommand implements TabExecutor {
private boolean setObject(Player player, String[] args) {
if (args.length < 2) {
player.sendMessage(Component.text("&#FF0000Использование: /dbdsetup set <generator|hook|pallet|chest|totem|gate|lobby>"));
player.sendMessage(TextUtil.color("<#FF0000>Использование: /dbdsetup set <generator|hook|pallet|chest|totem|gate|lobby>"));
return true;
}
Location loc = player.getLocation().getBlock().getLocation();
@ -149,26 +148,26 @@ public class SetupCommand implements TabExecutor {
case "gate" -> locations.addLocation("exitgates", loc);
case "lobby" -> locations.setLobby(loc);
default -> {
player.sendMessage(Component.text("&#FF0000Неизвестный тип: " + type));
player.sendMessage(TextUtil.color("<#FF0000>Неизвестный тип: " + type));
return true;
}
}
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
player.sendMessage(Component.text("&#00FF00Установлен: " + type + " на " + formatLoc(loc)));
player.sendMessage(TextUtil.color("<#00FF00>Установлен: " + type + " на " + formatLoc(loc)));
return true;
}
private boolean buildMap(Player player) {
player.sendMessage(Component.text("&#FFD700Строительство карты..."));
player.sendMessage(TextUtil.color("<#FFD700>Строительство карты..."));
plugin.getMapBuilder().buildMap(plugin.getConfigManager().getLocations());
player.sendMessage(Component.text("&#00FF00Карта построена!"));
player.sendMessage(TextUtil.color("<#00FF00>Карта построена!"));
return true;
}
private boolean clearMap(Player player) {
player.sendMessage(Component.text("&#FFA500Очистка карты..."));
player.sendMessage(TextUtil.color("<#FFA500>Очистка карты..."));
plugin.getMapBuilder().clearMap(plugin.getConfigManager().getLocations());
player.sendMessage(Component.text("&#00FF00Карта очищена!"));
player.sendMessage(TextUtil.color("<#00FF00>Карта очищена!"));
return true;
}
@ -177,21 +176,21 @@ public class SetupCommand implements TabExecutor {
plugin.getConfigManager().getLocations().setLobby(loc);
plugin.getConfigManager().saveConfig("locations.yml",
plugin.getConfigManager().getLocations().getConfig());
player.sendMessage(Component.text("&#00FF00Лобби установлено на " + formatLoc(loc)));
player.sendMessage(TextUtil.color("<#00FF00>Лобби установлено на " + formatLoc(loc)));
return true;
}
private void sendUsage(CommandSender sender) {
sender.sendMessage(Component.text("&#FF6B00=== DBD Setup ==="));
sender.sendMessage(Component.text("&#FFD700/dbdsetup wand — Получить палочку"));
sender.sendMessage(Component.text("&#FFD700/dbdsetup pos1/pos2 — Установить точки"));
sender.sendMessage(Component.text("&#FFD700/dbdsetup save <name> — Сохранить шаблон"));
sender.sendMessage(Component.text("&#FFD700/dbdsetup load <name> — Загрузить шаблон"));
sender.sendMessage(Component.text("&#FFD700/dbdsetup list — Список шаблонов"));
sender.sendMessage(Component.text("&#FFD700/dbdsetup set <type> — Установить объект"));
sender.sendMessage(Component.text("&#FFD700/dbdsetup build — Построить карту"));
sender.sendMessage(Component.text("&#FFD700/dbdsetup clear — Очистить карту"));
sender.sendMessage(Component.text("&#FFD700/dbdsetup lobby — Установить лобби"));
sender.sendMessage(TextUtil.color("<#FF6B00>=== DBD Setup ==="));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup wand — Получить палочку"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup pos1/pos2 — Установить точки"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup save <name> — Сохранить шаблон"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup load <name> — Загрузить шаблон"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup list — Список шаблонов"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup set <type> — Установить объект"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup build — Построить карту"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup clear — Очистить карту"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup lobby — Установить лобби"));
}
private String formatLoc(Location loc) {
@ -216,6 +215,11 @@ public class SetupCommand implements TabExecutor {
.filter(s -> s.startsWith(args[1].toLowerCase()))
.toList();
}
if (args.length == 2 && (args[0].equalsIgnoreCase("save") || args[0].equalsIgnoreCase("load"))) {
return plugin.getTemplateManager().getAllTemplates().keySet().stream()
.filter(s -> s.startsWith(args[1].toLowerCase()))
.toList();
}
return List.of();
}
}