diff --git a/Changelog.txt b/Changelog.txt index 53af7d21b..327d586bd 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -32,6 +32,7 @@ Version 1.4.08-dev = Fixed bug which made it possible to gain XP by taming the same horse multiple times, if a player "untamed" that horse = Fixed bug where the /ptp request expiration time was checked wrongly - preventing players from using the command = Fixed bug where Hylian Luck was broken + ! Changed party system. Parties now have XP and Levels. Party features such as party teleport and party chat have to be unlocked before they can be used by the party members ! Updated localization files ! Changed the appearance of /mcmmo commands ! Changed AxesCritical to CriticalHit in config file diff --git a/src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java b/src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java index 4548ff6e7..e7fd76270 100644 --- a/src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/chat/ChatCommand.java @@ -9,6 +9,8 @@ import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; +import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.datatypes.party.PartyFeature; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.chat.ChatManager; import com.gmail.nossr50.chat.ChatManagerFactory; @@ -111,6 +113,11 @@ public abstract class ChatCommand implements TabExecutor { return; } + if (chatMode == ChatMode.PARTY && (mcMMOPlayer.getParty().getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(PartyFeature.CHAT))) { + sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.1")); + return; + } + mcMMOPlayer.enableChat(chatMode); sender.sendMessage(chatMode.getEnabledMessage()); } diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java index 365a6c06a..c36159f48 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyCommand.java @@ -26,7 +26,7 @@ import com.google.common.collect.ImmutableList; public class PartyCommand implements TabExecutor { private static final List PARTY_SUBCOMMANDS; - private static final List EXPSHARE_COMPLETIONS = ImmutableList.of("none", "equal"); + private static final List XPSHARE_COMPLETIONS = ImmutableList.of("none", "equal"); private static final List ITEMSHARE_COMPLETIONS = ImmutableList.of("none", "equal", "random", "loot", "mining", "herbalism", "woodcutting", "misc"); static { @@ -44,7 +44,7 @@ public class PartyCommand implements TabExecutor { private CommandExecutor partyAcceptCommand = new PartyAcceptCommand(); private CommandExecutor partyCreateCommand = new PartyCreateCommand(); private CommandExecutor partyQuitCommand = new PartyQuitCommand(); - private CommandExecutor partyExpShareCommand = new PartyExpShareCommand(); + private CommandExecutor partyXpShareCommand = new PartyXpShareCommand(); private CommandExecutor partyItemShareCommand = new PartyItemShareCommand(); private CommandExecutor partyInviteCommand = new PartyInviteCommand(); private CommandExecutor partyKickCommand = new PartyKickCommand(); @@ -135,8 +135,8 @@ public class PartyCommand implements TabExecutor { } switch (subcommand) { - case EXPSHARE: - return partyExpShareCommand.onCommand(sender, command, label, args); + case XPSHARE: + return partyXpShareCommand.onCommand(sender, command, label, args); case ITEMSHARE: return partyItemShareCommand.onCommand(sender, command, label, args); case KICK: @@ -180,8 +180,8 @@ public class PartyCommand implements TabExecutor { case OWNER: Set playerNames = UserManager.getPlayerNames(); return StringUtil.copyPartialMatches(args[1], playerNames, new ArrayList(playerNames.size())); - case EXPSHARE: - return StringUtil.copyPartialMatches(args[1], EXPSHARE_COMPLETIONS, new ArrayList(EXPSHARE_COMPLETIONS.size())); + case XPSHARE: + return StringUtil.copyPartialMatches(args[1], XPSHARE_COMPLETIONS, new ArrayList(XPSHARE_COMPLETIONS.size())); case ITEMSHARE: return StringUtil.copyPartialMatches(args[1], ITEMSHARE_COMPLETIONS, new ArrayList(ITEMSHARE_COMPLETIONS.size())); case LOCK: 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 47c452776..adad3d49c 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyInfoCommand.java @@ -1,5 +1,8 @@ package com.gmail.nossr50.commands.party; +import java.util.ArrayList; +import java.util.List; + import org.bukkit.ChatColor; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -9,6 +12,7 @@ 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.party.PartyFeature; import com.gmail.nossr50.datatypes.party.ShareMode; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.locale.LocaleLoader; @@ -26,7 +30,8 @@ public class PartyInfoCommand implements CommandExecutor { Party party = mcMMOPlayer.getParty(); displayPartyHeader(player, party); - displayShareModeInfo(party, player); + displayShareModeInfo(player, party); + displayPartyFeatures(player, party); displayMemberInfo(player, mcMMOPlayer, party); return true; @@ -36,31 +41,56 @@ public class PartyInfoCommand implements CommandExecutor { } } - private String createMembersList(Party party) { - StringBuilder memberList = new StringBuilder(); + private void displayPartyHeader(Player player, Party party) { + player.sendMessage(LocaleLoader.getString("Commands.Party.Header")); - for (String memberName : party.getMembers()) { - Player member = mcMMO.p.getServer().getPlayerExact(memberName); + StringBuilder status = new StringBuilder(); + status.append(LocaleLoader.getString("Commands.Party.Status", party.getName(), LocaleLoader.getString("Party.Status." + (party.isLocked() ? "Locked" : "Unlocked")), party.getLevel())); - if (party.getLeader().equalsIgnoreCase(memberName)) { - memberList.append(ChatColor.GOLD); - } - else if (member != null) { - memberList.append(ChatColor.WHITE); - } - else { - memberList.append(ChatColor.GRAY); - } - - memberList.append(memberName).append(" "); + if (!party.hasReachedLevelCap()) { + status.append(" (" + party.getXpToLevelPercentage() + ")"); } - return memberList.toString(); + player.sendMessage(status.toString()); } - private void displayShareModeInfo(Party party, Player player) { - boolean xpShareEnabled = Config.getInstance().getExpShareEnabled(); - boolean itemShareEnabled = Config.getInstance().getItemShareEnabled(); + private void displayPartyFeatures(Player player, Party party) { + player.sendMessage(LocaleLoader.getString("Commands.Party.Features.Header")); + + List unlockedPartyFeatures = new ArrayList(); + List lockedPartyFeatures = new ArrayList(); + + for (PartyFeature partyFeature : PartyFeature.values()) { + if (!partyFeature.hasPermission(player)) { + continue; + } + + if (isUnlockedFeature(party, partyFeature)) { + unlockedPartyFeatures.add(partyFeature.getLocaleString()); + } + else { + lockedPartyFeatures.add(partyFeature.getFeatureLockedLocaleString()); + } + } + + player.sendMessage(LocaleLoader.getString("Commands.Party.UnlockedFeatures", unlockedPartyFeatures.isEmpty() ? "None" : unlockedPartyFeatures)); + + for (String message : lockedPartyFeatures) { + player.sendMessage(message); + } + } + + private boolean isUnlockedFeature(Party party, PartyFeature partyFeature) { + if (party.getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(partyFeature)) { + return false; + } + + return true; + } + + private void displayShareModeInfo(Player player, Party party) { + boolean xpShareEnabled = isUnlockedFeature(party, PartyFeature.XP_SHARE); + boolean itemShareEnabled = isUnlockedFeature(party, PartyFeature.ITEM_SHARE); boolean itemSharingActive = (party.getItemShareMode() != ShareMode.NONE); if (!xpShareEnabled && !itemShareEnabled) { @@ -90,21 +120,38 @@ public class PartyInfoCommand implements CommandExecutor { } } - private void displayPartyHeader(Player player, Party party) { - player.sendMessage(LocaleLoader.getString("Commands.Party.Header")); - player.sendMessage(LocaleLoader.getString("Commands.Party.Status", party.getName(), LocaleLoader.getString("Party.Status." + (party.isLocked() ? "Locked" : "Unlocked")))); - - if (party.getAlly() != null) { - player.sendMessage(LocaleLoader.getString("Commands.Party.Status.Alliance", party.getAlly().getName())); - } - } - private void displayMemberInfo(Player player, McMMOPlayer mcMMOPlayer, Party party) { - int membersNear = PartyManager.getNearMembers(mcMMOPlayer).size(); + List nearMembers = PartyManager.getNearMembers(mcMMOPlayer); int membersOnline = party.getOnlineMembers().size() - 1; player.sendMessage(LocaleLoader.getString("Commands.Party.Members.Header")); - player.sendMessage(LocaleLoader.getString("Commands.Party.MembersNear", membersNear, membersOnline)); - player.sendMessage(createMembersList(party)); + player.sendMessage(LocaleLoader.getString("Commands.Party.MembersNear", nearMembers.size(), membersOnline)); + player.sendMessage(createMembersList(party, nearMembers)); + } + + private String createMembersList(Party party, List nearMembers) { + StringBuilder memberList = new StringBuilder(); + + for (String memberName : party.getMembers()) { + Player member = mcMMO.p.getServer().getPlayerExact(memberName); + + if (!nearMembers.contains(member)) { + memberList.append(ChatColor.ITALIC); + } + + if (party.getLeader().equalsIgnoreCase(memberName)) { + memberList.append(ChatColor.GOLD); + } + else if (member != null) { + memberList.append(ChatColor.WHITE); + } + else { + memberList.append(ChatColor.GRAY); + } + + memberList.append(memberName).append(ChatColor.RESET).append(" "); + } + + return memberList.toString(); } } diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyItemShareCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyItemShareCommand.java index 1816d302f..0e4219207 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyItemShareCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyItemShareCommand.java @@ -8,6 +8,7 @@ import org.bukkit.entity.Player; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.ItemShareType; import com.gmail.nossr50.datatypes.party.Party; +import com.gmail.nossr50.datatypes.party.PartyFeature; import com.gmail.nossr50.datatypes.party.ShareMode; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.util.StringUtils; @@ -17,13 +18,13 @@ import com.gmail.nossr50.util.player.UserManager; public class PartyItemShareCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (!Config.getInstance().getItemShareEnabled()) { - sender.sendMessage(LocaleLoader.getString("Party.ItemShare.Disabled")); + Party party = UserManager.getPlayer((Player) sender).getParty(); + + if (party.getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(PartyFeature.ITEM_SHARE)) { + sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.4")); return true; } - Party party = UserManager.getPlayer((Player) sender).getParty(); - switch (args.length) { case 2: ShareMode mode = ShareMode.getShareMode(args[1].toUpperCase()); diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartySubcommandType.java b/src/main/java/com/gmail/nossr50/commands/party/PartySubcommandType.java index fe4b1cc9e..f4ebdb510 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartySubcommandType.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartySubcommandType.java @@ -7,7 +7,7 @@ public enum PartySubcommandType { HELP, INFO, QUIT, - EXPSHARE, + XPSHARE, ITEMSHARE, INVITE, KICK, @@ -38,7 +38,7 @@ public enum PartySubcommandType { return OWNER; } else if (commandName.equalsIgnoreCase("xpshare") || commandName.equalsIgnoreCase("shareexp") || commandName.equalsIgnoreCase("sharexp")) { - return EXPSHARE; + return XPSHARE; } else if (commandName.equalsIgnoreCase("shareitem") || commandName.equalsIgnoreCase("shareitems")) { return ITEMSHARE; diff --git a/src/main/java/com/gmail/nossr50/commands/party/PartyExpShareCommand.java b/src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java similarity index 72% rename from src/main/java/com/gmail/nossr50/commands/party/PartyExpShareCommand.java rename to src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java index 898ffdf7e..2a86478dc 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/PartyExpShareCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/PartyXpShareCommand.java @@ -7,24 +7,25 @@ import org.bukkit.entity.Player; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.Party; +import com.gmail.nossr50.datatypes.party.PartyFeature; import com.gmail.nossr50.datatypes.party.ShareMode; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.util.StringUtils; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; -public class PartyExpShareCommand implements CommandExecutor { +public class PartyXpShareCommand implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if (!Config.getInstance().getExpShareEnabled()) { - sender.sendMessage(LocaleLoader.getString("Party.ExpShare.Disabled")); + Party party = UserManager.getPlayer((Player) sender).getParty(); + + if (party.getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(PartyFeature.XP_SHARE)) { + sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.5")); return true; } switch (args.length) { case 2: - Party party = UserManager.getPlayer((Player) sender).getParty(); - if (args[1].equalsIgnoreCase("none") || CommandUtils.shouldDisableToggle(args[1])) { handleChangingShareMode(party, ShareMode.NONE); } @@ -32,13 +33,13 @@ public class PartyExpShareCommand implements CommandExecutor { handleChangingShareMode(party, ShareMode.EQUAL); } else { - sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "expshare", "")); + sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "xpshare", "")); } return true; default: - sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "expshare", "")); + sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "xpshare", "")); return true; } } @@ -46,7 +47,7 @@ public class PartyExpShareCommand implements CommandExecutor { private void handleChangingShareMode(Party party, ShareMode mode) { party.setXpShareMode(mode); - String changeModeMessage = LocaleLoader.getString("Commands.Party.SetSharing", LocaleLoader.getString("Party.ShareType.Exp"), LocaleLoader.getString("Party.ShareMode." + StringUtils.getCapitalized(mode.toString()))); + String changeModeMessage = LocaleLoader.getString("Commands.Party.SetSharing", LocaleLoader.getString("Party.ShareType.Xp"), LocaleLoader.getString("Party.ShareMode." + StringUtils.getCapitalized(mode.toString()))); for (Player member : party.getOnlineMembers()) { member.sendMessage(changeModeMessage); diff --git a/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceCommand.java b/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceCommand.java index ac12379b2..aaa390a39 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceCommand.java @@ -12,6 +12,8 @@ import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; +import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.datatypes.party.PartyFeature; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.Party; diff --git a/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceInviteCommand.java b/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceInviteCommand.java index 56612529b..570f55dc0 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceInviteCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/alliance/PartyAllianceInviteCommand.java @@ -9,7 +9,6 @@ import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.party.PartyManager; -import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.commands.CommandUtils; import com.gmail.nossr50.util.player.UserManager; diff --git a/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java b/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java index bae781b21..f7478c6f6 100644 --- a/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/party/teleport/PtpCommand.java @@ -11,6 +11,8 @@ import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.util.StringUtil; +import com.gmail.nossr50.datatypes.party.Party; +import com.gmail.nossr50.datatypes.party.PartyFeature; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.party.PartyTeleportRecord; @@ -40,6 +42,15 @@ public class PtpCommand implements TabExecutor { return true; } + Player player = (Player) sender; + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + Party party = mcMMOPlayer.getParty(); + + if (party.getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(PartyFeature.TELEPORT)) { + sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.2")); + return true; + } + switch (args.length) { case 1: if (args[0].equalsIgnoreCase("toggle")) { @@ -50,9 +61,6 @@ public class PtpCommand implements TabExecutor { return ptpAcceptAnyCommand.onCommand(sender, command, label, args); } - Player player = (Player) sender; - McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); - long recentlyHurt = mcMMOPlayer.getRecentlyHurt(); int hurtCooldown = Config.getInstance().getPTPCommandRecentlyHurtCooldown(); diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index 64f2e10f0..98fcb093f 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -9,6 +9,7 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.EntityType; import com.gmail.nossr50.datatypes.MobHealthbarType; +import com.gmail.nossr50.datatypes.party.PartyFeature; import com.gmail.nossr50.datatypes.skills.AbilityType; import com.gmail.nossr50.datatypes.skills.SkillType; import com.gmail.nossr50.util.StringUtils; @@ -146,6 +147,16 @@ public class Config extends AutoUpdateConfigLoader { reason.add("Party.Sharing.Range should be greater than 0!"); } + if (getPartyXpCurveMultiplier() < 1) { + reason.add("Party.Leveling.Xp_Curve_Modifier should be at least 1!"); + } + + for (PartyFeature partyFeature : PartyFeature.values()) { + if (getPartyFeatureUnlockLevel(partyFeature) < 0) { + reason.add("Party.Leveling." + StringUtils.getPrettyPartyFeatureString(partyFeature).replace(" ", "") + "_UnlockLevel should be at least 0!"); + } + } + /* Inspect command distance */ if (getInspectDistance() <= 0) { reason.add("Commands.inspect.Max_Distance should be greater than 0!"); @@ -343,13 +354,23 @@ public class Config extends AutoUpdateConfigLoader { /* PARTY SETTINGS */ public int getAutoPartyKickInterval() { return config.getInt("Party.AutoKick_Interval", 12); } public int getAutoPartyKickTime() { return config.getInt("Party.Old_Party_Member_Cutoff", 7); } - public boolean getExpShareEnabled() { return config.getBoolean("Party.Sharing.ExpShare_enabled", true); } + public double getPartyShareBonusBase() { return config.getDouble("Party.Sharing.ExpShare_bonus_base", 1.1D); } public double getPartyShareBonusIncrease() { return config.getDouble("Party.Sharing.ExpShare_bonus_increase", 0.05D); } public double getPartyShareBonusCap() { return config.getDouble("Party.Sharing.ExpShare_bonus_cap", 1.5D); } - public boolean getItemShareEnabled() { return config.getBoolean("Party.Sharing.ItemShare_enabled", true); } public double getPartyShareRange() { return config.getDouble("Party.Sharing.Range", 75.0D); } + public int getPartyLevelCap() { + int cap = config.getInt("Party.Leveling.Level_Cap", 10); + return (cap <= 0) ? Integer.MAX_VALUE : cap; + } + + public int getPartyXpCurveMultiplier() { return config.getInt("Party.Leveling.Xp_Curve_Modifier", 3); } + public boolean getPartyXpNearMembersNeeded() { return config.getBoolean("Party.Leveling.Near_Members_Needed", false); } + public boolean getPartyInformAllMembers() { return config.getBoolean("Party.Leveling.Inform_All_Party_Members_On_LevelUp", false); } + + public int getPartyFeatureUnlockLevel(PartyFeature partyFeature) { return config.getInt("Party.Leveling." + StringUtils.getPrettyPartyFeatureString(partyFeature).replace(" ", "") + "_UnlockLevel", 0); } + /* Party Teleport Settings */ public int getPTPCommandCooldown() { return config.getInt("Commands.ptp.Cooldown", 120); } public int getPTPCommandWarmup() { return config.getInt("Commands.ptp.Warmup", 5); } 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 2df1f063d..537b8ff0d 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/party/Party.java +++ b/src/main/java/com/gmail/nossr50/datatypes/party/Party.java @@ -1,12 +1,21 @@ package com.gmail.nossr50.datatypes.party; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; +import org.bukkit.Sound; import org.bukkit.entity.Player; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.config.experience.ExperienceConfig; +import com.gmail.nossr50.datatypes.experience.FormulaType; +import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.party.PartyManager; +import com.gmail.nossr50.util.EventUtils; +import com.gmail.nossr50.util.Misc; public class Party { private final LinkedHashSet members = new LinkedHashSet(); @@ -16,6 +25,8 @@ public class Party { private String password; private boolean locked; private Party ally; + private int level; + private float xp; private ShareMode xpShareMode = ShareMode.NONE; private ShareMode itemShareMode = ShareMode.NONE; @@ -34,6 +45,7 @@ public class Party { this.leader = leader; this.name = name; this.locked = true; + this.level = 0; } public Party(String leader, String name, String password) { @@ -41,6 +53,7 @@ public class Party { this.name = name; this.password = password; this.locked = true; + this.level = 0; } public Party(String leader, String name, String password, boolean locked) { @@ -48,6 +61,7 @@ public class Party { this.name = name; this.password = password; this.locked = locked; + this.level = 0; } public LinkedHashSet getMembers() { @@ -120,6 +134,93 @@ public class Party { this.ally = ally; } + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public float getXp() { + return xp; + } + + public void setXp(float xp) { + this.xp = xp; + } + + public void addXp(float xp) { + setXp(getXp() + xp); + } + + protected float levelUp() { + float xpRemoved = getXpToLevel(); + + setLevel(getLevel() + 1); + setXp(getXp() - xpRemoved); + + return xpRemoved; + } + + public int getXpToLevel() { + FormulaType formulaType = ExperienceConfig.getInstance().getFormulaType(); + return (mcMMO.getFormulaManager().getCachedXpToLevel(level, formulaType)) * (getOnlineMembers().size() + Config.getInstance().getPartyXpCurveMultiplier()); + } + + public String getXpToLevelPercentage() { + DecimalFormat percent = new DecimalFormat("##0.00%"); + return percent.format( this.getXp() / getXpToLevel()); + } + + /** + * Applies an experience gain + * + * @param xp Experience amount to add + */ + public void applyXpGain(float xp) { + if (!EventUtils.handlePartyXpGainEvent(this, xp)) { + return; + } + + if (getXp() < getXpToLevel()) { + return; + } + + int levelsGained = 0; + float xpRemoved = 0; + + while (getXp() >= getXpToLevel()) { + if (hasReachedLevelCap()) { + setXp(0); + return; + } + + xpRemoved += levelUp(); + levelsGained++; + } + + if (!EventUtils.handlePartyLevelChangeEvent(this, levelsGained, xpRemoved)) { + return; + } + + if (!Config.getInstance().getPartyInformAllMembers()) { + Player leader = mcMMO.p.getServer().getPlayer(this.leader); + leader.sendMessage(LocaleLoader.getString("Party.LevelUp", levelsGained, getLevel())); + + if (Config.getInstance().getLevelUpSoundsEnabled()) { + leader.playSound(leader.getLocation(), Sound.LEVEL_UP, Misc.LEVELUP_VOLUME, Misc.LEVELUP_PITCH); + } + return; + } + + PartyManager.informPartyMembersLevelUp(this, levelsGained, getLevel()); + } + + public boolean hasReachedLevelCap() { + return Config.getInstance().getPartyLevelCap() < getLevel() + 1; + } + public void setXpShareMode(ShareMode xpShareMode) { this.xpShareMode = xpShareMode; } diff --git a/src/main/java/com/gmail/nossr50/datatypes/party/PartyFeature.java b/src/main/java/com/gmail/nossr50/datatypes/party/PartyFeature.java new file mode 100644 index 000000000..7bc08afa9 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/datatypes/party/PartyFeature.java @@ -0,0 +1,54 @@ +package com.gmail.nossr50.datatypes.party; + +import org.bukkit.entity.Player; + +import com.gmail.nossr50.commands.party.PartySubcommandType; +import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.StringUtils; + +public enum PartyFeature { + CHAT, + TELEPORT, + ALLIANCE, + ITEM_SHARE, + XP_SHARE; + + public String getLocaleString() { + return LocaleLoader.getString("Party.Feature." + StringUtils.getPrettyPartyFeatureString(this).replace(" ", "")); + } + + public String getFeatureLockedLocaleString() { + return LocaleLoader.getString("Ability.Generic.Template.Lock", LocaleLoader.getString("Party.Feature.Locked." + StringUtils.getPrettyPartyFeatureString(this).replace(" ", ""), Config.getInstance().getPartyFeatureUnlockLevel(this))); + } + + public boolean hasPermission(Player player) { + PartySubcommandType partySubCommandType; + switch (this) { + case CHAT: + partySubCommandType = PartySubcommandType.CHAT; + break; + case TELEPORT: + partySubCommandType = PartySubcommandType.TELEPORT; + break; + case ALLIANCE: + partySubCommandType = PartySubcommandType.ALLIANCE; + break; + case ITEM_SHARE: + partySubCommandType = PartySubcommandType.ITEMSHARE; + break; + case XP_SHARE: + partySubCommandType = PartySubcommandType.XPSHARE; + break; + default: + return false; + } + + if (Permissions.partySubcommand(player, partySubCommandType)) { + return true; + } + + return false; + } +} diff --git a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java index 003f9b8c7..6de71bc78 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -514,6 +514,14 @@ public class McMMOPlayer { */ public void beginUnsharedXpGain(SkillType skill, float xp) { applyXpGain(skill, modifyXpGain(skill, xp)); + + if (party == null) { + return; + } + + if (!Config.getInstance().getPartyXpNearMembersNeeded() || !PartyManager.getNearMembers(this).isEmpty()) { + party.applyXpGain(modifyXpGain(skill, xp)); + } } /** diff --git a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyLevelUpEvent.java b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyLevelUpEvent.java new file mode 100644 index 000000000..b9b46f543 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyLevelUpEvent.java @@ -0,0 +1,54 @@ +package com.gmail.nossr50.events.party; + +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import com.gmail.nossr50.datatypes.party.Party; + +public class McMMOPartyLevelUpEvent extends Event implements Cancellable { + private Party party; + private int levelsChanged; + private boolean cancelled; + + public McMMOPartyLevelUpEvent(Party party, int levelsChanged) { + this.party = party; + this.levelsChanged = levelsChanged; + this.cancelled = false; + } + + public Party getParty() { + return party; + } + + public int getLevelsChanged() { + return levelsChanged; + } + + public void setLevelsChanged(int levelsChanged) { + this.levelsChanged = levelsChanged; + } + + /** Following are required for Cancellable **/ + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + + /** Rest of file is required boilerplate for custom events **/ + private static final HandlerList handlers = new HandlerList(); + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/src/main/java/com/gmail/nossr50/events/party/McMMOPartyXpGainEvent.java b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyXpGainEvent.java new file mode 100644 index 000000000..9dff58bdf --- /dev/null +++ b/src/main/java/com/gmail/nossr50/events/party/McMMOPartyXpGainEvent.java @@ -0,0 +1,76 @@ +package com.gmail.nossr50.events.party; + +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import com.gmail.nossr50.datatypes.party.Party; + +public class McMMOPartyXpGainEvent extends Event implements Cancellable { + private Party party; + private float xpGained; + private boolean cancelled; + + public McMMOPartyXpGainEvent(Party party, float xpGained) { + this.party = party; + this.xpGained = xpGained; + this.cancelled = false; + } + + public Party getParty() { + return party; + } + + /** + * @return The amount of experience gained in this event + */ + public float getRawXpGained() { + return xpGained; + } + + /** + * @return int amount of experience gained in this event + */ + @Deprecated + public int getXpGained() { + return (int) xpGained; + } + + /** + * @param xpGained set amount of experience gained in this event + */ + public void setRawXpGained(float xpGained) { + this.xpGained = xpGained; + } + + /** + * @param xpGained set int amount of experience gained in this event + */ + @Deprecated + public void setXpGained(int xpGained) { + this.xpGained = xpGained; + } + + /** Following are required for Cancellable **/ + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + + /** Rest of file is required boilerplate for custom events **/ + private static final HandlerList handlers = new HandlerList(); + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/src/main/java/com/gmail/nossr50/party/PartyManager.java b/src/main/java/com/gmail/nossr50/party/PartyManager.java index f3e8613da..ba1d38b06 100644 --- a/src/main/java/com/gmail/nossr50/party/PartyManager.java +++ b/src/main/java/com/gmail/nossr50/party/PartyManager.java @@ -6,6 +6,7 @@ import java.util.LinkedHashSet; import java.util.List; import org.bukkit.OfflinePlayer; +import org.bukkit.Sound; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -486,6 +487,8 @@ public final class PartyManager { party.setLeader(partiesFile.getString(partyName + ".Leader")); party.setPassword(partiesFile.getString(partyName + ".Password")); party.setLocked(partiesFile.getBoolean(partyName + ".Locked")); + party.setLevel(partiesFile.getInt(partyName + ".Level")); + party.setXp(partiesFile.getInt(partyName + ".Xp")); if (partiesFile.getString(partyName + ".Ally") != null) { hasAlly.add(party); @@ -529,6 +532,8 @@ public final class PartyManager { partiesFile.set(partyName + ".Leader", party.getLeader()); partiesFile.set(partyName + ".Password", party.getPassword()); partiesFile.set(partyName + ".Locked", party.isLocked()); + partiesFile.set(partyName + ".Level", party.getLevel()); + partiesFile.set(partyName + ".Xp", (int) party.getXp()); partiesFile.set(partyName + ".Ally", (party.getAlly() != null) ? party.getAlly().getName() : ""); partiesFile.set(partyName + ".ExpShareMode", party.getXpShareMode().toString()); partiesFile.set(partyName + ".ItemShareMode", party.getItemShareMode().toString()); @@ -599,6 +604,24 @@ public final class PartyManager { mcMMOPlayer.setItemShareModifier(10); } + /** + * Notify party members when the party levels up. + * + * @param party The concerned party + * @param levelsGained The amount of levels gained + * @param level The current party level + */ + public static void informPartyMembersLevelUp(Party party, int levelsGained, int level) { + boolean levelUpSoundsEnabled = Config.getInstance().getLevelUpSoundsEnabled(); + for (Player member : party.getOnlineMembers()) { + member.sendMessage(LocaleLoader.getString("Party.LevelUp", levelsGained, level)); + + if (levelUpSoundsEnabled) { + member.playSound(member.getLocation(), Sound.LEVEL_UP, Misc.LEVELUP_VOLUME, Misc.LEVELUP_PITCH); + } + } + } + /** * Notify party members when a player joins. * diff --git a/src/main/java/com/gmail/nossr50/util/EventUtils.java b/src/main/java/com/gmail/nossr50/util/EventUtils.java index b7426418e..913d26bf8 100644 --- a/src/main/java/com/gmail/nossr50/util/EventUtils.java +++ b/src/main/java/com/gmail/nossr50/util/EventUtils.java @@ -11,6 +11,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.PluginManager; import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.datatypes.party.Party; import com.gmail.nossr50.datatypes.player.McMMOPlayer; import com.gmail.nossr50.datatypes.player.PlayerProfile; import com.gmail.nossr50.datatypes.skills.AbilityType; @@ -24,7 +25,9 @@ import com.gmail.nossr50.events.fake.FakeBlockDamageEvent; import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent; import com.gmail.nossr50.events.fake.FakePlayerFishEvent; import com.gmail.nossr50.events.hardcore.McMMOPlayerDeathPenaltyEvent; +import com.gmail.nossr50.events.party.McMMOPartyLevelUpEvent; import com.gmail.nossr50.events.party.McMMOPartyTeleportEvent; +import com.gmail.nossr50.events.party.McMMOPartyXpGainEvent; import com.gmail.nossr50.events.skills.abilities.McMMOPlayerAbilityActivateEvent; import com.gmail.nossr50.events.skills.abilities.McMMOPlayerAbilityDeactivateEvent; import com.gmail.nossr50.events.skills.fishing.McMMOPlayerFishingTreasureEvent; @@ -108,6 +111,34 @@ public class EventUtils { mcMMOPlayer.getPartyTeleportRecord().actualizeLastUse(); } + public static boolean handlePartyXpGainEvent(Party party, float xpGained) { + McMMOPartyXpGainEvent event = new McMMOPartyXpGainEvent(party, xpGained); + mcMMO.p.getServer().getPluginManager().callEvent(event); + + boolean isCancelled = event.isCancelled(); + + if (!isCancelled) { + party.addXp(event.getRawXpGained()); + } + + return !isCancelled; + } + + public static boolean handlePartyLevelChangeEvent(Party party, int levelsChanged, float xpRemoved) { + McMMOPartyLevelUpEvent event = new McMMOPartyLevelUpEvent(party, levelsChanged); + mcMMO.p.getServer().getPluginManager().callEvent(event); + + boolean isCancelled = event.isCancelled(); + + if (isCancelled) { + + party.setLevel(party.getLevel() + levelsChanged); + party.addXp(xpRemoved); + } + + return !isCancelled; + } + public static boolean handleXpGainEvent(Player player, SkillType skill, float xpGained) { McMMOPlayerXpGainEvent event = new McMMOPlayerXpGainEvent(player, skill, xpGained); mcMMO.p.getServer().getPluginManager().callEvent(event); diff --git a/src/main/java/com/gmail/nossr50/util/StringUtils.java b/src/main/java/com/gmail/nossr50/util/StringUtils.java index 8ec6e4bba..2b382ab4d 100644 --- a/src/main/java/com/gmail/nossr50/util/StringUtils.java +++ b/src/main/java/com/gmail/nossr50/util/StringUtils.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.util; import org.bukkit.Material; import org.bukkit.entity.EntityType; +import com.gmail.nossr50.datatypes.party.PartyFeature; import com.gmail.nossr50.datatypes.skills.AbilityType; import com.gmail.nossr50.datatypes.skills.SecondaryAbility; @@ -30,7 +31,7 @@ public class StringUtils { } public static String getPrettySecondaryAbilityString(SecondaryAbility secondaryAbility) { - switch(secondaryAbility) { + switch (secondaryAbility) { case HERBALISM_DOUBLE_DROPS: case MINING_DOUBLE_DROPS: case WOODCUTTING_DOUBLE_DROPS: @@ -46,6 +47,10 @@ public class StringUtils { } } + public static String getPrettyPartyFeatureString(PartyFeature partyFeature) { + return createPrettyEnumString(partyFeature.toString()); + } + private static String createPrettyEnumString(String baseString) { String[] substrings = baseString.split("_"); String prettyString = ""; @@ -125,4 +130,5 @@ public class StringUtils { return false; } } + } diff --git a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java index b9086b973..e23b4d452 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -330,7 +330,7 @@ public final class CommandRegistrationManager { PluginCommand command = mcMMO.p.getCommand("party"); command.setDescription(LocaleLoader.getString("Commands.Description.party")); command.setPermission("mcmmo.commands.party;mcmmo.commands.party.accept;mcmmo.commands.party.create;mcmmo.commands.party.disband;" + - "mcmmo.commands.party.expshare;mcmmo.commands.party.invite;mcmmo.commands.party.itemshare;mcmmo.commands.party.join;" + + "mcmmo.commands.party.xpshare;mcmmo.commands.party.invite;mcmmo.commands.party.itemshare;mcmmo.commands.party.join;" + "mcmmo.commands.party.kick;mcmmo.commands.party.lock;mcmmo.commands.party.owner;mcmmo.commands.party.password;" + "mcmmo.commands.party.quit;mcmmo.commands.party.rename;mcmmo.commands.party.unlock"); command.setPermissionMessage(permissionsMessage); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 96fc83a22..40caf3198 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -199,15 +199,31 @@ Party: AutoKick_Interval: 12 # Any user who hasn't connected in this many days will get kicked from their party Old_Party_Member_Cutoff: 7 + # Settings for party share modes Sharing: - ExpShare_enabled: true ExpShare_bonus_base: 1.1 ExpShare_bonus_increase: 1.05 ExpShare_bonus_cap: 1.5 - ItemShare_enabled: true Range: 75.0 + # Party members level up their party by earning individual experience + # Newly created parties will not immediately have access to all the party features + # and have to level up the party a bit before they can use them. + Leveling: + Level_Cap: 10 + + # Uses the regular XP formula but is multiplied by + + Xp_Curve_Modifier: 3 + Near_Members_Needed: false + Inform_All_Party_Members_On_LevelUp: false + + Chat_UnlockLevel: 1 + Teleport_UnlockLevel: 2 + Alliance_UnlockLevel: 5 + ItemShare_UnlockLevel: 8 + XpShare_UnlockLevel: 10 + # # Settings for Abilities ### diff --git a/src/main/resources/locale/locale_cs_CZ.properties b/src/main/resources/locale/locale_cs_CZ.properties index 7d5ec0214..94c7543db 100644 --- a/src/main/resources/locale/locale_cs_CZ.properties +++ b/src/main/resources/locale/locale_cs_CZ.properties @@ -504,12 +504,12 @@ Party.Unlocked=[[GRAY]]Party je odemknuta Party.Disband=[[GRAY]]Parta se rozpadla Party.Status.Locked=[[DARK_RED]](POUZE POZV\u00c1NKY) Party.Status.Unlocked=[[DARK_GREEN]](OTEV\u0158\u00cdT) -Party.ShareType.Exp=EXP +Party.ShareType.Xp=EXP Party.ShareType.Item=P\u0158EDM\u011aT Party.ShareMode.None=\u017d\u00c1DN\u00dd Party.ShareMode.Equal=STEJN\u00dd Party.ShareMode.Random=N\u00c1HODN\u00dd -Party.ExpShare.Disabled=[[RED]]Sd\u00edlen\u00ed party zku\u0161enost\u00ed je vypnuto. +Party.XpShare.Disabled=[[RED]]Sd\u00edlen\u00ed party zku\u0161enost\u00ed je vypnuto. Party.ItemShare.Disabled=[[RED]]Sd\u00edlen\u00ed item\u016f v part\u011b je zak\u00e1zan\u00e9. Party.ItemShare.Category.Loot=Ko\u0159ist Party.ItemShare.Category.Mining=T\u011b\u017een\u00ed diff --git a/src/main/resources/locale/locale_de.properties b/src/main/resources/locale/locale_de.properties index 5fcd3ba63..d7d8e1539 100644 --- a/src/main/resources/locale/locale_de.properties +++ b/src/main/resources/locale/locale_de.properties @@ -415,7 +415,7 @@ Party.Teleport.Self=[[RED]]You can\'t teleport to yourself! Party.Teleport.Target=[[GREEN]]{0} hat sich zu dir teleportiert. Party.Unlocked=[[AQUA]]Gruppe entsperrt Party.Disband=[[GRAY]]Deine Gruppe wurde aufgel\u00f6st -Party.ShareType.Exp=Exp +Party.ShareType.Xp=Exp Party.ShareType.Item=Item Party.ShareMode.None=Nicht Party.ShareMode.Random=Zuf\u00e4llig diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 15746ddc4..5b51d757f 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -484,8 +484,10 @@ Commands.Notifications.On=Ability notifications toggled [[GREEN]]on Commands.Offline=[[RED]]This command does not work for offline players. Commands.Other=[[RED]]---[][[GREEN]]OTHER COMMANDS[[RED]][]--- Commands.Party.Header=[[RED]]-----[][[GREEN]]PARTY[[RED]][]----- -Commands.Party.Status=[[DARK_GRAY]]NAME: [[WHITE]]{0} {1} +Commands.Party.Features.Header=[[RED]]-----[][[GREEN]]FEATURES[[RED]][]----- +Commands.Party.Status=[[DARK_GRAY]]NAME: [[WHITE]]{0} {1} [[DARK_GRAY]]LEVEL: [[DARK_AQUA]]{2} Commands.Party.Status.Alliance=[[DARK_GRAY]]ALLY: [[WHITE]]{0} +Commands.Party.UnlockedFeatures=[[DARK_GRAY]]Unlocked Features: [[GRAY]][[ITALIC]]{0} Commands.Party.ShareMode=[[DARK_GRAY]]SHARE MODE: Commands.Party.ItemShare=[[GRAY]]ITEM [[DARK_AQUA]]({0}) Commands.Party.ExpShare=[[GRAY]]EXP [[DARK_AQUA]]({0}) @@ -623,13 +625,27 @@ Party.Alliance.Formed=[[GRAY]]Your party is now allies with [[GREEN]]{0} Party.Alliance.Disband=[[GRAY]]Your party is no longer allies with [[RED]]{0} Party.Status.Locked=[[DARK_RED]](INVITE-ONLY) Party.Status.Unlocked=[[DARK_GREEN]](OPEN) -Party.ShareType.Exp=EXP +Party.LevelUp=[[YELLOW]]Party level increased by {0}. Total ({1}) +Party.Feature.Chat=Party Chat +Party.Feature.Teleport=Party Teleport +Party.Feature.Alliance=Alliances +Party.Feature.ItemShare=Item Sharing +Party.Feature.XpShare=XP Sharing +Party.Feature.Locked.Chat=LOCKED UNTIL {0}+ (PARTY CHAT) +Party.Feature.Locked.Teleport=LOCKED UNTIL {0}+ (PARTY TELEPORT) +Party.Feature.Locked.Alliance=LOCKED UNTIL {0}+ (ALLIANCES) +Party.Feature.Locked.ItemShare=LOCKED UNTIL {0}+ (ITEM SHARING) +Party.Feature.Locked.XpShare=LOCKED UNTIL {0}+ (XP SHARING) +Party.Feature.Disabled.1=[[RED]]Party chat is not unlocked yet. +Party.Feature.Disabled.2=[[RED]]Party teleport is not unlocked yet. +Party.Feature.Disabled.3=[[RED]]Party alliances are not unlocked yet. +Party.Feature.Disabled.4=[[RED]]Party item sharing is not unlocked yet. +Party.Feature.Disabled.5=[[RED]]Party XP sharing is not unlocked yet. +Party.ShareType.Xp=XP Party.ShareType.Item=ITEM Party.ShareMode.None=NONE Party.ShareMode.Equal=EQUAL Party.ShareMode.Random=RANDOM -Party.ExpShare.Disabled=[[RED]]Party experience sharing is disabled. -Party.ItemShare.Disabled=[[RED]]Party item sharing is disabled. Party.ItemShare.Category.Loot=Loot Party.ItemShare.Category.Mining=Mining Party.ItemShare.Category.Herbalism=Herbalism diff --git a/src/main/resources/locale/locale_es.properties b/src/main/resources/locale/locale_es.properties index 63d1cc359..602b554c7 100644 --- a/src/main/resources/locale/locale_es.properties +++ b/src/main/resources/locale/locale_es.properties @@ -517,12 +517,12 @@ Party.Unlocked=[[GRAY]]El grupo est\u00e1 desbloqueado Party.Disband=[[GRAY]]El grupo ha sido eliminado Party.Status.Locked=[[DARK_RED]](Solo para invitados) Party.Status.Unlocked=[[DARK_GREEN]](Abierto) -Party.ShareType.Exp=EXP +Party.ShareType.Xp=EXP Party.ShareType.Item=OBJETO Party.ShareMode.None=NINGUNO Party.ShareMode.Equal=IGUAL Party.ShareMode.Random=ALEATORIO -Party.ExpShare.Disabled=[[RED]]El grupo no comparte la experiencia. +Party.XpShare.Disabled=[[RED]]El grupo no comparte la experiencia. Party.ItemShare.Disabled=[[RED]]El grupo no comparte los objetos. Party.ItemShare.Category.Loot=Saquear Party.ItemShare.Category.Mining=Mineria diff --git a/src/main/resources/locale/locale_it.properties b/src/main/resources/locale/locale_it.properties index 132e48281..15e1a3581 100644 --- a/src/main/resources/locale/locale_it.properties +++ b/src/main/resources/locale/locale_it.properties @@ -504,12 +504,12 @@ Party.Unlocked=[[GRAY]]Party sbloccato. Party.Disband=[[GRAY]]La compagnia \u00e8 stata sciolta Party.Status.Locked=[[DARK_RED]](SOLO SU INVITO) Party.Status.Unlocked=[[DARK_GREEN]](APERTA) -Party.ShareType.Exp=ESPERIENZA +Party.ShareType.Xp=ESPERIENZA Party.ShareType.Item=OGGETTI Party.ShareMode.None=NESSUNA Party.ShareMode.Equal=EQUA Party.ShareMode.Random=CASUALE -Party.ExpShare.Disabled=[[RED]]La condivisione di esperienza di compagnia \u00e8 disabilitata. +Party.XpShare.Disabled=[[RED]]La condivisione di esperienza di compagnia \u00e8 disabilitata. Party.ItemShare.Disabled=[[RED]]La condivisione di oggetti di compagnia \u00e8 disabilitata. Party.ItemShare.Category.Loot=Bottino Party.ItemShare.Category.Mining=Estrazione diff --git a/src/main/resources/locale/locale_ko.properties b/src/main/resources/locale/locale_ko.properties index 9b6689e18..1769da032 100644 --- a/src/main/resources/locale/locale_ko.properties +++ b/src/main/resources/locale/locale_ko.properties @@ -540,12 +540,12 @@ Party.Unlocked=[[GRAY]]\ud30c\ud2f0\uac00 \uc7a0\uae08\ud574\uc81c \ub418\uc5c8\ Party.Disband=[[GRAY]]\uadf8 \ud30c\ud2f0\uac00 \ud574\uccb4\ub418\uc5c8\uc2b5\ub2c8\ub2e4 Party.Status.Locked=[[DARK_RED]](\uc624\uc9c1-\ucd08\ub300\ub9cc) Party.Status.Unlocked=[[DARK_GREEN]](\uc5f4\ub9bc) -Party.ShareType.Exp=EXP +Party.ShareType.Xp=EXP Party.ShareType.Item=\uc544\uc774\ud15c Party.ShareMode.None=\uc5c6\uc74c Party.ShareMode.Equal=\uade0\ub4f1 Party.ShareMode.Random=\ubb34\uc791\uc704 -Party.ExpShare.Disabled=[[RED]]\ud30c\ud2f0 \uacbd\ud5d8\uce58 \uacf5\uc720\uac00 \ube44\ud65c\uc131\ud654 \ub418\uc5c8\uc2b5\ub2c8\ub2e4. +Party.XpShare.Disabled=[[RED]]\ud30c\ud2f0 \uacbd\ud5d8\uce58 \uacf5\uc720\uac00 \ube44\ud65c\uc131\ud654 \ub418\uc5c8\uc2b5\ub2c8\ub2e4. Party.ItemShare.Disabled=[[RED]]\ud30c\ud2f0 \uc544\uc774\ud15c \uacf5\uc720\uac00 \ube44\ud65c\uc131\ud654 \ub418\uc5c8\uc2b5\ub2c8\ub2e4. Party.ItemShare.Category.Loot=\uac15\ud0c8 Party.ItemShare.Category.Mining=\ucc44\uad11 diff --git a/src/main/resources/locale/locale_nl.properties b/src/main/resources/locale/locale_nl.properties index 2fb6d9eb8..212896130 100644 --- a/src/main/resources/locale/locale_nl.properties +++ b/src/main/resources/locale/locale_nl.properties @@ -348,12 +348,12 @@ Party.Unlocked=[[GRAY]]Groep is ontgrendeld Party.Disband=[[GRAY]] De partij werd ontbonden Party.Status.Locked=[[DARK_RED]](ALLEEN-UITNODIGING) Party.Status.Unlocked=[[DARK_GREEN]](OPEN) -Party.ShareType.Exp=EXP +Party.ShareType.Xp=EXP Party.ShareType.Item=ITEM Party.ShareMode.None=NIKS Party.ShareMode.Equal=GELIJK Party.ShareMode.Random=WILLEKEURIG -Party.ExpShare.Disabled=[[RED]]Groep experience delen in uitgeschakeld. +Party.XpShare.Disabled=[[RED]]Groep experience delen in uitgeschakeld. Party.ItemShare.Disabled=[[RED]]Groeps item delen is uitgezet. Party.ItemShare.Category.Loot=Buit Party.ItemShare.Category.Mining=Mijnbouw diff --git a/src/main/resources/locale/locale_pl.properties b/src/main/resources/locale/locale_pl.properties index b3d1d767b..512e68fba 100644 --- a/src/main/resources/locale/locale_pl.properties +++ b/src/main/resources/locale/locale_pl.properties @@ -470,7 +470,7 @@ Party.Join.Self=[[RED]]Nie mozesz dolaczyc do samego siebie! Party.Unlocked=[[GRAY]]Grupa jest otwarta dla wszystkich. Party.Disband=[[GRAY]]Druzyna zostala rozwiazana Party.Status.Locked=[[DARK_RED]](TYLKO NA ZAPROSZENIE) -Party.ShareType.Exp=EXP +Party.ShareType.Xp=EXP Party.ShareType.Item=PRZEDMIOTOWY Party.ShareMode.Equal=R\u00d3WNY Party.ShareMode.Random=LOSOWY diff --git a/src/main/resources/locale/locale_ru.properties b/src/main/resources/locale/locale_ru.properties index b3df647e0..9ab36b82f 100644 --- a/src/main/resources/locale/locale_ru.properties +++ b/src/main/resources/locale/locale_ru.properties @@ -541,12 +541,12 @@ Party.Unlocked=[[GRAY]]\u0413\u0440\u0443\u043f\u043f\u0430 \u0440\u0430\u0437\u Party.Disband=[[GRAY]\u0413\u0440\u0443\u043f\u043f\u0430 \u0431\u044b\u043b\u0430 \u0440\u0430\u0441\u043f\u0443\u0449\u0435\u043d\u0430 Party.Status.Locked=[[DARK_RED]](\u0422\u041e\u041b\u042c\u041a\u041e \u041f\u041e \u041f\u0420\u0418\u0413\u041b\u0410\u0428\u0415\u041d\u0418\u042e) Party.Status.Unlocked=[[DARK_GREEN]](\u041e\u0422\u041a\u0420\u042b\u0422\u041e) -Party.ShareType.Exp=\u041e\u041f\u042b\u0422 +Party.ShareType.Xp=\u041e\u041f\u042b\u0422 Party.ShareType.Item=\u041f\u0420\u0415\u0414\u041c\u0415\u0422 Party.ShareMode.None=\u041d\u0418\u0427\u0415\u0413\u041e Party.ShareMode.Equal=\u0420\u0410\u0412\u041d\u042b\u0419 Party.ShareMode.Random=\u0421\u041b\u0423\u0427\u0410\u0419\u041d\u041e -Party.ExpShare.Disabled=[[RED]]\u0414\u0435\u043b\u0435\u0436 \u043e\u043f\u044b\u0442\u0430 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d. +Party.XpShare.Disabled=[[RED]]\u0414\u0435\u043b\u0435\u0436 \u043e\u043f\u044b\u0442\u0430 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d. Party.ItemShare.Disabled=[[RED]]\u0414\u0435\u043b\u0435\u0436 \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u043e\u0432 \u0432 \u0433\u0440\u0443\u043f\u043f\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d. Party.ItemShare.Category.Loot=\u0414\u043e\u0431\u044b\u0447\u0430 Party.ItemShare.Category.Mining=\u0428\u0430\u0445\u0442\u0451\u0440\u0441\u0442\u0432\u043e diff --git a/src/main/resources/locale/locale_th_TH.properties b/src/main/resources/locale/locale_th_TH.properties index f112d83d4..ad365d70d 100644 --- a/src/main/resources/locale/locale_th_TH.properties +++ b/src/main/resources/locale/locale_th_TH.properties @@ -501,12 +501,12 @@ Party.Unlocked=[[GRAY]]Party \u0e16\u0e39\u0e01\u0e1b\u0e25\u0e14\u0e25\u0e47\u0 Party.Disband=[[GRAY]]Party \u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14\u0e44\u0e27\u0e49 Party.Status.Locked=[[DARK_RED]](\u0e40\u0e0a\u0e34\u0e0d\u0e2d\u0e22\u0e48\u0e32\u0e07\u0e40\u0e14\u0e35\u0e22\u0e27) Party.Status.Unlocked=[[DARK_GREEN]](\u0e40\u0e1b\u0e34\u0e14) -Party.ShareType.Exp=EXP +Party.ShareType.Xp=EXP Party.ShareType.Item=\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07 Party.ShareMode.None=NONE Party.ShareMode.Equal=\u0e40\u0e17\u0e48\u0e32\u0e01\u0e31\u0e19 Party.ShareMode.Random=\u0e2a\u0e38\u0e48\u0e21 -Party.ExpShare.Disabled=[[RED]]Party \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14. +Party.XpShare.Disabled=[[RED]]Party \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e1b\u0e23\u0e30\u0e2a\u0e1a\u0e01\u0e32\u0e23\u0e13\u0e4c\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14. Party.ItemShare.Disabled=[[RED]]Party \u0e41\u0e1a\u0e48\u0e07\u0e1b\u0e31\u0e19\u0e2a\u0e34\u0e48\u0e07\u0e02\u0e2d\u0e07\u0e16\u0e39\u0e01\u0e1b\u0e34\u0e14. Party.ItemShare.Category.Loot=Loot Party.ItemShare.Category.Mining=Mining diff --git a/src/main/resources/locale/locale_zh_CN.properties b/src/main/resources/locale/locale_zh_CN.properties index c6bf28baa..0ad82595d 100644 --- a/src/main/resources/locale/locale_zh_CN.properties +++ b/src/main/resources/locale/locale_zh_CN.properties @@ -528,12 +528,12 @@ Party.Unlocked=[[GRAY]]\u961f\u4f0d\u5df2\u89e3\u9501 Party.Disband=[[GRAY]]\u961f\u4f0d\u5df2\u89e3\u6563 Party.Status.Locked=[[DARK_RED]](\u4ec5\u9080\u8bf7) Party.Status.Unlocked=[[DARK_GREEN]](\u5f00\u542f) -Party.ShareType.Exp=\u7ecf\u9a8c +Party.ShareType.Xp=\u7ecf\u9a8c Party.ShareType.Item=\u7269\u54c1 Party.ShareMode.None=\u65e0 Party.ShareMode.Equal=\u5747\u5206 Party.ShareMode.Random=\u968f\u673a -Party.ExpShare.Disabled=[[RED]]\u961f\u4f0d\u7ecf\u9a8c\u5171\u4eab\u5df2\u7981\u7528 +Party.XpShare.Disabled=[[RED]]\u961f\u4f0d\u7ecf\u9a8c\u5171\u4eab\u5df2\u7981\u7528 Party.ItemShare.Disabled=[[RED]]\u961f\u4f0d\u7269\u54c1\u5206\u914d\u5df2\u5173\u95ed Party.ItemShare.Category.Loot=\u63a0\u593a Party.ItemShare.Category.Mining=\u6316\u77ff diff --git a/src/main/resources/locale/locale_zh_TW.properties b/src/main/resources/locale/locale_zh_TW.properties index 6d8d16818..582c25772 100644 --- a/src/main/resources/locale/locale_zh_TW.properties +++ b/src/main/resources/locale/locale_zh_TW.properties @@ -541,12 +541,12 @@ Party.Unlocked=[[GRAY]]\u968a\u4f0d\u5df2\u89e3\u9396! Party.Disband=[[GRAY]]\u968a\u4f0d\u5df2\u89e3\u6563 Party.Status.Locked=[[DARK_RED]](\u53ea\u53ef\u9080\u8acb) Party.Status.Unlocked=[[DARK_GREEN]](\u958b\u555f) -Party.ShareType.Exp=\u7d93\u9a57\u503c +Party.ShareType.Xp=\u7d93\u9a57\u503c Party.ShareType.Item=\u7269\u54c1 Party.ShareMode.None=\u7121 Party.ShareMode.Equal=\u5e73\u5206 Party.ShareMode.Random=\u96a8\u6a5f -Party.ExpShare.Disabled=[[RED]]\u968a\u4f0d\u7d93\u9a57\u5171\u4eab\u5df2\u505c\u7528. +Party.XpShare.Disabled=[[RED]]\u968a\u4f0d\u7d93\u9a57\u5171\u4eab\u5df2\u505c\u7528. Party.ItemShare.Disabled=[[RED]]\u968a\u4f0d\u7684\u7269\u54c1\u5206\u4eab\u95dc\u9589. Party.ItemShare.Category.Loot=\u62fe\u53d6 Party.ItemShare.Category.Mining=\u6316\u7926 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 59797775d..8fce9c725 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -924,7 +924,7 @@ permissions: mcmmo.commands.party.chat: true mcmmo.commands.party.create: true mcmmo.commands.party.disband: true - mcmmo.commands.party.expshare: true + mcmmo.commands.party.xpshare: true mcmmo.commands.party.help: true mcmmo.commands.party.info: true mcmmo.commands.party.invite: true @@ -951,8 +951,8 @@ permissions: description: Allows access to the party create command mcmmo.commands.party.disband: description: Allows access to the party disband command - mcmmo.commands.party.expshare: - description: Allows access to the party expshare command + mcmmo.commands.party.xpshare: + description: Allows access to the party xpshare command mcmmo.commands.party.help: description: Allows access to the party help command mcmmo.commands.party.info: