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
|
|
@ -198,6 +198,17 @@ public class DBDAdminCommand implements TabExecutor {
|
||||||
return selectingGenerator.contains(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() {
|
public void shutdown() {
|
||||||
if (actionBarTask != null) {
|
if (actionBarTask != null) {
|
||||||
actionBarTask.cancel();
|
actionBarTask.cancel();
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,8 @@ import java.util.List;
|
||||||
public class SetupCommand implements TabExecutor {
|
public class SetupCommand implements TabExecutor {
|
||||||
private final mdbd plugin;
|
private final mdbd plugin;
|
||||||
private final java.util.Map<String, Location> selectionCorners;
|
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) {
|
public SetupCommand(mdbd plugin) {
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
|
|
@ -31,36 +33,29 @@ public class SetupCommand implements TabExecutor {
|
||||||
sender.sendMessage(Component.text("Нет прав!", NamedTextColor.RED));
|
sender.sendMessage(Component.text("Нет прав!", NamedTextColor.RED));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(sender instanceof Player player)) {
|
if (!(sender instanceof Player player)) {
|
||||||
sender.sendMessage(Component.text("Только игроки!", NamedTextColor.RED));
|
sender.sendMessage(Component.text("Только игроки!", NamedTextColor.RED));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (args.length == 0) {
|
if (args.length == 0) {
|
||||||
sendUsage(sender);
|
sendUsage(sender);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
String sub = args[0].toLowerCase();
|
return switch (args[0].toLowerCase()) {
|
||||||
return switch (sub) {
|
|
||||||
case "wand" -> giveWand(player);
|
case "wand" -> giveWand(player);
|
||||||
case "pos1" -> setPos(player, 1);
|
case "pos1" -> setPos(player, 1);
|
||||||
case "pos2" -> setPos(player, 2);
|
case "pos2" -> setPos(player, 2);
|
||||||
case "save" -> saveTemplate(player, args);
|
|
||||||
case "load" -> loadTemplate(player, args);
|
|
||||||
case "list" -> listTemplates(sender);
|
|
||||||
case "set" -> setObject(player, args);
|
case "set" -> setObject(player, args);
|
||||||
case "build" -> buildMap(player);
|
case "build" -> buildMap(player);
|
||||||
case "clear" -> clearMap(player);
|
case "clear" -> clearMap(player);
|
||||||
case "lobby" -> setLobby(player);
|
case "lobby" -> setLobby(player);
|
||||||
default -> {
|
default -> { sendUsage(sender); yield true; }
|
||||||
sendUsage(sender);
|
|
||||||
yield true;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── wand ─────────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
private boolean giveWand(Player player) {
|
private boolean giveWand(Player player) {
|
||||||
var wand = new org.bukkit.inventory.ItemStack(org.bukkit.Material.STICK);
|
var wand = new org.bukkit.inventory.ItemStack(org.bukkit.Material.STICK);
|
||||||
wand.editMeta(meta -> {
|
wand.editMeta(meta -> {
|
||||||
|
|
@ -69,9 +64,12 @@ public class SetupCommand implements TabExecutor {
|
||||||
TextUtil.color("<#FFD700>ЛКМ — Первая точка"),
|
TextUtil.color("<#FFD700>ЛКМ — Первая точка"),
|
||||||
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.getInventory().addItem(wand);
|
||||||
player.sendMessage(TextUtil.color("<#00FF00>Получена палочка выделения!"));
|
player.sendMessage(TextUtil.color("<#00FF00>Получена палочка! <gray>ЛКМ=pos1 ПКМ=pos2"));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -83,59 +81,14 @@ public class SetupCommand implements TabExecutor {
|
||||||
return true;
|
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) {
|
public void setWandPos(Player player, int num, Location loc) {
|
||||||
String key = player.getUniqueId().toString();
|
String key = player.getUniqueId().toString();
|
||||||
selectionCorners.put(key + "_pos" + num, loc);
|
selectionCorners.put(key + "_pos" + num, loc);
|
||||||
player.sendMessage(TextUtil.color("<#00FF00>[Wand] Точка " + num + ": " + formatLoc(loc)));
|
player.sendMessage(TextUtil.color("<#00FF00>[Wand] Точка " + num + ": " + formatLoc(loc)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean saveTemplate(Player player, String[] args) {
|
// ── set <type> ────────────────────────────────────────────────────────────
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean setObject(Player player, String[] args) {
|
private boolean setObject(Player player, String[] args) {
|
||||||
if (args.length < 2) {
|
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"));
|
player.sendMessage(TextUtil.color("<#FFD700>Типы: generator, hook, pallet, gate, killer-spawn, survivor-spawn, lobby"));
|
||||||
return true;
|
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();
|
String type = args[1].toLowerCase();
|
||||||
var locations = plugin.getConfigManager().getLocations();
|
var locations = plugin.getConfigManager().getLocations();
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case "generator" -> {
|
case "generator" -> {
|
||||||
Location loc = player.getLocation().getBlock().getLocation();
|
plugin.getDbdAdminCommand().toggleGeneratorMode(player);
|
||||||
loc.add(0.5, 0, 0.5); // center of block
|
return true;
|
||||||
locations.addLocation("generators", loc);
|
}
|
||||||
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
|
case "killer-spawn", "killer_spawn" -> {
|
||||||
player.sendMessage(TextUtil.color("<#00FF00>Генератор установлен на " + formatLoc(loc)));
|
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" -> {
|
case "hook" -> {
|
||||||
Location loc = player.getLocation();
|
Location loc = player.getLocation();
|
||||||
locations.addLocation("hooks", loc);
|
locations.addLocation("hooks", loc);
|
||||||
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
|
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
|
||||||
player.sendMessage(TextUtil.color("<#00FF00>Крюк установлен на " + formatLoc(loc)));
|
player.sendMessage(TextUtil.color("<#00FF00>Крюк установлен: " + formatLoc(loc)));
|
||||||
}
|
}
|
||||||
case "pallet" -> {
|
case "pallet" -> {
|
||||||
Location loc = player.getLocation().getBlock().getLocation();
|
Location loc = player.getLocation().getBlock().getLocation();
|
||||||
locations.addLocation("pallets", loc);
|
locations.addLocation("pallets", loc);
|
||||||
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
|
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
|
||||||
player.sendMessage(TextUtil.color("<#00FF00>Паллет установлен на " + formatLoc(loc)));
|
player.sendMessage(TextUtil.color("<#00FF00>Паллет установлен: " + formatLoc(loc)));
|
||||||
}
|
}
|
||||||
case "gate" -> {
|
case "gate" -> {
|
||||||
Location loc = player.getLocation();
|
Location loc = player.getLocation();
|
||||||
locations.addLocation("exitgates", loc);
|
locations.addLocation("exitgates", loc);
|
||||||
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
|
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
|
||||||
player.sendMessage(TextUtil.color("<#00FF00>Ворота установлены на " + formatLoc(loc)));
|
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)));
|
|
||||||
}
|
}
|
||||||
case "lobby" -> {
|
case "lobby" -> {
|
||||||
Location loc = player.getLocation();
|
Location loc = player.getLocation();
|
||||||
locations.setLobby(loc);
|
locations.setLobby(loc);
|
||||||
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
|
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
|
||||||
player.sendMessage(TextUtil.color("<#00FF00>Лобби установлено на " + formatLoc(loc)));
|
player.sendMessage(TextUtil.color("<#00FF00>Лобби установлено: " + formatLoc(loc)));
|
||||||
}
|
}
|
||||||
default -> {
|
default -> {
|
||||||
player.sendMessage(TextUtil.color("<#FF0000>Неизвестный тип: " + type));
|
player.sendMessage(TextUtil.color("<#FF0000>Неизвестный тип: " + type));
|
||||||
|
|
@ -201,6 +158,33 @@ public class SetupCommand implements TabExecutor {
|
||||||
return true;
|
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) {
|
private boolean buildMap(Player player) {
|
||||||
player.sendMessage(TextUtil.color("<#FFD700>Строительство карты..."));
|
player.sendMessage(TextUtil.color("<#FFD700>Строительство карты..."));
|
||||||
plugin.getMapBuilder().buildMap(plugin.getConfigManager().getLocations());
|
plugin.getMapBuilder().buildMap(plugin.getConfigManager().getLocations());
|
||||||
|
|
@ -220,21 +204,20 @@ public class SetupCommand implements TabExecutor {
|
||||||
plugin.getConfigManager().getLocations().setLobby(loc);
|
plugin.getConfigManager().getLocations().setLobby(loc);
|
||||||
plugin.getConfigManager().saveConfig("locations.yml",
|
plugin.getConfigManager().saveConfig("locations.yml",
|
||||||
plugin.getConfigManager().getLocations().getConfig());
|
plugin.getConfigManager().getLocations().getConfig());
|
||||||
player.sendMessage(TextUtil.color("<#00FF00>Лобби установлено на " + formatLoc(loc)));
|
player.sendMessage(TextUtil.color("<#00FF00>Лобби установлено: " + formatLoc(loc)));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── usage / helpers ───────────────────────────────────────────────────────
|
||||||
|
|
||||||
private void sendUsage(CommandSender sender) {
|
private void sendUsage(CommandSender sender) {
|
||||||
sender.sendMessage(TextUtil.color("<#FF6B00>=== DBD Setup ==="));
|
sender.sendMessage(TextUtil.color("<#FF6B00>=== DBD Setup ==="));
|
||||||
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup wand — Получить палочку"));
|
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup wand — Получить палочку выделения"));
|
||||||
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup pos1/pos2 — Установить точки"));
|
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup pos1/pos2 — Установить точки выделения"));
|
||||||
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup save <name> — Сохранить шаблон"));
|
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup set <type> — Установить объект на карте"));
|
||||||
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 build — Построить карту"));
|
||||||
sender.sendMessage(TextUtil.color("<#FFD700>/dbdsetup clear — Очистить карту"));
|
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) {
|
private String formatLoc(Location loc) {
|
||||||
|
|
@ -248,22 +231,18 @@ public class SetupCommand implements TabExecutor {
|
||||||
if (!sender.hasPermission("mdbd.admin")) return List.of();
|
if (!sender.hasPermission("mdbd.admin")) return List.of();
|
||||||
|
|
||||||
if (args.length == 1) {
|
if (args.length == 1) {
|
||||||
return Arrays.asList("wand", "pos1", "pos2", "save", "load", "list",
|
return Arrays.asList("wand", "pos1", "pos2", "set", "build", "clear", "lobby")
|
||||||
"set", "build", "clear", "lobby").stream()
|
.stream()
|
||||||
.filter(s -> s.startsWith(args[0].toLowerCase()))
|
.filter(s -> s.startsWith(args[0].toLowerCase()))
|
||||||
.toList();
|
.toList();
|
||||||
}
|
}
|
||||||
if (args.length == 2 && args[0].equalsIgnoreCase("set")) {
|
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()
|
.stream()
|
||||||
.filter(s -> s.startsWith(args[1].toLowerCase()))
|
.filter(s -> s.startsWith(args[1].toLowerCase()))
|
||||||
.toList();
|
.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();
|
return List.of();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import dev.loki.core.GameManager;
|
||||||
import dev.loki.objective.GeneratorManager;
|
import dev.loki.objective.GeneratorManager;
|
||||||
import dev.loki.player.BasePlayer;
|
import dev.loki.player.BasePlayer;
|
||||||
import dev.loki.player.PlayerState;
|
import dev.loki.player.PlayerState;
|
||||||
import dev.loki.util.TextUtil;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
|
|
@ -89,24 +89,24 @@ public class PlayerInteractListener implements Listener {
|
||||||
if (item == null || item.getType() != Material.STICK) return false;
|
if (item == null || item.getType() != Material.STICK) return false;
|
||||||
if (!item.hasItemMeta()) return false;
|
if (!item.hasItemMeta()) return false;
|
||||||
|
|
||||||
|
// Reliable check: look for NBT persistent data tag instead of display name parsing
|
||||||
var meta = item.getItemMeta();
|
var meta = item.getItemMeta();
|
||||||
// Check it's the DBD wand by display name component
|
var key = new org.bukkit.NamespacedKey("mdbd", "dbd_wand");
|
||||||
if (meta.displayName() == null) return false;
|
if (!meta.getPersistentDataContainer().has(key, org.bukkit.persistence.PersistentDataType.BYTE)) {
|
||||||
String plain = net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer.plainText()
|
return false;
|
||||||
.serialize(meta.displayName());
|
}
|
||||||
if (!plain.contains("DBD Wand")) return false;
|
|
||||||
|
|
||||||
event.setCancelled(true);
|
event.setCancelled(true);
|
||||||
|
|
||||||
Action action = event.getAction();
|
Action action = event.getAction();
|
||||||
|
Location loc = event.getClickedBlock() != null
|
||||||
|
? event.getClickedBlock().getLocation()
|
||||||
|
: player.getLocation().getBlock().getLocation();
|
||||||
|
|
||||||
if (action == Action.LEFT_CLICK_BLOCK || action == Action.LEFT_CLICK_AIR) {
|
if (action == Action.LEFT_CLICK_BLOCK || action == Action.LEFT_CLICK_AIR) {
|
||||||
setupCommand.setWandPos(player, 1, event.getClickedBlock() != null
|
setupCommand.setWandPos(player, 1, loc);
|
||||||
? event.getClickedBlock().getLocation()
|
|
||||||
: player.getLocation().getBlock().getLocation());
|
|
||||||
} else if (action == Action.RIGHT_CLICK_BLOCK || action == Action.RIGHT_CLICK_AIR) {
|
} else if (action == Action.RIGHT_CLICK_BLOCK || action == Action.RIGHT_CLICK_AIR) {
|
||||||
setupCommand.setWandPos(player, 2, event.getClickedBlock() != null
|
setupCommand.setWandPos(player, 2, loc);
|
||||||
? event.getClickedBlock().getLocation()
|
|
||||||
: player.getLocation().getBlock().getLocation());
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
45
src/main/java/dev/loki/listener/SetupBlockBreakListener.java
Normal file
45
src/main/java/dev/loki/listener/SetupBlockBreakListener.java
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
package dev.loki.listener;
|
||||||
|
|
||||||
|
import dev.loki.command.SetupCommand;
|
||||||
|
import org.bukkit.Location;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.block.BlockBreakEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles block-break selection for killer-spawn and survivor-spawn setup modes.
|
||||||
|
* Generator selection is handled by GeneratorSelectListener.
|
||||||
|
*/
|
||||||
|
public class SetupBlockBreakListener implements Listener {
|
||||||
|
|
||||||
|
private final SetupCommand setupCommand;
|
||||||
|
|
||||||
|
public SetupBlockBreakListener(SetupCommand setupCommand) {
|
||||||
|
this.setupCommand = setupCommand;
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onBlockBreak(BlockBreakEvent event) {
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
|
boolean killerMode = setupCommand.isSelectingKillerSpawn(player.getUniqueId());
|
||||||
|
boolean survivorMode = setupCommand.isSelectingSurvivorSpawn(player.getUniqueId());
|
||||||
|
|
||||||
|
if (!killerMode && !survivorMode) return;
|
||||||
|
|
||||||
|
event.setCancelled(true);
|
||||||
|
|
||||||
|
// Center of block, standing on top
|
||||||
|
Location loc = event.getBlock().getLocation()
|
||||||
|
.add(0.5, 1.0, 0.5);
|
||||||
|
loc.setYaw(player.getLocation().getYaw());
|
||||||
|
loc.setPitch(0f);
|
||||||
|
|
||||||
|
if (killerMode) {
|
||||||
|
setupCommand.onKillerSpawnSelected(player, loc);
|
||||||
|
} else {
|
||||||
|
setupCommand.onSurvivorSpawnSelected(player, loc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,8 +5,6 @@ import dev.loki.core.GameSession;
|
||||||
import dev.loki.player.BasePlayer;
|
import dev.loki.player.BasePlayer;
|
||||||
import dev.loki.player.Killer;
|
import dev.loki.player.Killer;
|
||||||
import dev.loki.player.Survivor;
|
import dev.loki.player.Survivor;
|
||||||
import net.kyori.adventure.text.Component;
|
|
||||||
import net.kyori.adventure.text.format.NamedTextColor;
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
@ -32,52 +30,69 @@ public class RoleAssigner {
|
||||||
|
|
||||||
public void assignRoles(GameSession session) {
|
public void assignRoles(GameSession session) {
|
||||||
Map<UUID, BasePlayer> players = session.getPlayers();
|
Map<UUID, BasePlayer> players = session.getPlayers();
|
||||||
if (players.isEmpty()) return;
|
if (players.isEmpty()) {
|
||||||
|
session.getPlugin().getLogger().warning("[RoleAssigner] No players in session!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
List<UUID> uuids = new ArrayList<>(players.keySet());
|
List<UUID> uuids = new ArrayList<>(players.keySet());
|
||||||
UUID killerUuid = selectKiller(uuids);
|
UUID killerUuid = selectKiller(uuids);
|
||||||
|
|
||||||
|
Location killerSpawn = locations.getKillerSpawn();
|
||||||
List<Location> survivorSpawns = locations.getSurvivorSpawns();
|
List<Location> survivorSpawns = locations.getSurvivorSpawns();
|
||||||
|
|
||||||
|
if (killerSpawn == null) {
|
||||||
|
session.getPlugin().getLogger().warning("[RoleAssigner] killer-spawn not set! Using game world spawn.");
|
||||||
|
}
|
||||||
|
if (survivorSpawns.isEmpty()) {
|
||||||
|
session.getPlugin().getLogger().warning("[RoleAssigner] survivor-spawns not set! Using game world spawn.");
|
||||||
|
}
|
||||||
|
|
||||||
int spawnIndex = 0;
|
int spawnIndex = 0;
|
||||||
|
|
||||||
for (UUID uuid : uuids) {
|
for (UUID uuid : uuids) {
|
||||||
BasePlayer newPlayer;
|
BasePlayer newPlayer;
|
||||||
if (uuid.equals(killerUuid)) {
|
if (uuid.equals(killerUuid)) {
|
||||||
newPlayer = new Killer(uuid);
|
newPlayer = new Killer(uuid);
|
||||||
Location spawn = locations.getKillerSpawn();
|
if (killerSpawn != null) newPlayer.setSpawnLocation(killerSpawn);
|
||||||
if (spawn != null) newPlayer.setSpawnLocation(spawn);
|
|
||||||
} else {
|
} else {
|
||||||
newPlayer = new Survivor(uuid);
|
newPlayer = new Survivor(uuid);
|
||||||
if (!survivorSpawns.isEmpty()) {
|
if (!survivorSpawns.isEmpty()) {
|
||||||
Location spawn = survivorSpawns.get(spawnIndex % survivorSpawns.size());
|
newPlayer.setSpawnLocation(survivorSpawns.get(spawnIndex % survivorSpawns.size()));
|
||||||
newPlayer.setSpawnLocation(spawn);
|
|
||||||
spawnIndex++;
|
spawnIndex++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Actually replace the player object in session
|
|
||||||
session.replacePlayer(uuid, newPlayer);
|
session.replacePlayer(uuid, newPlayer);
|
||||||
|
|
||||||
// Announce role and teleport
|
|
||||||
Player bukkit = Bukkit.getPlayer(uuid);
|
Player bukkit = Bukkit.getPlayer(uuid);
|
||||||
if (bukkit != null && bukkit.isOnline()) {
|
if (bukkit != null && bukkit.isOnline()) {
|
||||||
if (newPlayer.isKiller()) {
|
if (newPlayer.isKiller()) {
|
||||||
bukkit.sendTitle("§4§lКИЛЛЕР", "§cОхоться на выживших!", 10, 60, 20);
|
bukkit.showTitle(net.kyori.adventure.title.Title.title(
|
||||||
bukkit.sendMessage(Component.text("[DBD] Ваша роль: Киллер", NamedTextColor.RED));
|
net.kyori.adventure.text.Component.text("КИЛЛЕР").color(net.kyori.adventure.text.format.TextColor.color(0xFF2222)),
|
||||||
|
net.kyori.adventure.text.Component.text("Охоться на выживших!").color(net.kyori.adventure.text.format.NamedTextColor.RED)
|
||||||
|
));
|
||||||
|
bukkit.sendMessage(net.kyori.adventure.text.Component.text("[DBD] Ваша роль: Киллер", net.kyori.adventure.text.format.NamedTextColor.RED));
|
||||||
} else {
|
} else {
|
||||||
bukkit.sendTitle("§a§lВЫЖИВШИЙ", "§eЧини генераторы и сбегай!", 10, 60, 20);
|
bukkit.showTitle(net.kyori.adventure.title.Title.title(
|
||||||
bukkit.sendMessage(Component.text("[DBD] Ваша роль: Выживший", NamedTextColor.GREEN));
|
net.kyori.adventure.text.Component.text("ВЫЖИВШИЙ").color(net.kyori.adventure.text.format.TextColor.color(0x00FF00)),
|
||||||
|
net.kyori.adventure.text.Component.text("Чини генераторы и сбегай!").color(net.kyori.adventure.text.format.NamedTextColor.YELLOW)
|
||||||
|
));
|
||||||
|
bukkit.sendMessage(net.kyori.adventure.text.Component.text("[DBD] Ваша роль: Выживший", net.kyori.adventure.text.format.NamedTextColor.GREEN));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Teleport to game world spawn (or role spawn)
|
|
||||||
Location spawn = newPlayer.getSpawnLocation();
|
Location spawn = newPlayer.getSpawnLocation();
|
||||||
if (spawn != null) {
|
if (spawn != null) {
|
||||||
bukkit.teleport(spawn);
|
bukkit.teleport(spawn);
|
||||||
|
session.getPlugin().getLogger().info("[RoleAssigner] Teleported " + bukkit.getName() + " to " + spawn);
|
||||||
} else {
|
} else {
|
||||||
// Fallback: game world spawn
|
|
||||||
var gameWorld = session.getPlugin().getLobbyManager().getGameWorld();
|
var gameWorld = session.getPlugin().getLobbyManager().getGameWorld();
|
||||||
if (gameWorld != null) {
|
if (gameWorld != null) {
|
||||||
bukkit.teleport(gameWorld.getSpawnLocation());
|
Location fallback = gameWorld.getSpawnLocation();
|
||||||
|
bukkit.teleport(fallback);
|
||||||
|
session.getPlugin().getLogger().info("[RoleAssigner] Teleported " + bukkit.getName() + " to game world spawn (no spawn set)");
|
||||||
|
} else {
|
||||||
|
session.getPlugin().getLogger().severe("[RoleAssigner] Game world is null! Cannot teleport " + bukkit.getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue