|
@@ -1,28 +1,47 @@
|
|
|
package com.gmail.nossr50.party;
|
|
|
|
|
|
+import java.io.EOFException;
|
|
|
+import java.io.File;
|
|
|
+import java.io.FileInputStream;
|
|
|
+import java.io.FileNotFoundException;
|
|
|
+import java.io.FileOutputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.io.ObjectInputStream;
|
|
|
+import java.io.ObjectOutputStream;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Iterator;
|
|
|
+
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
|
|
import com.gmail.nossr50.Users;
|
|
|
import com.gmail.nossr50.mcMMO;
|
|
|
+import com.gmail.nossr50.config.LoadProperties;
|
|
|
+import com.gmail.nossr50.datatypes.PlayerProfile;
|
|
|
import com.gmail.nossr50.locale.mcLocale;
|
|
|
|
|
|
|
|
|
public class Party
|
|
|
{
|
|
|
+ public static String partyPlayersFile = mcMMO.maindirectory + File.separator + "FlatFileStuff" + File.separator + "partyPlayers";
|
|
|
+ public static String partyLocksFile = mcMMO.maindirectory + File.separator + "FlatFileStuff" + File.separator + "partyLocks";
|
|
|
+ public static String partyPasswordsFile = mcMMO.maindirectory + File.separator + "FlatFileStuff" + File.separator + "partyPasswords";
|
|
|
+
|
|
|
+ HashMap<String, HashMap<String, Boolean>> partyPlayers = new HashMap<String, HashMap<String, Boolean>>();
|
|
|
+ HashMap<String, Boolean> partyLocks = new HashMap<String, Boolean>();
|
|
|
+ HashMap<String, String> partyPasswords = new HashMap<String, String>();
|
|
|
+
|
|
|
private static mcMMO plugin;
|
|
|
- public Party(mcMMO instance)
|
|
|
- {
|
|
|
+ public Party(mcMMO instance) {
|
|
|
plugin = instance;
|
|
|
}
|
|
|
private static volatile Party instance;
|
|
|
public static Party getInstance()
|
|
|
{
|
|
|
- if (instance == null)
|
|
|
- {
|
|
|
- instance = new Party(plugin);
|
|
|
+ if (instance == null) {
|
|
|
+ instance = new Party(plugin);
|
|
|
}
|
|
|
return instance;
|
|
|
- }
|
|
|
+ }
|
|
|
public boolean inSameParty(Player playera, Player playerb){
|
|
|
if(Users.getProfile(playera) == null || Users.getProfile(playerb) == null)
|
|
|
{
|
|
@@ -57,6 +76,13 @@ public class Party
|
|
|
}
|
|
|
return x;
|
|
|
}
|
|
|
+
|
|
|
+ public void informPartyMembers(Player player) {
|
|
|
+ Player[] players = plugin.getPlayersOnline();
|
|
|
+ informPartyMembers(player, players);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
public void informPartyMembers(Player player, Player[] players)
|
|
|
{
|
|
|
int x = 0;
|
|
@@ -72,6 +98,32 @@ public class Party
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ public void informPartyMembersOwnerChange(String newOwner) {
|
|
|
+ Player newOwnerPlayer = plugin.getServer().getPlayer(newOwner);
|
|
|
+ Player[] players = plugin.getPlayersOnline();
|
|
|
+ informPartyMembersOwnerChange(newOwnerPlayer, players);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void informPartyMembersOwnerChange(Player newOwner, Player[] players) {
|
|
|
+ int x = 0;
|
|
|
+ for(Player p : players){
|
|
|
+ if(newOwner != null && p != null){
|
|
|
+ if(inSameParty(newOwner, p) && !p.getName().equals(newOwner.getName()))
|
|
|
+ {
|
|
|
+ //TODO: Needs more locale.
|
|
|
+ p.sendMessage(newOwner.getName()+" is the new party owner.");
|
|
|
+ x++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void informPartyMembersQuit(Player player) {
|
|
|
+ Player[] players = plugin.getPlayersOnline();
|
|
|
+ informPartyMembersQuit(player, players);
|
|
|
+ }
|
|
|
+
|
|
|
public void informPartyMembersQuit(Player player, Player[] players)
|
|
|
{
|
|
|
int x = 0;
|
|
@@ -85,5 +137,252 @@ public class Party
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ public void removeFromParty(Player player, PlayerProfile PP) {
|
|
|
+ informPartyMembersQuit(player);
|
|
|
+ String party = PP.getParty();
|
|
|
+ if(isPartyLeader(player, party)) {
|
|
|
+ if(isPartyLocked(party)) {
|
|
|
+ unlockParty(party);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.partyPlayers.get(party).remove(player.getName());
|
|
|
+ if(isPartyEmpty(party)) deleteParty(party);
|
|
|
+ PP.removeParty();
|
|
|
+ savePartyPlayers();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void addToParty(Player player, PlayerProfile PP, String newParty, Boolean invite) {
|
|
|
+ addToParty(player, PP, newParty, invite, null);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public void addToParty(Player player, PlayerProfile PP, String newParty, Boolean invite, String password) {
|
|
|
+ //Don't care about passwords on invites
|
|
|
+ if(!invite) {
|
|
|
+ //Don't care about passwords if it isn't locked
|
|
|
+ if(isPartyLocked(newParty)) {
|
|
|
+ if(isPartyPasswordProtected(newParty)) {
|
|
|
+ if(password == null) {
|
|
|
+ //TODO: Needs more locale.
|
|
|
+ player.sendMessage("This party requires a password. Use "+LoadProperties.party+" <party> <password> to join it.");
|
|
|
+ return;
|
|
|
+ } else if(!password.equalsIgnoreCase(getPartyPassword(newParty))) {
|
|
|
+ //TODO: Needs more locale.
|
|
|
+ player.sendMessage("Party password incorrect.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ //TODO: Needs more locale.
|
|
|
+ player.sendMessage("Party is locked.");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ PP.acceptInvite();
|
|
|
+ }
|
|
|
+ //New party?
|
|
|
+ if(!isParty(newParty)) {
|
|
|
+ putNestedEntry(this.partyPlayers, newParty, player.getName(), true);
|
|
|
+
|
|
|
+ //Get default locking behavior from config?
|
|
|
+ this.partyLocks.put(newParty, false);
|
|
|
+ this.partyPasswords.put(newParty, null);
|
|
|
+ saveParties();
|
|
|
+ } else {
|
|
|
+ putNestedEntry(this.partyPlayers, newParty, player.getName(), false);
|
|
|
+
|
|
|
+ savePartyPlayers();
|
|
|
+ }
|
|
|
+ PP.setParty(newParty);
|
|
|
+ informPartyMembers(player);
|
|
|
+
|
|
|
+ if(!invite) {
|
|
|
+ player.sendMessage(mcLocale.getString("mcPlayerListener.JoinedParty", new Object[] { newParty }));
|
|
|
+ } else {
|
|
|
+ player.sendMessage(mcLocale.getString("mcPlayerListener.InviteAccepted", new Object[]{ PP.getParty() }));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static <U,V,W> W putNestedEntry(
|
|
|
+ HashMap<U,HashMap<V,W>> nest,
|
|
|
+ U nestKey,
|
|
|
+ V nestedKey,
|
|
|
+ W nestedValue)
|
|
|
+ {
|
|
|
+ HashMap<V,W> nested = nest.get(nestKey);
|
|
|
+
|
|
|
+ if (nested == null) {
|
|
|
+ nested = new HashMap<V,W>();
|
|
|
+ nest.put(nestKey, nested);
|
|
|
+ }
|
|
|
+
|
|
|
+ return nested.put(nestedKey, nestedValue);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void dump(Player player) {
|
|
|
+ player.sendMessage(partyPlayers.toString());
|
|
|
+ player.sendMessage(partyLocks.toString());
|
|
|
+ player.sendMessage(partyPasswords.toString());
|
|
|
+ Iterator<String> i = partyPlayers.keySet().iterator();
|
|
|
+ while(i.hasNext()) {
|
|
|
+ String nestkey = i.next();
|
|
|
+ player.sendMessage(nestkey);
|
|
|
+ Iterator<String> j = partyPlayers.get(nestkey).keySet().iterator();
|
|
|
+ while(j.hasNext()) {
|
|
|
+ String nestedkey = j.next();
|
|
|
+ player.sendMessage("."+nestedkey);
|
|
|
+ if(partyPlayers.get(nestkey).get(nestedkey)) {
|
|
|
+ player.sendMessage("..True");
|
|
|
+ } else {
|
|
|
+ player.sendMessage("..False");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void lockParty(String partyName) {
|
|
|
+ this.partyLocks.put(partyName, true);
|
|
|
+ savePartyLocks();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void unlockParty(String partyName) {
|
|
|
+ this.partyLocks.put(partyName, false);
|
|
|
+ savePartyLocks();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void deleteParty(String partyName) {
|
|
|
+ this.partyPlayers.remove(partyName);
|
|
|
+ this.partyLocks.remove(partyName);
|
|
|
+ this.partyPasswords.remove(partyName);
|
|
|
+ saveParties();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setPartyPassword(String partyName, String password) {
|
|
|
+ if(password.equalsIgnoreCase("\"\"")) password = null;
|
|
|
+ this.partyPasswords.put(partyName, password);
|
|
|
+ savePartyPasswords();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setPartyLeader(String partyName, String playerName) {
|
|
|
+ Iterator<String> i = partyPlayers.get(partyName).keySet().iterator();
|
|
|
+ while(i.hasNext()) {
|
|
|
+ String playerKey = i.next();
|
|
|
+ if(playerKey.equalsIgnoreCase(playerName)) {
|
|
|
+ partyPlayers.get(partyName).put(playerName, true);
|
|
|
+ informPartyMembersOwnerChange(playerName);
|
|
|
+ //TODO: Needs more locale.
|
|
|
+ plugin.getServer().getPlayer(playerName).sendMessage("You are now the party owner.");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if(partyPlayers.get(partyName).get(playerKey)) {
|
|
|
+ //TODO: Needs more locale.
|
|
|
+ plugin.getServer().getPlayer(playerKey).sendMessage("You are no longer party owner.");
|
|
|
+ partyPlayers.get(partyName).put(playerKey, false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public String getPartyPassword(String partyName) {
|
|
|
+ return this.partyPasswords.get(partyName);
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean canInvite(Player player, PlayerProfile PP) {
|
|
|
+ return (isPartyLocked(PP.getParty()) && !isPartyLeader(player, PP.getParty())) ? false : true;
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isParty(String partyName) {
|
|
|
+ return this.partyPlayers.containsKey(partyName);
|
|
|
+ }
|
|
|
|
|
|
+ public boolean isPartyEmpty(String partyName) {
|
|
|
+ return this.partyPlayers.get(partyName).isEmpty();
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isPartyLeader(Player player, String partyName) {
|
|
|
+ if(this.partyPlayers.get(partyName).get(player.getName()) == null) return false;
|
|
|
+ return this.partyPlayers.get(partyName).get(player.getName());
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isPartyLocked(String partyName) {
|
|
|
+ if(this.partyLocks.get(partyName) == null) return false;
|
|
|
+ return this.partyLocks.get(partyName);
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isPartyPasswordProtected(String partyName) {
|
|
|
+ return !(this.partyPasswords.get(partyName) == null);
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isInParty(Player player, PlayerProfile PP) {
|
|
|
+ return partyPlayers.get(PP.getParty()).containsKey(player.getName());
|
|
|
+ }
|
|
|
+
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ public void loadParties() {
|
|
|
+ if(new File(partyPlayersFile).exists()) {
|
|
|
+ try {
|
|
|
+ ObjectInputStream obj = new ObjectInputStream(new FileInputStream(partyPlayersFile));
|
|
|
+ this.partyPlayers = (HashMap<String, HashMap<String, Boolean>>)obj.readObject();
|
|
|
+ } catch (FileNotFoundException e) { e.printStackTrace();
|
|
|
+ } catch (EOFException e) { mcMMO.log.info("partyPlayersFile empty.");
|
|
|
+ } catch (IOException e) { e.printStackTrace();
|
|
|
+ } catch (ClassNotFoundException e) { e.printStackTrace(); }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(new File(partyLocksFile).exists()) {
|
|
|
+ try {
|
|
|
+ ObjectInputStream obj = new ObjectInputStream(new FileInputStream(partyLocksFile));
|
|
|
+ this.partyLocks = (HashMap<String, Boolean>)obj.readObject();
|
|
|
+ } catch (FileNotFoundException e) { e.printStackTrace();
|
|
|
+ } catch (EOFException e) { mcMMO.log.info("partyLocksFile empty.");
|
|
|
+ } catch (IOException e) { e.printStackTrace();
|
|
|
+ } catch (ClassNotFoundException e) { e.printStackTrace(); }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(new File(partyPasswordsFile).exists()) {
|
|
|
+ try {
|
|
|
+ ObjectInputStream obj = new ObjectInputStream(new FileInputStream(partyPasswordsFile));
|
|
|
+ this.partyPasswords = (HashMap<String, String>)obj.readObject();
|
|
|
+ } catch (FileNotFoundException e) { e.printStackTrace();
|
|
|
+ } catch (EOFException e) { mcMMO.log.info("partyPasswordsFile empty.");
|
|
|
+ } catch (IOException e) { e.printStackTrace();
|
|
|
+ } catch (ClassNotFoundException e) { e.printStackTrace(); }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void saveParties() {
|
|
|
+ savePartyPlayers();
|
|
|
+ savePartyLocks();
|
|
|
+ savePartyPasswords();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void savePartyPlayers() {
|
|
|
+ try {
|
|
|
+ new File(partyPlayersFile).createNewFile();
|
|
|
+ ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream(partyPlayersFile));
|
|
|
+ obj.writeObject(this.partyPlayers);
|
|
|
+ obj.close();
|
|
|
+ } catch (FileNotFoundException e) { e.printStackTrace();
|
|
|
+ } catch (IOException e) { e.printStackTrace(); }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void savePartyLocks() {
|
|
|
+ try {
|
|
|
+ new File(partyLocksFile).createNewFile();
|
|
|
+ ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream(partyLocksFile));
|
|
|
+ obj.writeObject(this.partyLocks);
|
|
|
+ obj.close();
|
|
|
+ } catch (FileNotFoundException e) { e.printStackTrace();
|
|
|
+ } catch (IOException e) { e.printStackTrace(); }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void savePartyPasswords() {
|
|
|
+ try {
|
|
|
+ new File(partyPasswordsFile).createNewFile();
|
|
|
+ ObjectOutputStream obj = new ObjectOutputStream(new FileOutputStream(partyPasswordsFile));
|
|
|
+ obj.writeObject(this.partyPasswords);
|
|
|
+ obj.close();
|
|
|
+ } catch (FileNotFoundException e) { e.printStackTrace();
|
|
|
+ } catch (IOException e) { e.printStackTrace(); }
|
|
|
+ }
|
|
|
}
|