Hub / src / main / java / com / lifeknight / relaymchub / commands / RelayHubCommand.java
RelayHubCommand.java
Raw
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;
    }
}