PartyManager.java 30 KB

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