package com.lifeknight.relaymchub.commands; import com.lifeknight.relaymchub.Main; import com.lifeknight.relaymchub.player.HubPlayer; import com.lifeknight.relaymchub.statistics.StatisticsLeaderboard; import com.lifeknight.relaymcutils.player.SmartGUI; import com.lifeknight.relaymcutils.player.SmartPlayer; import com.lifeknight.relaymcutils.utilities.Parkour; import com.lifeknight.relaymcutils.utilities.SmartNPC; import com.lifeknight.relayutils.RelayUtils; import com.lifeknight.relayutils.basic.Miscellaneous; import com.lifeknight.relayutils.basic.Text; import com.lifeknight.relayutils.game.GameAction; import com.lifeknight.relayutils.game.GameType; import com.lifeknight.relayutils.game.MainGame; import com.lifeknight.relayutils.game.SpecificGameAction; import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class RelayHubCommand implements CommandExecutor, TabCompleter { private static final String[] MAIN_COMMANDS = {"npc", "leaderboard", "log", "messagelog"}; private static final String[] NPC_COMMANDS = {"create", "select", "delete", "name", "teleport", "skin", "gui", "command", "info", "list", "clear"}; private static final String[] LEADERBOARD_COMMANDS = {"create", "select", "delete", "teleport", "info", "list", "clear"}; private static final String BASE = "/" + Main.PLUGIN_ID; @Override public boolean onCommand(CommandSender commandSender, Command command, String label, String[] arguments) { if (SmartPlayer.isPlayer(commandSender)) { if (!SmartPlayer.getSmartPlayer(commandSender).isAdministrator()) { commandSender.sendMessage(ChatColor.RED + "You do not have permission to execute this command."); return true; } } if (command.getName().equalsIgnoreCase(Main.PLUGIN_ID)) { if (commandSender instanceof Player) { SmartPlayer smartPlayer = SmartPlayer.getSmartPlayer(commandSender); if (arguments.length > 0) { switch (arguments[0].toLowerCase()) { case "npc": return this.onNPCommand(smartPlayer, arguments); case "lb": case "leaderboard": return this.onLeaderboardCommand(HubPlayer.getHubPlayer(smartPlayer), arguments); case "test": return this.onTestCommand(smartPlayer, arguments); case "log": RelayUtils.log = !RelayUtils.log; smartPlayer.sendSuccessMessage("Logging is now set to %s%s.", (RelayUtils.log ? ChatColor.GREEN + "ON" : ChatColor.RED + "OFF"), ChatColor.GREEN); break; case "messagelog": RelayUtils.messageLog = !RelayUtils.messageLog; smartPlayer.sendSuccessMessage("Message logging is now set to %s%s.", (RelayUtils.messageLog ? ChatColor.GREEN + "ON" : ChatColor.RED + "OFF"), ChatColor.GREEN); break; default: smartPlayer.sendUsageMessage(BASE + Text.separateBy(MAIN_COMMANDS, ", ")); break; } } else { smartPlayer.sendUsageMessage(BASE + Text.separateBy(MAIN_COMMANDS, ", ")); } } else { if (arguments.length > 0) { if (arguments[0].equalsIgnoreCase("npc")) { SmartNPC.clear(); Main.info("Cleared all NPCs."); } else if (arguments[0].equalsIgnoreCase("log")) { RelayUtils.log = !RelayUtils.log; commandSender.sendMessage(RelayUtils.format("Logging is now set to %s%s.", (RelayUtils.log ? ChatColor.GREEN + "ON" : ChatColor.RED + "OFF"), ChatColor.GREEN)); } else if (arguments[0].equalsIgnoreCase("messagelog")) { RelayUtils.messageLog = !RelayUtils.messageLog; commandSender.sendMessage(RelayUtils.format("Message logging is now set to %s%s.", (RelayUtils.log ? ChatColor.GREEN + "ON" : ChatColor.RED + "OFF"), ChatColor.GREEN)); } else { Main.info(BASE + " npc to clear all NPCs."); } } else { Main.info(BASE + " npc to clear all NPCs."); } } } return true; } private boolean onNPCommand(SmartPlayer smartPlayer, String[] arguments) { if (arguments.length > 1) { switch (Arrays.asList(NPC_COMMANDS).indexOf(arguments[1].toLowerCase())) { case 0: SmartNPC smartNPC = SmartNPC.createNPC(smartPlayer.getPlayer()); smartPlayer.selectedNPCId = smartNPC.getId(); smartPlayer.sendSuccessMessage("Created and selected NPC (%s).", smartNPC.getSmartName()); break; case 1: this.npcSelectCommand(smartPlayer, arguments); break; case 2: this.npcDeleteCommand(smartPlayer); break; case 3: this.npcNameCommand(smartPlayer, arguments); break; case 4: this.npcTeleportCommand(smartPlayer, arguments); break; case 5: this.npcSkinCommand(smartPlayer, arguments); break; case 6: this.npcGuiCommand(smartPlayer, arguments); break; case 7: this.npcCommandCommand(smartPlayer, arguments); break; case 8: this.npcInfoCommand(smartPlayer); break; case 9: this.npcListCommand(smartPlayer); break; case 10: SmartNPC.clear(); smartPlayer.sendSuccessMessage("Cleared all NPCs."); break; default: smartPlayer.sendUsageMessage(BASE + " npc create, select, delete, name, skin, gui, info, list, clear"); break; } } else { smartPlayer.sendUsageMessage(BASE + " npc create, select, delete, name, skin, gui, info, list, clear"); } return true; } private void npcDeleteCommand(SmartPlayer smartPlayer) { SmartNPC smartNPC; if (smartPlayer.hasSmartNPCSelected()) { smartNPC = smartPlayer.getSmartNPC(); smartNPC.delete(); smartPlayer.sendSuccessMessage("Deleted your selected NPC (%s).", smartNPC.getSmartName()); } else { smartPlayer.sendErrorMessage("You must select an NPC first."); } } private void npcSelectCommand(SmartPlayer smartPlayer, String[] arguments) { SmartNPC smartNPC; int previouslySelectedId = smartPlayer.selectedNPCId; if (arguments.length > 2) { try { int id = Integer.parseInt(arguments[2]); if (id == previouslySelectedId) { smartPlayer.sendErrorMessage("You already have this NPC selected."); } else if ((smartNPC = SmartNPC.getSmartNPC(id)) != null) { smartPlayer.selectedNPCId = id; smartPlayer.sendSuccessMessage("Selected NPC %s.", smartNPC.getSmartName()); } else { if ((smartNPC = SmartNPC.getSmartNPC(arguments[2])) != null) { int smartNPCId = smartNPC.getId(); if (smartNPCId == previouslySelectedId) { smartPlayer.sendErrorMessage("You already have this NPC selected."); } else { smartPlayer.selectedNPCId = smartNPCId; smartPlayer.sendSuccessMessage("Selected NPC %s.", smartNPC.getSmartName()); } } else { smartPlayer.sendErrorMessage("No NPC found with the ID/name/smart name of %s\"%s\"%s.", ChatColor.YELLOW, arguments[2], ChatColor.RED); } } } catch (Exception exception) { if ((smartNPC = SmartNPC.getSmartNPC(Miscellaneous.concatenateArguments(Miscellaneous.from(arguments, 2)))) != null) { int smartNPCId = smartNPC.getId(); if (smartNPCId == previouslySelectedId) { smartPlayer.sendErrorMessage("You already have this NPC selected."); } else { smartPlayer.selectedNPCId = smartNPCId; smartPlayer.sendSuccessMessage("Selected NPC %s.", smartNPC.getSmartName()); } } else { smartPlayer.sendErrorMessage("No NPC found with the ID/name/smart name of %s\"%s\"%s.", ChatColor.YELLOW, arguments[2], ChatColor.RED); } } } else { smartPlayer.sendInfoMessage("Your selected NPC: %s", previouslySelectedId == -1 ? ChatColor.RED + "None" : ChatColor.GREEN + SmartNPC.getSmartNPC(previouslySelectedId).getSmartName()); smartPlayer.sendUsageMessage(BASE + " npc select [ID/name/smart name]"); } } private void npcSkinCommand(SmartPlayer smartPlayer, String[] arguments) { SmartNPC smartNPC; if (arguments.length > 2) { if (smartPlayer.hasSmartNPCSelected()) { smartNPC = smartPlayer.getSmartNPC(); try { smartNPC.setSkin(arguments[2]); smartPlayer.sendSuccessMessage("Changed the skin of your selected NPC (%s).", smartNPC.getSmartName()); } catch (Exception exception) { smartPlayer.sendErrorMessage("Could not find a skin for %s\"%s\"%s.", ChatColor.YELLOW, arguments[2], ChatColor.RED); } } else { smartPlayer.sendErrorMessage("You must select an NPC first."); } } else { smartPlayer.sendUsageMessage(BASE + " npc skin [skin owner]"); } } private void npcNameCommand(SmartPlayer smartPlayer, String[] arguments) { SmartNPC smartNPC; if (arguments.length > 3) { if (smartPlayer.hasSmartNPCSelected()) { smartNPC = smartPlayer.getSmartNPC(); String name = Text.concatenateArguments(Miscellaneous.from(arguments, 3)); switch (arguments[2].toLowerCase()) { case "lower": smartNPC.setLowerName(name); smartPlayer.sendSuccessMessage("Changed the name of your selected NPC (%s).", smartNPC.getSmartName()); break; case "upper": smartNPC.setUpperName(name); smartPlayer.sendSuccessMessage("Changed the upper name of your selected NPC (%s).", smartNPC.getSmartName()); break; default: smartPlayer.sendUsageMessage(BASE + " npc name lower, upper"); break; } } else { smartPlayer.sendErrorMessage("You must select an NPC first."); } } else { smartPlayer.sendUsageMessage(BASE + " npc name upper, lower"); } } private void npcTeleportCommand(SmartPlayer smartPlayer, String[] arguments) { if (!smartPlayer.hasSmartNPCSelected()) { smartPlayer.sendErrorMessage("You must select an NPC first."); return; } if (arguments.length == 2) { smartPlayer.getSmartNPC().setLocation(smartPlayer.getPlayer()); smartPlayer.sendSuccessMessage("Teleported NPC to your location."); } else { if (arguments.length < 6) { if (arguments.length == 5) { try { double x = arguments[2].equals("~") ? smartPlayer.getLocation().getX() : Double.parseDouble(arguments[2]); double y = arguments[3].equals("~") ? smartPlayer.getLocation().getY() : Double.parseDouble(arguments[3]); double z = arguments[4].equals("~") ? smartPlayer.getLocation().getZ() : Double.parseDouble(arguments[4]); smartPlayer.getSmartNPC().setLocation(x, y, z); smartPlayer.sendSuccessMessage("Teleported NPC."); } catch (Exception exception) { smartPlayer.sendUsageMessage(BASE + " npc teleport [x] [y] [z]"); } } else { smartPlayer.sendUsageMessage(BASE + " npc teleport [x] [y] [z]"); } } else { if (arguments.length > 6) { try { double x = arguments[2].equals("~") ? smartPlayer.getLocation().getX() : Double.parseDouble(arguments[2]); double y = arguments[3].equals("~") ? smartPlayer.getLocation().getY() : Double.parseDouble(arguments[3]); double z = arguments[4].equals("~") ? smartPlayer.getLocation().getZ() : Double.parseDouble(arguments[4]); float yaw = arguments[5].equals("~") ? smartPlayer.getLocation().getYaw() : Float.parseFloat(arguments[5]); float pitch = arguments[6].equals("~") ? smartPlayer.getLocation().getPitch() : Float.parseFloat(arguments[6]); smartPlayer.getSmartNPC().setLocation(x, y, z, yaw, pitch); smartPlayer.sendSuccessMessage("Teleported NPC."); } catch (Exception exception) { smartPlayer.sendUsageMessage(BASE + " npc teleport [x] [y] [z] [yaw] [pitch]"); } } else { smartPlayer.sendUsageMessage(BASE + " npc teleport [x] [y] [z] [yaw] [pitch]"); } } } } private void npcGuiCommand(SmartPlayer smartPlayer, String[] arguments) { SmartNPC smartNPC; if (arguments.length > 2) { if (smartPlayer.hasSmartNPCSelected()) { smartNPC = smartPlayer.getSmartNPC(); SmartGUI smartGui = SmartGUI.getByName(Text.concatenateArguments(Miscellaneous.from(arguments, 2))); if (smartGui != null) { smartNPC.setSmartGui(smartGui.getName()); smartPlayer.sendSuccessMessage("Changed the associated GUI of your selected NPC (%s).", smartNPC.getSmartName()); } else { smartPlayer.sendErrorMessage("Could not find a GUI by the name of %s\"%s\"%s; will use server.", ChatColor.YELLOW, arguments[2], ChatColor.RED); smartNPC.setSmartGui(arguments[2]); } } else { smartPlayer.sendErrorMessage("You must select an NPC first."); } } else { smartPlayer.sendUsageMessage(BASE + " npc gui [gui name]"); } } private void npcCommandCommand(SmartPlayer smartPlayer, String[] arguments) { SmartNPC smartNPC; if (arguments.length > 2) { if (smartPlayer.hasSmartNPCSelected()) { smartNPC = smartPlayer.getSmartNPC(); String message = Text.concatenateArguments(Miscellaneous.from(arguments, 2)); boolean isCommand = message.startsWith("/"); if (message.isEmpty() || message.equalsIgnoreCase("empty")) { smartNPC.setCommandOrMessage(""); smartPlayer.sendSuccessMessage("Successfully removed the command/message associated with your NPC."); } else { smartNPC.setCommandOrMessage(ChatColor.translateAlternateColorCodes('&', message)); smartPlayer.sendSuccessMessage("Successfully changed the %s associated with your NPC.", isCommand ? "command" : "message"); } } else { smartPlayer.sendErrorMessage("You must select an NPC first."); } } else { smartPlayer.sendUsageMessage(BASE + " npc command [command/message]"); } } private void npcInfoCommand(SmartPlayer smartPlayer) { if (smartPlayer.hasSmartNPCSelected()) { smartPlayer.sendInfoMessage("Your selected NPC: %s%s", ChatColor.GOLD, smartPlayer.getSmartNPC().getInfo()); } else { smartPlayer.sendErrorMessage("You must selected an NPC first."); } } private void npcListCommand(SmartPlayer smartPlayer) { if (SmartNPC.getSmartNPCs().isEmpty()) { smartPlayer.sendInfoMessage("There are no NPCs."); return; } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(ChatColor.DARK_AQUA).append("-------------").append("\n"); for (SmartNPC smartNPC1 : SmartNPC.getSmartNPCs()) { stringBuilder.append(ChatColor.GOLD).append(smartNPC1.getSmartName()).append("\n"); } stringBuilder.append(ChatColor.DARK_AQUA).append("-------------").append("\n"); smartPlayer.sendMessage(stringBuilder.toString()); } public boolean onLeaderboardCommand(HubPlayer hubPlayer, String[] arguments) { if (arguments.length > 1) { String[] remaining = arguments.length == 2 ? new String[0] : Miscellaneous.from(arguments, 2); switch (Miscellaneous.getList(LEADERBOARD_COMMANDS).indexOf(arguments[1].toLowerCase())) { case 0: this.leaderboardCreateCommand(hubPlayer, remaining); break; case 1: this.leaderboardSelectCommand(hubPlayer, remaining); break; case 2: this.leaderboardDeleteCommand(hubPlayer); break; case 3: this.leaderboardTeleportCommand(hubPlayer); break; case 4: this.leaderboardInfoCommand(hubPlayer); break; case 5: this.leaderboardListCommand(hubPlayer); break; case 6: this.leaderboardClearCommand(hubPlayer); break; default: hubPlayer.sendUsageMessage(BASE + " leaderboard " + Text.separateBy(LEADERBOARD_COMMANDS, ", ")); break; } } else { hubPlayer.sendUsageMessage(BASE + " leaderboard " + Text.separateBy(LEADERBOARD_COMMANDS, ", ")); } return true; } public void leaderboardCreateCommand(HubPlayer hubPlayer, String[] arguments) { if (arguments.length > 0) { List<String> statistics = new ArrayList<>(); for (GameAction gameAction : Miscellaneous.filter(GameAction.getGameActions(Main.getMainGame()), GameAction::isLeaderboard)) { for (MainGame mainGame : gameAction.getMainGames()) { statistics.add(gameAction.getLeaderboardName(mainGame)); } } for (SpecificGameAction specificGameAction1 : SpecificGameAction.getSpecificGameActions()) { if (specificGameAction1.getGameAction().isLeaderboard()) { statistics.add(specificGameAction1.getColumnName()); } } for (String s : Miscellaneous.getList("kills", "killstreak", "deaths", "max_killstreak", "kdr")) { statistics.add("arena_" + s); } for (Parkour parkour : Parkour.PARKOUR_LIST) { statistics.add("parkour_" + parkour.getId()); } statistics.addAll(RelayUtils.EXTRA_COLUMNS); for (MainGame value : MainGame.values()) { statistics.add(value.specifyName("experience")); } for (MainGame value : MainGame.values()) { statistics.add(value.specifyName("time_played")); } for (MainGame value : MainGame.values()) { for (GameType gameType : value.getGameTypes()) { statistics.add(gameType.getCodeName() + "_time_played"); } } for (MainGame value : MainGame.values()) { for (GameType gameType : value.getGameTypes()) { if (gameType.isRankedType()) { statistics.add(gameType.getCodeName() + "_elo"); } } } if (!statistics.contains(arguments[0].toLowerCase())) { hubPlayer.sendErrorMessage("No statistic found with the name of %s%s%s.", ChatColor.YELLOW, arguments[0], ChatColor.RED); } else { String statistic = arguments[0]; StatisticsLeaderboard leaderboard = new StatisticsLeaderboard(hubPlayer.getLocation().add(0, 0.4, 0), statistic); hubPlayer.sendSuccessMessage("Created new leaderboard."); } } else { hubPlayer.sendUsageMessage(BASE + " leaderboard create [statistic]"); } } public void leaderboardSelectCommand(HubPlayer hubPlayer, String[] arguments) { if (arguments.length > 0) { StatisticsLeaderboard leaderboard = StatisticsLeaderboard.getLeaderboard(arguments[0]); if (leaderboard == null) { hubPlayer.sendErrorMessage("No leaderboard found."); } else { StatisticsLeaderboard.selectLeaderboard(hubPlayer, leaderboard.id); hubPlayer.sendSuccessMessage("Selected leaderboard."); } } else { hubPlayer.sendUsageMessage(BASE + " leaderboard select [id]"); } } public void leaderboardDeleteCommand(HubPlayer hubPlayer) { if (StatisticsLeaderboard.hasLeaderboardSelected(hubPlayer)) { StatisticsLeaderboard.deleteLeaderboard(hubPlayer); hubPlayer.sendSuccessMessage("Successfully deleted leaderboard."); } else { hubPlayer.sendErrorMessage("You must have a leaderboard selected to use the delete command!"); } } public void leaderboardTeleportCommand(HubPlayer hubPlayer) { if (StatisticsLeaderboard.hasLeaderboardSelected(hubPlayer)) { StatisticsLeaderboard.teleportLeaderboard(hubPlayer); hubPlayer.sendSuccessMessage("Successfully teleported leaderboard."); } else { hubPlayer.sendErrorMessage("You must have a leaderboard selected to use the teleport command!"); } } public void leaderboardInfoCommand(HubPlayer hubPlayer) { if (StatisticsLeaderboard.hasLeaderboardSelected(hubPlayer)) { StatisticsLeaderboard.showInfo(hubPlayer); } else { hubPlayer.sendErrorMessage("You must have a leaderboard selected to use the info command!"); } } public void leaderboardListCommand(HubPlayer hubPlayer) { StatisticsLeaderboard.listLeaderboards(hubPlayer); } public void leaderboardClearCommand(HubPlayer hubPlayer) { StatisticsLeaderboard.clear(); hubPlayer.sendSuccessMessage("Removed all leaderboards."); } private boolean onTestCommand(SmartPlayer player, String[] arguments) { HubPlayer hubPlayer = HubPlayer.getHubPlayer(player); hubPlayer.onDailyJoin(); return true; } @Override public List<String> onTabComplete(CommandSender commandSender, Command command, String alias, String[] arguments) { if (SmartPlayer.isPlayer(commandSender) && !SmartPlayer.getSmartPlayer(commandSender).isAdministrator()) return null; if (command.getName().equalsIgnoreCase(Main.PLUGIN_ID)) { if (commandSender instanceof Player) { if (arguments.length > 0) { switch (arguments[0].toLowerCase()) { case "npc": return this.onTabCompleteNPC(arguments); case "leaderboard": case "lb": return this.onTabCompleteLeaderboard(arguments); case "test": return null; default: return Text.returnStartingEntries(MAIN_COMMANDS, arguments[0].isEmpty() ? null : arguments[0], true); } } } } return null; } private List<String> onTabCompleteNPC(String[] arguments) { switch (arguments.length) { case 2: return Text.returnStartingEntries(NPC_COMMANDS, arguments[1].isEmpty() ? null : arguments[1], true); case 3: switch (Arrays.asList(NPC_COMMANDS).indexOf(arguments[1].toLowerCase())) { case 1: return Text.returnStartingEntries(SmartNPC.getAllSmartNames(), arguments[2].isEmpty() ? null : arguments[2], true); case 3: return Text.returnStartingEntries(Miscellaneous.getList("lower", "upper"), arguments[2].isEmpty() ? null : arguments[2], true); case 6: return Text.returnStartingEntries(SmartGUI.getAllGuiNames(), arguments[2].isEmpty() ? null : arguments[2], true); } } return null; } private List<String> onTabCompleteLeaderboard(String[] arguments) { switch (arguments.length) { case 2: return Text.returnStartingEntries(LEADERBOARD_COMMANDS, arguments[1], true); case 3: switch (Miscellaneous.getList(LEADERBOARD_COMMANDS).indexOf(arguments[1].toLowerCase())) { case 0: List<String> statistics = Text.toStringList(Miscellaneous.filter(GameAction.getGameActions(Main.getMainGame()), GameAction::isLeaderboard)); for (SpecificGameAction specificGameAction : SpecificGameAction.getSpecificGameActions()) { if (specificGameAction.getGameAction().isLeaderboard()) { statistics.add(specificGameAction.getColumnName()); } } for (String s : Miscellaneous.getList("kills", "killstreak", "deaths", "max_killstreak", "kdr")) { statistics.add("arena_" + s); } for (Parkour parkour : Parkour.PARKOUR_LIST) { statistics.add("parkour_" + parkour.getId()); } statistics.addAll(RelayUtils.EXTRA_COLUMNS); for (MainGame value : MainGame.values()) { statistics.add(value.specifyName("experience")); } for (MainGame value : MainGame.values()) { statistics.add(value.specifyName("time_played")); } for (MainGame value : MainGame.values()) { for (GameType gameType : value.getGameTypes()) { statistics.add(gameType.getCodeName() + "_time_played"); } } for (MainGame value : MainGame.values()) { for (GameType gameType : value.getGameTypes()) { if (gameType.isRankedType()) { statistics.add(gameType.getCodeName() + "_elo"); } } } return Text.returnStartingEntries(statistics, arguments[2], false); case 1: return Text.returnStartingEntries(StatisticsLeaderboard.getAllSmartNames(), arguments[2], false); } } return null; } }