diff --git a/Changelog.txt b/Changelog.txt index 82c0329e6..3cc4f27f6 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -14,6 +14,7 @@ Version 1.4.06-dev + Added new API method to McMMOPlayerLevelUpEvent to set levels gained + Added new permission node for /ptp; mcmmo.commands.ptp.send (enabled by default) + Added configurable cooldown and warmup times when using /ptp + = Fixed bug where players were able to join the same party multiple times = Fixed displaying partial names when trying to use /ptp = Fixed wolves from Call of the Wild only having 8 health = Fixed bug where /party chat was not working diff --git a/src/main/java/com/gmail/nossr50/api/PartyAPI.java b/src/main/java/com/gmail/nossr50/api/PartyAPI.java index c3cd324b8..6f7800ffe 100644 --- a/src/main/java/com/gmail/nossr50/api/PartyAPI.java +++ b/src/main/java/com/gmail/nossr50/api/PartyAPI.java @@ -1,10 +1,12 @@ package com.gmail.nossr50.api; +import java.util.ArrayList; import java.util.List; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.party.PartyManager; import com.gmail.nossr50.util.player.UserManager; @@ -127,7 +129,26 @@ public final class PartyAPI { * @param player The player to check * @return all the players in the player's party */ + @Deprecated public static List getOnlineAndOfflineMembers(Player player) { + List members = new ArrayList(); + + for (String memberName : PartyManager.getAllMembers(player)) { + OfflinePlayer member = mcMMO.p.getServer().getOfflinePlayer(memberName); + members.add(member); + } + return members; + } + + /** + * Get a list of all player names in this player's party. + *
+ * This function is designed for API usage. + * + * @param player The player to check + * @return all the player names in the player's party + */ + public static List getMembers(Player player) { return PartyManager.getAllMembers(player); } diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java index 70dce3e96..7a0483ed2 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java @@ -7,6 +7,7 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -41,8 +42,8 @@ public class PartyInfoCommand implements CommandExecutor { private String createMembersList() { StringBuilder memberList = new StringBuilder(); - for (OfflinePlayer member : playerParty.getMembers()) { - String memberName = member.getName(); + for (String memberName : playerParty.getMembers()) { + OfflinePlayer member = mcMMO.p.getServer().getOfflinePlayer(memberName); if (playerParty.getLeader().equalsIgnoreCase(memberName)) { memberList.append(ChatColor.GOLD); diff --git a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java index d042735e8..e9ba7f71d 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java @@ -6,10 +6,11 @@ import java.util.List; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.party.ShareHandler; public class Party { - private List members = new ArrayList(); + private List members = new ArrayList(); private String leader; private String name; private String password; @@ -23,14 +24,15 @@ public class Party { private boolean shareHerbalismDrops = true; private boolean shareWoodcuttingDrops = true; - public List getMembers() { + public List getMembers() { return members; } public List getOnlineMembers() { List onlineMembers = new ArrayList(); - for (OfflinePlayer member : members) { + for (String memberName : members) { + OfflinePlayer member = mcMMO.p.getServer().getOfflinePlayer(memberName); if (member.isOnline()) { onlineMembers.add(member.getPlayer()); } diff --git a/src/main/java/com/gmail/nossr50/party/PartyManager.java b/src/main/java/com/gmail/nossr50/party/PartyManager.java index 8985f42ef..17f3fd034 100644 --- a/src/main/java/com/gmail/nossr50/party/PartyManager.java +++ b/src/main/java/com/gmail/nossr50/party/PartyManager.java @@ -5,7 +5,6 @@ import java.util.ArrayList; import java.util.List; import org.bukkit.OfflinePlayer; -import org.bukkit.Server; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -15,7 +14,6 @@ import com.gmail.nossr50.datatypes.player.McMMOPlayer; 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.runnables.party.PartyLoaderTask; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.player.UserManager; @@ -99,7 +97,7 @@ public final class PartyManager { * @param player The player to check * @return all the players in the player's party */ - public static List getAllMembers(Player player) { + public static List getAllMembers(Player player) { Party party = UserManager.getPlayer(player).getParty(); if (party == null) { @@ -165,8 +163,8 @@ public final class PartyManager { */ public static Party getPlayerParty(String playerName) { for (Party party : parties) { - for (OfflinePlayer member : party.getMembers()) { - if (member.getName().equalsIgnoreCase(playerName)) { + for (String memberName : party.getMembers()) { + if (memberName.equalsIgnoreCase(playerName)) { return party; } } @@ -191,9 +189,11 @@ public final class PartyManager { * @param party The party */ public static void removeFromParty(OfflinePlayer player, Party party) { - List members = party.getMembers(); + List members = party.getMembers(); - members.remove(player); + while (members.remove(player.getName())) { + // Remove all the duplicates as well + } if (members.isEmpty()) { parties.remove(party); @@ -201,7 +201,7 @@ public final class PartyManager { else { // If the leaving player was the party leader, appoint a new leader from the party members if (party.getLeader().equalsIgnoreCase(player.getName())) { - String newLeader = members.get(0).getName(); + String newLeader = members.get(0); party.setLeader(newLeader); } @@ -222,10 +222,10 @@ public final class PartyManager { * @param party The party to remove */ public static void disbandParty(Party party) { - List members = party.getMembers(); + List members = party.getMembers(); - for (OfflinePlayer member : members) { - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(member.getName()); + for (String memberName : members) { + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(memberName); if (mcMMOPlayer != null) { mcMMOPlayer.removeParty(); @@ -361,7 +361,10 @@ public final class PartyManager { informPartyMembersJoin(player, party); mcMMOPlayer.setParty(party); - party.getMembers().add(player); + + if (!party.getMembers().contains(player.getName())) { + party.getMembers().add(player.getName()); + } } /** @@ -439,14 +442,6 @@ public final class PartyManager { * Load party file. */ public static void loadParties() { - try { - mcMMO.p.getServer().getOfflinePlayer("nossr50"); // TODO: Find a less-hacky way to manage reloading. - } - catch (IndexOutOfBoundsException ex){ - new PartyLoaderTask().runTaskLater(mcMMO.p, 0); - return; - } - File file = new File(partiesFilePath); if (!file.exists()) { @@ -473,11 +468,12 @@ public final class PartyManager { party.setItemShareMode(ShareHandler.ShareMode.getFromString(partiesFile.getString(partyName + ".ItemShareMode"))); List memberNames = partiesFile.getStringList(partyName + ".Members"); - List members = party.getMembers(); - Server server = mcMMO.p.getServer(); + List members = party.getMembers(); for (String memberName : memberNames) { - members.add(server.getOfflinePlayer(memberName)); + if (!members.contains(memberName)) { + members.add(memberName); + } } parties.add(party); @@ -507,8 +503,10 @@ public final class PartyManager { List memberNames = new ArrayList(); - for (OfflinePlayer member : party.getMembers()) { - memberNames.add(member.getName()); + for (String member : party.getMembers()) { + if (!memberNames.contains(member)) { + memberNames.add(member); + } } partiesFile.set(partyName + ".Members", memberNames); diff --git a/src/main/java/com/gmail/nossr50/runnables/party/PartyAutoKickTask.java b/src/main/java/com/gmail/nossr50/runnables/party/PartyAutoKickTask.java index 0b7547f84..d4f8e485d 100644 --- a/src/main/java/com/gmail/nossr50/runnables/party/PartyAutoKickTask.java +++ b/src/main/java/com/gmail/nossr50/runnables/party/PartyAutoKickTask.java @@ -7,6 +7,7 @@ import java.util.Map.Entry; import org.bukkit.OfflinePlayer; import org.bukkit.scheduler.BukkitRunnable; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.party.PartyManager; @@ -26,7 +27,9 @@ public class PartyAutoKickTask extends BukkitRunnable { for (Iterator partyIterator = PartyManager.getParties().iterator(); partyIterator.hasNext();) { Party party = partyIterator.next(); - for (OfflinePlayer member : party.getMembers()) { + for (String memberName : party.getMembers()) { + OfflinePlayer member = mcMMO.p.getServer().getOfflinePlayer(memberName); + if (currentTime - member.getLastPlayed() > kickTime) { toRemove.put(member, party); }