PartyManager.java 30 KB

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