PartyManager.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760
  1. package com.gmail.nossr50.party;
  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.LinkedHashMap;
  5. import java.util.List;
  6. import java.util.Map.Entry;
  7. import java.util.UUID;
  8. import org.bukkit.OfflinePlayer;
  9. import org.bukkit.Sound;
  10. import org.bukkit.configuration.file.YamlConfiguration;
  11. import org.bukkit.entity.Player;
  12. import com.gmail.nossr50.mcMMO;
  13. import com.gmail.nossr50.config.Config;
  14. import com.gmail.nossr50.datatypes.chat.ChatMode;
  15. import com.gmail.nossr50.datatypes.database.UpgradeType;
  16. import com.gmail.nossr50.datatypes.party.ItemShareType;
  17. import com.gmail.nossr50.datatypes.party.Party;
  18. import com.gmail.nossr50.datatypes.party.PartyLeader;
  19. import com.gmail.nossr50.datatypes.party.ShareMode;
  20. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  21. import com.gmail.nossr50.datatypes.player.PlayerProfile;
  22. import com.gmail.nossr50.events.party.McMMOPartyAllianceChangeEvent;
  23. import com.gmail.nossr50.events.party.McMMOPartyChangeEvent;
  24. import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason;
  25. import com.gmail.nossr50.locale.LocaleLoader;
  26. import com.gmail.nossr50.util.Misc;
  27. import com.gmail.nossr50.util.player.UserManager;
  28. public final class PartyManager {
  29. private static String partiesFilePath = mcMMO.getFlatFileDirectory() + "parties.yml";
  30. private static List<Party> parties = new ArrayList<Party>();
  31. private static File partyFile = new File(partiesFilePath);
  32. private PartyManager() {}
  33. /**
  34. * Check if a party with a given name already exists.
  35. *
  36. * @param player The player to notify
  37. * @param partyName The name of the party to check
  38. * @return true if a party with that name exists, false otherwise
  39. */
  40. public static boolean checkPartyExistence(Player player, String partyName) {
  41. if (getParty(partyName) == null) {
  42. return false;
  43. }
  44. player.sendMessage(LocaleLoader.getString("Commands.Party.AlreadyExists", partyName));
  45. return true;
  46. }
  47. /**
  48. * Attempt to change parties or join a new party.
  49. *
  50. * @param mcMMOPlayer The player changing or joining parties
  51. * @param newPartyName The name of the party being joined
  52. * @return true if the party was joined successfully, false otherwise
  53. */
  54. public static boolean changeOrJoinParty(McMMOPlayer mcMMOPlayer, String newPartyName) {
  55. Player player = mcMMOPlayer.getPlayer();
  56. if (mcMMOPlayer.inParty()) {
  57. Party oldParty = mcMMOPlayer.getParty();
  58. if (!handlePartyChangeEvent(player, oldParty.getName(), newPartyName, EventReason.CHANGED_PARTIES)) {
  59. return false;
  60. }
  61. removeFromParty(mcMMOPlayer);
  62. }
  63. else if (!handlePartyChangeEvent(player, null, newPartyName, EventReason.JOINED_PARTY)) {
  64. return false;
  65. }
  66. return true;
  67. }
  68. /**
  69. * Check if two online players are in the same party.
  70. *
  71. * @param firstPlayer The first player
  72. * @param secondPlayer The second player
  73. * @return true if they are in the same party, false otherwise
  74. */
  75. public static boolean inSameParty(Player firstPlayer, Player secondPlayer) {
  76. Party firstParty = UserManager.getPlayer(firstPlayer).getParty();
  77. Party secondParty = UserManager.getPlayer(secondPlayer).getParty();
  78. if (firstParty == null || secondParty == null) {
  79. return false;
  80. }
  81. return firstParty.equals(secondParty);
  82. }
  83. public static boolean areAllies(Player firstPlayer, Player secondPlayer) {
  84. Party firstParty = UserManager.getPlayer(firstPlayer).getParty();
  85. Party secondParty = UserManager.getPlayer(secondPlayer).getParty();
  86. if (firstParty == null || secondParty == null || firstParty.getAlly() == null || secondParty.getAlly() == null) {
  87. return false;
  88. }
  89. return firstParty.equals(secondParty.getAlly()) && secondParty.equals(firstParty.getAlly());
  90. }
  91. /**
  92. * Get the near party members.
  93. *
  94. * @param mcMMOPlayer The player to check
  95. * @return the near party members
  96. */
  97. public static List<Player> getNearMembers(McMMOPlayer mcMMOPlayer) {
  98. List<Player> nearMembers = new ArrayList<Player>();
  99. Party party = mcMMOPlayer.getParty();
  100. if (party != null) {
  101. Player player = mcMMOPlayer.getPlayer();
  102. double range = Config.getInstance().getPartyShareRange();
  103. for (Player member : party.getOnlineMembers()) {
  104. if (!player.equals(member) && member.isValid() && Misc.isNear(player.getLocation(), member.getLocation(), range)) {
  105. nearMembers.add(member);
  106. }
  107. }
  108. }
  109. return nearMembers;
  110. }
  111. /**
  112. * Get a list of all players in this player's party.
  113. *
  114. * @param player The player to check
  115. * @return all the players in the player's party
  116. */
  117. public static LinkedHashMap<UUID, String> getAllMembers(Player player) {
  118. Party party = getParty(player);
  119. return party == null ? new LinkedHashMap<UUID, String>() : party.getMembers();
  120. }
  121. /**
  122. * Get a list of all online players in this party.
  123. *
  124. * @param partyName The party to check
  125. * @return all online players in this party
  126. */
  127. public static List<Player> getOnlineMembers(String partyName) {
  128. return getOnlineMembers(getParty(partyName));
  129. }
  130. /**
  131. * Get a list of all online players in this party.
  132. *
  133. * @param player The player to check
  134. * @return all online players in this party
  135. */
  136. public static List<Player> getOnlineMembers(Player player) {
  137. return getOnlineMembers(getParty(player));
  138. }
  139. private static List<Player> getOnlineMembers(Party party) {
  140. return party == null ? new ArrayList<Player>() : party.getOnlineMembers();
  141. }
  142. /**
  143. * Retrieve a party by its name
  144. *
  145. * @param partyName The party name
  146. * @return the existing party, null otherwise
  147. */
  148. public static Party getParty(String partyName) {
  149. for (Party party : parties) {
  150. if (party.getName().equalsIgnoreCase(partyName)) {
  151. return party;
  152. }
  153. }
  154. return null;
  155. }
  156. /**
  157. * Retrieve a party by a members name
  158. *
  159. * @param playerName The members name
  160. * @return the existing party, null otherwise
  161. */
  162. @Deprecated
  163. public static Party getPlayerParty(String playerName) {
  164. for (Party party : parties) {
  165. if (party.getMembers().keySet().contains(playerName)) {
  166. return party;
  167. }
  168. }
  169. return null;
  170. }
  171. /**
  172. * Retrieve a party by a members uuid
  173. *
  174. * @param uuid The members uuid
  175. * @return the existing party, null otherwise
  176. */
  177. public static Party getPlayerParty(String playerName, UUID uuid) {
  178. for (Party party : parties) {
  179. LinkedHashMap<UUID, String> members = party.getMembers();
  180. if (members.keySet().contains(uuid) || members.values().contains(playerName)) {
  181. // Name changes
  182. if (members.get(uuid) == null || !members.get(uuid).equals(playerName)) {
  183. members.put(uuid, playerName);
  184. }
  185. return party;
  186. }
  187. }
  188. return null;
  189. }
  190. /**
  191. * Retrieve a party by member
  192. *
  193. * @param player The member
  194. * @return the existing party, null otherwise
  195. */
  196. public static Party getParty(Player player) {
  197. McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
  198. return mcMMOPlayer.getParty();
  199. }
  200. /**
  201. * Get a list of all current parties.
  202. *
  203. * @return the list of parties.
  204. */
  205. public static List<Party> getParties() {
  206. return parties;
  207. }
  208. /**
  209. * Remove a player from a party.
  210. *
  211. * @param player The player to remove
  212. * @param party The party
  213. */
  214. public static void removeFromParty(OfflinePlayer player, Party party) {
  215. LinkedHashMap<UUID, String> members = party.getMembers();
  216. String playerName = player.getName();
  217. members.remove(player.getUniqueId());
  218. if (player.isOnline()) {
  219. party.getOnlineMembers().remove(player.getPlayer());
  220. }
  221. if (members.isEmpty()) {
  222. parties.remove(party);
  223. }
  224. else {
  225. // If the leaving player was the party leader, appoint a new leader from the party members
  226. if (party.getLeader().getUniqueId().equals(player.getUniqueId())) {
  227. setPartyLeader(members.keySet().iterator().next(), party);
  228. }
  229. informPartyMembersQuit(party, playerName);
  230. }
  231. }
  232. /**
  233. * Remove a player from a party.
  234. *
  235. * @param mcMMOPlayer The player to remove
  236. */
  237. public static void removeFromParty(McMMOPlayer mcMMOPlayer) {
  238. removeFromParty(mcMMOPlayer.getPlayer(), mcMMOPlayer.getParty());
  239. processPartyLeaving(mcMMOPlayer);
  240. }
  241. /**
  242. * Disband a party. Kicks out all members and removes the party.
  243. *
  244. * @param party The party to remove
  245. */
  246. public static void disbandParty(Party party) {
  247. for (Player member : party.getOnlineMembers()) {
  248. processPartyLeaving(UserManager.getPlayer(member));
  249. }
  250. // Disband the alliance between the disbanded party and it's ally
  251. if (party.getAlly() != null) {
  252. party.getAlly().setAlly(null);
  253. }
  254. parties.remove(party);
  255. }
  256. /**
  257. * Create a new party
  258. *
  259. * @param mcMMOPlayer The player to add to the party
  260. * @param partyName The party to add the player to
  261. * @param password The password for this party, null if there was no password
  262. */
  263. public static void createParty(McMMOPlayer mcMMOPlayer, String partyName, String password) {
  264. Player player = mcMMOPlayer.getPlayer();
  265. Party party = new Party(new PartyLeader(player.getUniqueId(), player.getName()), partyName.replace(".", ""), password);
  266. if (password != null) {
  267. player.sendMessage(LocaleLoader.getString("Party.Password.Set", password));
  268. }
  269. parties.add(party);
  270. player.sendMessage(LocaleLoader.getString("Commands.Party.Create", party.getName()));
  271. addToParty(mcMMOPlayer, party);
  272. }
  273. /**
  274. * Check if a player can join a party
  275. *
  276. * @param player The player trying to join a party
  277. * @param party The party
  278. * @param password The password provided by the player
  279. * @return true if the player can join the party
  280. */
  281. public static boolean checkPartyPassword(Player player, Party party, String password) {
  282. if (party.isLocked()) {
  283. String partyPassword = party.getPassword();
  284. if (partyPassword == null) {
  285. player.sendMessage(LocaleLoader.getString("Party.Locked"));
  286. return false;
  287. }
  288. if (password == null) {
  289. player.sendMessage(LocaleLoader.getString("Party.Password.None"));
  290. return false;
  291. }
  292. if (!password.equals(partyPassword)) {
  293. player.sendMessage(LocaleLoader.getString("Party.Password.Incorrect"));
  294. return false;
  295. }
  296. }
  297. return true;
  298. }
  299. /**
  300. * Accept a party invitation
  301. *
  302. * @param mcMMOPlayer The player to add to the party
  303. */
  304. public static void joinInvitedParty(McMMOPlayer mcMMOPlayer) {
  305. Party invite = mcMMOPlayer.getPartyInvite();
  306. // Check if the party still exists, it might have been disbanded
  307. if (!parties.contains(invite)) {
  308. mcMMOPlayer.getPlayer().sendMessage(LocaleLoader.getString("Party.Disband"));
  309. return;
  310. }
  311. mcMMOPlayer.getPlayer().sendMessage(LocaleLoader.getString("Commands.Party.Invite.Accepted", invite.getName()));
  312. mcMMOPlayer.removePartyInvite();
  313. addToParty(mcMMOPlayer, invite);
  314. }
  315. /**
  316. * Accept a party alliance invitation
  317. *
  318. * @param mcMMOPlayer The player who accepts the alliance invite
  319. */
  320. public static void acceptAllianceInvite(McMMOPlayer mcMMOPlayer) {
  321. Party invite = mcMMOPlayer.getPartyAllianceInvite();
  322. Player player = mcMMOPlayer.getPlayer();
  323. // Check if the party still exists, it might have been disbanded
  324. if (!parties.contains(invite)) {
  325. player.sendMessage(LocaleLoader.getString("Party.Disband"));
  326. return;
  327. }
  328. if (!handlePartyChangeAllianceEvent(player, mcMMOPlayer.getParty().getName(), invite.getName(), McMMOPartyAllianceChangeEvent.EventReason.FORMED_ALLIANCE)) {
  329. return;
  330. }
  331. player.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.Invite.Accepted", invite.getName()));
  332. mcMMOPlayer.removePartyAllianceInvite();
  333. createAlliance(mcMMOPlayer.getParty(), invite);
  334. }
  335. public static void createAlliance(Party firstParty, Party secondParty) {
  336. firstParty.setAlly(secondParty);
  337. secondParty.setAlly(firstParty);
  338. for (Player member : firstParty.getOnlineMembers()) {
  339. member.sendMessage(LocaleLoader.getString("Party.Alliance.Formed", secondParty.getName()));
  340. }
  341. for (Player member : secondParty.getOnlineMembers()) {
  342. member.sendMessage(LocaleLoader.getString("Party.Alliance.Formed", firstParty.getName()));
  343. }
  344. }
  345. public static boolean disbandAlliance(Player player, Party firstParty, Party secondParty){
  346. if (!handlePartyChangeAllianceEvent(player, firstParty.getName(), secondParty.getName(), McMMOPartyAllianceChangeEvent.EventReason.DISBAND_ALLIANCE)) {
  347. return false;
  348. }
  349. PartyManager.disbandAlliance(firstParty, secondParty);
  350. return true;
  351. }
  352. private static void disbandAlliance(Party firstParty, Party secondParty) {
  353. firstParty.setAlly(null);
  354. secondParty.setAlly(null);
  355. for (Player member : firstParty.getOnlineMembers()) {
  356. member.sendMessage(LocaleLoader.getString("Party.Alliance.Disband", secondParty.getName()));
  357. }
  358. for (Player member : secondParty.getOnlineMembers()) {
  359. member.sendMessage(LocaleLoader.getString("Party.Alliance.Disband", firstParty.getName()));
  360. }
  361. }
  362. /**
  363. * Add a player to a party
  364. *
  365. * @param mcMMOPlayer The player to add to the party
  366. * @param party The party
  367. */
  368. public static void addToParty(McMMOPlayer mcMMOPlayer, Party party) {
  369. Player player = mcMMOPlayer.getPlayer();
  370. String playerName = player.getName();
  371. informPartyMembersJoin(party, playerName);
  372. mcMMOPlayer.setParty(party);
  373. party.getMembers().put(player.getUniqueId(), player.getName());
  374. party.getOnlineMembers().add(player);
  375. }
  376. /**
  377. * Get the leader of a party.
  378. *
  379. * @param partyName The party name
  380. * @return the leader of the party
  381. */
  382. public static String getPartyLeaderName(String partyName) {
  383. Party party = getParty(partyName);
  384. return party == null ? null : party.getLeader().getPlayerName();
  385. }
  386. /**
  387. * Set the leader of a party.
  388. *
  389. * @param uuid The uuid of the player to set as leader
  390. * @param party The party
  391. */
  392. public static void setPartyLeader(UUID uuid, Party party) {
  393. OfflinePlayer player = mcMMO.p.getServer().getOfflinePlayer(uuid);
  394. UUID leaderUniqueId = party.getLeader().getUniqueId();
  395. for (Player member : party.getOnlineMembers()) {
  396. UUID memberUniqueId = member.getUniqueId();
  397. if (memberUniqueId.equals(player.getUniqueId())) {
  398. member.sendMessage(LocaleLoader.getString("Party.Owner.Player"));
  399. }
  400. else if (memberUniqueId.equals(leaderUniqueId)) {
  401. member.sendMessage(LocaleLoader.getString("Party.Owner.NotLeader"));
  402. }
  403. else {
  404. member.sendMessage(LocaleLoader.getString("Party.Owner.New", player.getName()));
  405. }
  406. }
  407. party.setLeader(new PartyLeader(player.getUniqueId(), player.getName()));
  408. }
  409. /**
  410. * Check if a player can invite others to his party.
  411. *
  412. * @return true if the player can invite
  413. */
  414. public static boolean canInvite(McMMOPlayer mcMMOPlayer) {
  415. Party party = mcMMOPlayer.getParty();
  416. return !party.isLocked() || party.getLeader().getUniqueId().equals(mcMMOPlayer.getPlayer().getUniqueId());
  417. }
  418. /**
  419. * Load party file.
  420. */
  421. public static void loadParties() {
  422. if (!partyFile.exists()) {
  423. return;
  424. }
  425. if (mcMMO.getUpgradeManager().shouldUpgrade(UpgradeType.ADD_UUIDS_PARTY)) {
  426. loadAndUpgradeParties();
  427. return;
  428. }
  429. YamlConfiguration partiesFile = YamlConfiguration.loadConfiguration(partyFile);
  430. ArrayList<Party> hasAlly = new ArrayList<Party>();
  431. for (String partyName : partiesFile.getConfigurationSection("").getKeys(false)) {
  432. Party party = new Party(partyName);
  433. String[] leaderSplit = partiesFile.getString(partyName + ".Leader").split("[|]");
  434. party.setLeader(new PartyLeader(UUID.fromString(leaderSplit[0]), leaderSplit[1]));
  435. party.setPassword(partiesFile.getString(partyName + ".Password"));
  436. party.setLocked(partiesFile.getBoolean(partyName + ".Locked"));
  437. party.setLevel(partiesFile.getInt(partyName + ".Level"));
  438. party.setXp(partiesFile.getInt(partyName + ".Xp"));
  439. if (partiesFile.getString(partyName + ".Ally") != null) {
  440. hasAlly.add(party);
  441. }
  442. party.setXpShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ExpShareMode", "NONE")));
  443. party.setItemShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ItemShareMode", "NONE")));
  444. for (ItemShareType itemShareType : ItemShareType.values()) {
  445. party.setSharingDrops(itemShareType, partiesFile.getBoolean(partyName + ".ItemShareType." + itemShareType.toString(), true));
  446. }
  447. LinkedHashMap<UUID, String> members = party.getMembers();
  448. for (String memberEntry : partiesFile.getStringList(partyName + ".Members")) {
  449. String[] memberSplit = memberEntry.split("[|]");
  450. members.put(UUID.fromString(memberSplit[0]), memberSplit[1]);
  451. }
  452. parties.add(party);
  453. }
  454. mcMMO.p.debug("Loaded (" + parties.size() + ") Parties...");
  455. for (Party party : hasAlly) {
  456. party.setAlly(PartyManager.getParty(partiesFile.getString(party.getName() + ".Ally")));
  457. }
  458. }
  459. /**
  460. * Save party file.
  461. */
  462. public static void saveParties() {
  463. if (partyFile.exists()) {
  464. if (!partyFile.delete()) {
  465. mcMMO.p.getLogger().warning("Could not delete party file. Party saving failed!");
  466. return;
  467. }
  468. }
  469. YamlConfiguration partiesFile = new YamlConfiguration();
  470. mcMMO.p.debug("Saving Parties... (" + parties.size() + ")");
  471. for (Party party : parties) {
  472. String partyName = party.getName();
  473. PartyLeader leader = party.getLeader();
  474. partiesFile.set(partyName + ".Leader", leader.getUniqueId().toString() + "|" + leader.getPlayerName());
  475. partiesFile.set(partyName + ".Password", party.getPassword());
  476. partiesFile.set(partyName + ".Locked", party.isLocked());
  477. partiesFile.set(partyName + ".Level", party.getLevel());
  478. partiesFile.set(partyName + ".Xp", (int) party.getXp());
  479. partiesFile.set(partyName + ".Ally", (party.getAlly() != null) ? party.getAlly().getName() : "");
  480. partiesFile.set(partyName + ".ExpShareMode", party.getXpShareMode().toString());
  481. partiesFile.set(partyName + ".ItemShareMode", party.getItemShareMode().toString());
  482. for (ItemShareType itemShareType : ItemShareType.values()) {
  483. partiesFile.set(partyName + ".ItemShareType." + itemShareType.toString(), party.sharingDrops(itemShareType));
  484. }
  485. List<String> members = new ArrayList<String>();
  486. for (Entry<UUID, String> memberEntry : party.getMembers().entrySet()) {
  487. String memberUniqueId = memberEntry.getKey() == null ? "" : memberEntry.getKey().toString();
  488. String memberName = memberEntry.getValue();
  489. if (!members.contains(memberName)) {
  490. members.add(memberUniqueId + "|" + memberName);
  491. }
  492. }
  493. partiesFile.set(partyName + ".Members", members);
  494. }
  495. try {
  496. partiesFile.save(partyFile);
  497. }
  498. catch (Exception e) {
  499. e.printStackTrace();
  500. }
  501. }
  502. private static void loadAndUpgradeParties() {
  503. YamlConfiguration partiesFile = YamlConfiguration.loadConfiguration(partyFile);
  504. if (!partyFile.renameTo(new File(mcMMO.getFlatFileDirectory() + "parties.yml.converted"))) {
  505. mcMMO.p.getLogger().severe("Could not rename parties.yml to parties.yml.converted!");
  506. return;
  507. }
  508. ArrayList<Party> hasAlly = new ArrayList<Party>();
  509. for (String partyName : partiesFile.getConfigurationSection("").getKeys(false)) {
  510. Party party = new Party(partyName);
  511. String leaderName = partiesFile.getString(partyName + ".Leader");
  512. PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(leaderName, false);
  513. if (!profile.isLoaded()) {
  514. mcMMO.p.getLogger().warning("Could not find UUID in database for party leader " + leaderName + " in party " + partyName);
  515. continue;
  516. }
  517. UUID leaderUniqueId = profile.getUniqueId();
  518. party.setLeader(new PartyLeader(leaderUniqueId, leaderName));
  519. party.setPassword(partiesFile.getString(partyName + ".Password"));
  520. party.setLocked(partiesFile.getBoolean(partyName + ".Locked"));
  521. party.setLevel(partiesFile.getInt(partyName + ".Level"));
  522. party.setXp(partiesFile.getInt(partyName + ".Xp"));
  523. if (partiesFile.getString(partyName + ".Ally") != null) {
  524. hasAlly.add(party);
  525. }
  526. party.setXpShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ExpShareMode", "NONE")));
  527. party.setItemShareMode(ShareMode.getShareMode(partiesFile.getString(partyName + ".ItemShareMode", "NONE")));
  528. for (ItemShareType itemShareType : ItemShareType.values()) {
  529. party.setSharingDrops(itemShareType, partiesFile.getBoolean(partyName + ".ItemShareType." + itemShareType.toString(), true));
  530. }
  531. LinkedHashMap<UUID, String> members = party.getMembers();
  532. for (String memberName : partiesFile.getStringList(partyName + ".Members")) {
  533. PlayerProfile memberProfile = mcMMO.getDatabaseManager().loadPlayerProfile(memberName, false);
  534. if (!memberProfile.isLoaded()) {
  535. mcMMO.p.getLogger().warning("Could not find UUID in database for party member " + memberName + " in party " + partyName);
  536. continue;
  537. }
  538. UUID memberUniqueId = memberProfile.getUniqueId();
  539. members.put(memberUniqueId, memberName);
  540. }
  541. parties.add(party);
  542. }
  543. mcMMO.p.debug("Loaded (" + parties.size() + ") Parties...");
  544. for (Party party : hasAlly) {
  545. party.setAlly(PartyManager.getParty(partiesFile.getString(party.getName() + ".Ally")));
  546. }
  547. mcMMO.getUpgradeManager().setUpgradeCompleted(UpgradeType.ADD_UUIDS_PARTY);
  548. }
  549. /**
  550. * Handle party change event.
  551. *
  552. * @param player The player changing parties
  553. * @param oldPartyName The name of the old party
  554. * @param newPartyName The name of the new party
  555. * @param reason The reason for changing parties
  556. * @return true if the change event was successful, false otherwise
  557. */
  558. public static boolean handlePartyChangeEvent(Player player, String oldPartyName, String newPartyName, EventReason reason) {
  559. McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, oldPartyName, newPartyName, reason);
  560. mcMMO.p.getServer().getPluginManager().callEvent(event);
  561. return !event.isCancelled();
  562. }
  563. /**
  564. * Handle party alliance change event.
  565. *
  566. * @param player The player changing party alliances
  567. * @param oldAllyName The name of the old ally
  568. * @param newAllyName The name of the new ally
  569. * @param reason The reason for changing allies
  570. * @return true if the change event was successful, false otherwise
  571. */
  572. public static boolean handlePartyChangeAllianceEvent(Player player, String oldAllyName, String newAllyName, McMMOPartyAllianceChangeEvent.EventReason reason) {
  573. McMMOPartyAllianceChangeEvent event = new McMMOPartyAllianceChangeEvent(player, oldAllyName, newAllyName, reason);
  574. mcMMO.p.getServer().getPluginManager().callEvent(event);
  575. return !event.isCancelled();
  576. }
  577. /**
  578. * Remove party data from the mcMMOPlayer.
  579. *
  580. * @param mcMMOPlayer The player to remove party data from.
  581. */
  582. public static void processPartyLeaving(McMMOPlayer mcMMOPlayer) {
  583. mcMMOPlayer.removeParty();
  584. mcMMOPlayer.disableChat(ChatMode.PARTY);
  585. mcMMOPlayer.setItemShareModifier(10);
  586. }
  587. /**
  588. * Notify party members when the party levels up.
  589. *
  590. * @param party The concerned party
  591. * @param levelsGained The amount of levels gained
  592. * @param level The current party level
  593. */
  594. public static void informPartyMembersLevelUp(Party party, int levelsGained, int level) {
  595. boolean levelUpSoundsEnabled = Config.getInstance().getLevelUpSoundsEnabled();
  596. for (Player member : party.getOnlineMembers()) {
  597. member.sendMessage(LocaleLoader.getString("Party.LevelUp", levelsGained, level));
  598. if (levelUpSoundsEnabled) {
  599. member.playSound(member.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, Misc.LEVELUP_VOLUME, Misc.LEVELUP_PITCH);
  600. }
  601. }
  602. }
  603. /**
  604. * Notify party members when a player joins.
  605. *
  606. * @param party The concerned party
  607. * @param playerName The name of the player that joined
  608. */
  609. private static void informPartyMembersJoin(Party party, String playerName) {
  610. for (Player member : party.getOnlineMembers()) {
  611. member.sendMessage(LocaleLoader.getString("Party.InformedOnJoin", playerName));
  612. }
  613. }
  614. /**
  615. * Notify party members when a party member quits.
  616. *
  617. * @param party The concerned party
  618. * @param playerName The name of the player that left
  619. */
  620. private static void informPartyMembersQuit(Party party, String playerName) {
  621. for (Player member : party.getOnlineMembers()) {
  622. member.sendMessage(LocaleLoader.getString("Party.InformedOnQuit", playerName));
  623. }
  624. }
  625. }