- 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
192 lines
7.5 KiB
Java
192 lines
7.5 KiB
Java
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();
|
||
}
|
||
}
|