mirror of
https://github.com/mcMMO-Dev/mcMMO.git
synced 2024-11-22 13:16:45 +01:00
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:
parent
c729297615
commit
818962e668
@ -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
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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:
|
||||
|
@ -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);
|
||||
if (!party.hasReachedLevelCap()) {
|
||||
status.append(" (" + party.getXpToLevelPercentage() + ")");
|
||||
}
|
||||
else if (member != null) {
|
||||
memberList.append(ChatColor.WHITE);
|
||||
|
||||
player.sendMessage(status.toString());
|
||||
}
|
||||
|
||||
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 {
|
||||
memberList.append(ChatColor.GRAY);
|
||||
lockedPartyFeatures.add(partyFeature.getFeatureLockedLocaleString());
|
||||
}
|
||||
}
|
||||
|
||||
memberList.append(memberName).append(" ");
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Party.UnlockedFeatures", unlockedPartyFeatures.isEmpty() ? "None" : unlockedPartyFeatures));
|
||||
|
||||
for (String message : lockedPartyFeatures) {
|
||||
player.sendMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
return memberList.toString();
|
||||
private boolean isUnlockedFeature(Party party, PartyFeature partyFeature) {
|
||||
if (party.getLevel() < Config.getInstance().getPartyFeatureUnlockLevel(partyFeature)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
private void displayShareModeInfo(Party party, Player player) {
|
||||
boolean xpShareEnabled = Config.getInstance().getExpShareEnabled();
|
||||
boolean itemShareEnabled = Config.getInstance().getItemShareEnabled();
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
@ -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());
|
||||
|
@ -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;
|
||||
|
@ -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);
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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); }
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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.
|
||||
*
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
###
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user