remove: template save/load/list from SetupCommand
This commit is contained in:
parent
fcf2debbd4
commit
78fc8bfb55
5 changed files with 182 additions and 132 deletions
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue