diff --git a/Changelog.txt b/Changelog.txt index 6a40e7747..efece215a 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -12,23 +12,28 @@ Version 1.4.00-dev + Added new cancellable McMMOPlayerDisarmEvent for Citizens compatibility - fires whenever a player is disarmed. + Added config options for Hylian Luck skill + Added display values to Unarmed command for Iron Grip + + Added '/party create ' command, use this to create a party + + Added '/party disband' command, kicks out all members and deletes the party = Fixed several typos relating to locale string display - = Fixed bug where all skill guide headers appeared as "Skillname Guide Guide" + = Fixed bug where all skill guide headers appeared as "Skillname Guide Guide" = Fixed bug where Impact was applied incorrectly due to an inverted method call = Fixed bug where Impact improperly determined the defender's armor = Fixed ArrayIndexOutOfBoundsException resulting from being unranked in a skill when using FlatFile - = Fixed Woodcutting accidentally using Mining double drop values. + = Fixed Woodcutting accidentally using Mining double drop values. = Fixed Hylian Luck not removing the block-placed flag from flowers. = Fixed Hylian Luck not checking the block-placed flag on flowers. = Fixed Leaf Blower not respecting the unlock level set in advanced.yml = Fixed abilities activating with the wrong tool in hand = Fixed Experience.Gains.Mobspawners.Enabled not being used correctly (the check was inverted) = Fixed bug where Iron Grip was using the attacker's skill values rather than the defender's. + = Fixed a bug where /party kick would trigger the PartyChangeEvent for the wrong player + = Fixed a bug where party join messages weren't displayed ! Changed how Berserk handles not picking up items to avoid listening to PlayerPickupItemEvent - ! Moved Hylian Luck into a separate listener since it actually cancels the event and shouldn't just be on MONITOR. + ! Moved Hylian Luck into a separate listener since it actually cancels the event and shouldn't just be on MONITOR. ! Changed how Tree Feller is handled, it should now put less stress on the CPU ! Changed Fisherman's Diet and Farmer's Diet to use two seperate config values ! Major refactoring - please take note, this WILL break any mcMMO-related plugin not properly hooking into the API. + ! Changed the way party commands work, use /party ? to check how to use the new commands Version 1.3.14 + Added new Hylian Luck skill to Herbalism. diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index bfec28b6b..e469f6e16 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -51,8 +51,6 @@ import com.gmail.nossr50.listeners.WorldListener; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.party.commands.ACommand; -import com.gmail.nossr50.party.commands.AcceptCommand; -import com.gmail.nossr50.party.commands.InviteCommand; import com.gmail.nossr50.party.commands.PCommand; import com.gmail.nossr50.party.commands.PartyCommand; import com.gmail.nossr50.party.commands.PtpCommand; @@ -414,18 +412,10 @@ public class mcMMO extends JavaPlugin { } //Party commands - if (configInstance.getCommandAcceptEnabled()) { - getCommand("accept").setExecutor(new AcceptCommand(this)); - } - if (configInstance.getCommandAdminChatAEnabled()) { getCommand("a").setExecutor(new ACommand(this)); } - if (configInstance.getCommandInviteEnabled()) { - getCommand("invite").setExecutor(new InviteCommand(this)); - } - if (configInstance.getCommandPartyEnabled()) { getCommand("party").setExecutor(new PartyCommand(this)); } diff --git a/src/main/java/com/gmail/nossr50/party/PartyManager.java b/src/main/java/com/gmail/nossr50/party/PartyManager.java index 113c46f8f..0cfcbe637 100644 --- a/src/main/java/com/gmail/nossr50/party/PartyManager.java +++ b/src/main/java/com/gmail/nossr50/party/PartyManager.java @@ -66,7 +66,7 @@ public class PartyManager { */ private void informPartyMembersJoin(String playerName, Party party) { for (Player member : party.getOnlineMembers()) { - if (member.getName().equals(playerName)) { + if (!member.getName().equals(playerName)) { member.sendMessage(LocaleLoader.getString("Party.InformedOnJoin", new Object[] {playerName})); } } @@ -80,7 +80,7 @@ public class PartyManager { */ private void informPartyMembersQuit(String playerName, Party party) { for (Player member : party.getOnlineMembers()) { - if (member.getName().equals(playerName)) { + if (!member.getName().equals(playerName)) { member.sendMessage(LocaleLoader.getString("Party.InformedOnQuit", new Object[] {playerName})); } } @@ -156,7 +156,6 @@ public class PartyManager { return party; } } - return null; } @@ -177,6 +176,7 @@ public class PartyManager { */ public void removeFromParty(String playerName, Party party) { List members = party.getMembers(); + List onlineMembers = party.getOnlineMembers(); members.remove(playerName); @@ -184,8 +184,12 @@ public class PartyManager { parties.remove(party); } else { + //If the leaving player was the party leader, appoint a new leader from the online party members if (party.getLeader().equals(playerName)) { - party.setLocked(false); + if (!onlineMembers.isEmpty()) { + Player newLeader = onlineMembers.get(0); + party.setLeader(newLeader.getName()); + } } informPartyMembersQuit(playerName, party); @@ -198,6 +202,63 @@ public class PartyManager { } } + /** + * Disband a party. Kicks out all members and removes the party. + * + * @param party The party to remove + */ + public void disbandParty(Party party) { + List members = party.getMembers(); + + for (String member : party.getMembers()) { + PlayerProfile playerProfile = Users.getProfile(member); + + if (playerProfile != null) { + playerProfile.removeParty(); + } + } + + members.clear(); + if (members.isEmpty()) { + parties.remove(party); + } + } + + /** + * Create a new party + * + * @param player The player to add to the party + * @param playerProfile The profile of the player to add to the party + * @param partyName The party to add the player to + * @param password the password for this party, null if there was no password + */ + public void createParty(Player player, PlayerProfile playerProfile, String partyName, String password) { + partyName = partyName.replace(".", ""); + Party party = getParty(partyName); + String playerName = player.getName(); + + if (party == null) { + party = new Party(); + + party.setName(partyName); + party.setLeader(playerName); + party.setLocked(true);//Parties are now invite-only by default, can be set to open with /party unlock + + if (password != null) { + party.setPassword(password); + party.setLocked(true); + } + parties.add(party); + } + else { + player.sendMessage(LocaleLoader.getString("Commands.Party.AlreadyExists")); + return; + } + + player.sendMessage(LocaleLoader.getString("Commands.Party.Create", new Object[]{party.getName()})); + addToParty(player.getName(), playerProfile, party); + } + /** * Add a player to a party. * diff --git a/src/main/java/com/gmail/nossr50/party/commands/AcceptCommand.java b/src/main/java/com/gmail/nossr50/party/commands/AcceptCommand.java deleted file mode 100644 index b69d1e538..000000000 --- a/src/main/java/com/gmail/nossr50/party/commands/AcceptCommand.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.gmail.nossr50.party.commands; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.commands.CommandHelper; -import com.gmail.nossr50.datatypes.PlayerProfile; -import com.gmail.nossr50.events.party.McMMOPartyChangeEvent; -import com.gmail.nossr50.events.party.McMMOPartyChangeEvent.EventReason; -import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.party.Party; -import com.gmail.nossr50.party.PartyManager; -import com.gmail.nossr50.util.Users; - -public class AcceptCommand implements CommandExecutor { - private final mcMMO plugin; - - public AcceptCommand (mcMMO plugin) { - this.plugin = plugin; - } - - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (CommandHelper.noConsoleUsage(sender)) { - return true; - } - - if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party")) { - return true; - } - - Player player = (Player) sender; - PlayerProfile playerProfile = Users.getProfile(player); - - if (playerProfile.hasPartyInvite()) { - PartyManager partyManagerInstance = PartyManager.getInstance(); - - if (playerProfile.inParty()) { - Party party = playerProfile.getParty(); - McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, party.getName(), playerProfile.getInvite().getName(), EventReason.CHANGED_PARTIES); - - plugin.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return true; - } - - partyManagerInstance.removeFromParty(player.getName(), party); - } - else { - McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, null, playerProfile.getInvite().getName(), EventReason.JOINED_PARTY); - plugin.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return true; - } - } - - partyManagerInstance.joinInvitedParty(player, playerProfile); - } - else { - player.sendMessage(LocaleLoader.getString("mcMMO.NoInvites")); - } - - return true; - } -} diff --git a/src/main/java/com/gmail/nossr50/party/commands/InviteCommand.java b/src/main/java/com/gmail/nossr50/party/commands/InviteCommand.java deleted file mode 100644 index 837267726..000000000 --- a/src/main/java/com/gmail/nossr50/party/commands/InviteCommand.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.gmail.nossr50.party.commands; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import com.gmail.nossr50.mcMMO; -import com.gmail.nossr50.commands.CommandHelper; -import com.gmail.nossr50.datatypes.PlayerProfile; -import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.party.Party; -import com.gmail.nossr50.party.PartyManager; -import com.gmail.nossr50.util.Users; - -//TODO: Make this work from console. -public class InviteCommand implements CommandExecutor { - private final mcMMO plugin; - - public InviteCommand(mcMMO instance) { - this.plugin = instance; - } - - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - String usage = LocaleLoader.getString("Commands.Usage.1", new Object[] {"invite", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">"}); - - if (CommandHelper.noConsoleUsage(sender)) { - return true; - } - - if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party")) { - return true; - } - - switch (args.length) { - case 1: - Player player = (Player) sender; - PlayerProfile playerProfile = Users.getProfile(player); - - if (!playerProfile.inParty()) { - player.sendMessage(LocaleLoader.getString("Commands.Party.None")); - return true; - } - - Player target = plugin.getServer().getPlayer(args[0]); - - if (target != null) { - if (PartyManager.getInstance().canInvite(player, playerProfile)) { - Party party = playerProfile.getParty(); - - Users.getProfile(target).setInvite(party); - player.sendMessage(LocaleLoader.getString("Commands.Invite.Success")); - target.sendMessage(LocaleLoader.getString("Commands.Party.Invite.0", new Object[] {party.getName(), player.getName()})); - target.sendMessage(LocaleLoader.getString("Commands.Party.Invite.1")); - return true; - } - - player.sendMessage(LocaleLoader.getString("Party.Locked")); - return true; - } - - player.sendMessage(LocaleLoader.getString("Party.Player.Invalid")); - return true; - - default: - sender.sendMessage(usage); - return true; - } - } -} diff --git a/src/main/java/com/gmail/nossr50/party/commands/PartyCommand.java b/src/main/java/com/gmail/nossr50/party/commands/PartyCommand.java index 966f99d8f..12941c2d3 100644 --- a/src/main/java/com/gmail/nossr50/party/commands/PartyCommand.java +++ b/src/main/java/com/gmail/nossr50/party/commands/PartyCommand.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.party.commands; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Server; import org.bukkit.command.Command; @@ -34,6 +35,99 @@ public class PartyCommand implements CommandExecutor { return true; } + Player player = (Player) sender; + PlayerProfile playerProfile = Users.getProfile(player); + + if(args.length < 1) + return party(sender); + + if(args[0].equalsIgnoreCase("join")) + return join(sender, args); + else if(args[0].equalsIgnoreCase("accept")) + return accept(sender, args); + else if(args[0].equalsIgnoreCase("create")) + return create(sender, args); + else if(args[0].equalsIgnoreCase("?") || args[0].equalsIgnoreCase("help")) + return help(sender, args); + if (playerProfile.inParty()) { + if(args[0].equalsIgnoreCase("quit") || args[0].equalsIgnoreCase("q") || args[0].equalsIgnoreCase("leave")) + return quit(sender, args); + else if(args[0].equalsIgnoreCase("expshare")) + return expshare(sender, args); + else if(args[0].equalsIgnoreCase("itemshare")) + return itemshare(sender, args); + else if(args[0].equalsIgnoreCase("invite")) + return invite(sender, args); + else if(args[0].equalsIgnoreCase("kick")) + return kick(sender, args); + else if(args[0].equalsIgnoreCase("disband")) + return disband(sender, args); + else if(args[0].equalsIgnoreCase("owner")) + return owner(sender, args); + else if(args[0].equalsIgnoreCase("lock")) + return lock(sender, args); + else if(args[0].equalsIgnoreCase("unlock")) + return unlock(sender, args); + else if(args[0].equalsIgnoreCase("password")) + return password(sender, args); + else + return usage(sender); + } else { + player.sendMessage(LocaleLoader.getString("Commands.Party.None")); + return usage(sender); + } + } + + private boolean usage(CommandSender sender) { + Player player = (Player) sender; + player.sendMessage(LocaleLoader.getString("Party.Help.0")); + player.sendMessage(LocaleLoader.getString("Party.Help.1")); + player.sendMessage(LocaleLoader.getString("Party.Help.2")); + return true; + } + + private boolean party(CommandSender sender) { + Player player = (Player) sender; + PlayerProfile playerProfile = Users.getProfile(player); + + if (playerProfile.inParty()) { + Party party = playerProfile.getParty(); + + Server server = plugin.getServer(); + String leader = party.getLeader(); + StringBuffer tempList = new StringBuffer(); + + for (String otherPlayerName : party.getMembers()) { + if (leader.equals(otherPlayerName)) { + tempList.append(ChatColor.GOLD); + } + else if (server.getPlayer(otherPlayerName) != null) { + tempList.append(ChatColor.WHITE); + } + else { + tempList.append(ChatColor.GRAY); + } + tempList.append(otherPlayerName + " "); + } + + String status = LocaleLoader.getString("Party.Status.Locked"); + if (!party.isLocked()) + status = LocaleLoader.getString("Party.Status.Unlocked"); + + player.sendMessage(LocaleLoader.getString("Commands.Party.Header")); + player.sendMessage(LocaleLoader.getString("Commands.Party.Status", new Object[] {party.getName(), status})); +// player.sendMessage(LocaleLoader.getString("Commands.Party.ShareMode", new Object[] { "NONE", "NONE" })); Party share modes will get implemented later + player.sendMessage(LocaleLoader.getString("Commands.Party.Members.Header")); + player.sendMessage(LocaleLoader.getString("Commands.Party.Members", new Object[] {tempList})); + } else { + return usage(sender); + } + return true; + } + + private boolean join(CommandSender sender, String[] args) { + if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party.join")) + return true; Player player = (Player) sender; String playerName = player.getName(); PlayerProfile playerProfile = Users.getProfile(player); @@ -41,221 +135,414 @@ public class PartyCommand implements CommandExecutor { PartyManager partyManagerInstance = PartyManager.getInstance(); Party party = playerProfile.getParty(); - switch (args.length) { - case 0: - if (party == null) { - player.sendMessage(LocaleLoader.getString("Party.Help.0")); - player.sendMessage(LocaleLoader.getString("Party.Help.1")); - player.sendMessage(LocaleLoader.getString("Party.Help.2")); + if(args.length < 2) { + player.sendMessage(LocaleLoader.getString("Party.Help.0")); + return true; + } else { + Player target = Bukkit.getServer().getPlayer(args[1]); + if (target == null) { + player.sendMessage(LocaleLoader.getString("Party.NotOnline", new Object[] {args[1]})); + return false; + } + if (!Users.getProfile(target).inParty()) { + player.sendMessage(LocaleLoader.getString("Party.PlayerNotInParty", new Object[] {args[1]})); + return false; + } + String password = null; + if(args.length > 2) password = args[2]; + + String partyTarget = partyManagerInstance.getPlayerParty(target.getName()).getName(); + Party newParty = partyManagerInstance.getParty(args[0]); + + // Check to see if the party exists, and if it does, can the player join it? + if (newParty != null && !partyManagerInstance.checkJoinability(player, newParty, null)) { + return true; // End before any event is fired. + } + + if (party != null) { + McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, party.getName(), partyTarget, EventReason.CHANGED_PARTIES); + plugin.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return true; + } + partyManagerInstance.removeFromParty(playerName, party); } else { - Server server = plugin.getServer(); - String leader = party.getLeader(); - StringBuffer tempList = new StringBuffer(); + McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, null, partyTarget, EventReason.JOINED_PARTY); + plugin.getServer().getPluginManager().callEvent(event); - for (String otherPlayerName : party.getMembers()) { - if (leader.equals(otherPlayerName)) { - tempList.append(ChatColor.GOLD); - } - else if (server.getPlayer(otherPlayerName) != null) { - tempList.append(ChatColor.WHITE); - } - else { - tempList.append(ChatColor.GRAY); - } - - tempList.append(otherPlayerName + " "); + if (event.isCancelled()) { + return true; } - - player.sendMessage(LocaleLoader.getString("Commands.Party.InParty", new Object[] {party.getName()})); - player.sendMessage(LocaleLoader.getString("Commands.Party.Members", new Object[] {tempList})); } + partyManagerInstance.joinParty(player, playerProfile, partyTarget, password); + return true; + } + } + + private boolean accept(CommandSender sender, String[] args) { + if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party.accept")) return true; - case 1: - if (args[0].equalsIgnoreCase("q")) { - if (party != null) { - McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, party.getName(), null, EventReason.LEFT_PARTY); - plugin.getServer().getPluginManager().callEvent(event); + Player player = (Player) sender; + PlayerProfile playerProfile = Users.getProfile(player); - if (event.isCancelled()) { - return true; - } + if (playerProfile.hasPartyInvite()) { + PartyManager partyManagerInstance = PartyManager.getInstance(); - partyManagerInstance.removeFromParty(playerName, party); - player.sendMessage(LocaleLoader.getString("Commands.Party.Leave")); - } - else { - player.sendMessage(LocaleLoader.getString("Commands.Party.None")); - } - } - else if (args[0].equals("?")) { - player.sendMessage(LocaleLoader.getString("Party.Help.3")); - player.sendMessage(LocaleLoader.getString("Party.Help.1")); - player.sendMessage(LocaleLoader.getString("Party.Help.4")); - player.sendMessage(LocaleLoader.getString("Party.Help.5")); - player.sendMessage(LocaleLoader.getString("Party.Help.6")); - player.sendMessage(LocaleLoader.getString("Party.Help.7")); - } - else if (args[0].equalsIgnoreCase("lock")) { - if (party != null) { - if (party.getLeader().equals(playerName)) { - if (party.isLocked()) { - player.sendMessage(LocaleLoader.getString("Party.IsLocked")); - } - else { - party.setLocked(true); - player.sendMessage(LocaleLoader.getString("Party.Locked")); - } - } - else { - player.sendMessage(LocaleLoader.getString("Party.NotOwner")); - } - } - else { - player.sendMessage("Commands.Party.None"); - } - } - else if (args[0].equalsIgnoreCase("unlock")) { - if (party != null) { - if (party.getLeader().equals(playerName)) { - if (!party.isLocked()) { - player.sendMessage(LocaleLoader.getString("Party.IsntLocked")); - } - else { - party.setLocked(false); - player.sendMessage(LocaleLoader.getString("Party.Unlocked")); - } - } - else { - player.sendMessage(LocaleLoader.getString("Party.NotOwner")); - } - } - else { - player.sendMessage("Commands.Party.None"); - } - } - else { - Party newParty = partyManagerInstance.getParty(args[0]); - - // Check to see if the party exists, and if it does, can the player join it? - if (newParty != null && !partyManagerInstance.checkJoinability(player, newParty, null)) { - return true; // End before any event is fired. - } - - if (party != null) { - McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, party.getName(), args[0], EventReason.CHANGED_PARTIES); - plugin.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return true; - } - - partyManagerInstance.removeFromParty(playerName, party); - } - else { - McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, null, args[0], EventReason.JOINED_PARTY); - plugin.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return true; - } - } - - partyManagerInstance.joinParty(player, playerProfile, args[0], null); - } - - return true; - - case 2: if (playerProfile.inParty()) { - if (args[0].equalsIgnoreCase("password")) { - if (party.getLeader().equals(playerName)) { - party.setLocked(true); - party.setPassword(args[1]); - player.sendMessage(LocaleLoader.getString("Party.PasswordSet", new Object[] {args[1]})); - } - else { - player.sendMessage(LocaleLoader.getString("Party.NotOwner")); - } - } - else if (args[0].equalsIgnoreCase("kick")) { - if (party.getLeader().equals(playerName)) { - if (!party.getMembers().contains(args[1])) { - player.sendMessage(LocaleLoader.getString("Party.NotInYourParty", new Object[] {args[1]})); - return true; - } + Party party = playerProfile.getParty(); + McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, party.getName(), playerProfile.getInvite().getName(), EventReason.CHANGED_PARTIES); - String partyName = party.getName(); - McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, partyName, null, EventReason.KICKED_FROM_PARTY); - - plugin.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return true; - } - - partyManagerInstance.removeFromParty(args[1], party); - } - else { - player.sendMessage(LocaleLoader.getString("Party.NotOwner")); - } - } - else if (args[0].equalsIgnoreCase("owner")) { - if (party.getLeader().equals(playerName)) { - if (!party.getMembers().contains(args[1])) { - player.sendMessage(LocaleLoader.getString("Party.NotInYourParty", new Object[] {args[1]})); - return true; - } - - partyManagerInstance.setPartyLeader(args[1], party); - } - } - else { - Party newParty = partyManagerInstance.getParty(args[0]); - - // Check to see if the party exists, and if it does, can the player join it? - if (newParty != null && !partyManagerInstance.checkJoinability(player, newParty, args[1])) { - return true; // End before any event is fired. - } - - McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, party.getName(), args[0], EventReason.CHANGED_PARTIES); - plugin.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return true; - } - - partyManagerInstance.removeFromParty(playerName, party); - partyManagerInstance.joinParty(player, playerProfile, args[0], args[1]); - } - } - else { - Party newParty = partyManagerInstance.getParty(args[0]); - - // Check to see if the party exists, and if it does, can the player join it? - if (newParty != null && !partyManagerInstance.checkJoinability(player, newParty, args[1])) { - return true; // End before any event is fired. - } - - McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, null, args[0], EventReason.JOINED_PARTY); plugin.getServer().getPluginManager().callEvent(event); if (event.isCancelled()) { return true; } - partyManagerInstance.joinParty(player, playerProfile, args[0], args[1]); + partyManagerInstance.removeFromParty(player.getName(), party); + } + else { + McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, null, playerProfile.getInvite().getName(), EventReason.JOINED_PARTY); + plugin.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return true; + } + } + partyManagerInstance.joinInvitedParty(player, playerProfile); + } + else { + player.sendMessage(LocaleLoader.getString("mcMMO.NoInvites")); + } + return true; + } + + private boolean create(CommandSender sender, String[] args) { + if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party.create")) + return true; + + Player player = (Player) sender; + String playerName = player.getName(); + PlayerProfile playerProfile = Users.getProfile(player); + + PartyManager partyManagerInstance = PartyManager.getInstance(); + Party party = playerProfile.getParty(); + + if(args.length < 2) { + player.sendMessage(LocaleLoader.getString("Party.Help.1")); + return true; + } else { + String partyname = args[1]; + String password = null; + if(args.length > 2) password = args[2]; + + Party newParty = partyManagerInstance.getParty(args[1]); + // Check to see if the party exists, and if it does cancel creating a new party + if (newParty != null) { + player.sendMessage(LocaleLoader.getString("Commands.Party.AlreadyExists", new Object[] {partyname})); + return true; } + if (playerProfile.inParty()) { + McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, playerProfile.getPlayerName(), partyname, EventReason.CHANGED_PARTIES); + plugin.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return true; + } + + partyManagerInstance.removeFromParty(playerName, party); + partyManagerInstance.createParty(player, playerProfile, partyname, password); + } else { + McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, null, partyname, EventReason.JOINED_PARTY); + plugin.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return true; + } + + partyManagerInstance.createParty(player, playerProfile, partyname, password); + return true; + } + } + return true; + } + + private boolean quit(CommandSender sender, String[] args) { + if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party.quit")) + return true; + + Player player = (Player) sender; + String playerName = player.getName(); + PlayerProfile playerProfile = Users.getProfile(player); + + PartyManager partyManagerInstance = PartyManager.getInstance(); + Party party = playerProfile.getParty(); + + if (party != null) { + McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(player, party.getName(), null, EventReason.LEFT_PARTY); + plugin.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return true; + } + partyManagerInstance.removeFromParty(playerName, party); + player.sendMessage(LocaleLoader.getString("Commands.Party.Leave")); + } + else + player.sendMessage(LocaleLoader.getString("Commands.Party.None")); + return false; + } + + private boolean expshare(CommandSender sender, String[] args) { + if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party.expshare")) + return true; + return true; + } + + private boolean itemshare(CommandSender sender, String[] args) { + if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party.itemshare")) + return true; + return true; + } + + private boolean help(CommandSender sender, String[] args) { + Player player = (Player) sender; + player.sendMessage(LocaleLoader.getString("Party.Help.3")); + player.sendMessage(LocaleLoader.getString("Party.Help.1")); + player.sendMessage(LocaleLoader.getString("Party.Help.4")); + player.sendMessage(LocaleLoader.getString("Party.Help.5")); + player.sendMessage(LocaleLoader.getString("Party.Help.6")); + player.sendMessage(LocaleLoader.getString("Party.Help.7")); + player.sendMessage(LocaleLoader.getString("Party.Help.8")); + return true; + } + + private boolean invite(CommandSender sender, String[] args) { + if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party.invite")) + return true; + + switch (args.length) { + case 2: + Player player = (Player) sender; + PlayerProfile playerProfile = Users.getProfile(player); + + if (!playerProfile.inParty()) { + player.sendMessage(LocaleLoader.getString("Commands.Party.None")); + return true; + } + + Player target = plugin.getServer().getPlayer(args[1]); + + if (target != null) { + if (PartyManager.getInstance().inSameParty(player, target)) { + player.sendMessage(LocaleLoader.getString("Party.Player.InSameParty")); + return true; + } + if (PartyManager.getInstance().canInvite(player, playerProfile)) { + Party party = playerProfile.getParty(); + + Users.getProfile(target).setInvite(party); + player.sendMessage(LocaleLoader.getString("Commands.Invite.Success")); + target.sendMessage(LocaleLoader.getString("Commands.Party.Invite.0", new Object[] {party.getName(), player.getName()})); + target.sendMessage(LocaleLoader.getString("Commands.Party.Invite.1")); + return true; + } + + player.sendMessage(LocaleLoader.getString("Party.Locked")); + return true; + } + player.sendMessage(LocaleLoader.getString("Party.Player.Invalid")); return true; default: - player.sendMessage(LocaleLoader.getString("Party.Help.0")); - player.sendMessage(LocaleLoader.getString("Party.Help.1")); - player.sendMessage(LocaleLoader.getString("Party.Help.2")); + sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", new Object[] {"party", "invite", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">"})); return true; } } + + /** + * Kick a party member + */ + private boolean kick(CommandSender sender, String[] args) { + if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party.kick")) + return true; + Player player = (Player) sender; + String playerName = player.getName(); + PlayerProfile playerProfile = Users.getProfile(player); + + PartyManager partyManagerInstance = PartyManager.getInstance(); + Party party = playerProfile.getParty(); + + if (party.getLeader().equals(playerName)) { + if (!party.getMembers().contains(args[1])) { + player.sendMessage(LocaleLoader.getString("Party.NotInYourParty", new Object[] {args[1]})); + return true; + } + + Player target = plugin.getServer().getOfflinePlayer(args[1]).getPlayer(); + if (target != null) { + String partyName = party.getName(); + McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(target, partyName, null, EventReason.KICKED_FROM_PARTY); + + plugin.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return true; + } + target.sendMessage(LocaleLoader.getString("Commands.Party.Kick", new Object[] {partyName})); + } + partyManagerInstance.removeFromParty(args[1], party); + } + else + player.sendMessage(LocaleLoader.getString("Party.NotOwner")); + return true; + } + + /** + * Disband the current party, kicks out all party members. + */ + private boolean disband(CommandSender sender, String[] args) { + if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party.disband")) + return true; + + Player player = (Player) sender; + String playerName = player.getName(); + PlayerProfile playerProfile = Users.getProfile(player); + + PartyManager partyManagerInstance = PartyManager.getInstance(); + Party party = playerProfile.getParty(); + + if (party.getLeader().equals(playerName)) { + for (Player onlineMembers : party.getOnlineMembers()) { + McMMOPartyChangeEvent event = new McMMOPartyChangeEvent(onlineMembers, party.getName(), null, EventReason.KICKED_FROM_PARTY); + plugin.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) { + return true; + } + onlineMembers.sendMessage(LocaleLoader.getString("Party.Disband")); + } + partyManagerInstance.disbandParty(party); + } + else + player.sendMessage(LocaleLoader.getString("Party.NotOwner")); + return true; + } + + /** + * Change the owner of the current party + */ + private boolean owner(CommandSender sender, String[] args) { + if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party.owner")) + return true; + + Player player = (Player) sender; + String playerName = player.getName(); + PlayerProfile playerProfile = Users.getProfile(player); + + PartyManager partyManagerInstance = PartyManager.getInstance(); + Party party = playerProfile.getParty(); + + + if(args.length < 2) { + player.sendMessage("Usage: /party owner [player]"); + return true; + } + if (party.getLeader().equals(playerName)) { + if (!party.getMembers().contains(args[1])) { + player.sendMessage(LocaleLoader.getString("Party.NotInYourParty", new Object[] {args[1]})); + return true; + } + partyManagerInstance.setPartyLeader(args[1], party); + } + return true; + } + + /** + * Lock the current party + */ + private boolean lock(CommandSender sender, String[] args) { + if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party.lock")) + return true; + + Player player = (Player) sender; + String playerName = player.getName(); + PlayerProfile playerProfile = Users.getProfile(player); + Party party = playerProfile.getParty(); + + if (party != null) { + if (party.getLeader().equals(playerName)) { + if (party.isLocked()) { + player.sendMessage(LocaleLoader.getString("Party.IsLocked")); + } + else { + party.setLocked(true); + player.sendMessage(LocaleLoader.getString("Party.Locked")); + } + } + else + player.sendMessage(LocaleLoader.getString("Party.NotOwner")); + } + else + player.sendMessage("Commands.Party.None"); + return true; + } + + /** + * Unlock the current party + */ + private boolean unlock(CommandSender sender, String[] args) { + if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party.unlock")) + return true; + + Player player = (Player) sender; + String playerName = player.getName(); + PlayerProfile playerProfile = Users.getProfile(player); + Party party = playerProfile.getParty(); + + if (party != null) { + if (party.getLeader().equals(playerName)) { + if (!party.isLocked()) { + player.sendMessage(LocaleLoader.getString("Party.IsntLocked")); + } + else { + party.setLocked(false); + player.sendMessage(LocaleLoader.getString("Party.Unlocked")); + } + } + else + player.sendMessage(LocaleLoader.getString("Party.NotOwner")); + } + else + player.sendMessage("Commands.Party.None"); + return true; + } + + private boolean password(CommandSender sender, String[] args) { + if (CommandHelper.noCommandPermissions(sender, "mcmmo.commands.party.password")) + return true; + + Player player = (Player) sender; + String playerName = player.getName(); + PlayerProfile playerProfile = Users.getProfile(player); + Party party = playerProfile.getParty(); + + if(args.length < 2) { + player.sendMessage(LocaleLoader.getString("Commands.Usage.2", new Object[] {"party", "password", "<" + LocaleLoader.getString("Commands.Usage.Password") + ">"})); + return true; + } + + if (party.getLeader().equals(playerName)) { + party.setLocked(true); + party.setPassword(args[1]); + player.sendMessage(LocaleLoader.getString("Party.PasswordSet", new Object[] {args[1]})); + } + else + player.sendMessage(LocaleLoader.getString("Party.NotOwner")); + return true; + } } diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 544043770..081858de6 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -437,18 +437,24 @@ Commands.mmoupdate.Finish=[[GREEN]]Conversion finished! Commands.ModDescription=[[RED]]- Read brief mod description Commands.NoConsole=This command does not support console usage. Commands.Other=[[GREEN]]--OTHER COMMANDS-- +Commands.Party.Header=[[RED]]-----[][[GREEN]]PARTY[[RED]][]----- +Commands.Party.Status=[[DARK_GRAY]]NAME: [[WHITE]]{0} {1} +Commands.Party.ShareMode=[[DARK_GRAY]]SHARE MODE: [[GRAY]]ITEM [[DARK_AQUA]]({0}) [[DARK_GRAY]]|| [[GRAY]]EXP [[DARK_AQUA]]({1}) Commands.Party.Accept=[[RED]]- Accept party invite Commands.Party.Chat.Off=Party Chat only [[RED]]Off Commands.Party.Chat.On=Party Chat only [[GREEN]]On Commands.Party.Chat.Prefix=[[GREEN]]([[WHITE]]{0}[[GREEN]]) Commands.Party.Commands=[[GREEN]]--PARTY COMMANDS-- Commands.Party.Invite.0=[[RED]]ALERT: [[GREEN]]You have received a party invite for {0} from {1} -Commands.Party.Invite.1=[[YELLOW]]Type [[GREEN]]/accept[[YELLOW]] to accept the invite +Commands.Party.Invite.1=[[YELLOW]]Type [[GREEN]]/party accept[[YELLOW]] to accept the invite Commands.Party.Invite= [[RED]]- Send party invite -Commands.Party.Join=Joined Party: {0} +Commands.Party.Join=[[GRAY]]Joined Party: {0} +Commands.Party.Create=[[GRAY]]Created Party: {0} +Commands.Party.AlreadyExists=[[DARK_RED]]Party {0} already exists! Commands.Party.Kick=[[RED]]You were kicked from party {0}! Commands.Party.Leave=[[RED]]You have left that party -Commands.Party.Members=[[GREEN]]Party Members: {0} +Commands.Party.Members.Header=[[RED]]-----[][[GREEN]]MEMBERS[[RED]][]----- +Commands.Party.Members={0} Commands.Party.None=[[RED]]You are not in a party. Commands.Party.Quit=[[RED]]- Leave your current party Commands.Party.Teleport= [[RED]]- Teleport to party member @@ -473,6 +479,7 @@ Commands.Usage.Level=level Commands.Usage.Message=message Commands.Usage.Page=page Commands.Usage.PartyName=party-name +Commands.Usage.Password=password Commands.Usage.Player=player Commands.Usage.Skill=skill Commands.Usage.XP=xp @@ -481,18 +488,18 @@ mcMMO.NoPermission=[[DARK_RED]]Insufficient permissions. mcMMO.NoSkillNote=[[DARK_GRAY]]If you don't have access to a skill it will not be shown here. ##party -Commands.Party.InParty=[[GREEN]]Party: {0} Party.Forbidden=[mcMMO] Parties not permitted on this world (See Permissions) -Party.Help.0=[[RED]]Proper usage is /party to join or /party q to quit -Party.Help.1=[[RED]]To join a passworded party, use /party -Party.Help.2=[[RED]]Consult /party ? for more information -Party.Help.3=[[RED]]Use /party to join or /party q to quit -Party.Help.4=[[RED]]To lock or unlock your party, use /party -Party.Help.5=[[RED]]To password protect your party, use /party password -Party.Help.6=[[RED]]To kick a player from your party, use /party kick -Party.Help.7=[[RED]]To transfer ownership of your party, use /party owner -Party.InformedOnJoin={0} [[GREEN]] has joined your party -Party.InformedOnQuit={0} [[GREEN]] has left your party +Party.Help.0=[[RED]]Proper usage is [[DARK_AQUA]]/party join [password]. +Party.Help.1=[[RED]]To create a party, use [[DARK_AQUA]]/party create [password] +Party.Help.2=[[RED]]Consult [[DARK_AQUA]]/party ? [[RED]]for more information +Party.Help.3=[[RED]]Use [[DARK_AQUA]]/party join [[RED]]to join or [[DARK_AQUA]]/party quit [[RED]]to quit +Party.Help.4=[[RED]]To lock or unlock your party, use [[DARK_AQUA]]/party +Party.Help.5=[[RED]]To password protect your party, use [[DARK_AQUA]]/party password +Party.Help.6=[[RED]]To kick a player from your party, use [[DARK_AQUA]]/party kick +Party.Help.7=[[RED]]To transfer ownership of your party, use [[DARK_AQUA]]/party owner +Party.Help.8=[[RED]]To disband your party, use [[DARK_AQUA]]/party disband +Party.InformedOnJoin={0} [[GREEN]]has joined your party +Party.InformedOnQuit={0} [[GREEN]]has left your party Party.InvalidName=[[DARK_RED]]That is not a valid party name. Party.IsLocked=[[RED]]This party is already locked! Party.IsntLocked=[[RED]]This party is not locked! @@ -503,14 +510,20 @@ Party.Owner.New=[[GREEN]]{0} is the new party leader. Party.Owner.NotLeader=[[DARK_RED]]You are no longer the party leader. Party.Owner.Player =[[GREEN]]You are now the party leader. Party.Password.Incorrect=[[RED]]Party password is incorrect. +Party.NotOnline=[[DARK_RED]]{0} is not online! Party.PasswordSet=[[GREEN]]Party password set to {0} Party.Player.Invalid=[[RED]]That is not a valid player. +Party.Player.InSameParty=[[RED]]{0} already is in your party! +Party.PlayerNotInParty=[[DARK_RED]]{0} is not in a party Party.Teleport.Dead=[[RED]]You can't teleport to a dead player. Party.Teleport.Hurt=[[RED]]You''ve been hurt in the last {0} seconds and cannnot teleport. Party.Teleport.Player=[[GREEN]]You have teleported to {0}. -Party.Teleport.Self=[[RED]]You can't teleport to yourself! +Party.Teleport.Self=[[RED]]You can''t teleport to yourself! Party.Teleport.Target=[[GREEN]]{0} has teleported to you. Party.Unlocked=[[GRAY]]Party is unlocked +Party.Disband=[[GRAY]]The party has been disbanded +Party.Status.Locked=[[DARK_RED]](INVITE-ONLY) +Party.Status.Unlocked=[[DARK_GREEN]](OPEN) ##xp Commands.XPGain.Acrobatics=Falling @@ -645,4 +658,4 @@ Smelting.Effect.6=Flux Mining Smelting.Effect.7=Chance for ores to be instantly smelted while mining Smelting.FluxMining.Success=[[GREEN]]That ore smelted itself! Smelting.Listener=Smelting: -Smelting.SkillName=SMELTING \ No newline at end of file +Smelting.SkillName=SMELTING diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 0b933dc6e..76521dde8 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -73,12 +73,6 @@ commands: description: Create/join a party inspect: aliases: [] - invite: - aliases: [] - description: Invite a player into your party - accept: - aliases: [] - description: Accept a party invite mmoupdate: aliases: [] description: Convert from Flat File to MySQL @@ -706,15 +700,30 @@ permissions: mcmmo.commands.ability: true mcmmo.commands.ptp: true mcmmo.commands.inspect: true - mcmmo.commands.party: true + mcmmo.commands.party.all: true mcmmo.commands.ability: description: Allows access to the mcability command mcmmo.commands.ptp: description: Allows access to the ptp command mcmmo.commands.inspect: description: Allows access to the inspect command - mcmmo.commands.party: - description: Allows acces to the party command + mcmmo.commands.party.all: + description: Implies all mcmmo.commands.party permissions. + children: + mcmmo.commands.party: true + mcmmo.commands.party.join: true + mcmmo.commands.party.create: true + mcmmo.commands.party.quit: true + mcmmo.commands.party.expshare: true + mcmmo.commands.party.itemshare: true + mcmmo.commands.party.accept: true + mcmmo.commands.party.invite: true + mcmmo.commands.party.kick: true + mcmmo.commands.party.disband: true + mcmmo.commands.party.owner: true + mcmmo.commands.party.lock: true + mcmmo.commands.party.unlock: true + mcmmo.commands.party.password: true mcmmo.chat.*: description: Implies all mcmmo.chat permissions. (Warning, contains adminchat) children: