PartyManager.java 29 KB

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