PartyCommand.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. package com.gmail.nossr50.commands.party;
  2. import com.gmail.nossr50.commands.party.alliance.PartyAllianceCommand;
  3. import com.gmail.nossr50.commands.party.teleport.PtpCommand;
  4. import com.gmail.nossr50.datatypes.party.Party;
  5. import com.gmail.nossr50.datatypes.player.McMMOPlayer;
  6. import com.gmail.nossr50.locale.LocaleLoader;
  7. import com.gmail.nossr50.util.Permissions;
  8. import com.gmail.nossr50.util.commands.CommandUtils;
  9. import com.gmail.nossr50.util.player.UserManager;
  10. import com.google.common.collect.ImmutableList;
  11. import org.bukkit.command.Command;
  12. import org.bukkit.command.CommandExecutor;
  13. import org.bukkit.command.CommandSender;
  14. import org.bukkit.command.TabExecutor;
  15. import org.bukkit.entity.Player;
  16. import org.bukkit.util.StringUtil;
  17. import org.jetbrains.annotations.NotNull;
  18. import java.util.ArrayList;
  19. import java.util.Arrays;
  20. import java.util.Collections;
  21. import java.util.List;
  22. public class PartyCommand implements TabExecutor {
  23. private static final List<String> PARTY_SUBCOMMANDS;
  24. private static final List<String> XPSHARE_COMPLETIONS = ImmutableList.of("none", "equal");
  25. private static final List<String> ITEMSHARE_COMPLETIONS = ImmutableList.of("none", "equal", "random", "loot", "mining", "herbalism", "woodcutting", "misc");
  26. static {
  27. ArrayList<String> subcommands = new ArrayList<>();
  28. for (PartySubcommandType subcommand : PartySubcommandType.values()) {
  29. subcommands.add(subcommand.toString());
  30. }
  31. Collections.sort(subcommands);
  32. PARTY_SUBCOMMANDS = ImmutableList.copyOf(subcommands);
  33. }
  34. private final CommandExecutor partyJoinCommand = new PartyJoinCommand();
  35. private final CommandExecutor partyAcceptCommand = new PartyAcceptCommand();
  36. private final CommandExecutor partyCreateCommand = new PartyCreateCommand();
  37. private final CommandExecutor partyQuitCommand = new PartyQuitCommand();
  38. private final CommandExecutor partyXpShareCommand = new PartyXpShareCommand();
  39. private final CommandExecutor partyItemShareCommand = new PartyItemShareCommand();
  40. private final CommandExecutor partyInviteCommand = new PartyInviteCommand();
  41. private final CommandExecutor partyKickCommand = new PartyKickCommand();
  42. private final CommandExecutor partyDisbandCommand = new PartyDisbandCommand();
  43. private final CommandExecutor partyChangeOwnerCommand = new PartyChangeOwnerCommand();
  44. private final CommandExecutor partyLockCommand = new PartyLockCommand();
  45. private final CommandExecutor partyChangePasswordCommand = new PartyChangePasswordCommand();
  46. private final CommandExecutor partyRenameCommand = new PartyRenameCommand();
  47. private final CommandExecutor partyInfoCommand = new PartyInfoCommand();
  48. private final CommandExecutor partyHelpCommand = new PartyHelpCommand();
  49. private final CommandExecutor partyTeleportCommand = new PtpCommand();
  50. private final CommandExecutor partyAllianceCommand = new PartyAllianceCommand();
  51. @Override
  52. public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
  53. if (CommandUtils.noConsoleUsage(sender)) {
  54. return true;
  55. }
  56. if (!Permissions.party(sender)) {
  57. sender.sendMessage(command.getPermissionMessage());
  58. return true;
  59. }
  60. Player player = (Player) sender;
  61. if (!UserManager.hasPlayerDataKey(player)) {
  62. return true;
  63. }
  64. if(UserManager.getPlayer(player) == null)
  65. {
  66. player.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
  67. return true;
  68. }
  69. McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
  70. if (args.length < 1) {
  71. if (!mcMMOPlayer.inParty()) {
  72. sender.sendMessage(LocaleLoader.getString("Commands.Party.None"));
  73. return printUsage(player);
  74. }
  75. return partyInfoCommand.onCommand(sender, command, label, args);
  76. }
  77. PartySubcommandType subcommand = PartySubcommandType.getSubcommand(args[0]);
  78. if (subcommand == null) {
  79. return printUsage(player);
  80. }
  81. // Can't use this for lock/unlock since they're handled by the same command
  82. if (subcommand != PartySubcommandType.LOCK && subcommand != PartySubcommandType.UNLOCK && !Permissions.partySubcommand(sender, subcommand)) {
  83. sender.sendMessage(command.getPermissionMessage());
  84. return true;
  85. }
  86. switch (subcommand) {
  87. case JOIN:
  88. return partyJoinCommand.onCommand(sender, command, label, args);
  89. case ACCEPT:
  90. return partyAcceptCommand.onCommand(sender, command, label, args);
  91. case CREATE:
  92. return partyCreateCommand.onCommand(sender, command, label, args);
  93. case HELP:
  94. return partyHelpCommand.onCommand(sender, command, label, args);
  95. default:
  96. break;
  97. }
  98. // Party member commands
  99. if (!mcMMOPlayer.inParty()) {
  100. sender.sendMessage(LocaleLoader.getString("Commands.Party.None"));
  101. return printUsage(player);
  102. }
  103. switch (subcommand) {
  104. case INFO:
  105. return partyInfoCommand.onCommand(sender, command, label, args);
  106. case QUIT:
  107. return partyQuitCommand.onCommand(sender, command, label, args);
  108. case INVITE:
  109. return partyInviteCommand.onCommand(sender, command, label, args);
  110. case TELEPORT:
  111. return partyTeleportCommand.onCommand(sender, command, label, extractArgs(args));
  112. default:
  113. break;
  114. }
  115. // Party leader commands
  116. if (!mcMMOPlayer.getParty().getLeader().getUniqueId().equals(player.getUniqueId())) {
  117. sender.sendMessage(LocaleLoader.getString("Party.NotOwner"));
  118. return true;
  119. }
  120. switch (subcommand) {
  121. case XPSHARE:
  122. return partyXpShareCommand.onCommand(sender, command, label, args);
  123. case ITEMSHARE:
  124. return partyItemShareCommand.onCommand(sender, command, label, args);
  125. case KICK:
  126. return partyKickCommand.onCommand(sender, command, label, args);
  127. case DISBAND:
  128. return partyDisbandCommand.onCommand(sender, command, label, args);
  129. case OWNER:
  130. return partyChangeOwnerCommand.onCommand(sender, command, label, args);
  131. case LOCK:
  132. case UNLOCK:
  133. return partyLockCommand.onCommand(sender, command, label, args);
  134. case PASSWORD:
  135. return partyChangePasswordCommand.onCommand(sender, command, label, args);
  136. case RENAME:
  137. return partyRenameCommand.onCommand(sender, command, label, args);
  138. case ALLIANCE:
  139. return partyAllianceCommand.onCommand(sender, command, label, args);
  140. default:
  141. break;
  142. }
  143. return true;
  144. }
  145. @Override
  146. public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, String[] args) {
  147. switch (args.length) {
  148. case 1:
  149. return StringUtil.copyPartialMatches(args[0], PARTY_SUBCOMMANDS, new ArrayList<>(PARTY_SUBCOMMANDS.size()));
  150. case 2:
  151. PartySubcommandType subcommand = PartySubcommandType.getSubcommand(args[0]);
  152. if (subcommand == null) {
  153. return ImmutableList.of();
  154. }
  155. switch (subcommand) {
  156. case JOIN:
  157. case INVITE:
  158. case KICK:
  159. case OWNER:
  160. List<String> playerNames = CommandUtils.getOnlinePlayerNames(sender);
  161. return StringUtil.copyPartialMatches(args[1], playerNames, new ArrayList<>(playerNames.size()));
  162. case XPSHARE:
  163. return StringUtil.copyPartialMatches(args[1], XPSHARE_COMPLETIONS, new ArrayList<>(XPSHARE_COMPLETIONS.size()));
  164. case ITEMSHARE:
  165. return StringUtil.copyPartialMatches(args[1], ITEMSHARE_COMPLETIONS, new ArrayList<>(ITEMSHARE_COMPLETIONS.size()));
  166. case LOCK:
  167. case CHAT:
  168. return StringUtil.copyPartialMatches(args[1], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<>(CommandUtils.TRUE_FALSE_OPTIONS.size()));
  169. case PASSWORD:
  170. return StringUtil.copyPartialMatches(args[1], CommandUtils.RESET_OPTIONS, new ArrayList<>(CommandUtils.RESET_OPTIONS.size()));
  171. case TELEPORT:
  172. List<String> matches = StringUtil.copyPartialMatches(args[1], PtpCommand.TELEPORT_SUBCOMMANDS, new ArrayList<>(PtpCommand.TELEPORT_SUBCOMMANDS.size()));
  173. if (matches.size() == 0) {
  174. Player player = (Player) sender;
  175. //Not Loaded
  176. if(UserManager.getPlayer(player) == null)
  177. {
  178. sender.sendMessage(LocaleLoader.getString("Profile.PendingLoad"));
  179. return ImmutableList.of();
  180. }
  181. Party party = UserManager.getPlayer(player).getParty();
  182. playerNames = party.getOnlinePlayerNames(player);
  183. return StringUtil.copyPartialMatches(args[1], playerNames, new ArrayList<>(playerNames.size()));
  184. }
  185. return matches;
  186. default:
  187. return ImmutableList.of();
  188. }
  189. case 3:
  190. if (PartySubcommandType.getSubcommand(args[0]) == PartySubcommandType.ITEMSHARE && isItemShareCategory(args[1])) {
  191. return StringUtil.copyPartialMatches(args[2], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<>(CommandUtils.TRUE_FALSE_OPTIONS.size()));
  192. }
  193. return ImmutableList.of();
  194. default:
  195. return ImmutableList.of();
  196. }
  197. }
  198. private boolean printUsage(Player player) {
  199. player.sendMessage(LocaleLoader.getString("Party.Help.0", "/party join"));
  200. player.sendMessage(LocaleLoader.getString("Party.Help.1", "/party create"));
  201. player.sendMessage(LocaleLoader.getString("Party.Help.2", "/party ?"));
  202. return true;
  203. }
  204. private String[] extractArgs(String[] args) {
  205. return Arrays.copyOfRange(args, 1, args.length);
  206. }
  207. private boolean isItemShareCategory(String category) {
  208. return category.equalsIgnoreCase("loot") || category.equalsIgnoreCase("mining") || category.equalsIgnoreCase("herbalism") || category.equalsIgnoreCase("woodcutting") || category.equalsIgnoreCase("misc");
  209. }
  210. }