mdbd/src/main/java/dev/loki/command/DBDAdminCommand.java
loki5512344 c31ea425db feat: add computers as second objective type
- New: Computer, ComputerManager, ComputerRepair, ComputerHologram, ComputerDataManager
- Config: total-count=2, required-count=2, repair-seconds=90 in game.yml
- Win condition: all generators AND all computers required
- No regression, no ComputerKick, no compass on skill-check fail
- /dbdsetup set computer, /dbdadmin list computer
- Hologram progress display, persistence to data/computers.yml
- LECTERN block right-click cancelled
2026-06-21 13:37:37 +02:00

192 lines
7.5 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package dev.loki.command;
import dev.loki.mdbd;
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.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.List;
public class DBDAdminCommand implements TabExecutor {
private final mdbd plugin;
public DBDAdminCommand(mdbd plugin) {
this.plugin = plugin;
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command,
@NotNull String label, @NotNull String[] args) {
var messages = plugin.getConfigManager().getMessages();
if (!sender.hasPermission("mdbd.admin")) {
sender.sendMessage(messages.get("cmd.no-permission"));
return true;
}
if (!(sender instanceof Player player)) {
sender.sendMessage(messages.get("cmd.players-only"));
return true;
}
if (args.length == 0) {
sendUsage(sender);
return true;
}
return switch (args[0].toLowerCase()) {
case "list" -> handleList(player, args);
case "world" -> handleWorld(player, args);
case "repairgens" -> handleRepairGens(player);
default -> {
sendUsage(sender);
yield true;
}
};
}
private boolean handleList(Player player, String[] args) {
var locations = plugin.getConfigManager().getLocations();
// Если указан конкретный тип
if (args.length >= 2) {
return switch (args[1].toLowerCase()) {
case "generator" -> listType(player, "Генераторы", locations.getGenerators());
case "computer" -> listType(player, "Компьютеры", plugin.getComputerData().getComputers());
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(plugin.getConfigManager().getMessages().get("dbdadmin.unknown-type", args[1]));
yield true;
}
};
}
// Показать всё
player.sendMessage(plugin.getConfigManager().getMessages().get("dbdadmin-list.header"));
listType(player, "Генераторы", locations.getGenerators());
listType(player, "Компьютеры", plugin.getComputerData().getComputers());
listType(player, "Крюки", locations.getHooks());
listType(player, "Сундуки", locations.getChests());
listType(player, "Спавн киллера", locations.getKillerSpawns());
listType(player, "Спавн выживших", locations.getSurvivorSpawns());
return true;
}
private boolean listType(Player player, String label, List<Location> locations) {
var messages = plugin.getConfigManager().getMessages();
if (locations.isEmpty()) {
player.sendMessage(messages.get("dbdadmin-list.none", label));
return true;
}
player.sendMessage(messages.get("dbdadmin-list.count", label, locations.size()));
for (int i = 0; i < locations.size(); i++) {
Location loc = locations.get(i);
player.sendMessage(messages.get("dbdadmin-list.entry",
i + 1, loc.getWorld().getName(), loc.getX(), loc.getY(), loc.getZ()
));
}
return true;
}
private boolean handleWorld(Player player, String[] args) {
if (args.length < 2) {
player.sendMessage(plugin.getConfigManager().getMessages().get("dbdadmin-list.world-usage"));
return true;
}
String worldArg = args[1].toLowerCase();
org.bukkit.World target;
if (worldArg.equals("game")) {
target = plugin.getLobbyManager().getGameWorld();
if (target == null) {
player.sendMessage(plugin.getConfigManager().getMessages().get("dbdadmin-list.world-not-found"));
return true;
}
} else {
target = org.bukkit.Bukkit.getWorld(args[1]);
if (target == null) {
player.sendMessage(plugin.getConfigManager().getMessages().get("dbdadmin-list.world-not-exist", args[1]));
return true;
}
}
player.teleport(target.getSpawnLocation());
player.sendMessage(plugin.getConfigManager().getMessages().get("dbdadmin-list.world-teleport", target.getName()));
return true;
}
private boolean handleRepairGens(Player player) {
var gameManager = plugin.getGameManager();
var session = gameManager.getCurrentSession();
if (session == null) {
player.sendMessage("§cНет активной игры.");
return true;
}
var genManager = session.getGeneratorManager();
if (genManager == null) {
player.sendMessage("§cGeneratorManager не найден.");
return true;
}
int count = 0;
for (var gen : genManager.getIncompleteGenerators()) {
gen.setProgress(100.0);
genManager.onGeneratorCompleted(gen);
count++;
}
player.sendMessage("§aПочинено генераторов: §e" + count);
if (count > 0 && genManager.areAllRequiredCompleted()) {
player.sendMessage("§a✔ Все необходимые генераторы починены — ворота открываются!");
}
return true;
}
private void sendUsage(CommandSender sender) {
var messages = plugin.getConfigManager().getMessages();
sender.sendMessage(messages.get("usage.admin-list-header"));
sender.sendMessage(messages.get("usage.admin-list-list"));
sender.sendMessage(messages.get("usage.admin-list-type"));
sender.sendMessage(messages.get("usage.admin-world"));
sender.sendMessage("§7/dbdadmin repairgens §8— §fПочинить все генераторы");
}
@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("list", "world", "repairgens").stream()
.filter(s -> s.startsWith(args[0].toLowerCase()))
.toList();
}
if (args.length == 2 && args[0].equalsIgnoreCase("list")) {
return Arrays.asList("generator", "computer", "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("game").stream()
.filter(s -> s.startsWith(args[1].toLowerCase()))
.toList();
}
return List.of();
}
}