PartyManager.java 17 KB

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