This commit is contained in:
loki5512344 2026-06-10 23:00:12 +02:00
parent 89dc9eb00d
commit 957ab4a5a2
149 changed files with 5379 additions and 3263 deletions

View file

@ -1,53 +1,27 @@
package dev.loki.command;
import dev.loki.data.GeneratorDataManager;
import dev.loki.config.LocationsConfig;
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;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitTask;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
public class DBDAdminCommand implements TabExecutor {
private final mdbd plugin;
private final GeneratorDataManager generatorData;
private final Set<UUID> selectingGenerator;
private final MiniMessage mm;
private BukkitTask actionBarTask;
public DBDAdminCommand(mdbd plugin, GeneratorDataManager generatorData) {
public DBDAdminCommand(mdbd plugin) {
this.plugin = plugin;
this.generatorData = generatorData;
this.selectingGenerator = new HashSet<>();
this.mm = MiniMessage.miniMessage();
startActionBarTask();
}
private void startActionBarTask() {
this.actionBarTask = Bukkit.getScheduler().runTaskTimer(plugin, () -> {
for (UUID uuid : selectingGenerator) {
Player p = Bukkit.getPlayer(uuid);
if (p != null && p.isOnline()) {
p.sendActionBar(mm.deserialize(
"<#FFA500>⚒ Режим установки: <#00FF00>сломайте блок для генератора <#FFA500>⚒"));
}
}
}, 0L, 20L);
}
@Override
@ -69,10 +43,7 @@ public class DBDAdminCommand implements TabExecutor {
}
return switch (args[0].toLowerCase()) {
case "create" -> handleCreate(player, args);
case "list" -> handleList(player);
case "remove" -> handleRemove(player, args);
case "clear" -> handleClear(player);
case "list" -> handleList(player, args);
case "world" -> handleWorld(player, args);
default -> {
sendUsage(sender);
@ -81,92 +52,62 @@ public class DBDAdminCommand implements TabExecutor {
};
}
@SuppressWarnings("UnreachableBranchError")
private boolean handleCreate(Player player, String[] args) {
if (args.length < 2) {
player.sendMessage(TextUtil.color("<#FF0000>Использование: /dbdadmin create <generator>"));
return true;
}
private boolean handleList(Player player, String[] args) {
var locations = plugin.getConfigManager().getLocations();
String type = args[1].toLowerCase();
switch (type) {
case "generator" -> {
if (selectingGenerator.contains(player.getUniqueId())) {
selectingGenerator.remove(player.getUniqueId());
player.sendMessage(TextUtil.color("<#FFA500>Режим выбора генератора отключен"));
} else {
selectingGenerator.add(player.getUniqueId());
player.sendMessage(TextUtil.color("<#00FF00>Режим выбора генератора включен!"));
player.sendMessage(TextUtil.color("<#FFD700>Сломайте блок, чтобы установить генератор"));
player.sendMessage(TextUtil.color("<#FFD700>(блок не сломается, а сохранятся его координаты)"));
player.sendMessage(TextUtil.color("<#FFA500>Введите /dbdadmin create generator снова, чтобы отключить режим"));
// Если указан конкретный тип
if (args.length >= 2) {
return switch (args[1].toLowerCase()) {
case "generator" -> listType(player, "Генераторы", locations.getGenerators());
case "hook" -> listType(player, "Крюки", locations.getHooks());
case "chest" -> listType(player, "Сундуки", locations.getChests());
case "killer-spawn", "killerspawn" -> listType(player, "Спавн киллера", locations.getKillerSpawns());
case "survivor-spawn", "survivorspawn" -> listType(player, "Спавн выживших", locations.getSurvivorSpawns());
default -> {
player.sendMessage(TextUtil.color("<#FF0000>Неизвестный тип: " + args[1]));
yield true;
}
return true;
}
default -> {
player.sendMessage(TextUtil.color("<#FF0000>Неизвестный тип: " + type));
return true;
}
};
}
}
private boolean handleList(Player player) {
var entries = generatorData.getGeneratorEntries();
player.sendMessage(TextUtil.color("<#FFD700>=== Генераторы (" + entries.size() + ") ==="));
if (entries.isEmpty()) {
player.sendMessage(TextUtil.color("<#808000>Нет установленных генераторов"));
} else {
for (int i = 0; i < entries.size(); i++) {
player.sendMessage(TextUtil.color("<#00CED1>[" + i + "] " + entries.get(i)));
}
}
// Показать всё
player.sendMessage(TextUtil.color("<#FF6B00>=== Все установленные объекты ==="));
listType(player, "Генераторы", locations.getGenerators());
listType(player, "Крюки", locations.getHooks());
listType(player, "Сундуки", locations.getChests());
listType(player, "Спавн киллера", locations.getKillerSpawns());
listType(player, "Спавн выживших", locations.getSurvivorSpawns());
return true;
}
private boolean handleRemove(Player player, String[] args) {
if (args.length < 2) {
player.sendMessage(TextUtil.color("<#FF0000>Использование: /dbdadmin remove <id>"));
private boolean listType(Player player, String label, List<Location> locations) {
if (locations.isEmpty()) {
player.sendMessage(TextUtil.color("<#808000>" + label + ": нет"));
return true;
}
try {
int id = Integer.parseInt(args[1]);
var entries = generatorData.getGeneratorEntries();
if (id < 0 || id >= entries.size()) {
player.sendMessage(TextUtil.color("<#FF0000>Генератор с ID " + id + " не найден"));
return true;
}
String removed = entries.get(id);
generatorData.removeGenerator(id);
player.sendMessage(TextUtil.color("<#00FF00>Генератор удален: " + removed));
} catch (NumberFormatException e) {
player.sendMessage(TextUtil.color("<#FF0000>ID должен быть числом"));
player.sendMessage(TextUtil.color("<#FFD700>" + label + " (" + locations.size() + "):"));
for (int i = 0; i < locations.size(); i++) {
Location loc = locations.get(i);
player.sendMessage(TextUtil.color(String.format(
"<#00CED1> #%d %s [%.1f, %.1f, %.1f]",
i + 1, loc.getWorld().getName(), loc.getX(), loc.getY(), loc.getZ()
)));
}
return true;
}
private boolean handleClear(Player player) {
generatorData.clearGenerators();
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|<название мира>>"));
player.sendMessage(TextUtil.color("<#FF0000>Использование: /dbdadmin world <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")) {
if (worldArg.equals("game")) {
target = plugin.getLobbyManager().getGameWorld();
if (target == null) {
player.sendMessage(TextUtil.color("<#FF0000>Мир game не загружен!"));
@ -187,34 +128,9 @@ public class DBDAdminCommand implements TabExecutor {
private void sendUsage(CommandSender sender) {
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) {
return selectingGenerator.contains(uuid);
}
public void toggleGeneratorMode(org.bukkit.entity.Player player) {
if (selectingGenerator.contains(player.getUniqueId())) {
selectingGenerator.remove(player.getUniqueId());
player.sendMessage(TextUtil.color("<#FFA500>Режим выбора генератора отключен"));
} else {
selectingGenerator.add(player.getUniqueId());
player.sendMessage(TextUtil.color("<#00FF00>Режим выбора генератора включен!"));
player.sendMessage(TextUtil.color("<#FFD700>Сломайте блок чтобы установить генератор"));
}
}
public void shutdown() {
if (actionBarTask != null) {
actionBarTask.cancel();
actionBarTask = null;
}
selectingGenerator.clear();
sender.sendMessage(TextUtil.color("<#FFD700>/dbdadmin list — Список всех объектов"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdadmin list <тип> — Список по типу"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdadmin world <game|мир> — Телепорт в мир"));
}
@Override
@ -223,34 +139,23 @@ public class DBDAdminCommand implements TabExecutor {
if (!sender.hasPermission("mdbd.admin")) return List.of();
if (args.length == 1) {
return Arrays.asList("create", "list", "remove", "clear", "world").stream()
return Arrays.asList("list", "world").stream()
.filter(s -> s.startsWith(args[0].toLowerCase()))
.toList();
}
if (args.length == 2 && args[0].equalsIgnoreCase("create")) {
return List.of("generator").stream()
if (args.length == 2 && args[0].equalsIgnoreCase("list")) {
return Arrays.asList("generator", "hook", "chest", "killer-spawn", "survivor-spawn").stream()
.filter(s -> s.startsWith(args[1].toLowerCase()))
.toList();
}
if (args.length == 2 && args[0].equalsIgnoreCase("world")) {
return Arrays.asList("lobby", "game").stream()
return Arrays.asList("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<>();
for (int i = 0; i < entries.size(); i++) {
ids.add(String.valueOf(i));
}
return ids.stream()
.filter(s -> s.startsWith(args[1]))
.toList();
}
return List.of();
}
}