Browse Source

Merge branch 'master' of github.com:nossr50/vminecraft-plugin

cerevisiae 14 years ago
parent
commit
f1eb5ffc9e
4 changed files with 901 additions and 8 deletions
  1. 5 3
      TODO
  2. 2 3
      vMinecraft.java
  3. 17 2
      vMinecraftChat.java
  4. 877 0
      vMinecraftCommands.java

+ 5 - 3
TODO

@@ -1,7 +1,7 @@
 Vminecraft b8 Todo:
 Vminecraft b8 Todo:
-	+ Antigriefs
+	+ Antigriefs <Nos> Working on this, waiting for hMod to fix player 			health
 	+ Allow players to nickname themselves or others
 	+ Allow players to nickname themselves or others
-	+ /a to toggle admin chat
+	
 	+ vminecraft Help
 	+ vminecraft Help
 		* Specialized help message for vminecraft
 		* Specialized help message for vminecraft
 			? /vhelp?
 			? /vhelp?
@@ -14,7 +14,6 @@ Vminecraft b8 Todo:
 	+ Recode Messaging
 	+ Recode Messaging
 		* Reply Feature
 		* Reply Feature
 		* Personal Muting
 		* Personal Muting
-	+ Quick recode of /me to use the new getName function
 	+ Different types of /slay
 	+ Different types of /slay
 		* /slay fire to burn them to death
 		* /slay fire to burn them to death
 		* /slay drown to drown them
 		* /slay drown to drown them
@@ -23,8 +22,11 @@ Vminecraft b8 Todo:
 		<Cere> We talked about potentially doing this and I think
 		<Cere> We talked about potentially doing this and I think
 		I would like to now to add in further functionality and
 		I would like to now to add in further functionality and
 		further limit what features of /modify groups can access
 		further limit what features of /modify groups can access
+		<Nos> We should definitely add suffixes to /modify at least
 
 
 DONE
 DONE
+	+ Quick recode of /me to use the new getName function
+	+ /a to toggle admin chat
 	+ Code was organized
 	+ Code was organized
 	+ Aliasing was added
 	+ Aliasing was added
 	+ Playerlist is now colorful and awesome
 	+ Playerlist is now colorful and awesome

+ 2 - 3
vMinecraft.java

@@ -25,8 +25,7 @@ public class vMinecraft extends Plugin {
         etc.getLoader().addListener(PluginLoader.Hook.IGNITE, listener, this, PluginListener.Priority.HIGH);
         etc.getLoader().addListener(PluginLoader.Hook.IGNITE, listener, this, PluginListener.Priority.HIGH);
         etc.getLoader().addListener(PluginLoader.Hook.DAMAGE, listener, this, PluginListener.Priority.MEDIUM);
         etc.getLoader().addListener(PluginLoader.Hook.DAMAGE, listener, this, PluginListener.Priority.MEDIUM);
         etc.getLoader().addListener(PluginLoader.Hook.EXPLODE, listener, this, PluginListener.Priority.HIGH);
         etc.getLoader().addListener(PluginLoader.Hook.EXPLODE, listener, this, PluginListener.Priority.HIGH);
-        if(etc.getInstance().isHealthEnabled()){
-        	etc.getLoader().addListener(PluginLoader.Hook.HEALTH_CHANGE, listener, this, PluginListener.Priority.MEDIUM);
+        etc.getLoader().addListener(PluginLoader.Hook.HEALTH_CHANGE, listener, this, PluginListener.Priority.MEDIUM);
         }
         }
     }
     }
-}
+

+ 17 - 2
vMinecraftChat.java

@@ -361,6 +361,21 @@ public class vMinecraftChat {
 		}
 		}
 		return false;
 		return false;
 	}
 	}
+        //=====================================================================
+	//Function:	emote
+	//Input:	Player player: The player talking
+        //          	String message: The message to apply the effect to
+	//Output:	boolean: If this feature is enabled
+	//Use:		/me but with our custom colors applied
+	//=====================================================================
+        public static boolean emote(Player player, String message)
+        {
+            String temp = message.toString();
+            String[] msg = wordWrap("* " + getName(player) + " " + Colors.White + temp);
+            for(String str: msg)
+				gmsg(str);
+            return true;
+        }
 
 
     
     
     //=====================================================================
     //=====================================================================
@@ -385,7 +400,7 @@ public class vMinecraftChat {
 				//Loop through looking for a color code
 				//Loop through looking for a color code
 				for(int x = 0; x< msg.length(); x++)
 				for(int x = 0; x< msg.length(); x++)
 				{
 				{
-					//If the char is a ^ or §
+					//If the char is a ^ or �
 					if(msg.charAt(x) == '^' || msg.charAt(x) == Colors.White.charAt(0))
 					if(msg.charAt(x) == '^' || msg.charAt(x) == Colors.White.charAt(0))
 					{
 					{
 						if(x != msg.length() - 1)
 						if(x != msg.length() - 1)
@@ -451,7 +466,7 @@ public class vMinecraftChat {
 			//Loop through looking for a color code
 			//Loop through looking for a color code
 			for(int x = 0; x< message.length(); x++)
 			for(int x = 0; x< message.length(); x++)
 			{
 			{
-				//If the char is a ^ or '§'
+				//If the char is a ^ or '�'
 				if(message.charAt(x) == '^' || message.charAt(x) == Colors.White.charAt(0))
 				if(message.charAt(x) == '^' || message.charAt(x) == Colors.White.charAt(0))
 				{
 				{
 					if(x != message.length() - 1)
 					if(x != message.length() - 1)

+ 877 - 0
vMinecraftCommands.java

@@ -0,0 +1,877 @@
+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.register("/me", "me");
+        cl.registerAlias("/playerlist", "/who");
+        cl.registerAlias("/suicide", "/wrists");
+        cl.registerAlias("/clearinventory", "/ci");
+    }
+    	//=====================================================================
+	//Function:	me (/me)
+	//Input:	Player player: The player using the command
+	//Output:	int: Exit Code
+	//Use:		The player uses this to emote, but now its colorful.
+	//=====================================================================
+    public static int me(Player player, String[] args)
+    {
+        String str = etc.combineSplit(0, args, " ");
+        if (args.length < 1) {return EXIT_FAIL;}
+        vMinecraftChat.emote(player, str);
+        return EXIT_SUCCESS;
+    }
+	//=====================================================================
+	//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, String[] args)
+{
+    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;
+		}
+	}
+}