Add map templates, multi-config system, &#rrggbb colors
- MapTemplate: Save/load structures via Bukkit Structure API (.nbt files) - TemplateManager: Manage templates and presets - MapBuilder: Build/clear map with generators, hooks, pallets, etc. - SetupCommand: /dbdsetup wand/save/load/set/build for map editing - MessagesConfig: All messages with &#rrggbb color support via MiniMessage - SkillCheckConfig: Skill check colors, zones, rotation settings - Update GameConfig with color codes - ConfigManager: Load/save all 4 config files - Update plugin.yml with dbdsetup command - Add methods to Generator for template integration
This commit is contained in:
parent
362b791774
commit
2a2b9f4b5b
10 changed files with 951 additions and 1 deletions
221
src/main/java/dev/loki/command/SetupCommand.java
Normal file
221
src/main/java/dev/loki/command/SetupCommand.java
Normal file
|
|
@ -0,0 +1,221 @@
|
|||
package dev.loki.command;
|
||||
|
||||
import dev.loki.mdbd;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
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.util.BlockVector;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class SetupCommand implements TabExecutor {
|
||||
private final mdbd plugin;
|
||||
private final java.util.Map<String, Location> selectionCorners;
|
||||
|
||||
public SetupCommand(mdbd plugin) {
|
||||
this.plugin = plugin;
|
||||
this.selectionCorners = new java.util.HashMap<>();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command,
|
||||
@NotNull String label, @NotNull String[] args) {
|
||||
if (!sender.hasPermission("mdbd.admin")) {
|
||||
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);
|
||||
case "build" -> buildMap(player);
|
||||
case "clear" -> clearMap(player);
|
||||
case "lobby" -> setLobby(player);
|
||||
default -> {
|
||||
sendUsage(sender);
|
||||
yield true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
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.lore(List.of(
|
||||
Component.text("&#FFD700ЛКМ — Первая точка"),
|
||||
Component.text("&#FFD700ПКМ — Вторая точка")
|
||||
));
|
||||
});
|
||||
player.getInventory().addItem(wand);
|
||||
player.sendMessage(Component.text("�FF00Получена палочка выделения!", NamedTextColor.GREEN));
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean setPos(Player player, int num) {
|
||||
String key = player.getUniqueId().toString();
|
||||
Location loc = player.getLocation().getBlock().getLocation();
|
||||
selectionCorners.put(key + "_pos" + num, loc);
|
||||
player.sendMessage(Component.text("�FF00Установлена точка " + num + ": " + formatLoc(loc)));
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean saveTemplate(Player player, String[] args) {
|
||||
if (args.length < 2) {
|
||||
player.sendMessage(Component.text("&#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(Component.text("&#FF0000Сначала установите обе точки!"));
|
||||
return true;
|
||||
}
|
||||
|
||||
plugin.getTemplateManager().saveTemplate(args[1], pos1, pos2);
|
||||
player.sendMessage(Component.text("�FF00Шаблон '" + args[1] + "' сохранен!"));
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean loadTemplate(Player player, String[] args) {
|
||||
if (args.length < 2) {
|
||||
player.sendMessage(Component.text("&#FF0000Использование: /dbdsetup load <name>"));
|
||||
return true;
|
||||
}
|
||||
var template = plugin.getTemplateManager().getTemplate(args[1]);
|
||||
if (template == null) {
|
||||
player.sendMessage(Component.text("&#FF0000Шаблон не найден!"));
|
||||
return true;
|
||||
}
|
||||
template.place(player.getLocation(), false);
|
||||
player.sendMessage(Component.text("�FF00Шаблон '" + args[1] + "' загружен!"));
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean listTemplates(CommandSender sender) {
|
||||
var templates = plugin.getTemplateManager().getAllTemplates();
|
||||
sender.sendMessage(Component.text("&#FFD700=== Шаблоны ==="));
|
||||
if (templates.isEmpty()) {
|
||||
sender.sendMessage(Component.text("󅒐Нет шаблонов"));
|
||||
} else {
|
||||
templates.keySet().forEach(name ->
|
||||
sender.sendMessage(Component.text("�CED1- " + name))
|
||||
);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
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>"));
|
||||
return true;
|
||||
}
|
||||
Location loc = player.getLocation().getBlock().getLocation();
|
||||
String type = args[1].toLowerCase();
|
||||
var locations = plugin.getConfigManager().getLocations();
|
||||
|
||||
switch (type) {
|
||||
case "generator" -> locations.addLocation("generators", loc);
|
||||
case "hook" -> locations.addLocation("hooks", loc);
|
||||
case "pallet" -> locations.addLocation("pallets", loc);
|
||||
case "chest" -> locations.addLocation("chests", loc);
|
||||
case "totem" -> locations.addLocation("totems", loc);
|
||||
case "gate" -> locations.addLocation("exitgates", loc);
|
||||
case "lobby" -> locations.setLobby(loc);
|
||||
default -> {
|
||||
player.sendMessage(Component.text("&#FF0000Неизвестный тип: " + type));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
plugin.getConfigManager().saveConfig("locations.yml", locations.getConfig());
|
||||
player.sendMessage(Component.text("�FF00Установлен: " + type + " на " + formatLoc(loc)));
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean buildMap(Player player) {
|
||||
player.sendMessage(Component.text("&#FFD700Строительство карты..."));
|
||||
plugin.getMapBuilder().buildMap(plugin.getConfigManager().getLocations());
|
||||
player.sendMessage(Component.text("�FF00Карта построена!"));
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean clearMap(Player player) {
|
||||
player.sendMessage(Component.text("&#FFA500Очистка карты..."));
|
||||
plugin.getMapBuilder().clearMap(plugin.getConfigManager().getLocations());
|
||||
player.sendMessage(Component.text("�FF00Карта очищена!"));
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean setLobby(Player player) {
|
||||
Location loc = player.getLocation();
|
||||
plugin.getConfigManager().getLocations().setLobby(loc);
|
||||
plugin.getConfigManager().saveConfig("locations.yml",
|
||||
plugin.getConfigManager().getLocations().getConfig());
|
||||
player.sendMessage(Component.text("�FF00Лобби установлено на " + 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 — Установить лобби"));
|
||||
}
|
||||
|
||||
private String formatLoc(Location loc) {
|
||||
return String.format("[%s, %.0f, %.0f, %.0f]",
|
||||
loc.getWorld().getName(), loc.getX(), loc.getY(), loc.getZ());
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command,
|
||||
@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()
|
||||
.filter(s -> s.startsWith(args[0].toLowerCase()))
|
||||
.toList();
|
||||
}
|
||||
if (args.length == 2 && args[0].equalsIgnoreCase("set")) {
|
||||
return Arrays.asList("generator", "hook", "pallet", "chest", "totem", "gate", "lobby")
|
||||
.stream()
|
||||
.filter(s -> s.startsWith(args[1].toLowerCase()))
|
||||
.toList();
|
||||
}
|
||||
return List.of();
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue