Ported the player profile system from vMinecraft over to vChat, with a few changes.

This commit is contained in:
nossr50 2011-01-16 15:23:05 -08:00
parent 4cf87d0541
commit 407c9d5b8a
3 changed files with 642 additions and 90 deletions

View File

@ -24,14 +24,15 @@ public class vChat extends JavaPlugin {
public vChat(PluginLoader pluginLoader, Server instance, PluginDescriptionFile desc, File folder, File plugin, ClassLoader cLoader) { public vChat(PluginLoader pluginLoader, Server instance, PluginDescriptionFile desc, File folder, File plugin, ClassLoader cLoader) {
super(pluginLoader, instance, desc, folder, plugin, cLoader); super(pluginLoader, instance, desc, folder, plugin, cLoader);
} }
public void onEnable() { public void onEnable() {
PluginManager pm = getServer().getPluginManager(); PluginManager pm = getServer().getPluginManager();
pm.registerEvent(Event.Type.PLAYER_CHAT, playerListener, Priority.Normal, this); pm.registerEvent(Event.Type.PLAYER_CHAT, playerListener, Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_JOIN, playerListener, Priority.Normal, this);
pm.registerEvent(Event.Type.PLAYER_COMMAND, playerListener, Priority.Normal, this);
PluginDescriptionFile pdfFile = this.getDescription(); PluginDescriptionFile pdfFile = this.getDescription();
System.out.println( pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!" ); System.out.println( pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!" );
//Load the users file
vUsers.getInstance().loadUsers();
} }
public void onDisable() { public void onDisable() {
System.out.println("vChat Disabled!"); System.out.println("vChat Disabled!");

View File

@ -24,6 +24,10 @@ public class vPlayerListener extends PlayerListener {
public vPlayerListener(vChat instance) { public vPlayerListener(vChat instance) {
plugin = instance; plugin = instance;
} }
public void onPlayerJoin(PlayerEvent event) {
Player player = event.getPlayer();
vUsers.addUser(player);
}
//Special Color Codes //Special Color Codes
protected static final String[] rainbow = new String[] { protected static final String[] rainbow = new String[] {
ChatColor.DARK_RED.toString(), ChatColor.DARK_RED.toString(),
@ -56,7 +60,7 @@ public class vPlayerListener extends PlayerListener {
Player[] players = plugin.getServer().getOnlinePlayers(); Player[] players = plugin.getServer().getOnlinePlayers();
//Quotes //Quotes
if(split[0].startsWith(">")) if(split[0].startsWith(">"))
quote(player, message); quote(player, message, players);
else{ else{
quakeColors(player, message, players); quakeColors(player, message, players);
} }
@ -121,91 +125,87 @@ public class vPlayerListener extends PlayerListener {
//===================================================================== //=====================================================================
public static void gmsg(String msg){gmsg(null, msg, null);} public static void gmsg(String msg){gmsg(null, msg, null);}
public static void gmsg(Player player, String msg){gmsg(player, msg, null);} public static void gmsg(Player player, String msg){gmsg(player, msg, null);}
//===================================================================== //=====================================================================
//Function: wordWrap //Function: wordWrap
//Input: String msg: The message to be wrapped //Input: String msg: The message to be wrapped
//Output: String[]: The array of substrings //Output: String[]: The array of substrings
//Use: Cuts the message apart into whole words short enough to fit //Use: Cuts the message apart into whole words short enough to fit
// on one line // on one line
//===================================================================== //=====================================================================
public static String[] wordWrap(String msg){ 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>();
//Create an arraylist for the output //Loop through the words finding their length and increasing
ArrayList<String> out = new ArrayList<String>(); //j, the end point for the sub string
//Constructs the line that will be added to the output while(!split.isEmpty() && split.get(0) != null && len <= lineLength)
StringBuffer line = new StringBuffer(); {
//The current length of the line int wordLength = msgLength(split.get(0)) + 4;
int curLength = 0;
//The most recent color in a line //If a word is too long for a line
String color = ChatColor.WHITE.toString(); if(wordLength > lineLength)
//The number of words on this line {
int wordLength = 0; String[] tempArray = wordCut(len, split.remove(0));
words.add(tempArray[0]);
for(int i = 0; i < msg.length(); i++) split.add(tempArray[1]);
{ }
//If the next char would be a color, don't count it as length //If the word is not too long to fit
//but add it to the output line len += wordLength;
if(msg.charAt(i) == ChatColor.DARK_RED.toString().charAt(0)) if( len < lineLength)
words.add(split.remove(0));
}
//Merge them and add them to the output array.
out.add(combineSplit(words.toArray(new String[words.size()]), " ") + " " );
}
//Convert to an array and return
return out.toArray(new String[out.size()]);
}
//CombineSplit
public static String combineSplit(String[] array, String merge) {
String out = "";
for(String word : array)
out += word + merge;
return out;
}
//=====================================================================
//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++)
{ {
line.append(msg.charAt(i)); if((x+1 <= str.length()) && (str.charAt(x) == '^' || str.charAt(x) == ChatColor.WHITE.toString().charAt(0)))
line.append(msg.charAt(i+1));
//Increment skipping these chars
i+=2;
}
//Add the length of the current character
curLength += charLength(msg.charAt(i));
//If it would be a space, increment the wordLength
if(msg.charAt(i) == ' ')
wordLength++;
//If the character would make the line too long
if(curLength > lineLength)
{
//Go back one to avoid making it too long
i--;
//Go back to the place we would split the line
//If there is more than one word
if(wordLength > 0)
while(lineSplit.indexOf(msg.charAt(i)) == -1)
{
i--;
line.deleteCharAt(line.length() - 1);
}
//Add the line to the output
out.add(line.toString());
//Make sure you have the most recent color
for(int j = i; j > 0; j--)
{ {
if(msg.charAt(j) == ChatColor.DARK_RED.toString().charAt(0)) if(colorChange(str.charAt(x + 1)) != null)
{ {
color = msg.substring(j, j+1); x++;
break; continue;
} }
} }
int len = charLength(str.charAt(x));
//Create a new line length += len;
line = new StringBuffer();
curLength = 0;
} }
//If the line isn't long enough yet return length;
else }
{
//Add the character to the line
line.append(msg.charAt(i));
}
}
//Add the final line
out.add(line.toString());
//Return the output as an array
return out.toArray(new String[out.size()]);
}
//===================================================================== //=====================================================================
//Function: colorChange //Function: colorChange
//Input: char colour: The color code to find the color for //Input: char colour: The color code to find the color for
@ -392,14 +392,14 @@ public class vPlayerListener extends PlayerListener {
//Output: boolean: If this feature is enabled //Output: boolean: If this feature is enabled
//Use: Displays a message as a quote //Use: Displays a message as a quote
//===================================================================== //=====================================================================
public void quote(Player player, String message) public void quote(Player player, String message, Player[] players)
{ {
//Format the name //Format the name
String playerName = ChatColor.WHITE + "<" + player.getName() + "> "; String playerName = ChatColor.WHITE + "<" + player.getName() + "> ";
//Log the chat //Log the chat
log.log(Level.INFO, "<"+player.getName()+"> " + message); log.log(Level.INFO, "<"+player.getName()+"> " + message);
//Output the message //Output the message
gmsg(player, playerName + ChatColor.GREEN + message); gmsg(player, playerName + ChatColor.GREEN + message, players);
} }
//===================================================================== //=====================================================================
@ -424,7 +424,7 @@ public class vPlayerListener extends PlayerListener {
{ {
//Start the line with the most recent color //Start the line with the most recent color
String temp = ""; String temp = "";
if(!recentColor.equals("^r") && recentColor != null) if(!recentColor.equals("^r") && !recentColor.equals("^x") && recentColor != null)
temp += recentColor; temp += recentColor;
//Loop through looking for a color code //Loop through looking for a color code
@ -459,7 +459,6 @@ public class vPlayerListener extends PlayerListener {
&& msg.charAt(x) != ChatColor.DARK_RED.toString().charAt(0)) && msg.charAt(x) != ChatColor.DARK_RED.toString().charAt(0))
{ {
temp += rainbow[i] + msg.charAt(x); temp += rainbow[i] + msg.charAt(x);
if(msg.charAt(x) != ' ') i++; if(msg.charAt(x) != ' ') i++;
if(i == rainbow.length) i = 0; if(i == rainbow.length) i = 0;
x++; x++;
@ -467,15 +466,15 @@ public class vPlayerListener extends PlayerListener {
//If it reached another color instead of the end //If it reached another color instead of the end
if(x < msg.length() && msg.charAt(x) == '^' if(x < msg.length() && msg.charAt(x) == '^'
|| x < msg.length() /* Not sure what this check is for
&& msg.charAt(x) == ChatColor.DARK_RED.toString().charAt(0) ) * || x < msg.length() && msg.charAt(x) == ChatColor.DARK_RED.toString().charAt(0)*/)
{ {
taste = false; taste = false;
i = 0; i = 0;
x--; x--;
} }
} }
if(xmasparty || recentColor.equals("^x")) if(xmasparty || recentColor.equals("^x"))
{ {
//Skip the quake code for xmas //Skip the quake code for xmas
if(recentColor.equals("^x")) if(recentColor.equals("^x"))
@ -483,7 +482,7 @@ public class vPlayerListener extends PlayerListener {
x += 2; x += 2;
} }
//Taste keeps it going with xmas if there //xmasparty keeps it going with xmas if there
//are more lines //are more lines
xmasparty = true; xmasparty = true;
//Loop through the message applying the colors //Loop through the message applying the colors

View File

@ -0,0 +1,552 @@
package com.bukkit.nossr50.vChat;
import java.io.*;
import java.util.ArrayList;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.bukkit.entity.*;
public class vUsers {
private static volatile vUsers instance;
protected static final Logger log = Logger.getLogger("Minecraft");
String location = "vChat.users";
public static PlayerList players = new PlayerList();
private Properties properties = new Properties();
//To load
public void load() throws IOException {
properties.load(new FileInputStream(location));
}
//To save
public void save() {
try {
properties.store(new FileOutputStream(location), null);
}catch(IOException ex) {
}
}
public void loadUsers(){
File theDir = new File(location);
if(!theDir.exists()){
//properties = new PropertiesFile(location);
FileWriter writer = null;
try {
writer = new FileWriter(location);
writer.write("#Storage place for user information\r\n");
writer.write("#username:nickname:suffix:tag:ignore,list,names:alias,commands,here\r\n");
} catch (Exception e) {
log.log(Level.SEVERE, "Exception while creating " + location, e);
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
log.log(Level.SEVERE, "Exception while closing writer for " + location, e);
}
}
} else {
//properties = new PropertiesFile(location);
try {
load();
} catch (IOException e) {
log.log(Level.SEVERE, "Exception while loading " + location, e);
}
}
}
//=====================================================================
//Function: addUser
//Input: Player player: The player to create a profile for
//Output: none
//Use: Loads the profile for the specified player
//=====================================================================
public static void addUser(Player player){
players.addPlayer(player);
}
//=====================================================================
//Function: removeUser
//Input: Player player: The player to stop following
//Output: none
//Use: Creates the player profile
//=====================================================================
public static void removeUser(Player player){
players.removePlayer(player);
}
//=====================================================================
//Function: getProfile
//Input: Player player: The player to find the profile for
//Output: PlayerList.PlayerProfile: The profile
//Use: Gets the player profile
//=====================================================================
public static PlayerList.PlayerProfile getProfile(Player player){
return players.findProfile(player);
}
public static vUsers getInstance() {
if (instance == null) {
instance = new vUsers();
}
return instance;
}
public static void getRow(){
}
}
class PlayerList
{
protected static final Logger log = Logger.getLogger("Minecraft");
ArrayList<PlayerProfile> players;
//=====================================================================
//Function: PlayerList
//Input: Player player: The player to create a profile object for
//Output: none
//Use: Initializes the ArrayList
//=====================================================================
public PlayerList() { players = new ArrayList<PlayerProfile>(); }
//=====================================================================
//Function: addPlayer
//Input: Player player: The player to add
//Output: None
//Use: Add a profile of the specified player
//=====================================================================
public void addPlayer(Player player)
{
players.add(new PlayerProfile(player));
}
//=====================================================================
//Function: removePlayer
//Input: Player player: The player to remove
//Output: None
//Use: Remove the profile of the specified player
//=====================================================================
public void removePlayer(Player player)
{
players.remove(findProfile(player));
}
//=====================================================================
//Function: findProfile
//Input: Player player: The player to find's profile
//Output: PlayerProfile: The profile of the specified player
//Use: Get the profile for the specified player
//=====================================================================
public PlayerProfile findProfile(Player player)
{
for(PlayerProfile ply : players)
{
if(ply.isPlayer(player))
return ply;
}
return null;
}
//=====================================================================
//Class: PlayerProfile
//Use: Encapsulates all commands for player options
//Author: cerevisiae
//=====================================================================
class PlayerProfile
{
protected final Logger log = Logger.getLogger("Minecraft");
private String playerName,
lastMessage,
nickName,
tag,
suffix,
party;
private boolean dead,
silent;
char defaultColor;
String location = "vChat.users";
private ArrayList<String> ignoreList;
//private commandList aliasList;
static final int EXIT_FAIL = 0,
EXIT_SUCCESS = 1,
EXIT_CONTINUE = 2;
//=====================================================================
//Function: PlayerProfile
//Input: Player player: The player to create a profile object for
//Output: none
//Use: Loads settings for the player or creates them if they don't
// exist.
//=====================================================================
public PlayerProfile(Player player)
{
//Declare things
playerName = player.getName();
tag = new String();
nickName = new String();
suffix = new String();
party = new String();
party = null;
defaultColor = 'f';
ignoreList = new ArrayList<String>();
dead = false;
//Try to load the player and if they aren't found, append them
if(!load())
addPlayer();
}
public boolean load()
{
try {
//Open the user file
FileReader file = new FileReader(location);
BufferedReader in = new BufferedReader(file);
String line = "";
while((line = in.readLine()) != null)
{
//Find if the line contains the player we want.
String[] character = line.split(":");
if(!character[0].equals(playerName)){continue;}
//Get the tag
if(character.length > 1)
tag = character[1];
//Get the nickname
if(character.length > 2)
nickName = character[2];
//Get the suffix
if(character.length > 3)
suffix = character[3];
//Get the color
if(character.length > 4)
defaultColor = character[4].charAt(0);
//Ignore previously ignored players
if(character.length > 5)
{
String[] ignores = character[5].split(",");
if(ignores.length > 0)
{
for(String ignore : ignores)
ignoreList.add(ignore);
}
}
in.close();
return true;
}
in.close();
} catch (Exception e) {
log.log(Level.SEVERE, "Exception while reading "
+ location + " (Are you sure you formatted it correctly?)", e);
}
return false;
}
//=====================================================================
// Function: save
// Input: none
// Output: None
// Use: Writes current values of PlayerProfile to disk
// Call this function to save current values
//=====================================================================
public void save()
{
try {
//Open the file
FileReader file = new FileReader(location);
BufferedReader in = new BufferedReader(file);
StringBuilder writer = new StringBuilder();
String line = "";
//While not at the end of the file
while((line = in.readLine()) != null)
{
//Read the line in and copy it to the output it's not the player
//we want to edit
if(!line.split(":")[0].equalsIgnoreCase(playerName))
{
writer.append(line).append("\r\n");
//Otherwise write the new player information
} else {
writer.append(playerName + ":");
writer.append(tag + ":");
writer.append(nickName + ":");
writer.append(suffix + ":");
writer.append(defaultColor + ":");
int i = 0;
for(String ignore : ignoreList)
{
writer.append(ignore);
if(i < ignoreList.size() - 1)
writer.append(",");
}
writer.append("\r\n");
}
}
in.close();
//Write the new file
FileWriter out = new FileWriter(location);
out.write(writer.toString());
out.close();
} catch (Exception e) {
log.log(Level.SEVERE, "Exception while writing to " + location + " (Are you sure you formatted it correctly?)", e);
}
}
public void addPlayer()
{
try {
//Open the file to write the player
FileWriter file = new FileWriter(location, true);
BufferedWriter out = new BufferedWriter(file);
//Add the player to the end
out.append(playerName + ":");
out.append(tag + ":");
out.append(nickName + ":");
out.append(suffix + ":");
out.append(defaultColor + ":");
int i = 0;
for(String ignore : ignoreList)
{
out.append(ignore);
if(i < ignoreList.size() - 1)
out.append(",");
}
out.newLine();
out.close();
} catch (Exception e) {
log.log(Level.SEVERE, "Exception while writing to " + location + " (Are you sure you formatted it correctly?)", e);
}
}
//=====================================================================
//Function: isPlayer
//Input: None
//Output: Player: The player this profile belongs to
//Use: Finds if this profile belongs to a specified player
//=====================================================================
public boolean isPlayer(Player player)
{
return player.getName().equals(playerName);
}
//=====================================================================
//Function: isIgnored
//Input: Player player: Checks if a player is ignored
//Output: boolean: If they're ignored
//Use: Finds if the specified player is in the ignore list
//=====================================================================
public boolean isIgnored(Player player){
return ignoreList.contains(player.getName());
}
//=====================================================================
//Function: addIgnore
//Input: Player name: The player to ignore
//Output: boolean: If the player was successfully ignored
//Use: Ignores a player.
//=====================================================================
public boolean addIgnore(Player name)
{
if(!ignoreList.contains(name))
{
ignoreList.add(name.getName());
save();
return true;
}
return false;
}
//=====================================================================
//Function: removeIgnore
//Input: Player name: The player to unignore
//Output: boolean: If the player was successfully unignored
//Use: Stops ignoring a player.
//=====================================================================
public boolean removeIgnore(Player name)
{
if(ignoreList.contains(name.getName()))
{
ignoreList.remove(name.getName());
save();
return true;
}
return false;
}
//=====================================================================
//Function: removeIgnore
//Input: Player name: The player to unignore
//Output: boolean: If the player was successfully unignored
//Use: Stops ignoring a player.
//=====================================================================
public String[] listIgnore()
{
return ignoreList.toArray(new String[ignoreList.size()]);
}
//=====================================================================
//Function: setTag
//Input: String newTag: The tag to set for the player
//Output: None
//Use: Sets a player tag
//=====================================================================
public void setTag(String newTag)
{
tag = newTag;
save();
}
//=====================================================================
//Function: getTag
//Input: None
//Output: String: The player tag
//Use: Gets a player tag
//=====================================================================
public String getTag() { return tag; }
//=====================================================================
//Function: setNick
//Input: String newTag: The nickname to set for the player
//Output: None
//Use: Sets a player nickname
//=====================================================================
public void setNick(String newNick)
{
nickName = newNick;
save();
}
public void setSilent(){
silent = true;
}
public void disableSilent(){
silent = false;
}
public boolean isSilent(){
return silent;
}
//Store the player's party
public void setParty(String newParty)
{
party = newParty;
save();
}
//Retrieve the player's party
public String getParty() {return party;}
//Remove party
public void removeParty() {
party = null;
save();
}
//Retrieve whether or not the player is in a party
public boolean inParty() {
if(party != null){
return true;
} else {
return false;
}
}
//=====================================================================
//Function: getNick
//Input: None
//Output: String: The player nickname
//Use: Gets a player nickname
//=====================================================================
public String getNick() { return nickName; }
//=====================================================================
//Function: setSuffix
//Input: String newTag: The suffix to set for the player
//Output: None
//Use: Sets a player suffix
//=====================================================================
public void setSuffix(String newSuffix)
{
suffix = newSuffix;
save();
}
//=====================================================================
//Function: getSuffix
//Input: None
//Output: String: The player suffix
//Use: Gets a player suffix
//=====================================================================
public String getSuffix() { return suffix; }
//=====================================================================
//Function: setColor
//Input: String newTag: The color to set for the player
//Output: None
//Use: Sets a player color
//=====================================================================
public void setColor(String newColor)
{
defaultColor = newColor.charAt(0);
save();
}
//=====================================================================
//Function: getColor
//Input: None
//Output: String: The player color
//Use: Gets a player color
//=====================================================================
public String getColor() {return vPlayerListener.colorChange(defaultColor);}
//=====================================================================
//Function: setMessage
//Input: String newName: The name of the player they last messaged
// or recieved a message from.
//Output: None
//Use: Sets a player tag
//=====================================================================
public void setMessage(Player newName){ lastMessage = newName.getName(); }
//=====================================================================
//Function: getMessage
//Input: None
//Output: String: The player name
//Use: Gets the name of the player they last messaged or recieved
// a message from.
//=====================================================================
public Player getMessage()
{
//if(lastMessage != null)
//We need the bukkit equivalent of this
//return matchPlayer(lastMessage);
return null;
}
//=====================================================================
//Function: isDead
//Input: None
//Output: boolean: If the player is dead or not
//Use: Gets the player is dead or not.
//=====================================================================
public boolean isDead() {return dead;}
//=====================================================================
//Function: isDead
//Input: boolean isded: if the player is dead or not.
//Output: None
//Use: Sets if the player is dead or not
//=====================================================================
public void isDead(boolean isded){dead = isded;}
}
}