123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567 |
- package com.gmail.nossr50.party;
- import java.io.File;
- import java.util.ArrayList;
- import java.util.List;
- import org.bukkit.OfflinePlayer;
- import org.bukkit.configuration.file.YamlConfiguration;
- import org.bukkit.entity.Player;
- import com.gmail.nossr50.mcMMO;
- import com.gmail.nossr50.datatypes.party.Party;
- import com.gmail.nossr50.datatypes.player.McMMOPlayer;
- import com.gmail.nossr50.events.party.McMMOPartyChangeEvent;
- import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason;
- import com.gmail.nossr50.locale.LocaleLoader;
- import com.gmail.nossr50.util.Misc;
- import com.gmail.nossr50.util.player.UserManager;
- public final class PartyManager {
- private static String partiesFilePath = mcMMO.p.getDataFolder().getPath() + File.separator + "FlatFileStuff" + File.separator + "parties.yml";
- private static List<Party> parties = new ArrayList<Party>();
- private PartyManager() {}
- public static boolean checkPartyExistence(Player player, Party party, String partyName) {
- if (party == null) {
- return false;
- }
- player.sendMessage(LocaleLoader.getString("Commands.Party.AlreadyExists", partyName));
- return true;
- }
- public static boolean changeOrJoinParty(McMMOPlayer mcMMOPlayer, Player player, Party oldParty, String newPartyName) {
- if (mcMMOPlayer.inParty()) {
- if (!handlePartyChangeEvent(player, oldParty.getName(), newPartyName, EventReason.CHANGED_PARTIES)) {
- return false;
- }
- removeFromParty(player, oldParty);
- }
- else if (!handlePartyChangeEvent(player, null, newPartyName, EventReason.JOINED_PARTY)) {
- return false;
- }
- return true;
- }
- /**
- * Check if two online players are in the same party.
- *
- * @param firstPlayer The first player
- * @param secondPlayer The second player
- * @return true if they are in the same party, false otherwise
- */
- public static boolean inSameParty(Player firstPlayer, Player secondPlayer) {
- McMMOPlayer firstMcMMOPlayer = UserManager.getPlayer(firstPlayer);
- McMMOPlayer secondMcMMOPlayer = UserManager.getPlayer(secondPlayer);
- if (firstMcMMOPlayer == null || secondMcMMOPlayer == null) {
- return false;
- }
- Party firstParty = firstMcMMOPlayer.getParty();
- Party secondParty = secondMcMMOPlayer.getParty();
- if (firstParty == null || secondParty == null || firstParty != secondParty) {
- return false;
- }
- return true;
- }
- /**
- * Get the near party members.
- *
- * @param player The player to check
- * @param range The distance
- * @return the near party members
- */
- public static List<Player> getNearMembers(Player player, Party party, double range) {
- List<Player> nearMembers = new ArrayList<Player>();
- if (party != null) {
- for (Player member : party.getOnlineMembers()) {
- if (!player.getName().equalsIgnoreCase(member.getName()) && !member.isDead() && Misc.isNear(player.getLocation(), member.getLocation(), range)) {
- nearMembers.add(member);
- }
- }
- }
- return nearMembers;
- }
- /**
- * Get a list of all players in this player's party.
- *
- * @param player The player to check
- * @return all the players in the player's party
- */
- public static List<String> getAllMembers(Player player) {
- Party party = UserManager.getPlayer(player).getParty();
- if (party == null) {
- return null;
- }
- return party.getMembers();
- }
- /**
- * Get a list of all online players in this party.
- *
- * @param partyName The party to check
- * @return all online players in this party
- */
- public static List<Player> getOnlineMembers(String partyName) {
- Party party = getParty(partyName);
- if (party == null) {
- return null;
- }
- return party.getOnlineMembers();
- }
- /**
- * Get a list of all online players in this party.
- *
- * @param player The player to check
- * @return all online players in this party
- */
- public static List<Player> getOnlineMembers(Player player) {
- Party party = getPlayerParty(player.getName());
- if (party == null) {
- return null;
- }
- return getOnlineMembers(party.getName());
- }
- /**
- * Retrieve a party by its name
- *
- * @param partyName The party name
- * @return the existing party, null otherwise
- */
- public static Party getParty(String partyName) {
- for (Party party : parties) {
- if (party.getName().equals(partyName)) {
- return party;
- }
- }
- return null;
- }
- /**
- * Retrieve a party by a member name
- *
- * @param playerName The member name
- * @return the existing party, null otherwise
- */
- public static Party getPlayerParty(String playerName) {
- for (Party party : parties) {
- for (String memberName : party.getMembers()) {
- if (memberName.equalsIgnoreCase(playerName)) {
- return party;
- }
- }
- }
- return null;
- }
- /**
- * Get a list of all current parties.
- *
- * @return the list of parties.
- */
- public static List<Party> getParties() {
- return parties;
- }
- /**
- * Remove a player from a party.
- *
- * @param player The player to remove
- * @param party The party
- */
- public static void removeFromParty(OfflinePlayer player, Party party) {
- List<String> members = party.getMembers();
- while (members.contains(player.getName())) {
- // Remove all the duplicates as well
- members.remove(player.getName());
- }
- if (members.isEmpty()) {
- parties.remove(party);
- }
- else {
- // If the leaving player was the party leader, appoint a new leader from the party members
- if (party.getLeader().equalsIgnoreCase(player.getName())) {
- String newLeader = members.get(0);
- party.setLeader(newLeader);
- }
- informPartyMembersQuit(player, party);
- }
- McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player.getName());
- if (mcMMOPlayer != null) {
- mcMMOPlayer.removeParty();
- mcMMOPlayer.setItemShareModifier(10);
- }
- }
- /**
- * Disband a party. Kicks out all members and removes the party.
- *
- * @param party The party to remove
- */
- public static void disbandParty(Party party) {
- List<String> members = party.getMembers();
- for (String memberName : members) {
- McMMOPlayer mcMMOPlayer = UserManager.getPlayer(memberName);
- if (mcMMOPlayer != null) {
- mcMMOPlayer.removeParty();
- mcMMOPlayer.setItemShareModifier(10);
- }
- }
- members.clear();
- parties.remove(party);
- }
- /**
- * Create a new party
- *
- * @param player The player to add to the party
- * @param mcMMOPlayer The player to add to the party
- * @param partyName The party to add the player to
- * @param password The password for this party, null if there was no password
- */
- public static void createParty(Player player, McMMOPlayer mcMMOPlayer, String partyName, String password) {
- partyName = partyName.replace(".", "");
- Party party = getParty(partyName);
- if (party == null) {
- party = new Party();
- party.setName(partyName);
- party.setLeader(player.getName());
- party.setLocked(true); // Parties are now invite-only by default, can be set to open with /party unlock
- if (password != null) {
- party.setPassword(password);
- player.sendMessage(LocaleLoader.getString("Party.Password.Set", password));
- }
- parties.add(party);
- }
- else {
- player.sendMessage(LocaleLoader.getString("Commands.Party.AlreadyExists"));
- return;
- }
- player.sendMessage(LocaleLoader.getString("Commands.Party.Create", party.getName()));
- addToParty(player, mcMMOPlayer, party);
- }
- /**
- * Add a player to a party.
- *
- * @param player The player to add to the party
- * @param mcMMOPlayer The player to add to the party
- * @param party The party to add the player to
- * @param password the password for this party, null if there was no password
- */
- public static void joinParty(Player player, McMMOPlayer mcMMOPlayer, Party party, String password) {
- if (!checkPartyPassword(player, party, password)) {
- return;
- }
- if (mcMMOPlayer.getParty() == party) {
- return;
- }
- player.sendMessage(LocaleLoader.getString("Commands.Party.Join", party.getName()));
- addToParty(player, mcMMOPlayer, party);
- }
- /**
- * Check if a player can join a party
- *
- * @param player The player trying to join a party
- * @param party The party
- * @param password The password provided by the player
- * @return true if the player can join the party
- */
- public static boolean checkPartyPassword(Player player, Party party, String password) {
- // Don't care about passwords if it isn't locked
- if (party.isLocked()) {
- String partyPassword = party.getPassword();
- if (partyPassword != null) {
- if (password == null) {
- player.sendMessage(LocaleLoader.getString("Party.Password.None"));
- return false;
- }
- else if (!password.equals(partyPassword)) {
- player.sendMessage(LocaleLoader.getString("Party.Password.Incorrect"));
- return false;
- }
- }
- else {
- player.sendMessage(LocaleLoader.getString("Party.Locked"));
- return false;
- }
- }
- return true;
- }
- /**
- * Accept a party invitation
- *
- * @param Player The plaer to add to the party
- * @param mcMMOPlayer The player to add to the party
- */
- public static void joinInvitedParty(Player player, McMMOPlayer mcMMOPlayer) {
- Party invite = mcMMOPlayer.getPartyInvite();
- if (mcMMOPlayer.getParty() == invite) {
- return;
- }
- if (!parties.contains(invite)) {
- parties.add(invite);
- }
- player.sendMessage(LocaleLoader.getString("Commands.Invite.Accepted", invite.getName()));
- mcMMOPlayer.removePartyInvite();
- addToParty(player, mcMMOPlayer, invite);
- }
- /**
- * Add a player to a party
- *
- * @param player The player to add to a party
- * @param mcMMOPlayer The player to add to the party
- * @param party The party
- */
- public static void addToParty(OfflinePlayer player, McMMOPlayer mcMMOPlayer, Party party) {
- if (mcMMOPlayer.getParty() == party) {
- return;
- }
- informPartyMembersJoin(player, party);
- mcMMOPlayer.setParty(party);
- if (!party.getMembers().contains(player.getName())) {
- party.getMembers().add(player.getName());
- }
- }
- /**
- * Get the leader of a party.
- *
- * @param partyName The party name
- * @return the leader of the party
- */
- public static String getPartyLeader(String partyName) {
- Party party = getParty(partyName);
- if (party == null) {
- return null;
- }
- return party.getLeader();
- }
- /**
- * Set the leader of a party.
- *
- * @param playerName The name of the player to set as leader
- * @param party The party
- */
- public static void setPartyLeader(String playerName, Party party) {
- String leaderName = party.getLeader();
- for (Player member : party.getOnlineMembers()) {
- if (member.getName().equalsIgnoreCase(playerName)) {
- member.sendMessage(LocaleLoader.getString("Party.Owner.Player"));
- }
- else if (member.getName().equalsIgnoreCase(leaderName)) {
- member.sendMessage(LocaleLoader.getString("Party.Owner.NotLeader"));
- }
- else {
- member.sendMessage(LocaleLoader.getString("Party.Owner.New", playerName));
- }
- }
- party.setLeader(playerName);
- }
- /**
- * Check if a player can invite others to his party.
- *
- * @param player The player to check
- * @param mcMMOPlayer The player to check
- * @return true if the player can invite
- */
- public static boolean canInvite(Player player, Party party) {
- if (party.isLocked() && !party.getLeader().equalsIgnoreCase(player.getName())) {
- return false;
- }
- return true;
- }
- /**
- * Check if a string is a valid party name.
- *
- * @param partyName The party name to check
- * @return true if this is a valid party, false otherwise
- */
- public static boolean isParty(String partyName) {
- for (Party party : parties) {
- if (party.getName().equals(partyName)) {
- return true;
- }
- }
- return false;
- }
- /**
- * Load party file.
- */
- public static void loadParties() {
- File file = new File(partiesFilePath);
- if (!file.exists()) {
- return;
- }
- YamlConfiguration partiesFile = new YamlConfiguration();
- try {
- partiesFile.load(file);
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- for (String partyName : partiesFile.getConfigurationSection("").getKeys(false)) {
- Party party = new Party();
- party.setName(partyName);
- party.setLeader(partiesFile.getString(partyName + ".Leader"));
- party.setPassword(partiesFile.getString(partyName + ".Password"));
- party.setLocked(partiesFile.getBoolean(partyName + ".Locked"));
- party.setXpShareMode(ShareHandler.ShareMode.getFromString(partiesFile.getString(partyName + ".ExpShareMode")));
- party.setItemShareMode(ShareHandler.ShareMode.getFromString(partiesFile.getString(partyName + ".ItemShareMode")));
- List<String> memberNames = partiesFile.getStringList(partyName + ".Members");
- List<String> members = party.getMembers();
- for (String memberName : memberNames) {
- if (!members.contains(memberName)) {
- members.add(memberName);
- }
- }
- parties.add(party);
- }
- }
- /**
- * Save party file.
- */
- public static void saveParties() {
- File file = new File(partiesFilePath);
- if (file.exists()) {
- file.delete();
- }
- YamlConfiguration partiesFile = new YamlConfiguration();
- for (Party party : parties) {
- String partyName = party.getName();
- partiesFile.set(partyName + ".Leader", party.getLeader());
- partiesFile.set(partyName + ".Password", party.getPassword());
- partiesFile.set(partyName + ".Locked", party.isLocked());
- partiesFile.set(partyName + ".ExpShareMode", party.getXpShareMode().toString());
- partiesFile.set(partyName + ".ItemShareMode", party.getItemShareMode().toString());
- List<String> memberNames = new ArrayList<String>();
- for (String member : party.getMembers()) {
- if (!memberNames.contains(member)) {
- memberNames.add(member);
- }
- }
- partiesFile.set(partyName + ".Members", memberNames);
- }
- try {
- partiesFile.save(new File(partiesFilePath));
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * Handle party change event.
- *
- * @param player The player changing parties
- * @param oldPartyName The name of the old party
- * @param newPartyName The name of the new party
- * @param reason The reason for changing parties
- * @return true if the change event was successful, false otherwise
- */
- public static boolean handlePartyChangeEvent(Player player, String oldPartyName, String newPartyName, EventReason reason) {
- McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, oldPartyName, newPartyName, reason);
- mcMMO.p.getServer().getPluginManager().callEvent(event);
- return !event.isCancelled();
- }
- /**
- * Notify party members when a player joins
- *
- * @param player The player that joins
- * @param party The concerned party
- */
- private static void informPartyMembersJoin(OfflinePlayer player, Party party) {
- for (Player member : party.getOnlineMembers()) {
- if (!member.equals(player)) {
- member.sendMessage(LocaleLoader.getString("Party.InformedOnJoin", player.getName()));
- }
- }
- }
- /**
- * Notify party members when a party member quits.
- *
- * @param player The player that quits
- * @param party The concerned party
- */
- private static void informPartyMembersQuit(OfflinePlayer player, Party party) {
- for (Player member : party.getOnlineMembers()) {
- if (!member.equals(player)) {
- member.sendMessage(LocaleLoader.getString("Party.InformedOnQuit", player.getName()));
- }
- }
- }
- }
|