diff --git a/vminecraftChat.java b/vminecraftChat.java index b62365350..bf7ef6c49 100644 --- a/vminecraftChat.java +++ b/vminecraftChat.java @@ -23,6 +23,175 @@ public class vminecraftChat { } } + //===================================================================== + //Function: wordWrap + //Input: String msg: The message to be wrapped + //Output: String[]: The array of substrings + //Use: Cuts the message apart into whole words short enough to fit + // on one line + //===================================================================== + public static String[] wordWrap(String msg){ + //Split each word apart + String[] array = msg.split(" "); + //Create the output array + String[] out = new String[0]; + + //While i is less than the length of the array of words + int i = 0; + while(i < array.length){ + int len = 0; + int j = i; + //Loop through the words finding their length and increasing + //j, the end point for the sub string + while(len <= 316 && j < array.length) + { + len += msgLength(array[j]) + 4; + if( len <= 316) + j++; + + } + String[] temp = new String[j - i]; + + //If it's not the end yet + if(j < array.length) + { + //Copy the words in the selection into a new array + System.arraycopy(array, i, temp, 0, j); + + //Merge them and add them to the output array + String[] tempOut = new String[out.length + 1]; + System.arraycopy(out, 0, tempOut, 0, out.length); + tempOut[tempOut.length - 1] = etc.combineSplit(0, temp, " "); + out = tempOut; + + } + else + { + //Merge the rest and add them to the output array + String[] tempOut = new String[out.length + 1]; + System.arraycopy(out, 0, tempOut, 0, out.length); + tempOut[tempOut.length - 1] = etc.combineSplit(i, array, " "); + out = tempOut; + } + //Make the old front equal to the old end + i = j; + } + return out; + } + + //===================================================================== + //Function: wordWrap + //Input: Player player: To get the player name + // String msg: The message to be wrapped + //Output: String[]: The array of substrings + //Use: Cuts the message apart into whole words short enough to fit + // on one line + //===================================================================== + public static String[] wordWrap(Player player, String msg){ + //Split each word apart + String[] array = msg.split(" "); + //Create the output array + String[] out = new String[0]; + + //While i is less than the length of the array of words + int i = 0; + while(i < array.length){ + int len = 0; + if(out.length == 0) + len = msgLength("<" + player.getName() + "> "); + int j = i; + //Loop through the words finding their length and increasing + //j, the end point for the sub string + while(len <= 316 && j < array.length) + { + len += msgLength(array[j]) + 4; + if( len <= 316) + j++; + + } + String[] temp = new String[j - i]; + + //If it's not the end yet + if(j < array.length) + { + //Copy the words in the selection into a new array + System.arraycopy(array, i, temp, 0, j); + + //Merge them and add them to the output array + String[] tempOut = new String[out.length + 1]; + System.arraycopy(out, 0, tempOut, 0, out.length); + tempOut[tempOut.length - 1] = etc.combineSplit(0, temp, " "); + out = tempOut; + + } + else + { + //Merge the rest and add them to the output array + String[] tempOut = new String[out.length + 1]; + System.arraycopy(out, 0, tempOut, 0, out.length); + tempOut[tempOut.length - 1] = etc.combineSplit(i, array, " "); + out = tempOut; + } + //Make the old front equal to the old end + i = j; + } + return out; + } + + private static int msgLength(String str){ + int length = 0; + for(int x = 0; x\"*()".indexOf(str.charAt(x)) != -1) + { + length+=5; + } + else if("hequcbrownxjmpsvazydgTHEQUCKBROWNFXJMPSVLAZYDG1234567890#\\/?$%-=_+&".indexOf(str.charAt(x)) != -1) + { + length+=6; + } + else if("@~".indexOf(str.charAt(x)) != -1) + { + length+=7; + } + else if(str.charAt(x)==' ') + { + length+=4; + } + } + return length; + } + + + public static String rainbow(String msg){ + String temp = ""; + //The array of colors to use + String[] rainbow = new String[] {Colors.Red, Colors.Rose, + Colors.Yellow, Colors.Green, Colors.Blue, + Colors.LightPurple, Colors.Purple}; + int counter=0; + //Loop through the message applying the colors + for(int x=0; x\"*()".indexOf(str.charAt(x)) != -1) - { - length+=5; - } - else if("hequcbrownxjmpsvazydgTHEQUCKBROWNFXJMPSVLAZYDG1234567890#\\/?$%-=_+&".indexOf(str.charAt(x)) != -1) - { - length+=6; - } - else if("@~".indexOf(str.charAt(x)) != -1) - { - length+=7; - } - else if(str.charAt(x)==' ') - { - length+=4; - } - } - if(length<=316) - { - return true; - } else { return false; } - - } //===================================================================== //Function: adminChat @@ -177,8 +299,10 @@ public class vminecraftChat { if(player.isAdmin() || player.canUseCommand("/adminchat")) { //Special formatting for adminchat {Username} - String adminchat = Colors.DarkPurple + "{" + player.getColor() - + player.getName() + Colors.DarkPurple +"}" + Colors.White + " "; + String adminchat = Colors.DarkPurple + "{" + nameColor(player) + + Colors.DarkPurple +"}" + Colors.White + " "; + + String[] msg = wordWrap(player, message.substring(1, message.length())); //Get the player from the playerlist to send the message to. for (Player p: etc.getServer().getPlayerList()) { @@ -188,10 +312,15 @@ public class vminecraftChat { //And if p is an admin or has access to adminchat if (p.isAdmin() || (p.canUseCommand("/adminchat"))) { + + //Output the first line + p.sendMessage(adminchat + msg[0]); - //Send them the message - p.sendMessage(adminchat - + message.substring(1, message.length())); + //Get the rest of the lines and display them. + String[] tempOut = new String[msg.length - 1]; + System.arraycopy(msg, 1, tempOut, 0, tempOut.length); + for(String str: tempOut) + p.sendMessage(str); } } } @@ -218,8 +347,19 @@ public class vminecraftChat { if(vminecraftSettings.getInstance().greentext()) { //Log the chat log.log(Level.INFO, "<"+player.getName()+"> "+message); - //Output the message - gmsg(playerName + Colors.LightGreen + message); + + //Get the multi line array + String[] msg = wordWrap(player, message); + + //Output the first line + gmsg( playerName + Colors.LightGreen + msg[0]); + + //Get the rest of the lines and display them. + String[] tempOut = new String[msg.length - 1]; + System.arraycopy(msg, 1, tempOut, 0, tempOut.length); + for(String str: tempOut) + gmsg(Colors.LightGreen + str); + return true; } return false; } @@ -237,7 +377,18 @@ public class vminecraftChat { String playerName = "<" + nameColor(player) + Colors.White +"> "; if (vminecraftSettings.getInstance().FFF()) { log.log(Level.INFO, "<"+player.getName()+"> "+message); - gmsg(playerName + Colors.Red + message); + + //Get the multi line array + String[] msg = wordWrap(player, message); + + //Output the first line + gmsg( playerName + Colors.Red + msg[0]); + + //Get the rest of the lines and display them. + String[] tempOut = new String[msg.length - 1]; + System.arraycopy(msg, 1, tempOut, 0, tempOut.length); + for(String str: tempOut) + gmsg(Colors.Red + str); return true; } return false; @@ -254,28 +405,68 @@ public class vminecraftChat { { //Format the name String playerName = "<" + nameColor(player) + Colors.White +"> "; - if(vminecraftSettings.getInstance().quakeColors()&&message.length()>2 && vminecraftChat.lengthCheck(playerName + message)) { + if(vminecraftSettings.getInstance().quakeColors() && message.length()>2) { - //Loop through the string finding the color codes and inserting them - String temp = ""; - for(int x = 0; x< message.length(); x++) - { - if(message.charAt(x)=='^' && x != message.length() - 1) - { - temp += vminecraftChat.colorChange(message.charAt(x+1)); - x++; - } - else{ - temp+=message.charAt(x); - } - } //Log the chat log.log(Level.INFO, "<"+player.getName()+"> "+message); - //Broadcast the message - gmsg(playerName + temp + " "); + //Get the multi line array + String[] msg = wordWrap(player, message); + //Apply colors to the lines + applyColors(msg); + + //Output the first line + gmsg( playerName + msg[0]); + //Get the rest of the lines and display them. + String[] tempOut = new String[msg.length - 1]; + System.arraycopy(msg, 1, tempOut, 0, tempOut.length); + for(String str: tempOut) + gmsg(str); + + //Loop through the string finding the color codes and inserting them return true; } return false; } + + + //===================================================================== + //Function: applyColors + //Input: String[] message: The lines to be colored + //Output: String[]: The lines, but colorful + //Use: Colors each line + //===================================================================== + private static String[] applyColors(String[] message) + { + + //The color to start the line with + String recentColor = Colors.White; + + //Go through each line + int counter = 0; + for(String msg: message) + { + //Start the line with the most recent color + String temp = recentColor; + + //Loop through looking for a color code + for(int x = 0; x< msg.length(); x++) + { + if(msg.charAt(x)=='^' && x != msg.length() - 1) + { + //Set the most recent color to the new color + recentColor = vminecraftChat.colorChange(msg.charAt(x+1)); + temp += recentColor; + x++; + } + else{ + temp += msg.charAt(x); + } + } + //Replace the message with the colorful message + message[counter] = temp; + counter++; + } + return message; + } } diff --git a/vminecraftCommands.java b/vminecraftCommands.java index 26de3add0..e02bfe730 100644 --- a/vminecraftCommands.java +++ b/vminecraftCommands.java @@ -61,9 +61,13 @@ public class vminecraftCommands{ //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 - if (player.getName().equalsIgnoreCase(args[0])) + 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 @@ -72,15 +76,12 @@ public class vminecraftCommands{ "That player has higher permissions than you."); //If the player exists transport the user to the player - else if (playerTarget != null) { + else { log.log(Level.INFO, player.getName() + " teleported to " + playerTarget.getName()); player.teleportTo(playerTarget); //Otherwise inform the user that the player doesn't exist - } else { - player.sendMessage(Colors.Rose + "Can't find user " - + args[0] + "."); } } return true; @@ -133,19 +134,20 @@ public class vminecraftCommands{ } 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 - if (!player.hasControlOver(playerTarget)) { + 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])) { + 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 if (playerTarget != null) { + else { log.log(Level.INFO, player.getName() + " teleported " + player.getName() + " to their self."); playerTarget.teleportTo(player); - //Otherwise inform the user that the target doens't exist. - } else { - player.sendMessage(Colors.Rose + "Can't find user " + args[0] + "."); } } return true; @@ -186,7 +188,8 @@ public class vminecraftCommands{ if(vminecraftSettings.getInstance().cmdRules()) { //Display them for (String str : vminecraftSettings.getInstance().getRules()) { - player.sendMessage(Colors.Blue+str); + if(str != null) + player.sendMessage(Colors.Blue+str); } return true; } @@ -207,40 +210,24 @@ public class vminecraftCommands{ if(vminecraftSettings.getInstance().cmdFabulous()) { //Make sure a message has been specified if (args.length < 1) {return false;} - String str = "", - temp = ""; + String str = ""; //Merge the message again - str = etc.combineSplit(0, args, " "); - String playerName = "<" + player.getName() + "> "; - String temp2 = playerName + str; - //The array of colors to use - String[] rainbow = new String[] {Colors.Red, Colors.Rose, - Colors.Yellow, Colors.Green, Colors.Blue, - Colors.LightPurple, Colors.Purple}; - int counter=0; - //If the message isn't too long - if(vminecraftChat.lengthCheck(temp2)) - { - //Output for server - log.log(Level.INFO, player.getName()+" fabulously said \""+ str+"\""); - - //Loop through the message applying the colors - for(int x=0; x " + + vminecraftChat.rainbow(message[0])); + + //Get the rest of the lines and display them. + String[] tempOut = new String[message.length - 1]; + System.arraycopy(message, 1, tempOut, 0, tempOut.length); + for(String msg: tempOut) + vminecraftChat.gmsg(vminecraftChat.rainbow(msg)); + return true; } return false; @@ -259,39 +246,40 @@ public class vminecraftCommands{ //If the command is enabled if (vminecraftSettings.getInstance().cmdWhoIs()) { //If a player is specified - if (args.length < 1) { + if (args.length < 1) player.sendMessage(Colors.Rose + "Usage is /whois [player]"); - } - //Get the player by name - Player playerTarget = null; - for( Player p : etc.getServer().getPlayerList()) - { - if (p.getName().equalsIgnoreCase(args[0])) + else { + //Get the player by name + Player playerTarget = null; + for( Player p : etc.getServer().getPlayerList()) { - playerTarget = p; + if (p.getName().equalsIgnoreCase(args[0])) + { + playerTarget = p; + } } - } - //If the player exists - if (playerTarget != null){ + //If the player exists + if (playerTarget != null){ - //Displaying the information - player.sendMessage(Colors.Blue + "Whois results for " + - vminecraftChat.nameColor(playerTarget) + "."); - //Group - player.sendMessage(Colors.Blue + "Groups: " + - playerTarget.getGroups()); - //Admin - player.sendMessage(Colors.Blue+"Admin: " + - String.valueOf(playerTarget.canIgnoreRestrictions())); - //IP - player.sendMessage(Colors.Blue+"IP: " + playerTarget.getIP()); - //Restrictions - player.sendMessage(Colors.Blue+"Can ignore restrictions: " + - String.valueOf(playerTarget.canIgnoreRestrictions())); + //Displaying the information + player.sendMessage(Colors.Blue + "Whois results for " + + vminecraftChat.nameColor(playerTarget)); + //Group + player.sendMessage(Colors.Blue + "Groups: " + + playerTarget.getGroups()); + //Admin + player.sendMessage(Colors.Blue+"Admin: " + + String.valueOf(playerTarget.canIgnoreRestrictions())); + //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."); + //Give the user an error if the player doesn't exist + } else { + player.sendMessage(Colors.Rose+"Player not found."); + } } return true; } @@ -315,11 +303,13 @@ public class vminecraftCommands{ String tempList = ""; for( Player p : etc.getServer().getPlayerList()) { - if(count == 0) - tempList += vminecraftChat.nameColor(p); - else - tempList += ", " + vminecraftChat.nameColor(p); - count++; + if(p != null){ + if(count == 0) + tempList += vminecraftChat.nameColor(p); + else + tempList += ", " + vminecraftChat.nameColor(p); + count++; + } } //Get the max players from the config PropertiesFile server = new PropertiesFile("server.properties"); @@ -329,10 +319,11 @@ public class vminecraftCommands{ e.printStackTrace(); } int maxPlayers = server.getInt("max-players"); - //Output the player list - vminecraftChat.gmsg( Color.red + "Player List (" + count + "/" + maxPlayers + - "): " + tempList); + String[] tempOut = vminecraftChat.wordWrap(Colors.Rose + "Player List (" + + count + "/" + maxPlayers +"): " + tempList); + for(String msg: tempOut) + player.sendMessage( msg ); return true; } @@ -376,8 +367,11 @@ public class vminecraftCommands{ 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 false; //If the player isn't invulnerable kill them - if (!vminecraftSettings.getInstance().isEzModo(player.getName())) { + if (!vminecraftSettings.getInstance().isEzModo(playerTarget.getName())) { playerTarget.setHealth(0); vminecraftChat.gmsg(player.getColor() + player.getName() + Colors.LightBlue + " has slain " + playerTarget.getColor() + playerTarget.getName()); //Otherwise output error to the user diff --git a/vminecraftListener.java b/vminecraftListener.java index 5a0578f56..784adaec1 100644 --- a/vminecraftListener.java +++ b/vminecraftListener.java @@ -29,18 +29,19 @@ public class vminecraftListener extends PluginListener { public boolean onChat(Player player, String message){ //Quote (Greentext) - if (message.startsWith(">")) - vminecraftChat.quote(player, message); + if (message.startsWith("@")) + return vminecraftChat.adminChat(player, message); + + else if (message.startsWith(">")) + return vminecraftChat.quote(player, message); //Rage (FFF) else if (message.startsWith("FFF")) - vminecraftChat.rage(player, message); + return vminecraftChat.rage(player, message); //Send through quakeColors otherwise else - vminecraftChat.quakeColors(player, message); - - return false; + return vminecraftChat.quakeColors(player, message); } //===================================================================== diff --git a/vminecraftSettings.java b/vminecraftSettings.java index 44598c859..b485cec9f 100644 --- a/vminecraftSettings.java +++ b/vminecraftSettings.java @@ -105,7 +105,7 @@ public class vminecraftSettings { cmdPromote = properties.getBoolean("cmdPromote",true); cmdDemote = properties.getBoolean("cmdDemote",true); cmdWhoIs = properties.getBoolean("cmdWhoIs",true); - cmdWhoIs = properties.getBoolean("cmdWho",true); + cmdWho = properties.getBoolean("cmdWho",true); cmdRules = properties.getBoolean("cmdRules",true); cmdTp = properties.getBoolean("cmdTp",true); cmdMasstp = properties.getBoolean("cmdMasstp",true);