PartyManager.java 29 KB

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