123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690 |
- import java.util.ArrayList;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- //=====================================================================
- //Class: vMinecraftChat
- //Use: Encapsulates all chat commands added by this mod
- //Author: nossr50, TrapAlice, cerevisiae
- //=====================================================================
- public class vChat {
- protected static final Logger log = Logger.getLogger("Minecraft");
- protected static final int lineLength = 312;
- //The array of colors to use
- protected static final String[] rainbow = new String[] {
- Colors.Red,
- Colors.Rose,
- Colors.Gold,
- Colors.Yellow,
- Colors.LightGreen,
- Colors.Green,
- Colors.LightBlue,
- Colors.Blue,
- Colors.Navy,
- Colors.DarkPurple,
- Colors.Purple,
- Colors.LightPurple};
- protected static final String[] xmas = new String[] {
- Colors.Red,
- Colors.Red,
- Colors.White,
- Colors.White,
- Colors.Green,
- Colors.Green,
- };
- //=====================================================================
- //Function: gmsg
- //Input: Player sender: The player sending the message
- // String msg: The message to be broadcast to all players
- //Output: None
- //Use: Outputs a message to everybody
- //=====================================================================
- public static void gmsg(Player sender, String msg){
- if(sender != null && sender.isMuted())
- sender.sendMessage(Colors.Red + "You have been muted.");
-
- for (Player receiver : etc.getServer().getPlayerList()) {
-
- if (receiver == null) return;
-
- if(vUsers.getProfile(receiver) == null) return;
-
- //Check if the person has the sender ignored
- if(sender != null)
- if(vUsers.getProfile(receiver).isIgnored(sender))
- return;
-
- String[] message = applyColors(wordWrap(msg));
- for(String out : message)
- receiver.sendMessage(out);
- }
- }
- //=====================================================================
- //Function: gmsg
- //Input: String msg: The message to be broadcast to all players
- //Output: None
- //Use: Outputs a message to everybody
- //=====================================================================
- public static void gmsg(String msg){gmsg(null, msg);}
- //=====================================================================
- //Function: sendMessage
- //Input: Player sender: The player sending the message
- // Player receiver: The player receiving the message
- // String msg: The message to be broadcast to all players
- //Output: None
- //Use: Outputs a message to everybody
- //=====================================================================
- public static void sendMessage(Player sender, Player receiver, String msg){
- if(sender != null && sender.isMuted())
- sender.sendMessage(Colors.Red + "You have been muted.");
-
- //Check if the receiver has the sender ignored
- if(vUsers.getProfile(receiver) == null)
- return;
- if(sender != null)
- if(vUsers.getProfile(receiver).isIgnored(sender))
- {
- sendMessage(sender, sender, Colors.Rose + receiver.getName()
- + " has you on their ignore list.");
- return;
- }
- String[] message = applyColors(wordWrap(msg));
- for(String out : message)
- receiver.sendMessage(out);
- //Tell them if they are
- }
- //=====================================================================
- //Function: sendMessage
- //Input: Player receiver: The player receiving the message
- // String msg: The message to be broadcast to all players
- //Output: None
- //Use: Outputs a message to everybody
- //=====================================================================
- public static void sendMessage(Player receiver, String msg)
- {
- sendMessage(null, receiver, msg);
- }
- //=====================================================================
- //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
- ArrayList<String> split = new ArrayList<String>();
- for(String in : msg.split(" "))
- split.add(in);
-
- //Create an arraylist for the output
- ArrayList<String> out = new ArrayList<String>();
- //While i is less than the length of the array of words
- while(!split.isEmpty()){
- int len = 0;
-
- //Create an arraylist to hold individual words
- ArrayList<String> words = new ArrayList<String>();
- //Loop through the words finding their length and increasing
- //j, the end point for the sub string
- while(!split.isEmpty() && split.get(0) != null && len <= lineLength)
- {
- int wordLength = msgLength(split.get(0)) + 4;
-
- //If a word is too long for a line
- if(wordLength > lineLength)
- {
- String[] tempArray = wordCut(len, split.remove(0));
- words.add(tempArray[0]);
- split.add(tempArray[1]);
- }
- //If the word is not too long to fit
- len += wordLength;
- if( len < lineLength)
- words.add(split.remove(0));
- }
- //Merge them and add them to the output array.
- out.add( etc.combineSplit(0,
- words.toArray(new String[words.size()]), " ") + " " );
- }
- //Convert to an array and return
- return out.toArray(new String[out.size()]);
- }
-
- //=====================================================================
- //Function: msgLength
- //Input: String str: The string to find the length of
- //Output: int: The length on the screen of a string
- //Use: Finds the length on the screen of a string. Ignores colors.
- //=====================================================================
- public static int msgLength(String str){
- int length = 0;
- //Loop through all the characters, skipping any color characters
- //and their following color codes
- for(int x = 0; x<str.length(); x++)
- {
- if((x+1 <= str.length()) && (str.charAt(x) == '^' || str.charAt(x) == Colors.White.charAt(0)))
- {
- if(colorChange(str.charAt(x + 1)) != null)
- {
- x++;
- continue;
- }
- }
- int len = charLength(str.charAt(x));
- length += len;
- }
- return length;
- }
-
- //=====================================================================
- //Function: wordCut
- //Input: String str: The string to find the length of
- //Output: String[]: The cut up word
- //Use: Cuts apart a word that is too long to fit on one line
- //=====================================================================
- private static String[] wordCut(int lengthBefore, String str){
- int length = lengthBefore;
- //Loop through all the characters, skipping any color characters
- //and their following color codes
- String[] output = new String[2];
- int x = 0;
- while(length < lineLength && x < str.length())
- {
- int len = charLength(str.charAt(x));
- if( len > 0)
- length += len;
- else
- x++;
- x++;
- }
- if(x > str.length())
- x = str.length();
- //Add the substring to the output after cutting it
- output[0] = str.substring(0, x);
- //Add the last of the string to the output.
- output[1] = str.substring(x);
- return output;
- }
-
- //=====================================================================
- //Function: charLength
- //Input: char x: The character to find the length of.
- //Output: int: The length of the character
- //Use: Finds the visual length of the character on the screen.
- //=====================================================================
- private static int charLength(char x)
- {
- if("i.:,;|!".indexOf(x) != -1)
- return 2;
- else if("l'".indexOf(x) != -1)
- return 3;
- else if("tI[]".indexOf(x) != -1)
- return 4;
- else if("fk{}<>\"*()".indexOf(x) != -1)
- return 5;
- else if("abcdeghjmnopqrsuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ1234567890\\/#?$%-=_+&^".indexOf(x) != -1)
- return 6;
- else if("@~".indexOf(x) != -1)
- return 7;
- else if(x==' ')
- return 4;
- else
- return -1;
- }
- //=====================================================================
- //Function: rainbow
- //Input: String msg: The string to colorify
- //Output: String: The rainbowed result
- //Use: Rainbowifies a string;
- //=====================================================================
- public static String rainbow(String msg){
- String temp = "";
- int counter=0;
- //Loop through the message applying the colors
- for(int x=0; x<msg.length(); x++)
- {
- temp += rainbow[counter]+msg.charAt(x);
-
- if(msg.charAt(x)!=' ') counter++;
- if(counter==rainbow.length) counter = 0;
- }
- return temp;
- }
- //=====================================================================
- //Function: xmas
- //Input: String msg: The string to colorify
- //Output: String: The xmas colored result
- //Use: Makes a string more festive
- //=====================================================================
- public static String xmas(String msg){
- String temp = "";
- int counter=0;
- //Loop through the message applying the colors
- for(int x=0; x<msg.length(); x++)
- {
- temp += xmas[counter]+msg.charAt(x);
-
- if(msg.charAt(x)!=' ') counter++;
- if(counter==xmas.length) counter = 0;
- }
- return temp;
- }
- //=====================================================================
- //Function: getName
- //Input: Player player: The player to get name as color
- //Output: String: The name colored
- //Use: Returns the colored name;
- //=====================================================================
- public static String getName(Player player){
-
- //Add the nickname or the name if there is none
- String output = vUsers.getProfile(player).getNick();
-
- if(output.isEmpty())
- output = player.getName();
-
- //Add the color if there is one
- if(player.getColor() != null && !"".equals(player.getColor()))
- output = player.getColor().substring(0,2) + output;
-
- //Add the tag if there is one
- output = vUsers.getProfile(player).getTag() + output;
-
- //Add the suffix if there is one
- output += vUsers.getProfile(player).getSuffix();
-
- output = Colors.White + output;
-
- /*if(playerPrefix != null && !playerPrefix.isEmpty())
- output = applyColors(playerPrefix.substring(1)) + output;*/
-
- //Return the name
- return output;
- }
-
- //=====================================================================
- //Function: colorChange
- //Input: char colour: The color code to find the color for
- //Output: String: The color that the code identified
- //Use: Finds a color giving a color code
- //=====================================================================
- public static String colorChange(char colour)
- {
- String color;
- switch(colour)
- {
- case '0':
- color = Colors.Black;
- break;
- case '1':
- color = Colors.Navy;
- break;
- case '2':
- color = Colors.Green;
- break;
- case '3':
- color = Colors.Blue;
- break;
- case '4':
- color = Colors.Red;
- break;
- case '5':
- color = Colors.Purple;
- break;
- case '6':
- color = Colors.Gold;
- break;
- case '7':
- color = Colors.LightGray;
- break;
- case '8':
- color = Colors.Gray;
- break;
- case '9':
- color = Colors.DarkPurple;
- break;
- case 'a':
- color = Colors.LightGreen;
- break;
- case 'b':
- color = Colors.LightBlue;
- break;
- case 'c':
- color = Colors.Rose;
- break;
- case 'd':
- color = Colors.LightPurple;
- break;
- case 'e':
- color = Colors.Yellow;
- break;
- case 'f':
- color = Colors.White;
- break;
- case 'A':
- color = Colors.LightGreen;
- break;
- case 'B':
- color = Colors.LightBlue;
- break;
- case 'C':
- color = Colors.Rose;
- break;
- case 'D':
- color = Colors.LightPurple;
- break;
- case 'E':
- color = Colors.Yellow;
- break;
- case 'F':
- color = Colors.White;
- break;
- case 'R':
- color = "^r";
- break;
- case 'r':
- color = "^r";
- break;
- case 'x':
- color = "^x";
- break;
- case 'X':
- color = "^x";
- break;
- default:
- color = null;
- break;
- }
- return color;
- }
-
- //=====================================================================
- //Function: adminChat
- //Input: Player player: The player talking
- // String message: The message to apply the effect to
- //Output: boolean: If this feature is enabled
- //Use: Sends messages only to admins
- //=====================================================================
- public static boolean adminChat(Player player, String message){
-
- //Check if the player can use this feature
- if(player.isAdmin() || player.canUseCommand("/adminchat"))
- {
- //Special formatting for adminchat {Username}
- String adminchat = Colors.DarkPurple + "{" + getName(player)
- + Colors.DarkPurple +"} ";
-
- //Cut off the @ prefix
- if(message.startsWith("@"))
- message = message.substring(1, message.length());
-
- //Get the player from the playerlist to send the message to.
- for (Player p: etc.getServer().getPlayerList()) {
-
- //If p is not null
- if (p != null) {
-
- //And if p is an admin or has access to adminchat send message
- if (p.isAdmin() || (p.canUseCommand("/adminchat"))) {
- sendMessage(player, p, adminchat + message);
- }
- }
- }
- //So you can read adminchat from the server console
- log.log(Level.INFO, "@" + "<" + player.getName() + "> " + message);
- return true;
- }
- return false;
- }
- public static boolean partyChat(Player player, String message){
- if(vConfig.getInstance().partyChat()){
- //Cut off the ! prefix
- if(message.startsWith("!"))
- message = message.substring(1, message.length());
- if(vUsers.getProfile(player).inParty()){
- String partychat = Colors.Green + "(" + getName(player) + Colors.Green + ") ";
- for (Player p: etc.getServer().getPlayerList()){
- if (p != null){
- if (vUsers.getProfile(p).inParty() && (vUsers.getProfile(p).getParty().equals(vUsers.getProfile(player).getParty()))){
- sendMessage(player, p, partychat + Colors.Green + message);
- }
- }
- }
- return true;
- }
- }
- return false;
-
- }
- //=====================================================================
- //Function: quote
- //Input: Player player: The player talking
- // String message: The message to apply the effect to
- //Output: boolean: If this feature is enabled
- //Use: Displays a message as a quote
- //=====================================================================
- public static boolean quote(Player player, String message)
- {
- //Format the name
- String playerName = vmc.getInstance().getGroupPrefix(player) + "<" + getName(player)
- + vmc.getInstance().getGroupPrefix(player) + "> ";
- if(vConfig.getInstance().greentext()) {
- //Log the chat
- log.log(Level.INFO, "<"+player.getName()+"> " + message);
- //Output the message
- gmsg(player, playerName + Colors.LightGreen + message);
- return true;
- }
- return false;
- }
- //=====================================================================
- //Function: rage
- //Input: Player player: The player talking
- // String message: The message to apply the effect to
- //Output: boolean: If this feature is enabled
- //Use: Displays a message in red
- //=====================================================================
- public static boolean rage(Player player, String message)
- {
- //Format the name
- String playerName = vmc.getInstance().getGroupPrefix(player) + "<"
- + getName(player) + vmc.getInstance().getGroupPrefix(player) +"> ";
- if (vConfig.getInstance().FFF()) {
- log.log(Level.INFO, "<"+player.getName()+"> "+message);
-
- //Output the message
- gmsg(player, playerName + Colors.Red + message);
- return true;
- }
- return false;
- }
-
- //=====================================================================
- //Function: quakeColors
- //Input: Player player: The player talking
- // String message: The message to apply the effect to
- //Output: boolean: If this feature is enabled
- //Use: Displays a message in red
- //=====================================================================
- public static boolean quakeColors(Player player, String message)
- {
- //Format the name
- String playerName = vmc.getInstance().getGroupPrefix(player) + "<"
- + getName(player) + vmc.getInstance().getGroupPrefix(player) +"> ";
- if(vConfig.getInstance().quakeColors()) {
- String color = vUsers.getProfile(player).getColor();
- //Log the chat
- log.log(Level.INFO, "<"+player.getName()+"> " + message);
-
- //Output the message
- gmsg(player, playerName + color + message);
- //Loop through the string finding the color codes and inserting them
- return true;
- }
- 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)
- {
- gmsg(player, "* " + getName(player) + " " + Colors.White + message);
- return true;
- }
-
- //=====================================================================
- //Function: applyColors
- //Input: String[] message: The lines to be colored
- //Output: String[]: The lines, but colorful
- //Use: Colors each line
- //=====================================================================
- public static String[] applyColors(String[] message)
- {
- if(message != null && message[0] != null && !message[0].isEmpty()){
- //The color to start the line with
- String recentColor = Colors.White;
-
- //Go through each line
- int counter = 0;
- int i = 0;
- boolean taste = false;
- boolean xmasparty = false;
-
- for(String msg: message)
- {
- //Start the line with the most recent color
- String temp = "";
- if(!recentColor.equals("^r") && recentColor != null)
- temp += recentColor;
-
- //Loop through looking for a color code
- for(int x = 0; x< msg.length(); x++)
- {
- //If the char is a ^ or �
- if(taste || msg.charAt(x) == '^'
- || msg.charAt(x) == Colors.Red.charAt(0))
- {
- if(x != msg.length() - 1)
- {
- //If the following character is a color code
- if(vChat.colorChange(msg.charAt(x+1)) != null)
- {
- //Set the most recent color to the new color
- recentColor = vChat.colorChange(msg.charAt(x+1));
-
- //If the color specified is rainbow
- if(taste || recentColor.equals("^r"))
- {
- //Skip the quake code for rainbow
- if(recentColor.equals("^r"))
- {
- x += 2;
- }
-
- //Taste keeps it going with rainbow if there
- //are more lines
- taste = true;
- //Loop through the message applying the colors
- while(x < msg.length() && msg.charAt(x) != '^'
- && msg.charAt(x) != Colors.Red.charAt(0))
- {
- temp += rainbow[i] + msg.charAt(x);
-
- if(msg.charAt(x) != ' ') i++;
- if(i == rainbow.length) i = 0;
- x++;
- }
-
- //If it reached another color instead of the end
- if(x < msg.length() && msg.charAt(x) == '^'
- || x < msg.length()
- && msg.charAt(x) == Colors.Red.charAt(0) )
- {
- taste = false;
- i = 0;
- x--;
- }
- }
- if(xmasparty || recentColor.equals("^x"))
- {
- //Skip the quake code for xmas
- if(recentColor.equals("^x"))
- {
- x += 2;
- }
-
- //Taste keeps it going with xmas if there
- //are more lines
- xmasparty = true;
- //Loop through the message applying the colors
- while(x < msg.length() && msg.charAt(x) != '^'
- && msg.charAt(x) != Colors.Red.charAt(0))
- {
- temp += xmas[i] + msg.charAt(x);
-
- if(msg.charAt(x) != ' ') i++;
- if(i == xmas.length) i = 0;
- x++;
- }
-
- //If it reached another color instead of the end
- if(x < msg.length() && msg.charAt(x) == '^'
- || x < msg.length()
- && msg.charAt(x) == Colors.Red.charAt(0) )
- {
- xmasparty = false;
- i = 0;
- x--;
- }
- }
- else
-
- {
- //Add the color
- temp += recentColor;
- //Skip these chars
- x++;
- }
-
- //Otherwise ignore it.
- } else {
- temp += msg.charAt(x);
- }
- //Insert the character
- } else {
- temp += msg.charAt(x);
- }
- } else {
- temp += msg.charAt(x);
- }
- }
- //Replace the message with the colorful message
- message[counter] = temp;
- counter++;
- }
- }
- return message;
- }
- }
|