remove: template save/load/list from SetupCommand

This commit is contained in:
loki5512344 2026-06-03 20:46:35 +02:00
parent fcf2debbd4
commit 78fc8bfb55
5 changed files with 182 additions and 132 deletions

View file

@ -18,6 +18,8 @@ import java.util.List;
public class SetupCommand implements TabExecutor {
private final mdbd plugin;
private final java.util.Map<String, Location> selectionCorners;
private final java.util.Set<java.util.UUID> selectingKillerSpawn = new java.util.HashSet<>();
private final java.util.Set<java.util.UUID> selectingSurvivorSpawn = new java.util.HashSet<>();
public SetupCommand(mdbd plugin) {
this.plugin = plugin;
@ -31,36 +33,29 @@ public class SetupCommand implements TabExecutor {
sender.sendMessage(Component.text("Нет прав!", NamedTextColor.RED));
return true;
}
if (!(sender instanceof Player player)) {
sender.sendMessage(Component.text("Только игроки!", NamedTextColor.RED));
return true;
}
if (args.length == 0) {
sendUsage(sender);
return true;
}
String sub = args[0].toLowerCase();
return switch (sub) {
case "wand" -> giveWand(player);
case "pos1" -> setPos(player, 1);
case "pos2" -> setPos(player, 2);
case "save" -> saveTemplate(player, args);
case "load" -> loadTemplate(player, args);
case "list" -> listTemplates(sender);
case "set" -> setObject(player, args);
return switch (args[0].toLowerCase()) {
case "wand" -> giveWand(player);
case "pos1" -> setPos(player, 1);
case "pos2" -> setPos(player, 2);
case "set" -> setObject(player, args);
case "build" -> buildMap(player);
case "clear" -> clearMap(player);
case "lobby" -> setLobby(player);
default -> {
sendUsage(sender);
yield true;
}
default -> { sendUsage(sender); yield true; }
};
}
// ── wand ─────────────────────────────────────────────────────────────────
private boolean giveWand(Player player) {
var wand = new org.bukkit.inventory.ItemStack(org.bukkit.Material.STICK);
wand.editMeta(meta -> {
@ -69,9 +64,12 @@ public class SetupCommand implements TabExecutor {
TextUtil.color("<#FFD700>ЛКМ — Первая точка"),
TextUtil.color("<#FFD700>ПКМ — Вторая точка")
));
var key = new org.bukkit.NamespacedKey(plugin, "dbd_wand");
meta.getPersistentDataContainer().set(key,
org.bukkit.persistence.PersistentDataType.BYTE, (byte) 1);
});
player.getInventory().addItem(wand);
player.sendMessage(TextUtil.color("<#00FF00>Получена палочка выделения!"));
player.sendMessage(TextUtil.color("<#00FF00>Получена палочка! <gray>ЛКМ=pos1 ПКМ=pos2"));
return true;
}
@ -83,59 +81,14 @@ public class SetupCommand implements TabExecutor {
return true;
}
/** Called by PlayerInteractListener when wand is used. */
/** Called by PlayerInteractListener when wand is used on a block. */
public void setWandPos(Player player, int num, Location loc) {
String key = player.getUniqueId().toString();
selectionCorners.put(key + "_pos" + num, loc);
player.sendMessage(TextUtil.color("<#00FF00>[Wand] Точка " + num + ": " + formatLoc(loc)));
}
private boolean saveTemplate(Player player, String[] args) {
if (args.length < 2) {
player.sendMessage(TextUtil.color("<#FF0000>Использование: /dbdsetup save <name>"));
return true;
}
String key = player.getUniqueId().toString();
Location pos1 = selectionCorners.get(key + "_pos1");
Location pos2 = selectionCorners.get(key + "_pos2");
if (pos1 == null || pos2 == null) {
player.sendMessage(TextUtil.color("<#FF0000>Сначала установите обе точки!"));
return true;
}
plugin.getTemplateManager().saveTemplate(args[1], pos1, pos2);
player.sendMessage(TextUtil.color("<#00FF00>Шаблон '" + args[1] + "' сохранен!"));
return true;
}
private boolean loadTemplate(Player player, String[] args) {
if (args.length < 2) {
player.sendMessage(TextUtil.color("<#FF0000>Использование: /dbdsetup load <name>"));
return true;
}
var template = plugin.getTemplateManager().getTemplate(args[1]);
if (template == null) {
player.sendMessage(TextUtil.color("<#FF0000>Шаблон не найден!"));
return true;
}
template.place(player.getLocation(), false);
player.sendMessage(TextUtil.color("<#00FF00>Шаблон '" + args[1] + "' загружен!"));
return true;
}
private boolean listTemplates(CommandSender sender) {
var templates = plugin.getTemplateManager().getAllTemplates();
sender.sendMessage(TextUtil.color("<#FFD700>=== Шаблоны ==="));
if (templates.isEmpty()) {
sender.sendMessage(TextUtil.color("<#808080>Нет шаблонов"));
} else {
templates.keySet().forEach(name ->
sender.sendMessage(TextUtil.color("<#00CED1>- " + name))
);
}
return true;
}
// ── set <type> ────────────────────────────────────────────────────────────
private boolean setObject(Player player, String[] args) {
if (args.length < 2) {
@ -143,55 +96,59 @@ public class SetupCommand implements TabExecutor {
player.sendMessage(TextUtil.color("<#FFD700>Типы: generator, hook, pallet, gate, killer-spawn, survivor-spawn, lobby"));
return true;
}
// For spawns and hooks use exact player location (with yaw/pitch)
// For block-based objects (generator) use block location
String type = args[1].toLowerCase();
var locations = plugin.getConfigManager().getLocations();
switch (type) {
case "generator" -> {
Location loc = player.getLocation().getBlock().getLocation();
loc.add(0.5, 0, 0.5); // center of block
locations.addLocation("generators", loc);
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
player.sendMessage(TextUtil.color("<#00FF00>Генератор установлен на " + formatLoc(loc)));
plugin.getDbdAdminCommand().toggleGeneratorMode(player);
return true;
}
case "killer-spawn", "killer_spawn" -> {
if (selectingKillerSpawn.remove(player.getUniqueId())) {
player.sendMessage(TextUtil.color("<#FFA500>Режим спавна киллера отключен"));
} else {
selectingKillerSpawn.add(player.getUniqueId());
player.sendMessage(TextUtil.color("<#FF4444>Режим спавна киллера включен!"));
player.sendMessage(TextUtil.color("<#FFD700>Сломайте блок для установки (блок не сломается)"));
}
return true;
}
case "survivor-spawn", "survivor_spawn" -> {
if (selectingSurvivorSpawn.remove(player.getUniqueId())) {
player.sendMessage(TextUtil.color("<#FFA500>Режим спавна выжившего отключен"));
} else {
selectingSurvivorSpawn.add(player.getUniqueId());
int current = locations.getSurvivorSpawns().size();
player.sendMessage(TextUtil.color("<#00FF00>Режим спавна выжившего включен! Уже: " + current));
player.sendMessage(TextUtil.color("<#FFD700>Сломайте блок для установки (блок не сломается)"));
}
return true;
}
case "hook" -> {
Location loc = player.getLocation();
locations.addLocation("hooks", loc);
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
player.sendMessage(TextUtil.color("<#00FF00>Крюк установлен на " + formatLoc(loc)));
player.sendMessage(TextUtil.color("<#00FF00>Крюк установлен: " + formatLoc(loc)));
}
case "pallet" -> {
Location loc = player.getLocation().getBlock().getLocation();
locations.addLocation("pallets", loc);
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
player.sendMessage(TextUtil.color("<#00FF00>Паллет установлен на " + formatLoc(loc)));
player.sendMessage(TextUtil.color("<#00FF00>Паллет установлен: " + formatLoc(loc)));
}
case "gate" -> {
Location loc = player.getLocation();
locations.addLocation("exitgates", loc);
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
player.sendMessage(TextUtil.color("<#00FF00>Ворота установлены на " + formatLoc(loc)));
}
case "killer-spawn", "killer_spawn" -> {
Location loc = player.getLocation();
locations.setKillerSpawn(loc);
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
player.sendMessage(TextUtil.color("<#FF4444>Спавн киллера установлен на " + formatLoc(loc)));
}
case "survivor-spawn", "survivor_spawn" -> {
Location loc = player.getLocation();
locations.addLocation("survivor-spawns", loc);
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
int count = locations.getSurvivorSpawns().size();
player.sendMessage(TextUtil.color("<#00FF00>Спавн выжившего #" + count + " установлен на " + formatLoc(loc)));
player.sendMessage(TextUtil.color("<#00FF00>Ворота установлены: " + formatLoc(loc)));
}
case "lobby" -> {
Location loc = player.getLocation();
locations.setLobby(loc);
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
player.sendMessage(TextUtil.color("<#00FF00>Лобби установлено на " + formatLoc(loc)));
player.sendMessage(TextUtil.color("<#00FF00>Лобби установлено: " + formatLoc(loc)));
}
default -> {
player.sendMessage(TextUtil.color("<#FF0000>Неизвестный тип: " + type));
@ -201,6 +158,33 @@ public class SetupCommand implements TabExecutor {
return true;
}
// ── spawn selection callbacks (called by SetupBlockBreakListener) ─────────
public boolean isSelectingKillerSpawn(java.util.UUID uuid) {
return selectingKillerSpawn.contains(uuid);
}
public boolean isSelectingSurvivorSpawn(java.util.UUID uuid) {
return selectingSurvivorSpawn.contains(uuid);
}
public void onKillerSpawnSelected(Player player, Location loc) {
plugin.getConfigManager().getLocations().setKillerSpawn(loc);
plugin.getConfigManager().saveConfig("locations.yml",
plugin.getConfigManager().getLocations().getConfig());
player.sendMessage(TextUtil.color("<#FF4444>Спавн киллера установлен: " + formatLoc(loc)));
}
public void onSurvivorSpawnSelected(Player player, Location loc) {
var locations = plugin.getConfigManager().getLocations();
locations.addLocation("survivor-spawns", loc);
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
int count = locations.getSurvivorSpawns().size();
player.sendMessage(TextUtil.color("<#00FF00>Спавн выжившего #" + count + " добавлен: " + formatLoc(loc)));
}
// ── build / clear / lobby ─────────────────────────────────────────────────
private boolean buildMap(Player player) {
player.sendMessage(TextUtil.color("<#FFD700>Строительство карты..."));
plugin.getMapBuilder().buildMap(plugin.getConfigManager().getLocations());
@ -220,21 +204,20 @@ public class SetupCommand implements TabExecutor {
plugin.getConfigManager().getLocations().setLobby(loc);
plugin.getConfigManager().saveConfig("locations.yml",
plugin.getConfigManager().getLocations().getConfig());
player.sendMessage(TextUtil.color("<#00FF00>Лобби установлено на " + formatLoc(loc)));
player.sendMessage(TextUtil.color("<#00FF00>Лобби установлено: " + formatLoc(loc)));
return true;
}
// ── usage / helpers ───────────────────────────────────────────────────────
private void sendUsage(CommandSender sender) {
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 wand — Получить палочку выделения"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup pos1/pos2 — Установить точки выделения"));
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 — Установить лобби"));
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup lobby — Установить спавн лобби"));
}
private String formatLoc(Location loc) {
@ -244,26 +227,22 @@ public class SetupCommand implements TabExecutor {
@Override
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command,
@NotNull String label, @NotNull String[] args) {
@NotNull String label, @NotNull String[] args) {
if (!sender.hasPermission("mdbd.admin")) return List.of();
if (args.length == 1) {
return Arrays.asList("wand", "pos1", "pos2", "save", "load", "list",
"set", "build", "clear", "lobby").stream()
return Arrays.asList("wand", "pos1", "pos2", "set", "build", "clear", "lobby")
.stream()
.filter(s -> s.startsWith(args[0].toLowerCase()))
.toList();
}
if (args.length == 2 && args[0].equalsIgnoreCase("set")) {
return Arrays.asList("generator", "hook", "pallet", "gate", "killer-spawn", "survivor-spawn", "lobby")
return Arrays.asList("generator", "hook", "pallet", "gate",
"killer-spawn", "survivor-spawn", "lobby")
.stream()
.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();
}
}