mirror of
https://github.com/mcMMO-Dev/mcMMO.git
synced 2025-06-28 03:34:43 +02:00
Formatting cleanup from the scoreboard update. Also handle skill permissions differently.
This commit is contained in:
@ -3,6 +3,8 @@ package com.gmail.nossr50.util;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.EntityType;
|
||||
|
||||
import com.gmail.nossr50.datatypes.skills.AbilityType;
|
||||
|
||||
public class StringUtils {
|
||||
/**
|
||||
* Gets a capitalized version of the target string.
|
||||
@ -22,6 +24,10 @@ public class StringUtils {
|
||||
return createPrettyEnumString(entity.toString());
|
||||
}
|
||||
|
||||
public static String getPrettyAbilityString(AbilityType ability) {
|
||||
return createPrettyEnumString(ability.toString());
|
||||
}
|
||||
|
||||
private static String createPrettyEnumString(String baseString) {
|
||||
String[] substrings = baseString.split("_");
|
||||
String prettyString = "";
|
||||
|
@ -60,7 +60,7 @@ public final class CommandRegistrationManager {
|
||||
private static void registerSkillCommands() {
|
||||
for (SkillType skill : SkillType.values()) {
|
||||
String commandName = skill.toString().toLowerCase();
|
||||
String localizedName = skill.getSkillName().toLowerCase();
|
||||
String localizedName = skill.getName().toLowerCase();
|
||||
|
||||
PluginCommand command;
|
||||
|
||||
@ -385,7 +385,8 @@ public final class CommandRegistrationManager {
|
||||
command.setDescription("Change the current mcMMO scoreboard being displayed"); //TODO: Localize
|
||||
command.setPermission("mcmmo.commands.mcscoreboard");
|
||||
command.setPermissionMessage(permissionsMessage);
|
||||
command.setUsage(LocaleLoader.getString("Commands.Usage.1", "mcscoreboard", "<CLEAR | KEEP | TIME>"));
|
||||
command.setUsage(LocaleLoader.getString("Commands.Usage.1", "mcscoreboard", "<CLEAR | KEEP>"));
|
||||
command.setUsage(command.getUsage() + "\n" + LocaleLoader.getString("Commands.Usage.2", "mcscoreboard", "time", "<seconds>"));
|
||||
command.setExecutor(new McscoreboardCommand());
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,6 @@ package com.gmail.nossr50.util.commands;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -14,7 +13,6 @@ import com.gmail.nossr50.datatypes.player.PlayerProfile;
|
||||
import com.gmail.nossr50.datatypes.skills.SkillType;
|
||||
import com.gmail.nossr50.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.util.Misc;
|
||||
import com.gmail.nossr50.util.Permissions;
|
||||
import com.gmail.nossr50.util.StringUtils;
|
||||
import com.gmail.nossr50.util.player.UserManager;
|
||||
import com.gmail.nossr50.util.skills.SkillUtils;
|
||||
@ -98,9 +96,10 @@ public final class CommandUtils {
|
||||
return true;
|
||||
}
|
||||
|
||||
OfflinePlayer player = Bukkit.getOfflinePlayer(playerName);
|
||||
if (!player.hasPlayedBefore()) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.DoesNotExist"));
|
||||
PlayerProfile profile = new PlayerProfile(playerName, false);
|
||||
|
||||
if (unloadedProfile(sender, profile)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.DoesNotExist"));
|
||||
@ -208,7 +207,7 @@ public final class CommandUtils {
|
||||
displayData.add(header);
|
||||
|
||||
for (SkillType skill : skillGroup) {
|
||||
if (Permissions.skillEnabled(inspect, skill)) {
|
||||
if (skill.getPermissions(inspect)) {
|
||||
displayData.add(displaySkill(profile, skill));
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
package com.gmail.nossr50.util.scoreboards;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Random;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -48,88 +45,82 @@ public class ScoreboardManager {
|
||||
static final OfflinePlayer LABEL_ABILITY_COOLDOWN = getOfflinePlayer(LocaleLoader.getString("Scoreboard.Misc.Cooldown"));
|
||||
static final OfflinePlayer LABEL_OVERALL = getOfflinePlayer(LocaleLoader.getString("Scoreboard.Misc.Overall"));
|
||||
|
||||
static final Map<SkillType, OfflinePlayer> skillLabels;
|
||||
static final Map<SkillType, OfflinePlayer> skillLabels;
|
||||
static final Map<AbilityType, OfflinePlayer> abilityLabelsColored;
|
||||
static final Map<AbilityType, OfflinePlayer> abilityLabelsSkill;
|
||||
|
||||
static {
|
||||
ImmutableMap.Builder<SkillType, OfflinePlayer> b = ImmutableMap.builder();
|
||||
ImmutableMap.Builder<AbilityType, OfflinePlayer> c = ImmutableMap.builder();
|
||||
ImmutableMap.Builder<AbilityType, OfflinePlayer> d = ImmutableMap.builder();
|
||||
ImmutableMap.Builder<SkillType, OfflinePlayer> skillLabelBuilder = ImmutableMap.builder();
|
||||
ImmutableMap.Builder<AbilityType, OfflinePlayer> abilityLabelBuilder = ImmutableMap.builder();
|
||||
ImmutableMap.Builder<AbilityType, OfflinePlayer> abilityLabelSkillBuilder = ImmutableMap.builder();
|
||||
|
||||
if (Config.getInstance().getScoreboardRainbows()) {
|
||||
Random shuffler = new Random(Bukkit.getWorlds().get(0).getSeed());
|
||||
List<ChatColor> colors = Arrays.asList(
|
||||
ChatColor.WHITE,
|
||||
ChatColor.YELLOW,
|
||||
ChatColor.LIGHT_PURPLE,
|
||||
ChatColor.RED,
|
||||
ChatColor.AQUA,
|
||||
ChatColor.GREEN,
|
||||
ChatColor.DARK_GRAY,
|
||||
ChatColor.BLUE,
|
||||
ChatColor.DARK_PURPLE,
|
||||
ChatColor.DARK_RED,
|
||||
ChatColor.DARK_AQUA,
|
||||
ChatColor.DARK_GREEN,
|
||||
ChatColor.DARK_BLUE
|
||||
);
|
||||
Collections.shuffle(colors, shuffler);
|
||||
List<ChatColor> colors = new ArrayList<ChatColor>();
|
||||
|
||||
for (ChatColor color : ChatColor.values()) {
|
||||
if (color.isColor()) {
|
||||
colors.add(color);
|
||||
}
|
||||
}
|
||||
|
||||
Collections.shuffle(colors, Misc.getRandom());
|
||||
|
||||
int i = 0;
|
||||
for (SkillType type : SkillType.values()) {
|
||||
// Include child skills
|
||||
b.put(type, getOfflinePlayer(colors.get(i) + type.getSkillName()));
|
||||
skillLabelBuilder.put(type, getOfflinePlayer(colors.get(i) + type.getName()));
|
||||
|
||||
if (type.getAbility() != null) {
|
||||
// the toString is the properly formatted verison for abilities
|
||||
c.put(type.getAbility(), getOfflinePlayer(colors.get(i) + type.getAbility().getAbilityName()));
|
||||
abilityLabelBuilder.put(type.getAbility(), getOfflinePlayer(colors.get(i) + type.getAbility().getName()));
|
||||
|
||||
if (type == SkillType.MINING) {
|
||||
c.put(AbilityType.BLAST_MINING, getOfflinePlayer(colors.get(i) + AbilityType.BLAST_MINING.getAbilityName()));
|
||||
abilityLabelBuilder.put(AbilityType.BLAST_MINING, getOfflinePlayer(colors.get(i) + AbilityType.BLAST_MINING.getName()));
|
||||
}
|
||||
}
|
||||
|
||||
if (++i == colors.size()) i = 0;
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (SkillType type : SkillType.values()) {
|
||||
// Include child skills
|
||||
b.put(type, getOfflinePlayer(ChatColor.GREEN + type.getSkillName()));
|
||||
skillLabelBuilder.put(type, getOfflinePlayer(ChatColor.GREEN + type.getName()));
|
||||
|
||||
if (type.getAbility() != null) {
|
||||
// the toString is the properly formatted verison for abilities
|
||||
c.put(type.getAbility(), getOfflinePlayerDots(ChatColor.AQUA + type.getAbility().getAbilityName()));
|
||||
abilityLabelBuilder.put(type.getAbility(), getOfflinePlayerDots(ChatColor.AQUA + type.getAbility().getName()));
|
||||
|
||||
if (type == SkillType.MINING) {
|
||||
c.put(AbilityType.BLAST_MINING, getOfflinePlayerDots(ChatColor.AQUA + AbilityType.BLAST_MINING.getAbilityName()));
|
||||
abilityLabelBuilder.put(AbilityType.BLAST_MINING, getOfflinePlayerDots(ChatColor.AQUA + AbilityType.BLAST_MINING.getName()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (AbilityType type : AbilityType.NORMAL_ABILITIES) {
|
||||
if (type == AbilityType.BLAST_MINING) {
|
||||
// Special-case: get a different color
|
||||
d.put(AbilityType.BLAST_MINING, getOfflinePlayerDots(ChatColor.BLUE + AbilityType.BLAST_MINING.getAbilityName()));
|
||||
}
|
||||
else {
|
||||
d.put(type, getOfflinePlayerDots(ChatColor.AQUA + type.getAbilityName()));
|
||||
}
|
||||
abilityLabelSkillBuilder.put(type, getOfflinePlayerDots((type == AbilityType.BLAST_MINING ? ChatColor.BLUE : ChatColor.AQUA) + type.getName()));
|
||||
}
|
||||
|
||||
skillLabels = b.build();
|
||||
abilityLabelsColored = c.build();
|
||||
abilityLabelsSkill = d.build();
|
||||
skillLabels = skillLabelBuilder.build();
|
||||
abilityLabelsColored = abilityLabelBuilder.build();
|
||||
abilityLabelsSkill = abilityLabelSkillBuilder.build();
|
||||
}
|
||||
|
||||
private static List<String> dirtyPowerLevels = new ArrayList<String>();
|
||||
|
||||
private static OfflinePlayer getOfflinePlayer(String name) {
|
||||
if (name.length() > 16) {
|
||||
name = name.substring(0, 16);
|
||||
}
|
||||
return Bukkit.getOfflinePlayer(name);
|
||||
return getOfflinePlayer(name, false);
|
||||
}
|
||||
|
||||
private static OfflinePlayer getOfflinePlayerDots(String name) {
|
||||
return getOfflinePlayer(name, true);
|
||||
}
|
||||
|
||||
private static OfflinePlayer getOfflinePlayer(String name, boolean useDots) {
|
||||
if (name.length() > 16) {
|
||||
name = name.substring(0, 16 - 2) + "..";
|
||||
name = useDots ? name.substring(0, 14) + ".." : name.substring(0, 16);
|
||||
}
|
||||
return Bukkit.getOfflinePlayer(name);
|
||||
|
||||
return mcMMO.p.getServer().getOfflinePlayer(name);
|
||||
}
|
||||
|
||||
public enum SidebarType {
|
||||
@ -144,14 +135,15 @@ public class ScoreboardManager {
|
||||
// **** Listener call-ins **** //
|
||||
|
||||
// Called by PlayerJoinEvent listener
|
||||
public static void setupPlayer(Player p) {
|
||||
PLAYER_SCOREBOARDS.put(p.getName(), ScoreboardWrapper.create(p));
|
||||
dirtyPowerLevels.add(p.getName());
|
||||
public static void setupPlayer(Player player) {
|
||||
PLAYER_SCOREBOARDS.put(player.getName(), ScoreboardWrapper.create(player));
|
||||
dirtyPowerLevels.add(player.getName());
|
||||
}
|
||||
|
||||
// Called by PlayerQuitEvent listener
|
||||
public static void teardownPlayer(Player p) {
|
||||
ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.remove(p.getName());
|
||||
public static void teardownPlayer(Player player) {
|
||||
ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.remove(player.getName());
|
||||
|
||||
if (wrapper.revertTask != null) {
|
||||
wrapper.revertTask.cancel();
|
||||
}
|
||||
@ -159,14 +151,15 @@ public class ScoreboardManager {
|
||||
|
||||
// Called in onDisable()
|
||||
public static void teardownAll() {
|
||||
for (Player p : Bukkit.getOnlinePlayers()) {
|
||||
teardownPlayer(p);
|
||||
for (Player player : mcMMO.p.getServer().getOnlinePlayers()) {
|
||||
teardownPlayer(player);
|
||||
}
|
||||
}
|
||||
|
||||
// Called by ScoreboardWrapper when its Player logs off and an action tries to be performed
|
||||
public static void cleanup(ScoreboardWrapper wrapper) {
|
||||
PLAYER_SCOREBOARDS.remove(wrapper.playerName);
|
||||
|
||||
if (wrapper.revertTask != null) {
|
||||
wrapper.revertTask.cancel();
|
||||
}
|
||||
@ -175,16 +168,18 @@ public class ScoreboardManager {
|
||||
// Called by internal level-up event listener
|
||||
public static void handleLevelUp(Player player, SkillType skill) {
|
||||
// Selfboards
|
||||
ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName());
|
||||
if ((wrapper.isSkillScoreboard() && wrapper.targetSkill == skill) || (wrapper.isStatsScoreboard()) && wrapper.isBoardShown()) {
|
||||
wrapper.doSidebarUpdateSoon();
|
||||
ScoreboardWrapper selfboardWrapper = PLAYER_SCOREBOARDS.get(player.getName());
|
||||
|
||||
if ((selfboardWrapper.isSkillScoreboard() && selfboardWrapper.targetSkill == skill) || (selfboardWrapper.isStatsScoreboard()) && selfboardWrapper.isBoardShown()) {
|
||||
selfboardWrapper.doSidebarUpdateSoon();
|
||||
}
|
||||
|
||||
// Otherboards
|
||||
String playerName = player.getName();
|
||||
for (ScoreboardWrapper w : PLAYER_SCOREBOARDS.values()) {
|
||||
if (w.isStatsScoreboard() && playerName.equals(w.targetPlayer) && wrapper.isBoardShown()) {
|
||||
wrapper.doSidebarUpdateSoon();
|
||||
|
||||
for (ScoreboardWrapper wrapper : PLAYER_SCOREBOARDS.values()) {
|
||||
if (wrapper.isStatsScoreboard() && playerName.equals(wrapper.targetPlayer) && selfboardWrapper.isBoardShown()) {
|
||||
selfboardWrapper.doSidebarUpdateSoon();
|
||||
}
|
||||
}
|
||||
|
||||
@ -201,6 +196,7 @@ public class ScoreboardManager {
|
||||
public static void handleXp(Player player, SkillType skill) {
|
||||
// Selfboards
|
||||
ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName());
|
||||
|
||||
if (wrapper.isSkillScoreboard() && wrapper.targetSkill == skill && wrapper.isBoardShown()) {
|
||||
wrapper.doSidebarUpdateSoon();
|
||||
}
|
||||
@ -210,6 +206,7 @@ public class ScoreboardManager {
|
||||
public static void cooldownUpdate(Player player, SkillType skill) {
|
||||
// Selfboards
|
||||
ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName());
|
||||
|
||||
if ((wrapper.isCooldownScoreboard() || wrapper.isSkillScoreboard() && wrapper.targetSkill == skill) && wrapper.isBoardShown()) {
|
||||
wrapper.doSidebarUpdateSoon();
|
||||
}
|
||||
@ -267,8 +264,8 @@ public class ScoreboardManager {
|
||||
changeScoreboard(wrapper, Config.getInstance().getCooldownScoreboardTime());
|
||||
}
|
||||
|
||||
public static void showPlayerRankScoreboard(Player bukkitPlayer, Map<SkillType, Integer> rank) {
|
||||
ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(bukkitPlayer.getName());
|
||||
public static void showPlayerRankScoreboard(Player player, Map<SkillType, Integer> rank) {
|
||||
ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName());
|
||||
|
||||
wrapper.setOldScoreboard();
|
||||
wrapper.setTypeSelfRank();
|
||||
@ -277,8 +274,8 @@ public class ScoreboardManager {
|
||||
changeScoreboard(wrapper, Config.getInstance().getRankScoreboardTime());
|
||||
}
|
||||
|
||||
public static void showPlayerRankScoreboardOthers(Player bukkitPlayer, String targetName, Map<SkillType, Integer> rank) {
|
||||
ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(bukkitPlayer.getName());
|
||||
public static void showPlayerRankScoreboardOthers(Player player, String targetName, Map<SkillType, Integer> rank) {
|
||||
ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName());
|
||||
|
||||
wrapper.setOldScoreboard();
|
||||
wrapper.setTypeInspectRank(targetName);
|
||||
@ -314,24 +311,28 @@ public class ScoreboardManager {
|
||||
*/
|
||||
public static boolean powerLevelHeartbeat() {
|
||||
Objective mainObjective = getPowerLevelObjective();
|
||||
|
||||
if (mainObjective == null) {
|
||||
return false; // indicates
|
||||
}
|
||||
|
||||
if (!dirtyPowerLevels.isEmpty())
|
||||
if (!dirtyPowerLevels.isEmpty()) {
|
||||
mcMMO.p.getLogger().info(dirtyPowerLevels.toString());
|
||||
}
|
||||
|
||||
for (String playerName : dirtyPowerLevels) {
|
||||
McMMOPlayer mcpl = UserManager.getPlayer(playerName);
|
||||
Player player = mcpl.getPlayer();
|
||||
int power = mcpl.getPowerLevel();
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(playerName);
|
||||
Player player = mcMMOPlayer.getPlayer();
|
||||
int power = mcMMOPlayer.getPowerLevel();
|
||||
|
||||
mainObjective.getScore(player).setScore(power);
|
||||
|
||||
for (ScoreboardWrapper wrapper : PLAYER_SCOREBOARDS.values()) {
|
||||
wrapper.updatePowerLevel(player, power);
|
||||
}
|
||||
}
|
||||
dirtyPowerLevels.clear();
|
||||
|
||||
dirtyPowerLevels.clear();
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -345,21 +346,25 @@ public class ScoreboardManager {
|
||||
*/
|
||||
public static Objective getPowerLevelObjective() {
|
||||
if (!Config.getInstance().getPowerLevelTagsEnabled()) {
|
||||
Objective obj = Bukkit.getScoreboardManager().getMainScoreboard().getObjective(POWER_OBJECTIVE);
|
||||
if (obj != null) {
|
||||
obj.unregister();
|
||||
Objective objective = mcMMO.p.getServer().getScoreboardManager().getMainScoreboard().getObjective(POWER_OBJECTIVE);
|
||||
|
||||
if (objective != null) {
|
||||
objective.unregister();
|
||||
mcMMO.p.debug("Removed leftover scoreboard objects from Power Level Tags.");
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
Objective powerObj = Bukkit.getScoreboardManager().getMainScoreboard().getObjective(POWER_OBJECTIVE);
|
||||
if (powerObj == null) {
|
||||
powerObj = Bukkit.getScoreboardManager().getMainScoreboard().registerNewObjective(POWER_OBJECTIVE, "dummy");
|
||||
powerObj.setDisplayName(TAG_POWER_LEVEL);
|
||||
powerObj.setDisplaySlot(DisplaySlot.BELOW_NAME);
|
||||
Objective powerObjective = mcMMO.p.getServer().getScoreboardManager().getMainScoreboard().getObjective(POWER_OBJECTIVE);
|
||||
|
||||
if (powerObjective == null) {
|
||||
powerObjective = mcMMO.p.getServer().getScoreboardManager().getMainScoreboard().registerNewObjective(POWER_OBJECTIVE, "dummy");
|
||||
powerObjective.setDisplayName(TAG_POWER_LEVEL);
|
||||
powerObjective.setDisplaySlot(DisplaySlot.BELOW_NAME);
|
||||
}
|
||||
return powerObj;
|
||||
|
||||
return powerObjective;
|
||||
}
|
||||
|
||||
private static void changeScoreboard(ScoreboardWrapper wrapper, int displayTime) {
|
||||
|
@ -2,10 +2,8 @@ package com.gmail.nossr50.util.scoreboards;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
@ -25,7 +23,6 @@ import com.gmail.nossr50.datatypes.skills.SkillType;
|
||||
import com.gmail.nossr50.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.skills.child.FamilyTree;
|
||||
import com.gmail.nossr50.util.Misc;
|
||||
import com.gmail.nossr50.util.Permissions;
|
||||
import com.gmail.nossr50.util.player.UserManager;
|
||||
import com.gmail.nossr50.util.scoreboards.ScoreboardManager.SidebarType;
|
||||
import com.gmail.nossr50.util.skills.SkillUtils;
|
||||
@ -34,14 +31,14 @@ public class ScoreboardWrapper {
|
||||
|
||||
// Initialization variables
|
||||
public final String playerName;
|
||||
private final Scoreboard board;
|
||||
private final Scoreboard scoreboard;
|
||||
private boolean tippedKeep = false;
|
||||
private boolean tippedClear = false;
|
||||
|
||||
// Internal usage variables (should exist)
|
||||
private SidebarType sidebarType;
|
||||
private Objective sidebarObj;
|
||||
private Objective powerObj;
|
||||
private Objective sidebarObjective;
|
||||
private Objective powerObjective;
|
||||
|
||||
// Parameter variables (May be null / invalid)
|
||||
private Scoreboard oldBoard = null;
|
||||
@ -50,30 +47,32 @@ public class ScoreboardWrapper {
|
||||
private PlayerProfile targetProfile = null;
|
||||
public int leaderboardPage = -1;
|
||||
|
||||
private ScoreboardWrapper(String playerName, Scoreboard s) {
|
||||
private ScoreboardWrapper(String playerName, Scoreboard scoreboard) {
|
||||
this.playerName = playerName;
|
||||
board = s;
|
||||
this.scoreboard = scoreboard;
|
||||
sidebarType = SidebarType.NONE;
|
||||
sidebarObj = board.registerNewObjective(ScoreboardManager.SIDEBAR_OBJECTIVE, "dummy");
|
||||
powerObj = board.registerNewObjective(ScoreboardManager.POWER_OBJECTIVE, "dummy");
|
||||
sidebarObjective = this.scoreboard.registerNewObjective(ScoreboardManager.SIDEBAR_OBJECTIVE, "dummy");
|
||||
powerObjective = this.scoreboard.registerNewObjective(ScoreboardManager.POWER_OBJECTIVE, "dummy");
|
||||
|
||||
if (Config.getInstance().getPowerLevelTagsEnabled()) {
|
||||
powerObj.setDisplayName(ScoreboardManager.TAG_POWER_LEVEL);
|
||||
powerObj.setDisplaySlot(DisplaySlot.BELOW_NAME);
|
||||
for (McMMOPlayer mcpl : UserManager.getPlayers()) {
|
||||
powerObj.getScore(mcpl.getPlayer()).setScore(mcpl.getPowerLevel());
|
||||
powerObjective.setDisplayName(ScoreboardManager.TAG_POWER_LEVEL);
|
||||
powerObjective.setDisplaySlot(DisplaySlot.BELOW_NAME);
|
||||
|
||||
for (McMMOPlayer mcMMOPlayer : UserManager.getPlayers()) {
|
||||
powerObjective.getScore(mcMMOPlayer.getPlayer()).setScore(mcMMOPlayer.getPowerLevel());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static ScoreboardWrapper create(Player p) {
|
||||
return new ScoreboardWrapper(p.getName(), mcMMO.p.getServer().getScoreboardManager().getNewScoreboard());
|
||||
public static ScoreboardWrapper create(Player player) {
|
||||
return new ScoreboardWrapper(player.getName(), mcMMO.p.getServer().getScoreboardManager().getNewScoreboard());
|
||||
}
|
||||
|
||||
public BukkitTask updateTask = null;
|
||||
private class ScoreboardQuickUpdate extends BukkitRunnable {
|
||||
@Override
|
||||
public void run() {
|
||||
ScoreboardWrapper.this.updateSidebar();
|
||||
updateSidebar();
|
||||
updateTask = null;
|
||||
}
|
||||
}
|
||||
@ -82,7 +81,7 @@ public class ScoreboardWrapper {
|
||||
private class ScoreboardChangeTask extends BukkitRunnable {
|
||||
@Override
|
||||
public void run() {
|
||||
ScoreboardWrapper.this.tryRevertBoard();
|
||||
tryRevertBoard();
|
||||
revertTask = null;
|
||||
}
|
||||
}
|
||||
@ -91,13 +90,12 @@ public class ScoreboardWrapper {
|
||||
private class ScoreboardCooldownTask extends BukkitRunnable {
|
||||
@Override
|
||||
public void run() {
|
||||
ScoreboardWrapper wrapper = ScoreboardWrapper.this;
|
||||
// Stop updating if it's no longer something displaying cooldowns
|
||||
if (wrapper.isBoardShown() && (wrapper.isSkillScoreboard() || wrapper.isCooldownScoreboard())) {
|
||||
wrapper.doSidebarUpdateSoon();
|
||||
if (isBoardShown() && (isSkillScoreboard() || isCooldownScoreboard())) {
|
||||
doSidebarUpdateSoon();
|
||||
}
|
||||
else {
|
||||
wrapper.stopCooldownUpdating();
|
||||
stopCooldownUpdating();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -122,7 +120,9 @@ public class ScoreboardWrapper {
|
||||
if (cooldownTask != null) {
|
||||
try {
|
||||
cooldownTask.cancel();
|
||||
} catch (Throwable ignored) {}
|
||||
}
|
||||
catch (Throwable ignored) {}
|
||||
|
||||
cooldownTask = null;
|
||||
}
|
||||
}
|
||||
@ -143,29 +143,29 @@ public class ScoreboardWrapper {
|
||||
* Set the old scoreboard, for use in reverting.
|
||||
*/
|
||||
public void setOldScoreboard() {
|
||||
Player player = Bukkit.getPlayerExact(playerName);
|
||||
Player player = mcMMO.p.getServer().getPlayerExact(playerName);
|
||||
|
||||
if (player == null) {
|
||||
ScoreboardManager.cleanup(this);
|
||||
return;
|
||||
}
|
||||
|
||||
Scoreboard old = player.getScoreboard();
|
||||
if (old == board) { // Already displaying it
|
||||
if (oldBoard == null) {
|
||||
Scoreboard oldBoard = player.getScoreboard();
|
||||
|
||||
if (oldBoard == scoreboard) { // Already displaying it
|
||||
if (this.oldBoard == null) {
|
||||
// (Shouldn't happen) Use failsafe value - we're already displaying our board, but we don't have the one we should revert to
|
||||
oldBoard = Bukkit.getScoreboardManager().getMainScoreboard();
|
||||
}
|
||||
else {
|
||||
// Do nothing, we already have a prev board
|
||||
this.oldBoard = mcMMO.p.getServer().getScoreboardManager().getMainScoreboard();
|
||||
}
|
||||
}
|
||||
else {
|
||||
oldBoard = old;
|
||||
this.oldBoard = oldBoard;
|
||||
}
|
||||
}
|
||||
|
||||
public void showBoardWithNoRevert() {
|
||||
Player player = Bukkit.getPlayerExact(playerName);
|
||||
Player player = mcMMO.p.getServer().getPlayerExact(playerName);
|
||||
|
||||
if (player == null) {
|
||||
ScoreboardManager.cleanup(this);
|
||||
return;
|
||||
@ -174,12 +174,14 @@ public class ScoreboardWrapper {
|
||||
if (revertTask != null) {
|
||||
revertTask.cancel();
|
||||
}
|
||||
player.setScoreboard(board);
|
||||
|
||||
player.setScoreboard(scoreboard);
|
||||
revertTask = null;
|
||||
}
|
||||
|
||||
public void showBoardAndScheduleRevert(int ticks) {
|
||||
Player player = Bukkit.getPlayerExact(playerName);
|
||||
Player player = mcMMO.p.getServer().getPlayerExact(playerName);
|
||||
|
||||
if (player == null) {
|
||||
ScoreboardManager.cleanup(this);
|
||||
return;
|
||||
@ -188,7 +190,8 @@ public class ScoreboardWrapper {
|
||||
if (revertTask != null) {
|
||||
revertTask.cancel();
|
||||
}
|
||||
player.setScoreboard(board);
|
||||
|
||||
player.setScoreboard(scoreboard);
|
||||
revertTask = new ScoreboardChangeTask().runTaskLater(mcMMO.p, ticks);
|
||||
|
||||
// TODO is there any way to do the time that looks acceptable?
|
||||
@ -204,14 +207,15 @@ public class ScoreboardWrapper {
|
||||
}
|
||||
|
||||
public void tryRevertBoard() {
|
||||
Player player = Bukkit.getPlayerExact(playerName);
|
||||
Player player = mcMMO.p.getServer().getPlayerExact(playerName);
|
||||
|
||||
if (player == null) {
|
||||
ScoreboardManager.cleanup(this);
|
||||
return;
|
||||
}
|
||||
|
||||
if (oldBoard != null) {
|
||||
if (player.getScoreboard() == board) {
|
||||
if (player.getScoreboard() == scoreboard) {
|
||||
player.setScoreboard(oldBoard);
|
||||
oldBoard = null;
|
||||
}
|
||||
@ -219,14 +223,9 @@ public class ScoreboardWrapper {
|
||||
mcMMO.p.debug("Not reverting scoreboard for " + playerName + " - scoreboard was changed by another plugin (Consider disabling the mcMMO scoreboards if you don't want them!)");
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Was already reverted
|
||||
}
|
||||
|
||||
if (revertTask != null) {
|
||||
revertTask.cancel();
|
||||
revertTask = null;
|
||||
}
|
||||
cancelRevert();
|
||||
|
||||
sidebarType = SidebarType.NONE;
|
||||
targetPlayer = null;
|
||||
targetSkill = null;
|
||||
@ -235,19 +234,22 @@ public class ScoreboardWrapper {
|
||||
}
|
||||
|
||||
public boolean isBoardShown() {
|
||||
Player player = Bukkit.getPlayerExact(playerName);
|
||||
Player player = mcMMO.p.getServer().getPlayerExact(playerName);
|
||||
|
||||
if (player == null) {
|
||||
ScoreboardManager.cleanup(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
return player.getScoreboard() == board;
|
||||
return player.getScoreboard() == scoreboard;
|
||||
}
|
||||
|
||||
public void cancelRevert() {
|
||||
if (revertTask != null) {
|
||||
revertTask.cancel();
|
||||
if (revertTask == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
revertTask.cancel();
|
||||
revertTask = null;
|
||||
}
|
||||
|
||||
@ -358,17 +360,18 @@ public class ScoreboardWrapper {
|
||||
|
||||
// Setup for after a board type change
|
||||
protected void loadObjective(String displayName) {
|
||||
sidebarObj.unregister();
|
||||
sidebarObj = board.registerNewObjective(ScoreboardManager.SIDEBAR_OBJECTIVE, "dummy");
|
||||
sidebarObjective.unregister();
|
||||
sidebarObjective = scoreboard.registerNewObjective(ScoreboardManager.SIDEBAR_OBJECTIVE, "dummy");
|
||||
|
||||
if (displayName.length() > 32) {
|
||||
displayName = displayName.substring(0, 32);
|
||||
}
|
||||
sidebarObj.setDisplayName(displayName);
|
||||
|
||||
sidebarObjective.setDisplayName(displayName);
|
||||
|
||||
updateSidebar();
|
||||
// Do last! Minimize packets!
|
||||
sidebarObj.setDisplaySlot(DisplaySlot.SIDEBAR);
|
||||
sidebarObjective.setDisplaySlot(DisplaySlot.SIDEBAR);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -377,21 +380,24 @@ public class ScoreboardWrapper {
|
||||
private void updateSidebar() {
|
||||
try {
|
||||
updateTask.cancel();
|
||||
} catch (Throwable ignored) {} // catch NullPointerException and IllegalStateException and any Error; don't care
|
||||
}
|
||||
catch (Throwable ignored) {} // catch NullPointerException and IllegalStateException and any Error; don't care
|
||||
|
||||
updateTask = null;
|
||||
|
||||
if (sidebarType == SidebarType.NONE) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player bukkitPlayer = Bukkit.getPlayerExact(playerName);
|
||||
if (bukkitPlayer == null) {
|
||||
Player player = mcMMO.p.getServer().getPlayerExact(playerName);
|
||||
|
||||
if (player == null) {
|
||||
ScoreboardManager.cleanup(this);
|
||||
return;
|
||||
}
|
||||
|
||||
McMMOPlayer mcPlayer = UserManager.getPlayer(bukkitPlayer);
|
||||
PlayerProfile profile = mcPlayer.getProfile();
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
PlayerProfile profile = mcMMOPlayer.getProfile();
|
||||
|
||||
switch (sidebarType) {
|
||||
case NONE:
|
||||
@ -399,65 +405,66 @@ public class ScoreboardWrapper {
|
||||
|
||||
case SKILL_BOARD:
|
||||
Validate.notNull(targetSkill);
|
||||
|
||||
if (!targetSkill.isChildSkill()) {
|
||||
int currentXP = profile.getSkillXpLevel(targetSkill);
|
||||
sidebarObj.getScore(ScoreboardManager.LABEL_CURRENT_XP).setScore(currentXP);
|
||||
sidebarObj.getScore(ScoreboardManager.LABEL_REMAINING_XP).setScore(profile.getXpToLevel(targetSkill) - currentXP);
|
||||
|
||||
sidebarObjective.getScore(ScoreboardManager.LABEL_CURRENT_XP).setScore(currentXP);
|
||||
sidebarObjective.getScore(ScoreboardManager.LABEL_REMAINING_XP).setScore(profile.getXpToLevel(targetSkill) - currentXP);
|
||||
}
|
||||
else {
|
||||
Set<SkillType> parents = FamilyTree.getParents(targetSkill);
|
||||
for (SkillType parentSkill : parents) {
|
||||
sidebarObj.getScore(ScoreboardManager.skillLabels.get(parentSkill)).setScore(profile.getSkillLevel(parentSkill));
|
||||
for (SkillType parentSkill : FamilyTree.getParents(targetSkill)) {
|
||||
sidebarObjective.getScore(ScoreboardManager.skillLabels.get(parentSkill)).setScore(profile.getSkillLevel(parentSkill));
|
||||
}
|
||||
}
|
||||
sidebarObj.getScore(ScoreboardManager.LABEL_LEVEL).setScore(profile.getSkillLevel(targetSkill));
|
||||
|
||||
sidebarObjective.getScore(ScoreboardManager.LABEL_LEVEL).setScore(profile.getSkillLevel(targetSkill));
|
||||
|
||||
if (targetSkill.getAbility() != null) {
|
||||
if (targetSkill != SkillType.MINING) {
|
||||
AbilityType ab = targetSkill.getAbility();
|
||||
Score cooldown = sidebarObj.getScore(ScoreboardManager.abilityLabelsSkill.get(ab));
|
||||
int seconds = SkillUtils.calculateTimeLeft(ab, profile, bukkitPlayer);
|
||||
seconds = (seconds <= 0) ? 0 : seconds;
|
||||
if (seconds == 0) {
|
||||
cooldown.setScore(0);
|
||||
stopCooldownUpdating();
|
||||
}
|
||||
else {
|
||||
cooldown.setScore(seconds);
|
||||
startCooldownUpdating();
|
||||
}
|
||||
} else {
|
||||
boolean stopUpdating;
|
||||
|
||||
if (targetSkill == SkillType.MINING) {
|
||||
// Special-Case: Mining has two abilities, both with cooldowns
|
||||
AbilityType sb = AbilityType.SUPER_BREAKER;
|
||||
AbilityType bm = AbilityType.BLAST_MINING;
|
||||
Score cooldownSB = sidebarObj.getScore(ScoreboardManager.abilityLabelsSkill.get(sb));
|
||||
Score cooldownBM = sidebarObj.getScore(ScoreboardManager.abilityLabelsSkill.get(bm));
|
||||
int secondsSB = SkillUtils.calculateTimeLeft(sb, profile, bukkitPlayer);
|
||||
int secondsBM = SkillUtils.calculateTimeLeft(bm, profile, bukkitPlayer);
|
||||
secondsSB = (secondsSB <= 0) ? 0 : secondsSB;
|
||||
secondsBM = (secondsBM <= 0) ? 0 : secondsBM;
|
||||
if (secondsSB == 0 && secondsBM == 0) {
|
||||
cooldownSB.setScore(0);
|
||||
cooldownBM.setScore(0);
|
||||
stopCooldownUpdating();
|
||||
}
|
||||
else {
|
||||
cooldownSB.setScore(secondsSB);
|
||||
cooldownBM.setScore(secondsBM);
|
||||
startCooldownUpdating();
|
||||
}
|
||||
Score cooldownSB = sidebarObjective.getScore(ScoreboardManager.abilityLabelsSkill.get(AbilityType.SUPER_BREAKER));
|
||||
Score cooldownBM = sidebarObjective.getScore(ScoreboardManager.abilityLabelsSkill.get(AbilityType.BLAST_MINING));
|
||||
int secondsSB = Math.max(SkillUtils.calculateTimeLeft(AbilityType.SUPER_BREAKER, profile, player), 0);
|
||||
int secondsBM = Math.max(SkillUtils.calculateTimeLeft(AbilityType.BLAST_MINING, profile, player), 0);
|
||||
|
||||
cooldownSB.setScore(secondsSB);
|
||||
cooldownBM.setScore(secondsBM);
|
||||
|
||||
stopUpdating = (secondsSB == 0 && secondsBM == 0);
|
||||
}
|
||||
else {
|
||||
AbilityType ability = targetSkill.getAbility();
|
||||
Score cooldown = sidebarObjective.getScore(ScoreboardManager.abilityLabelsSkill.get(ability));
|
||||
int seconds = Math.max(SkillUtils.calculateTimeLeft(ability, profile, player), 0);
|
||||
|
||||
cooldown.setScore(seconds);
|
||||
|
||||
stopUpdating = seconds == 0;
|
||||
}
|
||||
|
||||
if (stopUpdating) {
|
||||
stopCooldownUpdating();
|
||||
}
|
||||
else {
|
||||
startCooldownUpdating();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case COOLDOWNS_BOARD:
|
||||
boolean anyCooldownsActive = false;
|
||||
|
||||
for (AbilityType ability : AbilityType.NORMAL_ABILITIES) {
|
||||
int seconds = SkillUtils.calculateTimeLeft(ability, profile, bukkitPlayer);
|
||||
seconds = (seconds <= 0) ? 0 : seconds;
|
||||
int seconds = Math.max(SkillUtils.calculateTimeLeft(ability, profile, player), 0);
|
||||
|
||||
if (seconds != 0) {
|
||||
anyCooldownsActive = true;
|
||||
}
|
||||
sidebarObj.getScore(ScoreboardManager.abilityLabelsColored.get(ability)).setScore(seconds);
|
||||
|
||||
sidebarObjective.getScore(ScoreboardManager.abilityLabelsColored.get(ability)).setScore(seconds);
|
||||
}
|
||||
|
||||
if (anyCooldownsActive) {
|
||||
@ -470,30 +477,35 @@ public class ScoreboardWrapper {
|
||||
|
||||
case STATS_BOARD:
|
||||
// Select the profile to read from
|
||||
PlayerProfile prof;
|
||||
PlayerProfile newProfile;
|
||||
|
||||
if (targetProfile != null) {
|
||||
prof = targetProfile; // offline
|
||||
newProfile = targetProfile; // offline
|
||||
}
|
||||
else if (targetPlayer == null) {
|
||||
prof = profile; // self
|
||||
newProfile = profile; // self
|
||||
}
|
||||
else {
|
||||
prof = UserManager.getPlayer(targetPlayer).getProfile(); // online
|
||||
newProfile = UserManager.getPlayer(targetPlayer).getProfile(); // online
|
||||
}
|
||||
|
||||
// Calculate power level here
|
||||
int powerLevel = 0;
|
||||
for (SkillType skill : SkillType.values()) { // Include child skills, but not in power level
|
||||
int level = prof.getSkillLevel(skill);
|
||||
int level = newProfile.getSkillLevel(skill);
|
||||
|
||||
if (!skill.isChildSkill())
|
||||
powerLevel += level;
|
||||
|
||||
// TODO: Verify that this is what we want - calculated in power level but not displayed
|
||||
if (!Permissions.skillEnabled(bukkitPlayer, skill)) {
|
||||
if (!skill.getPermissions(player)) {
|
||||
continue;
|
||||
}
|
||||
sidebarObj.getScore(ScoreboardManager.skillLabels.get(skill)).setScore(level);
|
||||
|
||||
sidebarObjective.getScore(ScoreboardManager.skillLabels.get(skill)).setScore(level);
|
||||
}
|
||||
sidebarObj.getScore(ScoreboardManager.LABEL_POWER_LEVEL).setScore(powerLevel);
|
||||
|
||||
sidebarObjective.getScore(ScoreboardManager.LABEL_POWER_LEVEL).setScore(powerLevel);
|
||||
break;
|
||||
|
||||
case RANK_BOARD:
|
||||
@ -504,40 +516,47 @@ public class ScoreboardWrapper {
|
||||
*/
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void acceptRankData(Map<SkillType, Integer> rankData) {
|
||||
Integer rank;
|
||||
Player bukkitPlayer = Bukkit.getPlayerExact(playerName);
|
||||
Player player = mcMMO.p.getServer().getPlayerExact(playerName);
|
||||
|
||||
for (SkillType skill : SkillType.NON_CHILD_SKILLS) {
|
||||
if (!Permissions.skillEnabled(bukkitPlayer, skill)) {
|
||||
if (!skill.getPermissions(player)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
rank = rankData.get(skill);
|
||||
|
||||
if (rank != null) {
|
||||
sidebarObj.getScore(ScoreboardManager.skillLabels.get(skill)).setScore(rank);
|
||||
sidebarObjective.getScore(ScoreboardManager.skillLabels.get(skill)).setScore(rank);
|
||||
}
|
||||
}
|
||||
|
||||
rank = rankData.get(null);
|
||||
|
||||
if (rank != null) {
|
||||
sidebarObj.getScore(ScoreboardManager.LABEL_POWER_LEVEL).setScore(rank);
|
||||
sidebarObjective.getScore(ScoreboardManager.LABEL_POWER_LEVEL).setScore(rank);
|
||||
}
|
||||
}
|
||||
|
||||
public void acceptLeaderboardData(List<PlayerStat> leaderboardData) {
|
||||
for (PlayerStat stat : leaderboardData) {
|
||||
String statname = stat.name;
|
||||
if (statname.equals(playerName)) {
|
||||
statname = ChatColor.GOLD + "--You--";
|
||||
String name = stat.name;
|
||||
|
||||
if (name.equals(playerName)) {
|
||||
name = ChatColor.GOLD + "--You--";
|
||||
}
|
||||
sidebarObj.getScore(Bukkit.getOfflinePlayer(statname)).setScore(stat.statVal);
|
||||
|
||||
sidebarObjective.getScore(mcMMO.p.getServer().getOfflinePlayer(name)).setScore(stat.statVal);
|
||||
}
|
||||
}
|
||||
|
||||
public void updatePowerLevel(Player leveledPlayer, int newPowerLevel) {
|
||||
powerObj.getScore(leveledPlayer).setScore(newPowerLevel);
|
||||
public void updatePowerLevel(Player player, int newPowerLevel) {
|
||||
powerObjective.getScore(player).setScore(newPowerLevel);
|
||||
}
|
||||
}
|
||||
|
@ -224,7 +224,7 @@ public final class CombatUtils {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Permissions.skillEnabled(player, SkillType.SWORDS)) {
|
||||
if (SkillType.SWORDS.getPermissions(player)) {
|
||||
processSwordCombat(target, player, event.getDamage());
|
||||
}
|
||||
}
|
||||
@ -233,7 +233,7 @@ public final class CombatUtils {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Permissions.skillEnabled(player, SkillType.AXES)) {
|
||||
if (SkillType.AXES.getPermissions(player)) {
|
||||
processAxeCombat(target, player, event);
|
||||
}
|
||||
}
|
||||
@ -242,7 +242,7 @@ public final class CombatUtils {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Permissions.skillEnabled(player, SkillType.UNARMED)) {
|
||||
if (SkillType.UNARMED.getPermissions(player)) {
|
||||
processUnarmedCombat(target, player, event);
|
||||
}
|
||||
}
|
||||
@ -260,7 +260,7 @@ public final class CombatUtils {
|
||||
if (tamer != null && tamer instanceof Player && shouldProcessSkill(target, SkillType.TAMING)) {
|
||||
Player master = (Player) tamer;
|
||||
|
||||
if (!Misc.isNPCEntity(master) && Permissions.skillEnabled(master, SkillType.TAMING)) {
|
||||
if (!Misc.isNPCEntity(master) && SkillType.TAMING.getPermissions(master)) {
|
||||
processTamingCombat(target, master, wolf, event);
|
||||
}
|
||||
}
|
||||
@ -272,7 +272,7 @@ public final class CombatUtils {
|
||||
if (shooter != null && shooter instanceof Player && shouldProcessSkill(target, SkillType.ARCHERY)) {
|
||||
Player player = (Player) shooter;
|
||||
|
||||
if (!Misc.isNPCEntity(player) && Permissions.skillEnabled(player, SkillType.ARCHERY)) {
|
||||
if (!Misc.isNPCEntity(player) && SkillType.ARCHERY.getPermissions(player)) {
|
||||
processArcheryCombat(target, player, event, arrow);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user