From a9bc2a0b31b9d931845ab6be9282afea644da983 Mon Sep 17 00:00:00 2001 From: nossr50 Date: Wed, 1 Dec 2010 00:10:24 -0800 Subject: [PATCH] Fixed aliasing for suicide and clearinventory. --- vMinecraftCommands.java | 864 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 864 insertions(+) create mode 100644 vMinecraftCommands.java diff --git a/vMinecraftCommands.java b/vMinecraftCommands.java new file mode 100644 index 000000000..c4106df93 --- /dev/null +++ b/vMinecraftCommands.java @@ -0,0 +1,864 @@ +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.logging.Level; +import java.util.logging.Logger; + +//===================================================================== +//Class: vMinecraftCommands +//Use: Encapsulates all commands added by this mod +//Author: nos, trapalice, cerevisiae +//===================================================================== +public class vMinecraftCommands{ + //Log output + protected static final Logger log = Logger.getLogger("Minecraft"); + static final int EXIT_FAIL = 0, + EXIT_SUCCESS = 1, + EXIT_CONTINUE = 2; + + //The list of commands for vMinecraft + public static commandList cl = new commandList(); + + //===================================================================== + //Function: loadCommands + //Input: None + //Output: None + //Use: Imports all the commands into the command list + //===================================================================== + public static void loadCommands(){ + //If we had commands we would add them here. + cl.register("/tp", "teleport"); + cl.register("/masstp", "masstp", "Teleports those with lower permissions to you"); + cl.register("/reload", "reload"); + cl.register("/rules", "rules", "Displays the rules"); + cl.register("/fabulous", "fabulous", "makes text SUUUPER"); + cl.register("/whois", "whois", "/whois [user]"); + cl.register("/who", "who"); + cl.register("/say", "say"); + cl.register("/slay", "slay", "Kill target player"); + cl.register("/ezmodo", "invuln", "Toggle invulnerability"); + cl.register("/ezlist", "ezlist", "List invulnerable players"); + cl.register("/heal", "heal", "heal yourself or other players"); + cl.register("/suicide", "suicide", "kill yourself... you loser"); + cl.register("/a", "adminChatToggle", "toggle admin chat for every message"); + cl.register("/modify", "modifySplit"); + cl.registerAlias("/playerlist", "/who"); + cl.registerAlias("/suicide", "/wrists"); + cl.registerAlias("/clearinventory", "/ci"); + } + //===================================================================== + //Function: adminChatToggle (/a) + //Input: Player player: The player using the command + //Output: int: Exit Code + //Use: Toggles the player into admin chat. Every message they + // send will be piped to admin chat. + //===================================================================== + + public static int adminChatToggle(Player player) +{ + if(vMinecraftSettings.getInstance().adminChatToggle()) + { + //If the player is already toggled for admin chat, remove them + if (vMinecraftSettings.getInstance().isAdminToggled(player.getName())) { + player.sendMessage(Colors.Red + "Admin Chat Toggle = off"); + vMinecraftSettings.getInstance().removeAdminToggled(player.getName()); + //Otherwise include them + } else { + player.sendMessage(Colors.Blue + "Admin Chat Toggled on"); + vMinecraftSettings.getInstance().addAdminToggled(player.getName()); + } + return EXIT_SUCCESS; + } + return EXIT_FAIL; +} + //===================================================================== + //Function: heal (/heal) + //Input: Player player: The player using the command + // String[] args: The arguments for the command. Should be a + // player name or blank + //Output: int: Exit Code + //Use: Heals yourself or a specified player. + //===================================================================== + public static int heal(Player player, String[] args) + { + if(vMinecraftSettings.getInstance().cmdHeal()) + { + //If a target wasn't specified, heal the user. + if (args.length < 1){ + player.setHealth(20); + player.sendMessage("Your health is restored"); + //If a target was specified, try to find them and then heal them + //Otherwise report the error + } else if (args.length > 0){ + Player playerTarget = etc.getServer().matchPlayer(args[0]); + + if (playerTarget != null){ + playerTarget.setHealth(20); + player.sendMessage(Colors.Blue + "You have healed " + vMinecraftChat.getName(playerTarget)); + playerTarget.sendMessage(Colors.Blue + "You have been healed by " + vMinecraftChat.getName(player)); + } + else if (playerTarget == null){ + vMinecraftChat.gmsg(Colors.Rose + "Couldn't find that player"); + } + } + return EXIT_SUCCESS; + } + return EXIT_FAIL; + } + + //===================================================================== + //Function: suicide (/suicide, /wrists) + //Input: Player player: The player using the command + // String[] args: Ignored + //Output: int: Exit Code + //Use: Kills yourself + //===================================================================== + public static int suicide(Player player, String[] args) + { + if(vMinecraftSettings.getInstance().cmdSuicide()) + { + //Set your health to 0. Not much to it. + player.setHealth(0); + return EXIT_SUCCESS; + } + return EXIT_FAIL; + } + + //===================================================================== + //Function: teleport (/tp) + //Input: Player player: The player using the command + // String[] args: The arguments for the command. Should be a + // player name + //Output: int: Exit Code + //Use: Teleports the user to another player + //===================================================================== + public static int teleport(Player player, String[] args) + { + //Get if the command is enabled + if(vMinecraftSettings.getInstance().cmdTp()) + { + //Make sure a player has been specified and return an error if not + if (args.length < 1) { + player.sendMessage(Colors.Rose + "Correct usage is: /tp [player]"); + } else { + + //Find the player by name + Player playerTarget = etc.getServer().matchPlayer(args[0]); + + //Target player isn't found + if(playerTarget == null) + player.sendMessage(Colors.Rose + "Can't find user " + + args[0] + "."); + //If it's you, return witty message + else if (player.getName().equalsIgnoreCase(args[0])) + player.sendMessage(Colors.Rose + "You're already here!"); + + //If the player is higher rank than you, inform the user + else if (!player.hasControlOver(playerTarget)) + player.sendMessage(Colors.Red + + "That player has higher permissions than you."); + + //If the player exists transport the user to the player + else { + log.log(Level.INFO, player.getName() + " teleported to " + + playerTarget.getName()); + player.teleportTo(playerTarget); + + //Otherwise inform the user that the player doesn't exist + } + } + return EXIT_SUCCESS; + } + return EXIT_FAIL; + } + + //===================================================================== + //Function: masstp (/masstp) + //Input: Player player: The player using the command + // String[] args: Should be empty or is ignored + //Output: int: Exit Code + //Use: Teleports all players to the user + //===================================================================== + public static int masstp(Player player, String[] args) + { + //If the command is enabled + if(vMinecraftSettings.getInstance().cmdMasstp()) { + //Go through all players and move them to the user + for (Player p : etc.getServer().getPlayerList()) { + if (!p.hasControlOver(player)) { + p.teleportTo(player); + } + } + //Inform the user that the command has executed successfully + player.sendMessage(Colors.Blue+"Summoning successful."); + + return EXIT_SUCCESS; + } + return EXIT_FAIL; + } + + //===================================================================== + //Function: tphere (/tphere) + //Input: Player player: The player using the command + // String[] args: The arguments for the command. Should be a + // player name + //Output: int: Exit Code + //Use: Teleports the user to another player + //===================================================================== + public static int tphere(Player player, String[] args) + { + //Check if the command is enabled. + if (vMinecraftSettings.getInstance().cmdTphere()) { + //Make sure a player is specified + if (args.length < 1) { + player.sendMessage(Colors.Rose + "Correct usage is: /tphere [player]"); + } else { + //Get the player by name + Player playerTarget = etc.getServer().matchPlayer(args[0]); + + //If the target doesn't exist + if(playerTarget == null) + player.sendMessage(Colors.Rose + "Can't find user " + args[0] + "."); + //If the player has a higher rank than the user, return error + else if (!player.hasControlOver(playerTarget)) + player.sendMessage(Colors.Red + "That player has higher permissions than you."); + //If the user teleports themselves, mock them + else if (player.getName().equalsIgnoreCase(args[0])) + player.sendMessage(Colors.Rose + "Wow look at that! You teleported yourself to yourself!"); + //If the target exists, teleport them to the user + else { + log.log(Level.INFO, player.getName() + " teleported " + player.getName() + " to their self."); + playerTarget.teleportTo(player); + } + } + return EXIT_SUCCESS; + } + return EXIT_FAIL; + } + + //===================================================================== + //Function: reload (/reload) + //Input: Player player: The player using the command + // String[] args: Ignored + //Output: int: Exit Code + //Use: Reloads the settings for vMinecraft + //===================================================================== + public static int reload(Player player, String[] args) + { + vMinecraftSettings.getInstance().loadSettings(); + return EXIT_FAIL; + } + + //===================================================================== + //Function: rules (/rules) + //Input: Player player: The player using the command + // String[] args: Ignored + //Output: int: Exit Code + //Use: Lists the rules + //===================================================================== + public static int rules(Player player, String[] args) + { + //If the rules exist + if(vMinecraftSettings.getInstance().cmdRules() + && vMinecraftSettings.getInstance().getRules().length > 0) { + + //Apply QuakeCode Colors to the rules + String[] rules = vMinecraftChat.applyColors( + vMinecraftSettings.getInstance().getRules()); + //Display them + for (String str : rules ) { + if(!str.isEmpty()) + player.sendMessage(Colors.Blue + str); + else + player.sendMessage(Colors.Blue + "!!!The Rules Have Not Been Set!!!"); + } + return EXIT_SUCCESS; + } + return EXIT_FAIL; + } + + //===================================================================== + //Function: fabulous (/fabulous) + //Input: Player player: The player using the command + // String[] args: The message to apply the effect to + //Output: int: Exit Code + //Use: Makes the text rainbow colored + //===================================================================== + public static int fabulous(Player player, String[] args) + { + //If the command is enabled + if(vMinecraftSettings.getInstance().cmdFabulous()) { + + //Format the name + String playerName = Colors.White + "<" + + vMinecraftChat.getName(player) + Colors.White +"> "; + //Make sure a message has been specified + if (args.length < 1) {return EXIT_FAIL;} + String str = " "; + + //Merge the message again + str = etc.combineSplit(0, args, " "); + + //Output for server + log.log(Level.INFO, player.getName()+" fabulously said \""+ str+"\""); + + //Prepend the player name and cut into lines. + String[] message = vMinecraftChat.wordWrap(playerName + str); + + //Output the message + for(String msg: message) + { + if (msg.contains(playerName)) + vMinecraftChat.gmsg( playerName + + vMinecraftChat.rainbow( + msg.substring(playerName.length()))); + else + vMinecraftChat.gmsg(vMinecraftChat.rainbow(msg)); + } + + return EXIT_SUCCESS; + } + return EXIT_FAIL; + } + + //===================================================================== + //Function: whois (/whois) + //Input: Player player: The player using the command + // String[] args: The player to find info on + //Output: int: Exit Code + //Use: Displays information about the player specified + //===================================================================== + public static int whois(Player player, String[] args) + { + //If the command is enabled + if (vMinecraftSettings.getInstance().cmdWhoIs()) { + //If a player is specified + if (args.length < 1) + player.sendMessage(Colors.Rose + "Usage is /whois [player]"); + else { + //Get the player by name + Player playerTarget = null; + for( Player p : etc.getServer().getPlayerList()) + { + if (p.getName().equalsIgnoreCase(args[0])) + { + playerTarget = p; + } + } + //If the player exists + if (playerTarget != null){ + + //Displaying the information + player.sendMessage(Colors.Blue + "Whois results for " + + vMinecraftChat.getName(playerTarget)); + //Group + for(String group: playerTarget.getGroups()) + player.sendMessage(Colors.Blue + "Groups: " + group); + //Admin + player.sendMessage(Colors.Blue+"Admin: " + + String.valueOf(playerTarget.isAdmin())); + //IP + player.sendMessage(Colors.Blue+"IP: " + playerTarget.getIP()); + //Restrictions + player.sendMessage(Colors.Blue+"Can ignore restrictions: " + + String.valueOf(playerTarget.canIgnoreRestrictions())); + + //Give the user an error if the player doesn't exist + } else { + player.sendMessage(Colors.Rose+"Player not found."); + } + } + return EXIT_SUCCESS; + } + return EXIT_SUCCESS; + } + + //===================================================================== + //Function: who (/who) + //Input: Player player: The player using the command + // String[] args: Ignored + //Output: int: Exit Code + //Use: Displays the connected players + //===================================================================== + public static int who(Player player, String[] args) + { + //If the command is enabled + if (vMinecraftSettings.getInstance().cmdWho()) { + //Loop through all players counting them and adding to the list + int count=0; + String tempList = ""; + for( Player p : etc.getServer().getPlayerList()) + { + if(p != null){ + if(count == 0) + tempList += vMinecraftChat.getName(p); + else + tempList += Colors.White + ", " + vMinecraftChat.getName(p); + count++; + } + } + //Get the max players from the config + PropertiesFile server = new PropertiesFile("server.properties"); + try { + server.load(); + } catch (IOException e) { + e.printStackTrace(); + } + int maxPlayers = server.getInt("max-players"); + //Output the player list + String[] tempOut = vMinecraftChat.wordWrap(Colors.Rose + "Player List (" + + count + "/" + maxPlayers +"): " + tempList); + for(String msg: tempOut) + player.sendMessage( msg ); + + return EXIT_SUCCESS; + } + return EXIT_FAIL; + } + + //===================================================================== + //Function: say (/say) + //Input: Player player: The player using the command + // String[] args: The message to apply the effect to + //Output: int: Exit Code + //Use: Announces the message to all players + //===================================================================== + public static int say(Player player, String[] args) + { + //If the command is enabled + if (vMinecraftSettings.getInstance().cmdSay()) { + //Make sure a message is supplied or output an error + if (args.length < 1) { + player.sendMessage(Colors.Rose + "Usage is /say [message]"); + } + //Display the message globally + vMinecraftChat.gmsg(Colors.Yellow + etc.combineSplit(0, args, " ")); + return EXIT_SUCCESS; + } + return EXIT_FAIL; + } + + //===================================================================== + //Function: slay (/slay) + //Input: Player player: The player using the command + // String[] args: The target for the command + //Output: int: Exit Code + //Use: Kill the target player + //===================================================================== + public static int slay(Player player, String[] args) + { + //Check if the command is enabled + if(vMinecraftSettings.getInstance().cmdEzModo()) { + //Get the player by name + Player playerTarget = etc.getServer().matchPlayer(args[0]); + //If the player doesn't exist don't run + if(playerTarget == null) + return EXIT_FAIL; + //If the player isn't invulnerable kill them + if (!vMinecraftSettings.getInstance().isEzModo(playerTarget.getName())) { + playerTarget.setHealth(0); + vMinecraftChat.gmsg(vMinecraftChat.getName(player) + + Colors.LightBlue + " has slain " + + vMinecraftChat.getName(playerTarget)); + //Otherwise output error to the user + } else { + player.sendMessage(Colors.Rose + "That player is currently in ezmodo! Hahahaha"); + } + return EXIT_SUCCESS; + } + return EXIT_FAIL; + } + + //===================================================================== + //Function: invuln (/ezmodo) + //Input: Player player: The player using the command + // String[] args: The target for the command + //Output: int: Exit Code + //Use: Kill the target player + //===================================================================== + public static int invuln(Player player, String[] args) + { + //If the command is enabled + if (vMinecraftSettings.getInstance().cmdEzModo()) { + //If the player is already invulnerable, turn ezmodo off. + if (vMinecraftSettings.getInstance().isEzModo(player.getName())) { + player.sendMessage(Colors.Red + "ezmodo = off"); + vMinecraftSettings.getInstance().removeEzModo(player.getName()); + //Otherwise make them invulnerable + } else { + player.sendMessage(Colors.LightBlue + "eh- maji? ezmodo!?"); + player.sendMessage(Colors.Rose + "kimo-i"); + player.sendMessage(Colors.LightBlue + "Easy Mode ga yurusareru no wa shougakusei made dayo ne"); + player.sendMessage(Colors.Red + "**Laughter**"); + vMinecraftSettings.getInstance().addEzModo(player.getName()); + player.setHealth(vMinecraftSettings.getInstance().ezModoHealth()); + } + return EXIT_SUCCESS; + } + return EXIT_FAIL; + } + + //===================================================================== + //Function: ezlist (/ezlist) + //Input: Player player: The player using the command + // String[] args: Ignored + //Output: int: Exit Code + //Use: List all invulnerable players + //===================================================================== + public static int ezlist(Player player, String[] args) + { + //If the feature is enabled list the players + if(vMinecraftSettings.getInstance().cmdEzModo()) { + player.sendMessage("Ezmodo: " + vMinecraftSettings.getInstance().ezModoList()); + return EXIT_SUCCESS; + } + return EXIT_FAIL; + } + + //===================================================================== + //Function: modifySplit (/modify) + //Input: Player player: The player using the command + // String[] args: Player, Command, Arguments + //Output: int: Exit Code + //Use: List all invulnerable players + //===================================================================== + public static int modifySplit(Player player, String[] args) + { + //Exploit fix for people giving themselves commands + if(args[1].equals("commands")) + return EXIT_FAIL; + return EXIT_CONTINUE; + } + + //===================================================================== + //Function: Time Reverse + //Input: long time: The time to reverse to. + //Output: int: Exit Code + //Use: List all invulnerable players + //===================================================================== + public static int timeReverse(long tarTime) + { + long curTime = etc.getServer().getRelativeTime(); + //if(cur) + return EXIT_SUCCESS; + } +} + +//===================================================================== +//Class: commandList +//Use: The list of commands that will be checked for +//Author: cerevisiae +//===================================================================== +class commandList { + command[] commands; + protected static final Logger log = Logger.getLogger("Minecraft"); + static final int EXIT_FAIL = 0, + EXIT_SUCCESS = 1, + EXIT_CONTINUE = 2; + + //===================================================================== + //Function: commandList + //Input: None + //Output: None + //Use: Initialize the array of commands + //===================================================================== + public commandList(){ + commands = new command[0]; + } + + //===================================================================== + //Function: register + //Input: String name: The name of the command + // String func: The function to be called + //Output: boolean: Whether the command was input successfully or not + //Use: Registers a command to the command list for checking later + //===================================================================== + public boolean register(String name, String func){ + + //If the command list isn't empty + if(commands.length > 0) + { + //Check to make sure the command doesn't already exist + for(int i = 0; i < commands.length; i++) + if(commands[i].getName().equalsIgnoreCase(name)) + return false; + + //Create a new temp array + command[] temp = new command[commands.length + 1]; + //Copy the old command list over + System.arraycopy(commands, 0, temp, 0, commands.length); + //Set commands to equal the new array + commands = temp; + } else { + commands = new command[1]; + } + + //Add the new function to the list + commands[commands.length - 1] = new command(name, func); + + //exit successfully + return true; + } + + //===================================================================== + //Function: register + //Input: String name: The name of the command + // String func: The function to be called + // String info: The information for the command to put in help + //Output: boolean: Whether the command was input successfully or not + //Use: Registers a command to the command list for checking later + //===================================================================== + public boolean register(String name, String func, String info){ + //Add to the /help list + etc.getInstance().addCommand(name, info); + + //Finish registering + return register(name, func); + } + + //===================================================================== + //Function: register + //Input: String name: The name of the command + // String func: The function to be called + //Output: boolean: Whether the command was input successfully or not + //Use: Registers a command to the command list for checking later + //===================================================================== + public boolean registerAlias(String name, String com, String[] args){ + + //If the command list isn't empty + if(commands.length > 0) + { + //Check to make sure the command doesn't already exist + for(int i = 0; i < commands.length; i++) + if(commands[i].getName().equalsIgnoreCase(name)) + return false; + + //Create a new temp array + command[] temp = new command[commands.length + 1]; + //Copy the old command list over + System.arraycopy(commands, 0, temp, 0, commands.length); + //Set commands to equal the new array + commands = temp; + } else { + commands = new command[1]; + } + + //Add the new function to the list + commands[commands.length - 1] = new commandRef(name, com, args); + + //exit successfully + return true; + } + + //===================================================================== + //Function: register + //Input: String name: The name of the command + // String func: The function to be called + //Output: boolean: Whether the command was input successfully or not + //Use: Registers a command to the command list for checking later + //===================================================================== + public boolean registerAlias(String name, String com){ + + //If the command list isn't empty + if(commands.length > 0) + { + //Check to make sure the command doesn't already exist + for(int i = 0; i < commands.length; i++) + if(commands[i].getName().equalsIgnoreCase(name)) + return false; + + //Create a new temp array + command[] temp = new command[commands.length + 1]; + //Copy the old command list over + System.arraycopy(commands, 0, temp, 0, commands.length); + //Set commands to equal the new array + commands = temp; + } else { + commands = new command[1]; + } + + //Add the new function to the list + commands[commands.length - 1] = new commandRef(name, com); + + //exit successfully + return true; + } + + //===================================================================== + //Function: call + //Input: String name: The name of the command to be run + //Output: boolean: If the command was called successfully + //Use: Attempts to call a command + //===================================================================== + public int call(String name, Player player, String[] arg){ + //Make sure the user has access to the command + if(!player.canUseCommand(name)) { + return EXIT_FAIL; + } + //Search for the command + for(command cmd : commands) + { + //When found + if(cmd.getName().equalsIgnoreCase(name)) + { + try { + //Call the command and return results + return cmd.call(player, arg); + } catch (SecurityException e) { + log.log(Level.SEVERE, "Exception while running command", e); + } catch (IllegalArgumentException e) { + log.log(Level.SEVERE, "The Command Entered Doesn't Exist", e); + return EXIT_FAIL; + } + } + } + + //Something went wrong + return EXIT_FAIL; + } + + + + //===================================================================== + //Class: command + //Use: The specific command + //Author: cerevisiae + //===================================================================== + private class command + { + private String commandName; + private String function; + + //===================================================================== + //Function: command + //Input: None + //Output: None + //Use: Initialize the command + //===================================================================== + public command(String name, String func){ + commandName = name; + function = func; + } + + + //===================================================================== + //Function: getName + //Input: None + //Output: String: The command name + //Use: Returns the command name + //===================================================================== + public String getName(){return commandName;} + + + //===================================================================== + //Function: call + //Input: String[] arg: The arguments for the command + //Output: boolean: If the command was called successfully + //Use: Attempts to call the command + //===================================================================== + int call(Player player, String[] arg) + { + + Method m; + try { + m = vMinecraftCommands.class.getMethod(function, Player.class, String[].class); + m.setAccessible(true); + return (Integer) m.invoke(null, player, arg); + } catch (SecurityException e) { + e.printStackTrace(); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return 1; + } + } + + //===================================================================== + //Class: commandRef + //Use: A command referencing another command + //Author: cerevisiae + //===================================================================== + private class commandRef extends command + { + private String reference; + private String[] args; + + //===================================================================== + //Function: command + //Input: String name: The command name + // String com: The command to run + // String[] arg: the arguments to apply + //Output: None + //Use: Initialize the command + //===================================================================== + public commandRef(String name, String com, String[] arg){ + super(name, ""); + reference = com; + args = arg; + } + + //===================================================================== + //Function: command + //Input: String name: The command name + // String com: The command to run + //Output: None + //Use: Initialize the command + //===================================================================== + public commandRef(String name, String com){ + super(name, ""); + reference = com; + args = null; + } + + + //===================================================================== + //Function: call + //Input: String[] arg: The arguments for the command + //Output: boolean: If the command was called successfully + //Use: Attempts to call the command + //===================================================================== + int call(Player player, String[] arg) + { + if(args != null) { + String[] temp = new String[args.length]; + System.arraycopy(args, 0, temp, 0, args.length); + //Insert the arguments into the pre-set arguments + int lastSet = 0, + argCount = 0; + for(String argument : temp) + { + if(argument.startsWith("%")) + { + int argNum = Integer.parseInt(argument.substring(1)); + if( argNum < arg.length ) + { + temp[lastSet] = arg[argNum]; + argCount++; + } + } + lastSet++; + } + //Append the rest of the arguments to the argument array + if(lastSet < temp.length + arg.length - argCount) + { + String[] temp2 = new String[temp.length + arg.length - argCount]; + System.arraycopy(temp, 0, temp2, 0, temp.length); + System.arraycopy(arg, argCount, temp2, + temp.length, arg.length - argCount); + temp = temp2; + } + + //Call the referenced command + player.command(reference + " " + etc.combineSplit(0, temp, " ")); + } else + player.command(reference); + return EXIT_SUCCESS; + } + } +} \ No newline at end of file