PartyManager.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567
  1. package com.gmail.nossr50.party;
  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import org.bukkit.OfflinePlayer;
  6. import org.bukkit.configuration.file.YamlConfiguration;
  7. import org.bukkit.entity.Player;
  8. import com.gmail.nossr50.mcMMO;
  9. import com.gmail.nossr50.datatypes.party.Party;
  10. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  11. import com.gmail.nossr50.events.party.McMMOPartyChangeEvent;
  12. import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason;
  13. import com.gmail.nossr50.locale.LocaleLoader;
  14. import com.gmail.nossr50.util.Misc;
  15. import com.gmail.nossr50.util.player.UserManager;
  16. public final class PartyManager {
  17. private static String partiesFilePath = mcMMO.p.getDataFolder().getPath() + File.separator + "FlatFileStuff" + File.separator + "parties.yml";
  18. private static List<Party> parties = new ArrayList<Party>();
  19. private PartyManager() {}
  20. public static boolean checkPartyExistence(Player player, Party party, String partyName) {
  21. if (party == null) {
  22. return false;
  23. }
  24. player.sendMessage(LocaleLoader.getString("Commands.Party.AlreadyExists", partyName));
  25. return true;
  26. }
  27. public static boolean changeOrJoinParty(McMMOPlayer mcMMOPlayer, Player player, Party oldParty, String newPartyName) {
  28. if (mcMMOPlayer.inParty()) {
  29. if (!handlePartyChangeEvent(player, oldParty.getName(), newPartyName, EventReason.CHANGED_PARTIES)) {
  30. return false;
  31. }
  32. removeFromParty(player, oldParty);
  33. }
  34. else if (!handlePartyChangeEvent(player, null, newPartyName, EventReason.JOINED_PARTY)) {
  35. return false;
  36. }
  37. return true;
  38. }
  39. /**
  40. * Check if two online players are in the same party.
  41. *
  42. * @param firstPlayer The first player
  43. * @param secondPlayer The second player
  44. * @return true if they are in the same party, false otherwise
  45. */
  46. public static boolean inSameParty(Player firstPlayer, Player secondPlayer) {
  47. McMMOPlayer firstMcMMOPlayer = UserManager.getPlayer(firstPlayer);
  48. McMMOPlayer secondMcMMOPlayer = UserManager.getPlayer(secondPlayer);
  49. if (firstMcMMOPlayer == null || secondMcMMOPlayer == null) {
  50. return false;
  51. }
  52. Party firstParty = firstMcMMOPlayer.getParty();
  53. Party secondParty = secondMcMMOPlayer.getParty();
  54. if (firstParty == null || secondParty == null || firstParty != secondParty) {
  55. return false;
  56. }
  57. return true;
  58. }
  59. /**
  60. * Get the near party members.
  61. *
  62. * @param player The player to check
  63. * @param range The distance
  64. * @return the near party members
  65. */
  66. public static List<Player> getNearMembers(Player player, Party party, double range) {
  67. List<Player> nearMembers = new ArrayList<Player>();
  68. if (party != null) {
  69. for (Player member : party.getOnlineMembers()) {
  70. if (!player.getName().equalsIgnoreCase(member.getName()) && !member.isDead() && Misc.isNear(player.getLocation(), member.getLocation(), range)) {
  71. nearMembers.add(member);
  72. }
  73. }
  74. }
  75. return nearMembers;
  76. }
  77. /**
  78. * Get a list of all players in this player's party.
  79. *
  80. * @param player The player to check
  81. * @return all the players in the player's party
  82. */
  83. public static List<String> getAllMembers(Player player) {
  84. Party party = UserManager.getPlayer(player).getParty();
  85. if (party == null) {
  86. return null;
  87. }
  88. return party.getMembers();
  89. }
  90. /**
  91. * Get a list of all online players in this party.
  92. *
  93. * @param partyName The party to check
  94. * @return all online players in this party
  95. */
  96. public static List<Player> getOnlineMembers(String partyName) {
  97. Party party = getParty(partyName);
  98. if (party == null) {
  99. return null;
  100. }
  101. return party.getOnlineMembers();
  102. }
  103. /**
  104. * Get a list of all online players in this party.
  105. *
  106. * @param player The player to check
  107. * @return all online players in this party
  108. */
  109. public static List<Player> getOnlineMembers(Player player) {
  110. Party party = getPlayerParty(player.getName());
  111. if (party == null) {
  112. return null;
  113. }
  114. return getOnlineMembers(party.getName());
  115. }
  116. /**
  117. * Retrieve a party by its name
  118. *
  119. * @param partyName The party name
  120. * @return the existing party, null otherwise
  121. */
  122. public static Party getParty(String partyName) {
  123. for (Party party : parties) {
  124. if (party.getName().equals(partyName)) {
  125. return party;
  126. }
  127. }
  128. return null;
  129. }
  130. /**
  131. * Retrieve a party by a member name
  132. *
  133. * @param playerName The member name
  134. * @return the existing party, null otherwise
  135. */
  136. public static Party getPlayerParty(String playerName) {
  137. for (Party party : parties) {
  138. for (String memberName : party.getMembers()) {
  139. if (memberName.equalsIgnoreCase(playerName)) {
  140. return party;
  141. }
  142. }
  143. }
  144. return null;
  145. }
  146. /**
  147. * Get a list of all current parties.
  148. *
  149. * @return the list of parties.
  150. */
  151. public static List<Party> getParties() {
  152. return parties;
  153. }
  154. /**
  155. * Remove a player from a party.
  156. *
  157. * @param player The player to remove
  158. * @param party The party
  159. */
  160. public static void removeFromParty(OfflinePlayer player, Party party) {
  161. List<String> members = party.getMembers();
  162. while (members.contains(player.getName())) {
  163. // Remove all the duplicates as well
  164. members.remove(player.getName());
  165. }
  166. if (members.isEmpty()) {
  167. parties.remove(party);
  168. }
  169. else {
  170. // If the leaving player was the party leader, appoint a new leader from the party members
  171. if (party.getLeader().equalsIgnoreCase(player.getName())) {
  172. String newLeader = members.get(0);
  173. party.setLeader(newLeader);
  174. }
  175. informPartyMembersQuit(player, party);
  176. }
  177. McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player.getName());
  178. if (mcMMOPlayer != null) {
  179. mcMMOPlayer.removeParty();
  180. mcMMOPlayer.setItemShareModifier(10);
  181. }
  182. }
  183. /**
  184. * Disband a party. Kicks out all members and removes the party.
  185. *
  186. * @param party The party to remove
  187. */
  188. public static void disbandParty(Party party) {
  189. List<String> members = party.getMembers();
  190. for (String memberName : members) {
  191. McMMOPlayer mcMMOPlayer = UserManager.getPlayer(memberName);
  192. if (mcMMOPlayer != null) {
  193. mcMMOPlayer.removeParty();
  194. mcMMOPlayer.setItemShareModifier(10);
  195. }
  196. }
  197. members.clear();
  198. parties.remove(party);
  199. }
  200. /**
  201. * Create a new party
  202. *
  203. * @param player The player to add to the party
  204. * @param mcMMOPlayer The player to add to the party
  205. * @param partyName The party to add the player to
  206. * @param password The password for this party, null if there was no password
  207. */
  208. public static void createParty(Player player, McMMOPlayer mcMMOPlayer, String partyName, String password) {
  209. partyName = partyName.replace(".", "");
  210. Party party = getParty(partyName);
  211. if (party == null) {
  212. party = new Party();
  213. party.setName(partyName);
  214. party.setLeader(player.getName());
  215. party.setLocked(true); // Parties are now invite-only by default, can be set to open with /party unlock
  216. if (password != null) {
  217. party.setPassword(password);
  218. player.sendMessage(LocaleLoader.getString("Party.Password.Set", password));
  219. }
  220. parties.add(party);
  221. }
  222. else {
  223. player.sendMessage(LocaleLoader.getString("Commands.Party.AlreadyExists"));
  224. return;
  225. }
  226. player.sendMessage(LocaleLoader.getString("Commands.Party.Create", party.getName()));
  227. addToParty(player, mcMMOPlayer, party);
  228. }
  229. /**
  230. * Add a player to a party.
  231. *
  232. * @param player The player to add to the party
  233. * @param mcMMOPlayer The player to add to the party
  234. * @param party The party to add the player to
  235. * @param password the password for this party, null if there was no password
  236. */
  237. public static void joinParty(Player player, McMMOPlayer mcMMOPlayer, Party party, String password) {
  238. if (!checkPartyPassword(player, party, password)) {
  239. return;
  240. }
  241. if (mcMMOPlayer.getParty() == party) {
  242. return;
  243. }
  244. player.sendMessage(LocaleLoader.getString("Commands.Party.Join", party.getName()));
  245. addToParty(player, mcMMOPlayer, party);
  246. }
  247. /**
  248. * Check if a player can join a party
  249. *
  250. * @param player The player trying to join a party
  251. * @param party The party
  252. * @param password The password provided by the player
  253. * @return true if the player can join the party
  254. */
  255. public static boolean checkPartyPassword(Player player, Party party, String password) {
  256. // Don't care about passwords if it isn't locked
  257. if (party.isLocked()) {
  258. String partyPassword = party.getPassword();
  259. if (partyPassword != null) {
  260. if (password == null) {
  261. player.sendMessage(LocaleLoader.getString("Party.Password.None"));
  262. return false;
  263. }
  264. else if (!password.equals(partyPassword)) {
  265. player.sendMessage(LocaleLoader.getString("Party.Password.Incorrect"));
  266. return false;
  267. }
  268. }
  269. else {
  270. player.sendMessage(LocaleLoader.getString("Party.Locked"));
  271. return false;
  272. }
  273. }
  274. return true;
  275. }
  276. /**
  277. * Accept a party invitation
  278. *
  279. * @param Player The plaer to add to the party
  280. * @param mcMMOPlayer The player to add to the party
  281. */
  282. public static void joinInvitedParty(Player player, McMMOPlayer mcMMOPlayer) {
  283. Party invite = mcMMOPlayer.getPartyInvite();
  284. if (mcMMOPlayer.getParty() == invite) {
  285. return;
  286. }
  287. if (!parties.contains(invite)) {
  288. parties.add(invite);
  289. }
  290. player.sendMessage(LocaleLoader.getString("Commands.Invite.Accepted", invite.getName()));
  291. mcMMOPlayer.removePartyInvite();
  292. addToParty(player, mcMMOPlayer, invite);
  293. }
  294. /**
  295. * Add a player to a party
  296. *
  297. * @param player The player to add to a party
  298. * @param mcMMOPlayer The player to add to the party
  299. * @param party The party
  300. */
  301. public static void addToParty(OfflinePlayer player, McMMOPlayer mcMMOPlayer, Party party) {
  302. if (mcMMOPlayer.getParty() == party) {
  303. return;
  304. }
  305. informPartyMembersJoin(player, party);
  306. mcMMOPlayer.setParty(party);
  307. if (!party.getMembers().contains(player.getName())) {
  308. party.getMembers().add(player.getName());
  309. }
  310. }
  311. /**
  312. * Get the leader of a party.
  313. *
  314. * @param partyName The party name
  315. * @return the leader of the party
  316. */
  317. public static String getPartyLeader(String partyName) {
  318. Party party = getParty(partyName);
  319. if (party == null) {
  320. return null;
  321. }
  322. return party.getLeader();
  323. }
  324. /**
  325. * Set the leader of a party.
  326. *
  327. * @param playerName The name of the player to set as leader
  328. * @param party The party
  329. */
  330. public static void setPartyLeader(String playerName, Party party) {
  331. String leaderName = party.getLeader();
  332. for (Player member : party.getOnlineMembers()) {
  333. if (member.getName().equalsIgnoreCase(playerName)) {
  334. member.sendMessage(LocaleLoader.getString("Party.Owner.Player"));
  335. }
  336. else if (member.getName().equalsIgnoreCase(leaderName)) {
  337. member.sendMessage(LocaleLoader.getString("Party.Owner.NotLeader"));
  338. }
  339. else {
  340. member.sendMessage(LocaleLoader.getString("Party.Owner.New", playerName));
  341. }
  342. }
  343. party.setLeader(playerName);
  344. }
  345. /**
  346. * Check if a player can invite others to his party.
  347. *
  348. * @param player The player to check
  349. * @param mcMMOPlayer The player to check
  350. * @return true if the player can invite
  351. */
  352. public static boolean canInvite(Player player, Party party) {
  353. if (party.isLocked() && !party.getLeader().equalsIgnoreCase(player.getName())) {
  354. return false;
  355. }
  356. return true;
  357. }
  358. /**
  359. * Check if a string is a valid party name.
  360. *
  361. * @param partyName The party name to check
  362. * @return true if this is a valid party, false otherwise
  363. */
  364. public static boolean isParty(String partyName) {
  365. for (Party party : parties) {
  366. if (party.getName().equals(partyName)) {
  367. return true;
  368. }
  369. }
  370. return false;
  371. }
  372. /**
  373. * Load party file.
  374. */
  375. public static void loadParties() {
  376. File file = new File(partiesFilePath);
  377. if (!file.exists()) {
  378. return;
  379. }
  380. YamlConfiguration partiesFile = new YamlConfiguration();
  381. try {
  382. partiesFile.load(file);
  383. }
  384. catch (Exception e) {
  385. e.printStackTrace();
  386. }
  387. for (String partyName : partiesFile.getConfigurationSection("").getKeys(false)) {
  388. Party party = new Party();
  389. party.setName(partyName);
  390. party.setLeader(partiesFile.getString(partyName + ".Leader"));
  391. party.setPassword(partiesFile.getString(partyName + ".Password"));
  392. party.setLocked(partiesFile.getBoolean(partyName + ".Locked"));
  393. party.setXpShareMode(ShareHandler.ShareMode.getFromString(partiesFile.getString(partyName + ".ExpShareMode")));
  394. party.setItemShareMode(ShareHandler.ShareMode.getFromString(partiesFile.getString(partyName + ".ItemShareMode")));
  395. List<String> memberNames = partiesFile.getStringList(partyName + ".Members");
  396. List<String> members = party.getMembers();
  397. for (String memberName : memberNames) {
  398. if (!members.contains(memberName)) {
  399. members.add(memberName);
  400. }
  401. }
  402. parties.add(party);
  403. }
  404. }
  405. /**
  406. * Save party file.
  407. */
  408. public static void saveParties() {
  409. File file = new File(partiesFilePath);
  410. if (file.exists()) {
  411. file.delete();
  412. }
  413. YamlConfiguration partiesFile = new YamlConfiguration();
  414. for (Party party : parties) {
  415. String partyName = party.getName();
  416. partiesFile.set(partyName + ".Leader", party.getLeader());
  417. partiesFile.set(partyName + ".Password", party.getPassword());
  418. partiesFile.set(partyName + ".Locked", party.isLocked());
  419. partiesFile.set(partyName + ".ExpShareMode", party.getXpShareMode().toString());
  420. partiesFile.set(partyName + ".ItemShareMode", party.getItemShareMode().toString());
  421. List<String> memberNames = new ArrayList<String>();
  422. for (String member : party.getMembers()) {
  423. if (!memberNames.contains(member)) {
  424. memberNames.add(member);
  425. }
  426. }
  427. partiesFile.set(partyName + ".Members", memberNames);
  428. }
  429. try {
  430. partiesFile.save(new File(partiesFilePath));
  431. }
  432. catch (Exception e) {
  433. e.printStackTrace();
  434. }
  435. }
  436. /**
  437. * Handle party change event.
  438. *
  439. * @param player The player changing parties
  440. * @param oldPartyName The name of the old party
  441. * @param newPartyName The name of the new party
  442. * @param reason The reason for changing parties
  443. * @return true if the change event was successful, false otherwise
  444. */
  445. public static boolean handlePartyChangeEvent(Player player, String oldPartyName, String newPartyName, EventReason reason) {
  446. McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, oldPartyName, newPartyName, reason);
  447. mcMMO.p.getServer().getPluginManager().callEvent(event);
  448. return !event.isCancelled();
  449. }
  450. /**
  451. * Notify party members when a player joins
  452. *
  453. * @param player The player that joins
  454. * @param party The concerned party
  455. */
  456. private static void informPartyMembersJoin(OfflinePlayer player, Party party) {
  457. for (Player member : party.getOnlineMembers()) {
  458. if (!member.equals(player)) {
  459. member.sendMessage(LocaleLoader.getString("Party.InformedOnJoin", player.getName()));
  460. }
  461. }
  462. }
  463. /**
  464. * Notify party members when a party member quits.
  465. *
  466. * @param player The player that quits
  467. * @param party The concerned party
  468. */
  469. private static void informPartyMembersQuit(OfflinePlayer player, Party party) {
  470. for (Player member : party.getOnlineMembers()) {
  471. if (!member.equals(player)) {
  472. member.sendMessage(LocaleLoader.getString("Party.InformedOnQuit", player.getName()));
  473. }
  474. }
  475. }
  476. }