Added party levels

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
This commit is contained in:
TfT_02 2013-11-11 17:42:57 +01:00
parent c729297615
commit 818962e668
34 changed files with 561 additions and 89 deletions

View File

@ -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

View File

@ -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());
}

View File

@ -26,7 +26,7 @@ import com.google.common.collect.ImmutableList;
public class PartyCommand implements TabExecutor {
private static final List<String> PARTY_SUBCOMMANDS;
private static final List<String> EXPSHARE_COMPLETIONS = ImmutableList.of("none", "equal");
private static final List<String> XPSHARE_COMPLETIONS = ImmutableList.of("none", "equal");
private static final List<String> 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<String> playerNames = UserManager.getPlayerNames();
return StringUtil.copyPartialMatches(args[1], playerNames, new ArrayList<String>(playerNames.size()));
case EXPSHARE:
return StringUtil.copyPartialMatches(args[1], EXPSHARE_COMPLETIONS, new ArrayList<String>(EXPSHARE_COMPLETIONS.size()));
case XPSHARE:
return StringUtil.copyPartialMatches(args[1], XPSHARE_COMPLETIONS, new ArrayList<String>(XPSHARE_COMPLETIONS.size()));
case ITEMSHARE:
return StringUtil.copyPartialMatches(args[1], ITEMSHARE_COMPLETIONS, new ArrayList<String>(ITEMSHARE_COMPLETIONS.size()));
case LOCK:

View File

@ -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<String> unlockedPartyFeatures = new ArrayList<String>();
List<String> lockedPartyFeatures = new ArrayList<String>();
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<Player> 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<Player> 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();
}
}

View File

@ -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());

View File

@ -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;

View File

@ -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", "<NONE | EQUAL>"));
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "xpshare", "<NONE | EQUAL>"));
}
return true;
default:
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "expshare", "<NONE | EQUAL>"));
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "xpshare", "<NONE | EQUAL>"));
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);

View File

@ -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;

View File

@ -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;

View File

@ -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();

View File

@ -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); }

View File

@ -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<String> members = new LinkedHashSet<String>();
@ -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<String> 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;
}

View File

@ -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;
}
}

View File

@ -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));
}
}
/**

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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.
*

View File

@ -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);

View File

@ -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;
}
}
}

View File

@ -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);

View File

@ -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 <amount of party members> + <Xp_Curve_Modifier>
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
###

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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: