Browse Source

Formatting cleanup from the scoreboard update. Also handle skill permissions differently.

GJ 12 years ago
parent
commit
9ef3c721df
32 changed files with 416 additions and 436 deletions
  1. 53 45
      src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java
  2. 1 1
      src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java
  3. 1 1
      src/main/java/com/gmail/nossr50/commands/experience/AddxpCommand.java
  4. 1 1
      src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java
  5. 1 1
      src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java
  6. 1 1
      src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java
  7. 8 2
      src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java
  8. 7 35
      src/main/java/com/gmail/nossr50/commands/player/MccooldownCommand.java
  9. 9 5
      src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java
  10. 5 1
      src/main/java/com/gmail/nossr50/commands/player/McstatsCommand.java
  11. 20 18
      src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java
  12. 2 3
      src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java
  13. 1 1
      src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java
  14. 2 9
      src/main/java/com/gmail/nossr50/config/Config.java
  15. 3 3
      src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java
  16. 11 57
      src/main/java/com/gmail/nossr50/datatypes/skills/AbilityType.java
  17. 8 2
      src/main/java/com/gmail/nossr50/datatypes/skills/SkillType.java
  18. 4 4
      src/main/java/com/gmail/nossr50/listeners/BlockListener.java
  19. 1 1
      src/main/java/com/gmail/nossr50/listeners/InventoryListener.java
  20. 5 5
      src/main/java/com/gmail/nossr50/listeners/PlayerListener.java
  21. 12 12
      src/main/java/com/gmail/nossr50/listeners/ScoreboardsListener.java
  22. 5 1
      src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandAsyncTask.java
  23. 5 5
      src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java
  24. 5 1
      src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandAsyncTask.java
  25. 4 2
      src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java
  26. 6 0
      src/main/java/com/gmail/nossr50/util/StringUtils.java
  27. 3 2
      src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java
  28. 5 6
      src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java
  29. 84 79
      src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java
  30. 136 117
      src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java
  31. 5 5
      src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java
  32. 2 10
      src/main/resources/locale/locale_en_US.properties

+ 53 - 45
src/main/java/com/gmail/nossr50/commands/McscoreboardCommand.java

@@ -14,57 +14,58 @@ import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableList;
 
 
 public class McscoreboardCommand implements TabExecutor {
 public class McscoreboardCommand implements TabExecutor {
-    private static final List<String> FIRST_ARGS = ImmutableList.of("keep", "time", "clear", "reset");
+    private static final List<String> FIRST_ARGS = ImmutableList.of("keep", "time", "clear");
 
 
     @Override
     @Override
     public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
     public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
         if (CommandUtils.noConsoleUsage(sender)) {
         if (CommandUtils.noConsoleUsage(sender)) {
             return true;
             return true;
         }
         }
-        if (args.length == 0) {
-            help(sender);
-            return true;
-        }
 
 
-        if (args[0].equalsIgnoreCase("clear") || args[0].equalsIgnoreCase("reset")) {
-            ScoreboardManager.clearBoard(sender.getName());
-            sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Clear"));
-        }
-        else if (args[0].equalsIgnoreCase("keep")) {
-            if (!Config.getInstance().getAllowKeepBoard()) {
-                sender.sendMessage(LocaleLoader.getString("Commands.Disabled"));
-                return true;
-            }
-            if (!ScoreboardManager.isBoardShown(sender.getName())) {
-                sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.NoBoard"));
-                return true;
-            }
-            ScoreboardManager.keepBoard(sender.getName());
-            sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Keep"));
-        }
-        else if (args[0].equalsIgnoreCase("time") || args[0].equalsIgnoreCase("timer")) {
-            if (args.length == 1) {
-                help(sender);
-                return true;
-            }
-            if (CommandUtils.isInvalidInteger(sender, args[1])) {
-                return true;
-            }
-            int time = Math.abs(Integer.parseInt(args[1]));
-            ScoreboardManager.setRevertTimer(sender.getName(), time);
-            sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Timer", time));
-        }
-        else {
-            help(sender);
-        }
-        return true;
-    }
+        switch (args.length) {
+            case 1:
+                if (args[0].equalsIgnoreCase("clear") || args[0].equalsIgnoreCase("reset")) {
+                    ScoreboardManager.clearBoard(sender.getName());
+                    sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Clear"));
+                    return true;
+                }
 
 
-    private void help(CommandSender sender) {
-        sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Help.0"));
-        sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Help.1"));
-        sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Help.2"));
-        sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Help.3"));
+                if (args[0].equalsIgnoreCase("keep")) {
+                    if (!Config.getInstance().getAllowKeepBoard()) {
+                        sender.sendMessage(LocaleLoader.getString("Commands.Disabled"));
+                        return true;
+                    }
+
+                    if (!ScoreboardManager.isBoardShown(sender.getName())) {
+                        sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.NoBoard"));
+                        return true;
+                    }
+
+                    ScoreboardManager.keepBoard(sender.getName());
+                    sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Keep"));
+                    return true;
+                }
+
+                return help(sender);
+
+            case 2:
+                if (args[0].equalsIgnoreCase("time") || args[0].equalsIgnoreCase("timer")) {
+                    if (CommandUtils.isInvalidInteger(sender, args[1])) {
+                        return true;
+                    }
+
+                    int time = Math.abs(Integer.parseInt(args[1]));
+
+                    ScoreboardManager.setRevertTimer(sender.getName(), time);
+                    sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Timer", time));
+                    return true;
+                }
+
+                return help(sender);
+
+            default:
+                return help(sender);
+        }
     }
     }
 
 
     @Override
     @Override
@@ -73,8 +74,15 @@ public class McscoreboardCommand implements TabExecutor {
             case 1:
             case 1:
                 return StringUtil.copyPartialMatches(args[0], FIRST_ARGS, new ArrayList<String>(FIRST_ARGS.size()));
                 return StringUtil.copyPartialMatches(args[0], FIRST_ARGS, new ArrayList<String>(FIRST_ARGS.size()));
             default:
             default:
-                break;
+                return ImmutableList.of();
         }
         }
-        return ImmutableList.of();
+    }
+
+    private boolean help(CommandSender sender) {
+        sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Help.0"));
+        sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Help.1"));
+        sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Help.2"));
+        sender.sendMessage(LocaleLoader.getString("Commands.Scoreboard.Help.3"));
+        return true;
     }
     }
 }
 }

+ 1 - 1
src/main/java/com/gmail/nossr50/commands/experience/AddlevelsCommand.java

@@ -37,6 +37,6 @@ public class AddlevelsCommand extends ExperienceCommand {
 
 
     @Override
     @Override
     protected void handlePlayerMessageSkill() {
     protected void handlePlayerMessageSkill() {
-        player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", value, skill.getSkillName()));
+        player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", value, skill.getName()));
     }
     }
 }
 }

+ 1 - 1
src/main/java/com/gmail/nossr50/commands/experience/AddxpCommand.java

@@ -34,6 +34,6 @@ public class AddxpCommand extends ExperienceCommand {
 
 
     @Override
     @Override
     protected void handlePlayerMessageSkill() {
     protected void handlePlayerMessageSkill() {
-        player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardSkill", value, skill.getSkillName()));
+        player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardSkill", value, skill.getName()));
     }
     }
 }
 }

+ 1 - 1
src/main/java/com/gmail/nossr50/commands/experience/ExperienceCommand.java

@@ -148,7 +148,7 @@ public abstract class ExperienceCommand implements TabExecutor {
             sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.2", playerName));
             sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.2", playerName));
         }
         }
         else {
         else {
-            sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", skill.getSkillName(), playerName));
+            sender.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.2", skill.getName(), playerName));
         }
         }
     }
     }
 
 

+ 1 - 1
src/main/java/com/gmail/nossr50/commands/experience/MmoeditCommand.java

@@ -39,6 +39,6 @@ public class MmoeditCommand extends ExperienceCommand {
 
 
     @Override
     @Override
     protected void handlePlayerMessageSkill() {
     protected void handlePlayerMessageSkill() {
-        player.sendMessage(LocaleLoader.getString("Commands.mmoedit.Modified.1", skill.getSkillName(), value));
+        player.sendMessage(LocaleLoader.getString("Commands.mmoedit.Modified.1", skill.getName(), value));
     }
     }
 }
 }

+ 1 - 1
src/main/java/com/gmail/nossr50/commands/experience/SkillresetCommand.java

@@ -121,6 +121,6 @@ public class SkillresetCommand extends ExperienceCommand {
 
 
     @Override
     @Override
     protected void handlePlayerMessageSkill() {
     protected void handlePlayerMessageSkill() {
-        player.sendMessage(LocaleLoader.getString("Commands.Reset.Single", skill.getSkillName()));
+        player.sendMessage(LocaleLoader.getString("Commands.Reset.Single", skill.getName()));
     }
     }
 }
 }

+ 8 - 2
src/main/java/com/gmail/nossr50/commands/player/InspectCommand.java

@@ -42,7 +42,10 @@ public class InspectCommand implements TabExecutor {
 
 
                     if (sender instanceof Player && Config.getInstance().getInspectUseBoard()) {
                     if (sender instanceof Player && Config.getInstance().getInspectUseBoard()) {
                         ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, profile);
                         ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, profile);
-                        if (!Config.getInstance().getInspectUseChat()) return true;
+
+                        if (!Config.getInstance().getInspectUseChat()) {
+                            return true;
+                        }
                     }
                     }
 
 
                     sender.sendMessage(LocaleLoader.getString("Inspect.OfflineStats", playerName));
                     sender.sendMessage(LocaleLoader.getString("Inspect.OfflineStats", playerName));
@@ -78,7 +81,10 @@ public class InspectCommand implements TabExecutor {
 
 
                     if (sender instanceof Player && Config.getInstance().getInspectUseBoard()) {
                     if (sender instanceof Player && Config.getInstance().getInspectUseBoard()) {
                         ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, mcMMOPlayer.getProfile());
                         ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, mcMMOPlayer.getProfile());
-                        if (!Config.getInstance().getInspectUseChat()) return true;
+
+                        if (!Config.getInstance().getInspectUseChat()) {
+                            return true;
+                        }
                     }
                     }
 
 
                     sender.sendMessage(LocaleLoader.getString("Inspect.Stats", target.getName()));
                     sender.sendMessage(LocaleLoader.getString("Inspect.Stats", target.getName()));

+ 7 - 35
src/main/java/com/gmail/nossr50/commands/player/MccooldownCommand.java

@@ -6,14 +6,11 @@ import org.bukkit.command.Command;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.TabExecutor;
 import org.bukkit.command.TabExecutor;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
-import org.bukkit.permissions.Permissible;
 
 
-import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.player.PlayerProfile;
 import com.gmail.nossr50.datatypes.player.PlayerProfile;
 import com.gmail.nossr50.datatypes.skills.AbilityType;
 import com.gmail.nossr50.datatypes.skills.AbilityType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.commands.CommandUtils;
 import com.gmail.nossr50.util.commands.CommandUtils;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
@@ -33,7 +30,10 @@ public class MccooldownCommand implements TabExecutor {
 
 
                 if (Config.getInstance().getCooldownUseBoard()) {
                 if (Config.getInstance().getCooldownUseBoard()) {
                     ScoreboardManager.enablePlayerCooldownScoreboard(player);
                     ScoreboardManager.enablePlayerCooldownScoreboard(player);
-                    if (!Config.getInstance().getCooldownUseChat()) return true;
+
+                    if (!Config.getInstance().getCooldownUseChat()) {
+                        return true;
+                    }
                 }
                 }
 
 
                 PlayerProfile profile = UserManager.getPlayer(player).getProfile();
                 PlayerProfile profile = UserManager.getPlayer(player).getProfile();
@@ -42,17 +42,17 @@ public class MccooldownCommand implements TabExecutor {
                 player.sendMessage(LocaleLoader.getString("mcMMO.NoSkillNote"));
                 player.sendMessage(LocaleLoader.getString("mcMMO.NoSkillNote"));
 
 
                 for (AbilityType ability : AbilityType.NORMAL_ABILITIES) {
                 for (AbilityType ability : AbilityType.NORMAL_ABILITIES) {
-                    if (!hasPermission(player, ability)) {
+                    if (!ability.getPermissions(player)) {
                         continue;
                         continue;
                     }
                     }
 
 
                     int seconds = SkillUtils.calculateTimeLeft(ability, profile, player);
                     int seconds = SkillUtils.calculateTimeLeft(ability, profile, player);
 
 
                     if (seconds <= 0) {
                     if (seconds <= 0) {
-                        player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.Y", ability.getAbilityName()));
+                        player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.Y", ability.getName()));
                     }
                     }
                     else {
                     else {
-                        player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.N", ability.getAbilityName(), Integer.toString(seconds)));
+                        player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.N", ability.getName(), seconds));
                     }
                     }
                 }
                 }
 
 
@@ -63,34 +63,6 @@ public class MccooldownCommand implements TabExecutor {
         }
         }
     }
     }
 
 
-    private boolean hasPermission(Permissible permissible, AbilityType ability) {
-        switch (ability) {
-        case BERSERK:
-            return Permissions.berserk(permissible);
-        case BLAST_MINING:
-            return Permissions.remoteDetonation(permissible);
-        case BLOCK_CRACKER:
-            return Permissions.blockCracker(permissible);
-        case GIGA_DRILL_BREAKER:
-            return Permissions.gigaDrillBreaker(permissible);
-        case GREEN_TERRA:
-            return Permissions.greenTerra(permissible);
-        case LEAF_BLOWER:
-            return Permissions.leafBlower(permissible);
-        case SERRATED_STRIKES:
-            return Permissions.serratedStrikes(permissible);
-        case SKULL_SPLITTER:
-            return Permissions.skullSplitter(permissible);
-        case SUPER_BREAKER:
-            return Permissions.superBreaker(permissible);
-        case TREE_FELLER:
-            return Permissions.treeFeller(permissible);
-        default:
-            mcMMO.p.getLogger().warning("MccooldownCommand - couldn't check permission for AbilityType." + ability.name());
-            return false;
-        }
-    }
-
     @Override
     @Override
     public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
     public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
         return ImmutableList.of();
         return ImmutableList.of();

+ 9 - 5
src/main/java/com/gmail/nossr50/commands/player/McrankCommand.java

@@ -49,9 +49,10 @@ public class McrankCommand implements TabExecutor {
                 McMMOPlayer mcMMOPlayer = UserManager.getPlayer(playerName, true);
                 McMMOPlayer mcMMOPlayer = UserManager.getPlayer(playerName, true);
 
 
                 if (mcMMOPlayer != null) {
                 if (mcMMOPlayer != null) {
-                    playerName = mcMMOPlayer.getPlayer().getName();
+                    Player player = mcMMOPlayer.getPlayer();
+                    playerName = player.getName();
 
 
-                    if (CommandUtils.tooFar(sender, mcMMOPlayer.getPlayer(), Permissions.mcrankFar(sender))) {
+                    if (CommandUtils.tooFar(sender, player, Permissions.mcrankFar(sender))) {
                         return true;
                         return true;
                     }
                     }
                 }
                 }
@@ -80,16 +81,19 @@ public class McrankCommand implements TabExecutor {
 
 
     private void display(CommandSender sender, String playerName) {
     private void display(CommandSender sender, String playerName) {
         if (sender instanceof Player) {
         if (sender instanceof Player) {
-            McMMOPlayer mcpl = UserManager.getPlayer(sender.getName());
-            if (mcpl.getDatabaseATS() + Misc.PLAYER_DATABASE_COOLDOWN_MILLIS > System.currentTimeMillis()) {
+            McMMOPlayer mcMMOPlayer = UserManager.getPlayer(sender.getName());
+
+            if (mcMMOPlayer.getDatabaseATS() + Misc.PLAYER_DATABASE_COOLDOWN_MILLIS > System.currentTimeMillis()) {
                 sender.sendMessage(LocaleLoader.getString("Commands.Database.Cooldown"));
                 sender.sendMessage(LocaleLoader.getString("Commands.Database.Cooldown"));
                 return;
                 return;
             }
             }
-            mcpl.actualizeDatabaseATS();
+
+            mcMMOPlayer.actualizeDatabaseATS();
         }
         }
 
 
         boolean useBoard = (sender instanceof Player) && (Config.getInstance().getRankUseBoard());
         boolean useBoard = (sender instanceof Player) && (Config.getInstance().getRankUseBoard());
         boolean useChat = useBoard ? Config.getInstance().getRankUseChat() : true;
         boolean useChat = useBoard ? Config.getInstance().getRankUseChat() : true;
+
         new McrankCommandAsyncTask(playerName, sender, useBoard, useChat).runTaskAsynchronously(mcMMO.p);
         new McrankCommandAsyncTask(playerName, sender, useBoard, useChat).runTaskAsynchronously(mcMMO.p);
     }
     }
 }
 }

+ 5 - 1
src/main/java/com/gmail/nossr50/commands/player/McstatsCommand.java

@@ -28,8 +28,12 @@ public class McstatsCommand implements TabExecutor {
 
 
                 if (Config.getInstance().getStatsUseBoard()) {
                 if (Config.getInstance().getStatsUseBoard()) {
                     ScoreboardManager.enablePlayerStatsScoreboard(player);
                     ScoreboardManager.enablePlayerStatsScoreboard(player);
-                    if (!Config.getInstance().getStatsUseChat()) return true;
+
+                    if (!Config.getInstance().getStatsUseChat()) {
+                        return true;
+                    }
                 }
                 }
+
                 player.sendMessage(LocaleLoader.getString("Stats.Own.Stats"));
                 player.sendMessage(LocaleLoader.getString("Stats.Own.Stats"));
                 player.sendMessage(LocaleLoader.getString("mcMMO.NoSkillNote"));
                 player.sendMessage(LocaleLoader.getString("mcMMO.NoSkillNote"));
 
 

+ 20 - 18
src/main/java/com/gmail/nossr50/commands/player/MctopCommand.java

@@ -23,27 +23,26 @@ import com.gmail.nossr50.util.player.UserManager;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableList;
 
 
 public class MctopCommand implements TabExecutor {
 public class MctopCommand implements TabExecutor {
+    private SkillType skill;
 
 
     @Override
     @Override
     public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
     public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
-        SkillType skill;
-
         switch (args.length) {
         switch (args.length) {
             case 0:
             case 0:
-                display(1, null, sender, command);
+                display(1, sender, command);
                 return true;
                 return true;
 
 
             case 1:
             case 1:
                 if (StringUtils.isInt(args[0])) {
                 if (StringUtils.isInt(args[0])) {
-                    display(Math.abs(Integer.parseInt(args[0])), null, sender, command);
+                    display(Math.abs(Integer.parseInt(args[0])), sender, command);
                     return true;
                     return true;
                 }
                 }
 
 
-                if ((skill = extractSkill(sender, args[0])) == null) {
+                if (!extractSkill(sender, args[0])) {
                     return true;
                     return true;
                 }
                 }
 
 
-                display(1, skill, sender, command);
+                display(1, sender, command);
                 return true;
                 return true;
 
 
             case 2:
             case 2:
@@ -51,11 +50,11 @@ public class MctopCommand implements TabExecutor {
                     return true;
                     return true;
                 }
                 }
 
 
-                if ((skill = extractSkill(sender, args[0])) == null) {
+                if (!extractSkill(sender, args[0])) {
                     return true;
                     return true;
                 }
                 }
 
 
-                display(Math.abs(Integer.parseInt(args[1])), skill, sender, command);
+                display(Math.abs(Integer.parseInt(args[1])), sender, command);
                 return true;
                 return true;
 
 
             default:
             default:
@@ -73,19 +72,21 @@ public class MctopCommand implements TabExecutor {
         }
         }
     }
     }
 
 
-    private void display(int page, SkillType skill, CommandSender sender, Command command) {
+    private void display(int page, CommandSender sender, Command command) {
         if (skill != null && !Permissions.mctop(sender, skill)) {
         if (skill != null && !Permissions.mctop(sender, skill)) {
             sender.sendMessage(command.getPermissionMessage());
             sender.sendMessage(command.getPermissionMessage());
             return;
             return;
         }
         }
 
 
         if (sender instanceof Player) {
         if (sender instanceof Player) {
-            McMMOPlayer mcpl = UserManager.getPlayer(sender.getName());
-            if (mcpl.getDatabaseATS() + Misc.PLAYER_DATABASE_COOLDOWN_MILLIS > System.currentTimeMillis()) {
+            McMMOPlayer mcMMOPlayer = UserManager.getPlayer(sender.getName());
+
+            if (mcMMOPlayer.getDatabaseATS() + Misc.PLAYER_DATABASE_COOLDOWN_MILLIS > System.currentTimeMillis()) {
                 sender.sendMessage(LocaleLoader.getString("Commands.Database.Cooldown"));
                 sender.sendMessage(LocaleLoader.getString("Commands.Database.Cooldown"));
                 return;
                 return;
             }
             }
-            mcpl.actualizeDatabaseATS();
+
+            mcMMOPlayer.actualizeDatabaseATS();
         }
         }
 
 
         display(page, skill, sender);
         display(page, skill, sender);
@@ -98,16 +99,17 @@ public class MctopCommand implements TabExecutor {
         new MctopCommandAsyncTask(page, skill, sender, useBoard, useChat).runTaskAsynchronously(mcMMO.p);
         new MctopCommandAsyncTask(page, skill, sender, useBoard, useChat).runTaskAsynchronously(mcMMO.p);
     }
     }
 
 
-    private SkillType extractSkill(CommandSender sender, String skillName) {
+    private boolean extractSkill(CommandSender sender, String skillName) {
         if (CommandUtils.isInvalidSkill(sender, skillName)) {
         if (CommandUtils.isInvalidSkill(sender, skillName)) {
-            return null;
+            return false;
         }
         }
-        SkillType skill = SkillType.getSkill(skillName);
 
 
-        if (skill != null && CommandUtils.isChildSkill(sender, skill)) {
-            return null;
+        skill = SkillType.getSkill(skillName);
+
+        if (CommandUtils.isChildSkill(sender, skill)) {
+            return false;
         }
         }
 
 
-        return skill;
+        return true;
     }
     }
 }
 }

+ 2 - 3
src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java

@@ -45,7 +45,7 @@ public abstract class SkillCommand implements TabExecutor {
 
 
     public SkillCommand(SkillType skill) {
     public SkillCommand(SkillType skill) {
         this.skill = skill;
         this.skill = skill;
-        skillName = skill.getSkillName();
+        skillName = skill.getName();
         skillGuideCommand = new SkillGuideCommand(skill);
         skillGuideCommand = new SkillGuideCommand(skill);
     }
     }
 
 
@@ -77,7 +77,6 @@ public abstract class SkillCommand implements TabExecutor {
                     player.sendMessage(LocaleLoader.getString("Skills.Header", skillName));
                     player.sendMessage(LocaleLoader.getString("Skills.Header", skillName));
                     player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain." + StringUtils.getCapitalized(skill.toString()))));
                     player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain." + StringUtils.getCapitalized(skill.toString()))));
                     player.sendMessage(LocaleLoader.getString("Effects.Level", (int) skillValue, profile.getSkillXpLevel(skill), profile.getXpToLevel(skill)));
                     player.sendMessage(LocaleLoader.getString("Effects.Level", (int) skillValue, profile.getSkillXpLevel(skill), profile.getXpToLevel(skill)));
-
                 }
                 }
                 else {
                 else {
                     player.sendMessage(LocaleLoader.getString("Skills.Header", skillName + " " + LocaleLoader.getString("Skills.Child")));
                     player.sendMessage(LocaleLoader.getString("Skills.Header", skillName + " " + LocaleLoader.getString("Skills.Child")));
@@ -88,7 +87,7 @@ public abstract class SkillCommand implements TabExecutor {
                     Set<SkillType> parents = FamilyTree.getParents(skill);
                     Set<SkillType> parents = FamilyTree.getParents(skill);
 
 
                     for (SkillType parent : parents) {
                     for (SkillType parent : parents) {
-                        player.sendMessage(parent.getSkillName() + " - " + LocaleLoader.getString("Effects.Level", profile.getSkillLevel(parent), profile.getSkillXpLevel(parent), profile.getXpToLevel(parent)));
+                        player.sendMessage(parent.getName() + " - " + LocaleLoader.getString("Effects.Level", profile.getSkillLevel(parent), profile.getSkillXpLevel(parent), profile.getXpToLevel(parent)));
                     }
                     }
                 }
                 }
 
 

+ 1 - 1
src/main/java/com/gmail/nossr50/commands/skills/SkillGuideCommand.java

@@ -18,7 +18,7 @@ public class SkillGuideCommand implements CommandExecutor {
     private String invalidPage;
     private String invalidPage;
 
 
     public SkillGuideCommand(SkillType skillType) {
     public SkillGuideCommand(SkillType skillType) {
-        header = LocaleLoader.getString("Guides.Header", skillType.getSkillName());
+        header = LocaleLoader.getString("Guides.Header", skillType.getName());
         guide = getGuide(skillType);
         guide = getGuide(skillType);
 
 
         invalidPage = LocaleLoader.getString("Guides.Page.Invalid");
         invalidPage = LocaleLoader.getString("Guides.Page.Invalid");

+ 2 - 9
src/main/java/com/gmail/nossr50/config/Config.java

@@ -85,12 +85,6 @@ public class Config extends AutoUpdateConfigLoader {
             reason.add("Either Board or Print in Scoreboard.Types.Inspect must be true!");
             reason.add("Either Board or Print in Scoreboard.Types.Inspect must be true!");
         }
         }
 
 
-        /* Skill.Print setting removed, as I can't think of a good use for it
-        if (!(getSkillUseChat() || getSkillUseBoard())) {
-            reason.add("Either Board or Print in Scoreboard.Commands.Skill must be true!");
-        }
-        // */
-
         /* Database Purging */
         /* Database Purging */
         if (getPurgeInterval() < -1) {
         if (getPurgeInterval() < -1) {
             reason.add("Database_Purging.Purge_Interval should be greater than, or equal to -1!");
             reason.add("Database_Purging.Purge_Interval should be greater than, or equal to -1!");
@@ -258,7 +252,6 @@ public class Config extends AutoUpdateConfigLoader {
     public boolean getCooldownUseBoard() { return config.getBoolean("Scoreboard.Types.Cooldown.Board", true); }
     public boolean getCooldownUseBoard() { return config.getBoolean("Scoreboard.Types.Cooldown.Board", true); }
     public int getCooldownScoreboardTime() { return config.getInt("Scoreboard.Types.Cooldown.Display_Time", 41); }
     public int getCooldownScoreboardTime() { return config.getInt("Scoreboard.Types.Cooldown.Display_Time", 41); }
 
 
-    // public boolean getSkillUseChat() { return config.getBoolean("Scoreboard.Types.Skill.Print", false); }
     public boolean getSkillUseBoard() { return config.getBoolean("Scoreboard.Types.Skill.Board", true); }
     public boolean getSkillUseBoard() { return config.getBoolean("Scoreboard.Types.Skill.Board", true); }
     public int getSkillScoreboardTime() { return config.getInt("Scoreboard.Types.Skill.Display_Time", 30); }
     public int getSkillScoreboardTime() { return config.getInt("Scoreboard.Types.Skill.Display_Time", 30); }
     public boolean getSkillLevelUpBoard() { return config.getBoolean("Scoreboard.Types.Skill.LevelUp_Board", true); }
     public boolean getSkillLevelUpBoard() { return config.getBoolean("Scoreboard.Types.Skill.LevelUp_Board", true); }
@@ -364,8 +357,8 @@ public class Config extends AutoUpdateConfigLoader {
     public boolean getAbilitiesEnabled() { return config.getBoolean("Abilities.Enabled", true); }
     public boolean getAbilitiesEnabled() { return config.getBoolean("Abilities.Enabled", true); }
     public boolean getAbilitiesOnlyActivateWhenSneaking() { return config.getBoolean("Abilities.Activation.Only_Activate_When_Sneaking", false); }
     public boolean getAbilitiesOnlyActivateWhenSneaking() { return config.getBoolean("Abilities.Activation.Only_Activate_When_Sneaking", false); }
 
 
-    public int getCooldown(AbilityType ability) { return config.getInt("Abilities.Cooldowns." + ability.getConfigString()); }
-    public int getMaxLength(AbilityType ability) { return config.getInt("Abilities.Max_Seconds." + ability.getConfigString()); }
+    public int getCooldown(AbilityType ability) { return config.getInt("Abilities.Cooldowns." + ability.toString()); }
+    public int getMaxLength(AbilityType ability) { return config.getInt("Abilities.Max_Seconds." + ability.toString()); }
 
 
     /* Durability Settings */
     /* Durability Settings */
     public int getAbilityToolDamage() { return config.getInt("Abilities.Tools.Durability_Loss", 1); }
     public int getAbilityToolDamage() { return config.getInt("Abilities.Tools.Durability_Loss", 1); }

+ 3 - 3
src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java

@@ -543,7 +543,7 @@ public class McMMOPlayer {
         int powerLevel = 0;
         int powerLevel = 0;
 
 
         for (SkillType type : SkillType.NON_CHILD_SKILLS) {
         for (SkillType type : SkillType.NON_CHILD_SKILLS) {
-            if (Permissions.skillEnabled(player, type)) {
+            if (type.getPermissions(player)) {
                 powerLevel += profile.getSkillLevel(type);
                 powerLevel += profile.getSkillLevel(type);
             }
             }
         }
         }
@@ -566,7 +566,7 @@ public class McMMOPlayer {
             Set<SkillType> parentSkills = FamilyTree.getParents(skillType);
             Set<SkillType> parentSkills = FamilyTree.getParents(skillType);
 
 
             for (SkillType parentSkill : parentSkills) {
             for (SkillType parentSkill : parentSkills) {
-                if (Permissions.skillEnabled(player, parentSkill)) {
+                if (parentSkill.getPermissions(player)) {
                     beginXpGain(parentSkill, xp / parentSkills.size());
                     beginXpGain(parentSkill, xp / parentSkills.size());
                 }
                 }
             }
             }
@@ -601,7 +601,7 @@ public class McMMOPlayer {
      * @param xp Experience amount to add
      * @param xp Experience amount to add
      */
      */
     public void applyXpGain(SkillType skillType, float xp) {
     public void applyXpGain(SkillType skillType, float xp) {
-        if (!Permissions.skillEnabled(player, skillType)) {
+        if (!skillType.getPermissions(player)) {
             return;
             return;
         }
         }
 
 

+ 11 - 57
src/main/java/com/gmail/nossr50/datatypes/skills/AbilityType.java

@@ -17,7 +17,6 @@ import com.google.common.collect.ImmutableList;
 
 
 public enum AbilityType {
 public enum AbilityType {
     BERSERK(
     BERSERK(
-            "Unarmed.Skills.Berserk.Name",
             "Unarmed.Skills.Berserk.On",
             "Unarmed.Skills.Berserk.On",
             "Unarmed.Skills.Berserk.Off",
             "Unarmed.Skills.Berserk.Off",
             "Unarmed.Skills.Berserk.Other.On",
             "Unarmed.Skills.Berserk.Other.On",
@@ -25,7 +24,6 @@ public enum AbilityType {
             "Unarmed.Skills.Berserk.Other.Off"),
             "Unarmed.Skills.Berserk.Other.Off"),
 
 
     SUPER_BREAKER(
     SUPER_BREAKER(
-            "Mining.Skills.SuperBreaker.Name",
             "Mining.Skills.SuperBreaker.On",
             "Mining.Skills.SuperBreaker.On",
             "Mining.Skills.SuperBreaker.Off",
             "Mining.Skills.SuperBreaker.Off",
             "Mining.Skills.SuperBreaker.Other.On",
             "Mining.Skills.SuperBreaker.Other.On",
@@ -33,7 +31,6 @@ public enum AbilityType {
             "Mining.Skills.SuperBreaker.Other.Off"),
             "Mining.Skills.SuperBreaker.Other.Off"),
 
 
     GIGA_DRILL_BREAKER(
     GIGA_DRILL_BREAKER(
-            "Excavation.Skills.GigaDrillBreaker.Name",
             "Excavation.Skills.GigaDrillBreaker.On",
             "Excavation.Skills.GigaDrillBreaker.On",
             "Excavation.Skills.GigaDrillBreaker.Off",
             "Excavation.Skills.GigaDrillBreaker.Off",
             "Excavation.Skills.GigaDrillBreaker.Other.On",
             "Excavation.Skills.GigaDrillBreaker.Other.On",
@@ -41,7 +38,6 @@ public enum AbilityType {
             "Excavation.Skills.GigaDrillBreaker.Other.Off"),
             "Excavation.Skills.GigaDrillBreaker.Other.Off"),
 
 
     GREEN_TERRA(
     GREEN_TERRA(
-            "Herbalism.Skills.GTe.Name",
             "Herbalism.Skills.GTe.On",
             "Herbalism.Skills.GTe.On",
             "Herbalism.Skills.GTe.Off",
             "Herbalism.Skills.GTe.Off",
             "Herbalism.Skills.GTe.Other.On",
             "Herbalism.Skills.GTe.Other.On",
@@ -49,7 +45,6 @@ public enum AbilityType {
             "Herbalism.Skills.GTe.Other.Off"),
             "Herbalism.Skills.GTe.Other.Off"),
 
 
     SKULL_SPLITTER(
     SKULL_SPLITTER(
-            "Axes.Skills.SS.Name",
             "Axes.Skills.SS.On",
             "Axes.Skills.SS.On",
             "Axes.Skills.SS.Off",
             "Axes.Skills.SS.Off",
             "Axes.Skills.SS.Other.On",
             "Axes.Skills.SS.Other.On",
@@ -57,7 +52,6 @@ public enum AbilityType {
             "Axes.Skills.SS.Other.Off"),
             "Axes.Skills.SS.Other.Off"),
 
 
     TREE_FELLER(
     TREE_FELLER(
-            "Woodcutting.Skills.TreeFeller.Name",
             "Woodcutting.Skills.TreeFeller.On",
             "Woodcutting.Skills.TreeFeller.On",
             "Woodcutting.Skills.TreeFeller.Off",
             "Woodcutting.Skills.TreeFeller.Off",
             "Woodcutting.Skills.TreeFeller.Other.On",
             "Woodcutting.Skills.TreeFeller.Other.On",
@@ -65,7 +59,6 @@ public enum AbilityType {
             "Woodcutting.Skills.TreeFeller.Other.Off"),
             "Woodcutting.Skills.TreeFeller.Other.Off"),
 
 
     SERRATED_STRIKES(
     SERRATED_STRIKES(
-            "Swords.Skills.SS.Name",
             "Swords.Skills.SS.On",
             "Swords.Skills.SS.On",
             "Swords.Skills.SS.Off",
             "Swords.Skills.SS.Off",
             "Swords.Skills.SS.Other.On",
             "Swords.Skills.SS.Other.On",
@@ -76,7 +69,6 @@ public enum AbilityType {
      * Has cooldown - but has to share a skill with Super Breaker, so needs special treatment
      * Has cooldown - but has to share a skill with Super Breaker, so needs special treatment
      */
      */
     BLAST_MINING(
     BLAST_MINING(
-            "Mining.Blast.Name",
             null,
             null,
             null,
             null,
             "Mining.Blast.Other.On",
             "Mining.Blast.Other.On",
@@ -86,26 +78,13 @@ public enum AbilityType {
     /**
     /**
      * No cooldown - always active
      * No cooldown - always active
      */
      */
-    LEAF_BLOWER(
-            null,
-            null,
-            null,
-            null,
-            null,
-            null),
+    LEAF_BLOWER,
 
 
     /**
     /**
      * Not a first-class Ability - part of Berserk
      * Not a first-class Ability - part of Berserk
      */
      */
-    BLOCK_CRACKER(
-            null,
-            null,
-            null,
-            null,
-            null,
-            null);
+    BLOCK_CRACKER;
 
 
-    private String abilityName;
     private String abilityOn;
     private String abilityOn;
     private String abilityOff;
     private String abilityOff;
     private String abilityPlayer;
     private String abilityPlayer;
@@ -115,31 +94,18 @@ public enum AbilityType {
     /**
     /**
      * Those abilities that have a cooldown saved to the database.
      * Those abilities that have a cooldown saved to the database.
      */
      */
-    public static final List<AbilityType> NORMAL_ABILITIES;
+    public static final List<AbilityType> NORMAL_ABILITIES = ImmutableList.of(BERSERK, BLAST_MINING, GIGA_DRILL_BREAKER, GREEN_TERRA, SERRATED_STRIKES, SKULL_SPLITTER, SUPER_BREAKER, TREE_FELLER);
+
     /**
     /**
      * Those abilities that do not have a cooldown saved to the database.
      * Those abilities that do not have a cooldown saved to the database.
      */
      */
-    public static final List<AbilityType> NON_NORMAL_ABILITIES;
-
-    static {
-        NORMAL_ABILITIES = ImmutableList.of(
-                BERSERK,
-                SUPER_BREAKER,
-                GIGA_DRILL_BREAKER,
-                GREEN_TERRA,
-                SKULL_SPLITTER,
-                TREE_FELLER,
-                SERRATED_STRIKES,
-                BLAST_MINING
-                );
-        NON_NORMAL_ABILITIES = ImmutableList.of(
-                LEAF_BLOWER,
-                BLOCK_CRACKER
-                );
+    public static final List<AbilityType> NON_NORMAL_ABILITIES = ImmutableList.of(BLOCK_CRACKER, LEAF_BLOWER);
+
+    private AbilityType() {
+        this(null, null, null, null, null);
     }
     }
 
 
-    private AbilityType(String abilityName, String abilityOn, String abilityOff, String abilityPlayer, String abilityRefresh, String abilityPlayerOff) {
-        this.abilityName = abilityName;
+    private AbilityType(String abilityOn, String abilityOff, String abilityPlayer, String abilityRefresh, String abilityPlayerOff) {
         this.abilityOn = abilityOn;
         this.abilityOn = abilityOn;
         this.abilityOff = abilityOff;
         this.abilityOff = abilityOff;
         this.abilityPlayer = abilityPlayer;
         this.abilityPlayer = abilityPlayer;
@@ -155,17 +121,6 @@ public enum AbilityType {
         return Config.getInstance().getMaxLength(this);
         return Config.getInstance().getMaxLength(this);
     }
     }
 
 
-    /**
-     * May return null
-     * @return ability name, or null if unavailable
-     */
-    public String getAbilityName() {
-        if (this.abilityName == null) {
-            return null;
-        }
-        return LocaleLoader.getString(this.abilityName);
-    }
-
     public String getAbilityOn() {
     public String getAbilityOn() {
         return LocaleLoader.getString(this.abilityOn);
         return LocaleLoader.getString(this.abilityOn);
     }
     }
@@ -186,9 +141,8 @@ public enum AbilityType {
         return LocaleLoader.getString(this.abilityRefresh);
         return LocaleLoader.getString(this.abilityRefresh);
     }
     }
 
 
-    public String getConfigString() {
-        // If toString() changes, place old code here to not break config.yml
-        return this.toString();
+    public String getName() {
+        return StringUtils.getPrettyAbilityString(this);
     }
     }
 
 
     @Override
     @Override

+ 8 - 2
src/main/java/com/gmail/nossr50/datatypes/skills/SkillType.java

@@ -5,6 +5,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.List;
 
 
 import org.bukkit.Color;
 import org.bukkit.Color;
+import org.bukkit.entity.Player;
 
 
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.Config;
@@ -24,6 +25,7 @@ import com.gmail.nossr50.skills.swords.SwordsManager;
 import com.gmail.nossr50.skills.taming.TamingManager;
 import com.gmail.nossr50.skills.taming.TamingManager;
 import com.gmail.nossr50.skills.unarmed.UnarmedManager;
 import com.gmail.nossr50.skills.unarmed.UnarmedManager;
 import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager;
 import com.gmail.nossr50.skills.woodcutting.WoodcuttingManager;
+import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.StringUtils;
 import com.gmail.nossr50.util.StringUtils;
 
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableList;
@@ -70,7 +72,7 @@ public enum SkillType {
                 nonChildSkills.add(skill);
                 nonChildSkills.add(skill);
             }
             }
 
 
-            names.add(skill.getSkillName());
+            names.add(skill.getName());
         }
         }
 
 
         Collections.sort(names);
         Collections.sort(names);
@@ -191,7 +193,11 @@ public enum SkillType {
         return null;
         return null;
     }
     }
 
 
-    public String getSkillName() {
+    public String getName() {
         return Config.getInstance().getLocale().equalsIgnoreCase("en_US") ? StringUtils.getCapitalized(this.toString()) : StringUtils.getCapitalized(LocaleLoader.getString(StringUtils.getCapitalized(this.toString()) + ".SkillName"));
         return Config.getInstance().getLocale().equalsIgnoreCase("en_US") ? StringUtils.getCapitalized(this.toString()) : StringUtils.getCapitalized(LocaleLoader.getString(StringUtils.getCapitalized(this.toString()) + ".SkillName"));
     }
     }
+
+    public boolean getPermissions(Player player) {
+        return Permissions.skillEnabled(player, this);
+    }
 }
 }

+ 4 - 4
src/main/java/com/gmail/nossr50/listeners/BlockListener.java

@@ -156,19 +156,19 @@ public class BlockListener implements Listener {
              * We don't check the block store here because herbalism has too many unusual edge cases.
              * We don't check the block store here because herbalism has too many unusual edge cases.
              * Instead, we check it inside the drops handler.
              * Instead, we check it inside the drops handler.
              */
              */
-            if (Permissions.skillEnabled(player, SkillType.HERBALISM)) {
+            if (SkillType.HERBALISM.getPermissions(player)) {
                 herbalismManager.herbalismBlockCheck(blockState);
                 herbalismManager.herbalismBlockCheck(blockState);
             }
             }
         }
         }
 
 
         /* MINING */
         /* MINING */
-        else if (BlockUtils.affectedBySuperBreaker(blockState) && ItemUtils.isPickaxe(heldItem) && Permissions.skillEnabled(player, SkillType.MINING) && !mcMMO.getPlaceStore().isTrue(blockState)) {
+        else if (BlockUtils.affectedBySuperBreaker(blockState) && ItemUtils.isPickaxe(heldItem) && SkillType.MINING.getPermissions(player) && !mcMMO.getPlaceStore().isTrue(blockState)) {
             MiningManager miningManager = mcMMOPlayer.getMiningManager();
             MiningManager miningManager = mcMMOPlayer.getMiningManager();
             miningManager.miningBlockCheck(blockState);
             miningManager.miningBlockCheck(blockState);
         }
         }
 
 
         /* WOOD CUTTING */
         /* WOOD CUTTING */
-        else if (BlockUtils.isLog(blockState) && Permissions.skillEnabled(player, SkillType.WOODCUTTING) && !mcMMO.getPlaceStore().isTrue(blockState)) {
+        else if (BlockUtils.isLog(blockState) && SkillType.WOODCUTTING.getPermissions(player) && !mcMMO.getPlaceStore().isTrue(blockState)) {
             WoodcuttingManager woodcuttingManager = mcMMOPlayer.getWoodcuttingManager();
             WoodcuttingManager woodcuttingManager = mcMMOPlayer.getWoodcuttingManager();
 
 
             if (woodcuttingManager.canUseTreeFeller(heldItem)) {
             if (woodcuttingManager.canUseTreeFeller(heldItem)) {
@@ -180,7 +180,7 @@ public class BlockListener implements Listener {
         }
         }
 
 
         /* EXCAVATION */
         /* EXCAVATION */
-        else if (BlockUtils.affectedByGigaDrillBreaker(blockState) && ItemUtils.isShovel(heldItem) && Permissions.skillEnabled(player, SkillType.EXCAVATION) && !mcMMO.getPlaceStore().isTrue(blockState)) {
+        else if (BlockUtils.affectedByGigaDrillBreaker(blockState) && ItemUtils.isShovel(heldItem) && SkillType.EXCAVATION.getPermissions(player) && !mcMMO.getPlaceStore().isTrue(blockState)) {
             ExcavationManager excavationManager = mcMMOPlayer.getExcavationManager();
             ExcavationManager excavationManager = mcMMOPlayer.getExcavationManager();
             excavationManager.excavationBlockCheck(blockState);
             excavationManager.excavationBlockCheck(blockState);
 
 

+ 1 - 1
src/main/java/com/gmail/nossr50/listeners/InventoryListener.java

@@ -91,7 +91,7 @@ public class InventoryListener implements Listener {
 
 
         Player player = Misc.getPlayerFromFurnace(furnaceBlock);
         Player player = Misc.getPlayerFromFurnace(furnaceBlock);
 
 
-        if (Misc.isNPCEntity(player) || !Permissions.skillEnabled(player, SkillType.SMELTING)) {
+        if (Misc.isNPCEntity(player) || !SkillType.SMELTING.getPermissions(player)) {
             return;
             return;
         }
         }
 
 

+ 5 - 5
src/main/java/com/gmail/nossr50/listeners/PlayerListener.java

@@ -204,7 +204,7 @@ public class PlayerListener implements Listener {
     public void onPlayerFishHighest(PlayerFishEvent event) {
     public void onPlayerFishHighest(PlayerFishEvent event) {
         Player player = event.getPlayer();
         Player player = event.getPlayer();
 
 
-        if (Misc.isNPCEntity(player) || !Permissions.skillEnabled(player, SkillType.FISHING)) {
+        if (Misc.isNPCEntity(player) || !SkillType.FISHING.getPermissions(player)) {
             return;
             return;
         }
         }
 
 
@@ -249,7 +249,7 @@ public class PlayerListener implements Listener {
     public void onPlayerFishMonitor(PlayerFishEvent event) {
     public void onPlayerFishMonitor(PlayerFishEvent event) {
         Player player = event.getPlayer();
         Player player = event.getPlayer();
 
 
-        if (Misc.isNPCEntity(player) || !Permissions.skillEnabled(player, SkillType.FISHING)) {
+        if (Misc.isNPCEntity(player) || !SkillType.FISHING.getPermissions(player)) {
             return;
             return;
         }
         }
 
 
@@ -421,7 +421,7 @@ public class PlayerListener implements Listener {
 
 
                 if (!Config.getInstance().getAbilitiesOnlyActivateWhenSneaking() || player.isSneaking()) {
                 if (!Config.getInstance().getAbilitiesOnlyActivateWhenSneaking() || player.isSneaking()) {
                     /* REPAIR CHECKS */
                     /* REPAIR CHECKS */
-                    if (type == Repair.repairAnvilMaterial && Permissions.skillEnabled(player, SkillType.REPAIR) && mcMMO.getRepairableManager().isRepairable(heldItem)) {
+                    if (type == Repair.repairAnvilMaterial && SkillType.REPAIR.getPermissions(player) && mcMMO.getRepairableManager().isRepairable(heldItem)) {
                         RepairManager repairManager = mcMMOPlayer.getRepairManager();
                         RepairManager repairManager = mcMMOPlayer.getRepairManager();
                         event.setCancelled(true);
                         event.setCancelled(true);
 
 
@@ -460,7 +460,7 @@ public class PlayerListener implements Listener {
 
 
                 if ((Config.getInstance().getAbilitiesOnlyActivateWhenSneaking() && player.isSneaking()) || !Config.getInstance().getAbilitiesOnlyActivateWhenSneaking()) {
                 if ((Config.getInstance().getAbilitiesOnlyActivateWhenSneaking() && player.isSneaking()) || !Config.getInstance().getAbilitiesOnlyActivateWhenSneaking()) {
                     /* REPAIR CHECKS */
                     /* REPAIR CHECKS */
-                    if (type == Repair.repairAnvilMaterial && Permissions.skillEnabled(player, SkillType.REPAIR) && mcMMO.getRepairableManager().isRepairable(heldItem)) {
+                    if (type == Repair.repairAnvilMaterial && SkillType.REPAIR.getPermissions(player) && mcMMO.getRepairableManager().isRepairable(heldItem)) {
                         RepairManager repairManager = mcMMOPlayer.getRepairManager();
                         RepairManager repairManager = mcMMOPlayer.getRepairManager();
 
 
                         // Cancel repairing an enchanted item
                         // Cancel repairing an enchanted item
@@ -658,7 +658,7 @@ public class PlayerListener implements Listener {
             // Do these ACTUALLY have to be lower case to work properly?
             // Do these ACTUALLY have to be lower case to work properly?
             for (SkillType skill : SkillType.values()) {
             for (SkillType skill : SkillType.values()) {
                 String skillName = skill.toString().toLowerCase();
                 String skillName = skill.toString().toLowerCase();
-                String localizedName = skill.getSkillName().toLowerCase();
+                String localizedName = skill.getName().toLowerCase();
 
 
                 if (lowerCaseCommand.equals(localizedName)) {
                 if (lowerCaseCommand.equals(localizedName)) {
                     event.setMessage(message.replace(command, skillName));
                     event.setMessage(message.replace(command, skillName));

+ 12 - 12
src/main/java/com/gmail/nossr50/listeners/ScoreboardsListener.java

@@ -12,28 +12,28 @@ import com.gmail.nossr50.events.skills.abilities.McMMOPlayerAbilityActivateEvent
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
 
 
 public class ScoreboardsListener implements Listener {
 public class ScoreboardsListener implements Listener {
-    @EventHandler
-    public void onPlayerJoin(PlayerJoinEvent e) {
-        ScoreboardManager.setupPlayer(e.getPlayer());
+    @EventHandler(priority = EventPriority.MONITOR)
+    public void onPlayerJoin(PlayerJoinEvent event) {
+        ScoreboardManager.setupPlayer(event.getPlayer());
     }
     }
 
 
-    @EventHandler
-    public void onPlayerQuit(PlayerQuitEvent e) {
-        ScoreboardManager.teardownPlayer(e.getPlayer());
+    @EventHandler(priority = EventPriority.MONITOR)
+    public void onPlayerQuit(PlayerQuitEvent event) {
+        ScoreboardManager.teardownPlayer(event.getPlayer());
     }
     }
 
 
     @EventHandler(priority = EventPriority.MONITOR)
     @EventHandler(priority = EventPriority.MONITOR)
-    public void onPlayerLevelUp(McMMOPlayerLevelUpEvent e) {
-        ScoreboardManager.handleLevelUp(e.getPlayer(), e.getSkill());
+    public void onPlayerLevelUp(McMMOPlayerLevelUpEvent event) {
+        ScoreboardManager.handleLevelUp(event.getPlayer(), event.getSkill());
     }
     }
 
 
     @EventHandler(priority = EventPriority.MONITOR)
     @EventHandler(priority = EventPriority.MONITOR)
-    public void onPlayerXp(McMMOPlayerXpGainEvent e) {
-        ScoreboardManager.handleXp(e.getPlayer(), e.getSkill());
+    public void onPlayerXp(McMMOPlayerXpGainEvent event) {
+        ScoreboardManager.handleXp(event.getPlayer(), event.getSkill());
     }
     }
 
 
     @EventHandler(priority = EventPriority.MONITOR)
     @EventHandler(priority = EventPriority.MONITOR)
-    public void onAbility(McMMOPlayerAbilityActivateEvent e) {
-        ScoreboardManager.cooldownUpdate(e.getPlayer(), e.getSkill());
+    public void onAbility(McMMOPlayerAbilityActivateEvent event) {
+        ScoreboardManager.cooldownUpdate(event.getPlayer(), event.getSkill());
     }
     }
 }
 }

+ 5 - 1
src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandAsyncTask.java

@@ -18,7 +18,11 @@ public class McrankCommandAsyncTask extends BukkitRunnable {
     public McrankCommandAsyncTask(String playerName, CommandSender sender, boolean useBoard, boolean useChat) {
     public McrankCommandAsyncTask(String playerName, CommandSender sender, boolean useBoard, boolean useChat) {
         Validate.isTrue(useBoard || useChat, "Attempted to start a rank retrieval with both board and chat off");
         Validate.isTrue(useBoard || useChat, "Attempted to start a rank retrieval with both board and chat off");
         Validate.notNull(sender, "Attempted to start a rank retrieval with no recipient");
         Validate.notNull(sender, "Attempted to start a rank retrieval with no recipient");
-        if (useBoard) Validate.isTrue(sender instanceof Player, "Attempted to start a rank retrieval displaying scoreboard to a non-player");
+
+        if (useBoard) {
+            Validate.isTrue(sender instanceof Player, "Attempted to start a rank retrieval displaying scoreboard to a non-player");
+        }
+
         this.playerName = playerName;
         this.playerName = playerName;
         this.sender = sender;
         this.sender = sender;
         this.useBoard = useBoard;
         this.useBoard = useBoard;

+ 5 - 5
src/main/java/com/gmail/nossr50/runnables/commands/McrankCommandDisplayTask.java

@@ -9,7 +9,6 @@ import org.bukkit.scheduler.BukkitRunnable;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.datatypes.skills.SkillType;
 import com.gmail.nossr50.datatypes.skills.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
 
 
 /**
 /**
@@ -21,7 +20,7 @@ public class McrankCommandDisplayTask extends BukkitRunnable {
     private final String playerName;
     private final String playerName;
     private final boolean useBoard, useChat;
     private final boolean useBoard, useChat;
 
 
-    /*package-private*/ McrankCommandDisplayTask(Map<SkillType, Integer> skills, CommandSender sender, String playerName, boolean useBoard, boolean useChat) {
+    McrankCommandDisplayTask(Map<SkillType, Integer> skills, CommandSender sender, String playerName, boolean useBoard, boolean useChat) {
         this.skills = skills;
         this.skills = skills;
         this.sender = sender;
         this.sender = sender;
         this.playerName = playerName;
         this.playerName = playerName;
@@ -34,6 +33,7 @@ public class McrankCommandDisplayTask extends BukkitRunnable {
         if (useBoard) {
         if (useBoard) {
             displayBoard();
             displayBoard();
         }
         }
+
         if (useChat){
         if (useChat){
             displayChat();
             displayChat();
         }
         }
@@ -47,12 +47,12 @@ public class McrankCommandDisplayTask extends BukkitRunnable {
         sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Player", playerName));
         sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Player", playerName));
 
 
         for (SkillType skill : SkillType.NON_CHILD_SKILLS) {
         for (SkillType skill : SkillType.NON_CHILD_SKILLS) {
-            if (player != null && !Permissions.skillEnabled(player, skill)) {
+            if (!skill.getPermissions(player)) {
                 continue;
                 continue;
             }
             }
 
 
             rank = skills.get(skill);
             rank = skills.get(skill);
-            sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Skill", skill.getSkillName(), (rank == null ? LocaleLoader.getString("Commands.mcrank.Unranked") : rank)));
+            sender.sendMessage(LocaleLoader.getString("Commands.mcrank.Skill", skill.getName(), (rank == null ? LocaleLoader.getString("Commands.mcrank.Unranked") : rank)));
         }
         }
 
 
         rank = skills.get(null);
         rank = skills.get(null);
@@ -60,7 +60,7 @@ public class McrankCommandDisplayTask extends BukkitRunnable {
     }
     }
 
 
     public void displayBoard() {
     public void displayBoard() {
-        if (playerName == null || sender.getName().equalsIgnoreCase(playerName)) {
+        if (sender.getName().equalsIgnoreCase(playerName)) {
             ScoreboardManager.showPlayerRankScoreboard((Player) sender, skills);
             ScoreboardManager.showPlayerRankScoreboard((Player) sender, skills);
         }
         }
         else {
         else {

+ 5 - 1
src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandAsyncTask.java

@@ -20,7 +20,11 @@ public class MctopCommandAsyncTask extends BukkitRunnable {
     public MctopCommandAsyncTask(int page, SkillType skill, CommandSender sender, boolean useBoard, boolean useChat) {
     public MctopCommandAsyncTask(int page, SkillType skill, CommandSender sender, boolean useBoard, boolean useChat) {
         Validate.isTrue(useBoard || useChat, "Attempted to start a rank retrieval with both board and chat off");
         Validate.isTrue(useBoard || useChat, "Attempted to start a rank retrieval with both board and chat off");
         Validate.notNull(sender, "Attempted to start a rank retrieval with no recipient");
         Validate.notNull(sender, "Attempted to start a rank retrieval with no recipient");
-        if (useBoard) Validate.isTrue(sender instanceof Player, "Attempted to start a rank retrieval displaying scoreboard to a non-player");
+
+        if (useBoard) {
+            Validate.isTrue(sender instanceof Player, "Attempted to start a rank retrieval displaying scoreboard to a non-player");
+        }
+
         this.page = page;
         this.page = page;
         this.skill = skill;
         this.skill = skill;
         this.sender = sender;
         this.sender = sender;

+ 4 - 2
src/main/java/com/gmail/nossr50/runnables/commands/MctopCommandDisplayTask.java

@@ -22,7 +22,7 @@ public class MctopCommandDisplayTask extends BukkitRunnable {
     private final int page;
     private final int page;
     private final boolean useBoard, useChat;
     private final boolean useBoard, useChat;
 
 
-    /*package-private*/ MctopCommandDisplayTask(List<PlayerStat> userStats, int page, SkillType skill, CommandSender sender, boolean useBoard, boolean useChat) {
+    MctopCommandDisplayTask(List<PlayerStat> userStats, int page, SkillType skill, CommandSender sender, boolean useBoard, boolean useChat) {
         this.userStats = userStats;
         this.userStats = userStats;
         this.page = page;
         this.page = page;
         this.skill = skill;
         this.skill = skill;
@@ -36,9 +36,11 @@ public class MctopCommandDisplayTask extends BukkitRunnable {
         if (useBoard) {
         if (useBoard) {
             displayBoard();
             displayBoard();
         }
         }
+
         if (useChat) {
         if (useChat) {
             displayChat();
             displayChat();
         }
         }
+
         sender.sendMessage(LocaleLoader.getString("Commands.mctop.Tip"));
         sender.sendMessage(LocaleLoader.getString("Commands.mctop.Tip"));
     }
     }
 
 
@@ -47,7 +49,7 @@ public class MctopCommandDisplayTask extends BukkitRunnable {
             sender.sendMessage(LocaleLoader.getString("Commands.PowerLevel.Leaderboard"));
             sender.sendMessage(LocaleLoader.getString("Commands.PowerLevel.Leaderboard"));
         }
         }
         else {
         else {
-            sender.sendMessage(LocaleLoader.getString("Commands.Skill.Leaderboard", skill.getSkillName()));
+            sender.sendMessage(LocaleLoader.getString("Commands.Skill.Leaderboard", skill.getName()));
         }
         }
 
 
         int place = (page * 10) - 9;
         int place = (page * 10) - 9;

+ 6 - 0
src/main/java/com/gmail/nossr50/util/StringUtils.java

@@ -3,6 +3,8 @@ package com.gmail.nossr50.util;
 import org.bukkit.Material;
 import org.bukkit.Material;
 import org.bukkit.entity.EntityType;
 import org.bukkit.entity.EntityType;
 
 
+import com.gmail.nossr50.datatypes.skills.AbilityType;
+
 public class StringUtils {
 public class StringUtils {
     /**
     /**
      * Gets a capitalized version of the target string.
      * Gets a capitalized version of the target string.
@@ -22,6 +24,10 @@ public class StringUtils {
         return createPrettyEnumString(entity.toString());
         return createPrettyEnumString(entity.toString());
     }
     }
 
 
+    public static String getPrettyAbilityString(AbilityType ability) {
+        return createPrettyEnumString(ability.toString());
+    }
+
     private static String createPrettyEnumString(String baseString) {
     private static String createPrettyEnumString(String baseString) {
         String[] substrings = baseString.split("_");
         String[] substrings = baseString.split("_");
         String prettyString = "";
         String prettyString = "";

+ 3 - 2
src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java

@@ -60,7 +60,7 @@ public final class CommandRegistrationManager {
     private static void registerSkillCommands() {
     private static void registerSkillCommands() {
         for (SkillType skill : SkillType.values()) {
         for (SkillType skill : SkillType.values()) {
             String commandName = skill.toString().toLowerCase();
             String commandName = skill.toString().toLowerCase();
-            String localizedName = skill.getSkillName().toLowerCase();
+            String localizedName = skill.getName().toLowerCase();
 
 
             PluginCommand command;
             PluginCommand command;
 
 
@@ -385,7 +385,8 @@ public final class CommandRegistrationManager {
         command.setDescription("Change the current mcMMO scoreboard being displayed"); //TODO: Localize
         command.setDescription("Change the current mcMMO scoreboard being displayed"); //TODO: Localize
         command.setPermission("mcmmo.commands.mcscoreboard");
         command.setPermission("mcmmo.commands.mcscoreboard");
         command.setPermissionMessage(permissionsMessage);
         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());
         command.setExecutor(new McscoreboardCommand());
     }
     }
 
 

+ 5 - 6
src/main/java/com/gmail/nossr50/util/commands/CommandUtils.java

@@ -3,7 +3,6 @@ package com.gmail.nossr50.util.commands;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 
 
-import org.bukkit.Bukkit;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.command.CommandSender;
 import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 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.datatypes.skills.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Misc;
-import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.StringUtils;
 import com.gmail.nossr50.util.StringUtils;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.skills.SkillUtils;
 import com.gmail.nossr50.util.skills.SkillUtils;
@@ -98,9 +96,10 @@ public final class CommandUtils {
             return true;
             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"));
         sender.sendMessage(LocaleLoader.getString("Commands.DoesNotExist"));
@@ -208,7 +207,7 @@ public final class CommandUtils {
         displayData.add(header);
         displayData.add(header);
 
 
         for (SkillType skill : skillGroup) {
         for (SkillType skill : skillGroup) {
-            if (Permissions.skillEnabled(inspect, skill)) {
+            if (skill.getPermissions(inspect)) {
                 displayData.add(displaySkill(profile, skill));
                 displayData.add(displaySkill(profile, skill));
             }
             }
         }
         }

+ 84 - 79
src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardManager.java

@@ -1,14 +1,11 @@
 package com.gmail.nossr50.util.scoreboards;
 package com.gmail.nossr50.util.scoreboards;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
-import java.util.Random;
 
 
-import org.bukkit.Bukkit;
 import org.bukkit.ChatColor;
 import org.bukkit.ChatColor;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.entity.Player;
 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_ABILITY_COOLDOWN = getOfflinePlayer(LocaleLoader.getString("Scoreboard.Misc.Cooldown"));
     static final OfflinePlayer LABEL_OVERALL = getOfflinePlayer(LocaleLoader.getString("Scoreboard.Misc.Overall"));
     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> abilityLabelsColored;
     static final Map<AbilityType, OfflinePlayer> abilityLabelsSkill;
     static final Map<AbilityType, OfflinePlayer> abilityLabelsSkill;
+
     static {
     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()) {
         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;
             int i = 0;
             for (SkillType type : SkillType.values()) {
             for (SkillType type : SkillType.values()) {
                 // Include child skills
                 // 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) {
                 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) {
                     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;
                 if (++i == colors.size()) i = 0;
             }
             }
         }
         }
         else {
         else {
             for (SkillType type : SkillType.values()) {
             for (SkillType type : SkillType.values()) {
                 // Include child skills
                 // Include child skills
-                b.put(type, getOfflinePlayer(ChatColor.GREEN + type.getSkillName()));
+                skillLabelBuilder.put(type, getOfflinePlayer(ChatColor.GREEN + type.getName()));
+
                 if (type.getAbility() != null) {
                 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) {
                     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) {
         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 List<String> dirtyPowerLevels = new ArrayList<String>();
 
 
     private static OfflinePlayer getOfflinePlayer(String name) {
     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) {
     private static OfflinePlayer getOfflinePlayerDots(String name) {
+        return getOfflinePlayer(name, true);
+    }
+
+    private static OfflinePlayer getOfflinePlayer(String name, boolean useDots) {
         if (name.length() > 16) {
         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 {
     public enum SidebarType {
@@ -144,14 +135,15 @@ public class ScoreboardManager {
     // **** Listener call-ins **** //
     // **** Listener call-ins **** //
 
 
     // Called by PlayerJoinEvent listener
     // 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
     // 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) {
         if (wrapper.revertTask != null) {
             wrapper.revertTask.cancel();
             wrapper.revertTask.cancel();
         }
         }
@@ -159,14 +151,15 @@ public class ScoreboardManager {
 
 
     // Called in onDisable()
     // Called in onDisable()
     public static void teardownAll() {
     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
     // Called by ScoreboardWrapper when its Player logs off and an action tries to be performed
     public static void cleanup(ScoreboardWrapper wrapper) {
     public static void cleanup(ScoreboardWrapper wrapper) {
         PLAYER_SCOREBOARDS.remove(wrapper.playerName);
         PLAYER_SCOREBOARDS.remove(wrapper.playerName);
+
         if (wrapper.revertTask != null) {
         if (wrapper.revertTask != null) {
             wrapper.revertTask.cancel();
             wrapper.revertTask.cancel();
         }
         }
@@ -175,16 +168,18 @@ public class ScoreboardManager {
     // Called by internal level-up event listener
     // Called by internal level-up event listener
     public static void handleLevelUp(Player player, SkillType skill) {
     public static void handleLevelUp(Player player, SkillType skill) {
         // Selfboards
         // 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
         // Otherboards
         String playerName = player.getName();
         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) {
     public static void handleXp(Player player, SkillType skill) {
         // Selfboards
         // Selfboards
         ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName());
         ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName());
+
         if (wrapper.isSkillScoreboard() && wrapper.targetSkill == skill && wrapper.isBoardShown()) {
         if (wrapper.isSkillScoreboard() && wrapper.targetSkill == skill && wrapper.isBoardShown()) {
             wrapper.doSidebarUpdateSoon();
             wrapper.doSidebarUpdateSoon();
         }
         }
@@ -210,6 +206,7 @@ public class ScoreboardManager {
     public static void cooldownUpdate(Player player, SkillType skill) {
     public static void cooldownUpdate(Player player, SkillType skill) {
         // Selfboards
         // Selfboards
         ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName());
         ScoreboardWrapper wrapper = PLAYER_SCOREBOARDS.get(player.getName());
+
         if ((wrapper.isCooldownScoreboard() || wrapper.isSkillScoreboard() && wrapper.targetSkill == skill) && wrapper.isBoardShown()) {
         if ((wrapper.isCooldownScoreboard() || wrapper.isSkillScoreboard() && wrapper.targetSkill == skill) && wrapper.isBoardShown()) {
             wrapper.doSidebarUpdateSoon();
             wrapper.doSidebarUpdateSoon();
         }
         }
@@ -267,8 +264,8 @@ public class ScoreboardManager {
         changeScoreboard(wrapper, Config.getInstance().getCooldownScoreboardTime());
         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.setOldScoreboard();
         wrapper.setTypeSelfRank();
         wrapper.setTypeSelfRank();
@@ -277,8 +274,8 @@ public class ScoreboardManager {
         changeScoreboard(wrapper, Config.getInstance().getRankScoreboardTime());
         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.setOldScoreboard();
         wrapper.setTypeInspectRank(targetName);
         wrapper.setTypeInspectRank(targetName);
@@ -314,24 +311,28 @@ public class ScoreboardManager {
      */
      */
     public static boolean powerLevelHeartbeat() {
     public static boolean powerLevelHeartbeat() {
         Objective mainObjective = getPowerLevelObjective();
         Objective mainObjective = getPowerLevelObjective();
+
         if (mainObjective == null) {
         if (mainObjective == null) {
             return false; // indicates
             return false; // indicates
         }
         }
 
 
-        if (!dirtyPowerLevels.isEmpty())
+        if (!dirtyPowerLevels.isEmpty()) {
             mcMMO.p.getLogger().info(dirtyPowerLevels.toString());
             mcMMO.p.getLogger().info(dirtyPowerLevels.toString());
+        }
+
         for (String playerName : dirtyPowerLevels) {
         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);
             mainObjective.getScore(player).setScore(power);
+
             for (ScoreboardWrapper wrapper : PLAYER_SCOREBOARDS.values()) {
             for (ScoreboardWrapper wrapper : PLAYER_SCOREBOARDS.values()) {
                 wrapper.updatePowerLevel(player, power);
                 wrapper.updatePowerLevel(player, power);
             }
             }
         }
         }
-        dirtyPowerLevels.clear();
 
 
+        dirtyPowerLevels.clear();
         return true;
         return true;
     }
     }
 
 
@@ -345,21 +346,25 @@ public class ScoreboardManager {
      */
      */
     public static Objective getPowerLevelObjective() {
     public static Objective getPowerLevelObjective() {
         if (!Config.getInstance().getPowerLevelTagsEnabled()) {
         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.");
                 mcMMO.p.debug("Removed leftover scoreboard objects from Power Level Tags.");
             }
             }
+
             return null;
             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) {
     private static void changeScoreboard(ScoreboardWrapper wrapper, int displayTime) {

+ 136 - 117
src/main/java/com/gmail/nossr50/util/scoreboards/ScoreboardWrapper.java

@@ -2,10 +2,8 @@ package com.gmail.nossr50.util.scoreboards;
 
 
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
-import java.util.Set;
 
 
 import org.apache.commons.lang.Validate;
 import org.apache.commons.lang.Validate;
-import org.bukkit.Bukkit;
 import org.bukkit.ChatColor;
 import org.bukkit.ChatColor;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
 import org.bukkit.scheduler.BukkitRunnable;
 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.locale.LocaleLoader;
 import com.gmail.nossr50.skills.child.FamilyTree;
 import com.gmail.nossr50.skills.child.FamilyTree;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Misc;
-import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.player.UserManager;
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager.SidebarType;
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager.SidebarType;
 import com.gmail.nossr50.util.skills.SkillUtils;
 import com.gmail.nossr50.util.skills.SkillUtils;
@@ -34,14 +31,14 @@ public class ScoreboardWrapper {
 
 
     // Initialization variables
     // Initialization variables
     public final String playerName;
     public final String playerName;
-    private final Scoreboard board;
+    private final Scoreboard scoreboard;
     private boolean tippedKeep = false;
     private boolean tippedKeep = false;
     private boolean tippedClear = false;
     private boolean tippedClear = false;
 
 
     // Internal usage variables (should exist)
     // Internal usage variables (should exist)
     private SidebarType sidebarType;
     private SidebarType sidebarType;
-    private Objective sidebarObj;
-    private Objective powerObj;
+    private Objective sidebarObjective;
+    private Objective powerObjective;
 
 
     // Parameter variables (May be null / invalid)
     // Parameter variables (May be null / invalid)
     private Scoreboard oldBoard = null;
     private Scoreboard oldBoard = null;
@@ -50,30 +47,32 @@ public class ScoreboardWrapper {
     private PlayerProfile targetProfile = null;
     private PlayerProfile targetProfile = null;
     public int leaderboardPage = -1;
     public int leaderboardPage = -1;
 
 
-    private ScoreboardWrapper(String playerName, Scoreboard s) {
+    private ScoreboardWrapper(String playerName, Scoreboard scoreboard) {
         this.playerName = playerName;
         this.playerName = playerName;
-        board = s;
+        this.scoreboard = scoreboard;
         sidebarType = SidebarType.NONE;
         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()) {
         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;
     public BukkitTask updateTask = null;
     private class ScoreboardQuickUpdate extends BukkitRunnable {
     private class ScoreboardQuickUpdate extends BukkitRunnable {
         @Override
         @Override
         public void run() {
         public void run() {
-            ScoreboardWrapper.this.updateSidebar();
+            updateSidebar();
             updateTask = null;
             updateTask = null;
         }
         }
     }
     }
@@ -82,7 +81,7 @@ public class ScoreboardWrapper {
     private class ScoreboardChangeTask extends BukkitRunnable {
     private class ScoreboardChangeTask extends BukkitRunnable {
         @Override
         @Override
         public void run() {
         public void run() {
-            ScoreboardWrapper.this.tryRevertBoard();
+            tryRevertBoard();
             revertTask = null;
             revertTask = null;
         }
         }
     }
     }
@@ -91,13 +90,12 @@ public class ScoreboardWrapper {
     private class ScoreboardCooldownTask extends BukkitRunnable {
     private class ScoreboardCooldownTask extends BukkitRunnable {
         @Override
         @Override
         public void run() {
         public void run() {
-            ScoreboardWrapper wrapper = ScoreboardWrapper.this;
             // Stop updating if it's no longer something displaying cooldowns
             // 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 {
             else {
-                wrapper.stopCooldownUpdating();
+                stopCooldownUpdating();
             }
             }
         }
         }
     }
     }
@@ -122,7 +120,9 @@ public class ScoreboardWrapper {
         if (cooldownTask != null) {
         if (cooldownTask != null) {
             try {
             try {
                 cooldownTask.cancel();
                 cooldownTask.cancel();
-            } catch (Throwable ignored) {}
+            }
+            catch (Throwable ignored) {}
+
             cooldownTask = null;
             cooldownTask = null;
         }
         }
     }
     }
@@ -143,29 +143,29 @@ public class ScoreboardWrapper {
      * Set the old scoreboard, for use in reverting.
      * Set the old scoreboard, for use in reverting.
      */
      */
     public void setOldScoreboard() {
     public void setOldScoreboard() {
-        Player player = Bukkit.getPlayerExact(playerName);
+        Player player = mcMMO.p.getServer().getPlayerExact(playerName);
+
         if (player == null) {
         if (player == null) {
             ScoreboardManager.cleanup(this);
             ScoreboardManager.cleanup(this);
             return;
             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
                 // (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 {
         else {
-            oldBoard = old;
+            this.oldBoard = oldBoard;
         }
         }
     }
     }
 
 
     public void showBoardWithNoRevert() {
     public void showBoardWithNoRevert() {
-        Player player = Bukkit.getPlayerExact(playerName);
+        Player player = mcMMO.p.getServer().getPlayerExact(playerName);
+
         if (player == null) {
         if (player == null) {
             ScoreboardManager.cleanup(this);
             ScoreboardManager.cleanup(this);
             return;
             return;
@@ -174,12 +174,14 @@ public class ScoreboardWrapper {
         if (revertTask != null) {
         if (revertTask != null) {
             revertTask.cancel();
             revertTask.cancel();
         }
         }
-        player.setScoreboard(board);
+
+        player.setScoreboard(scoreboard);
         revertTask = null;
         revertTask = null;
     }
     }
 
 
     public void showBoardAndScheduleRevert(int ticks) {
     public void showBoardAndScheduleRevert(int ticks) {
-        Player player = Bukkit.getPlayerExact(playerName);
+        Player player = mcMMO.p.getServer().getPlayerExact(playerName);
+
         if (player == null) {
         if (player == null) {
             ScoreboardManager.cleanup(this);
             ScoreboardManager.cleanup(this);
             return;
             return;
@@ -188,7 +190,8 @@ public class ScoreboardWrapper {
         if (revertTask != null) {
         if (revertTask != null) {
             revertTask.cancel();
             revertTask.cancel();
         }
         }
-        player.setScoreboard(board);
+
+        player.setScoreboard(scoreboard);
         revertTask = new ScoreboardChangeTask().runTaskLater(mcMMO.p, ticks);
         revertTask = new ScoreboardChangeTask().runTaskLater(mcMMO.p, ticks);
 
 
         // TODO is there any way to do the time that looks acceptable?
         // TODO is there any way to do the time that looks acceptable?
@@ -204,14 +207,15 @@ public class ScoreboardWrapper {
     }
     }
 
 
     public void tryRevertBoard() {
     public void tryRevertBoard() {
-        Player player = Bukkit.getPlayerExact(playerName);
+        Player player = mcMMO.p.getServer().getPlayerExact(playerName);
+
         if (player == null) {
         if (player == null) {
             ScoreboardManager.cleanup(this);
             ScoreboardManager.cleanup(this);
             return;
             return;
         }
         }
 
 
         if (oldBoard != null) {
         if (oldBoard != null) {
-            if (player.getScoreboard() == board) {
+            if (player.getScoreboard() == scoreboard) {
                 player.setScoreboard(oldBoard);
                 player.setScoreboard(oldBoard);
                 oldBoard = null;
                 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!)");
                 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;
         sidebarType = SidebarType.NONE;
         targetPlayer = null;
         targetPlayer = null;
         targetSkill = null;
         targetSkill = null;
@@ -235,19 +234,22 @@ public class ScoreboardWrapper {
     }
     }
 
 
     public boolean isBoardShown() {
     public boolean isBoardShown() {
-        Player player = Bukkit.getPlayerExact(playerName);
+        Player player = mcMMO.p.getServer().getPlayerExact(playerName);
+
         if (player == null) {
         if (player == null) {
             ScoreboardManager.cleanup(this);
             ScoreboardManager.cleanup(this);
             return false;
             return false;
         }
         }
 
 
-        return player.getScoreboard() == board;
+        return player.getScoreboard() == scoreboard;
     }
     }
 
 
     public void cancelRevert() {
     public void cancelRevert() {
-        if (revertTask != null) {
-            revertTask.cancel();
+        if (revertTask == null) {
+            return;
         }
         }
+
+        revertTask.cancel();
         revertTask = null;
         revertTask = null;
     }
     }
 
 
@@ -358,17 +360,18 @@ public class ScoreboardWrapper {
 
 
     // Setup for after a board type change
     // Setup for after a board type change
     protected void loadObjective(String displayName) {
     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) {
         if (displayName.length() > 32) {
             displayName = displayName.substring(0, 32);
             displayName = displayName.substring(0, 32);
         }
         }
-        sidebarObj.setDisplayName(displayName);
+
+        sidebarObjective.setDisplayName(displayName);
 
 
         updateSidebar();
         updateSidebar();
         // Do last! Minimize packets!
         // Do last! Minimize packets!
-        sidebarObj.setDisplaySlot(DisplaySlot.SIDEBAR);
+        sidebarObjective.setDisplaySlot(DisplaySlot.SIDEBAR);
     }
     }
 
 
     /**
     /**
@@ -377,21 +380,24 @@ public class ScoreboardWrapper {
     private void updateSidebar() {
     private void updateSidebar() {
         try {
         try {
             updateTask.cancel();
             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;
         updateTask = null;
 
 
         if (sidebarType == SidebarType.NONE) {
         if (sidebarType == SidebarType.NONE) {
             return;
             return;
         }
         }
 
 
-        Player bukkitPlayer = Bukkit.getPlayerExact(playerName);
-        if (bukkitPlayer == null) {
+        Player player = mcMMO.p.getServer().getPlayerExact(playerName);
+
+        if (player == null) {
             ScoreboardManager.cleanup(this);
             ScoreboardManager.cleanup(this);
             return;
             return;
         }
         }
 
 
-        McMMOPlayer mcPlayer = UserManager.getPlayer(bukkitPlayer);
-        PlayerProfile profile = mcPlayer.getProfile();
+        McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
+        PlayerProfile profile = mcMMOPlayer.getProfile();
 
 
         switch (sidebarType) {
         switch (sidebarType) {
         case NONE:
         case NONE:
@@ -399,65 +405,66 @@ public class ScoreboardWrapper {
 
 
         case SKILL_BOARD:
         case SKILL_BOARD:
             Validate.notNull(targetSkill);
             Validate.notNull(targetSkill);
+
             if (!targetSkill.isChildSkill()) {
             if (!targetSkill.isChildSkill()) {
                 int currentXP = profile.getSkillXpLevel(targetSkill);
                 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 {
             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.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
                     // 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;
             break;
 
 
         case COOLDOWNS_BOARD:
         case COOLDOWNS_BOARD:
             boolean anyCooldownsActive = false;
             boolean anyCooldownsActive = false;
+
             for (AbilityType ability : AbilityType.NORMAL_ABILITIES) {
             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) {
                 if (seconds != 0) {
                     anyCooldownsActive = true;
                     anyCooldownsActive = true;
                 }
                 }
-                sidebarObj.getScore(ScoreboardManager.abilityLabelsColored.get(ability)).setScore(seconds);
+
+                sidebarObjective.getScore(ScoreboardManager.abilityLabelsColored.get(ability)).setScore(seconds);
             }
             }
 
 
             if (anyCooldownsActive) {
             if (anyCooldownsActive) {
@@ -470,30 +477,35 @@ public class ScoreboardWrapper {
 
 
         case STATS_BOARD:
         case STATS_BOARD:
             // Select the profile to read from
             // Select the profile to read from
-            PlayerProfile prof;
+            PlayerProfile newProfile;
+
             if (targetProfile != null) {
             if (targetProfile != null) {
-                prof = targetProfile; // offline
+                newProfile = targetProfile; // offline
             }
             }
             else if (targetPlayer == null) {
             else if (targetPlayer == null) {
-                prof = profile; // self
+                newProfile = profile; // self
             }
             }
             else {
             else {
-                prof = UserManager.getPlayer(targetPlayer).getProfile(); // online
+                newProfile = UserManager.getPlayer(targetPlayer).getProfile(); // online
             }
             }
+
             // Calculate power level here
             // Calculate power level here
             int powerLevel = 0;
             int powerLevel = 0;
             for (SkillType skill : SkillType.values()) { // Include child skills, but not in power level
             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())
                 if (!skill.isChildSkill())
                     powerLevel += level;
                     powerLevel += level;
 
 
                 // TODO: Verify that this is what we want - calculated in power level but not displayed
                 // 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;
                     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;
             break;
 
 
         case RANK_BOARD:
         case RANK_BOARD:
@@ -504,40 +516,47 @@ public class ScoreboardWrapper {
              */
              */
             break;
             break;
 
 
+        default:
+            break;
         }
         }
     }
     }
 
 
     public void acceptRankData(Map<SkillType, Integer> rankData) {
     public void acceptRankData(Map<SkillType, Integer> rankData) {
         Integer rank;
         Integer rank;
-        Player bukkitPlayer = Bukkit.getPlayerExact(playerName);
+        Player player = mcMMO.p.getServer().getPlayerExact(playerName);
 
 
         for (SkillType skill : SkillType.NON_CHILD_SKILLS) {
         for (SkillType skill : SkillType.NON_CHILD_SKILLS) {
-            if (!Permissions.skillEnabled(bukkitPlayer, skill)) {
+            if (!skill.getPermissions(player)) {
                 continue;
                 continue;
             }
             }
 
 
             rank = rankData.get(skill);
             rank = rankData.get(skill);
+
             if (rank != null) {
             if (rank != null) {
-                sidebarObj.getScore(ScoreboardManager.skillLabels.get(skill)).setScore(rank);
+                sidebarObjective.getScore(ScoreboardManager.skillLabels.get(skill)).setScore(rank);
             }
             }
         }
         }
+
         rank = rankData.get(null);
         rank = rankData.get(null);
+
         if (rank != 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) {
     public void acceptLeaderboardData(List<PlayerStat> leaderboardData) {
         for (PlayerStat stat : 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);
     }
     }
 }
 }

+ 5 - 5
src/main/java/com/gmail/nossr50/util/skills/CombatUtils.java

@@ -224,7 +224,7 @@ public final class CombatUtils {
                     return;
                     return;
                 }
                 }
 
 
-                if (Permissions.skillEnabled(player, SkillType.SWORDS)) {
+                if (SkillType.SWORDS.getPermissions(player)) {
                     processSwordCombat(target, player, event.getDamage());
                     processSwordCombat(target, player, event.getDamage());
                 }
                 }
             }
             }
@@ -233,7 +233,7 @@ public final class CombatUtils {
                     return;
                     return;
                 }
                 }
 
 
-                if (Permissions.skillEnabled(player, SkillType.AXES)) {
+                if (SkillType.AXES.getPermissions(player)) {
                     processAxeCombat(target, player, event);
                     processAxeCombat(target, player, event);
                 }
                 }
             }
             }
@@ -242,7 +242,7 @@ public final class CombatUtils {
                     return;
                     return;
                 }
                 }
 
 
-                if (Permissions.skillEnabled(player, SkillType.UNARMED)) {
+                if (SkillType.UNARMED.getPermissions(player)) {
                     processUnarmedCombat(target, player, event);
                     processUnarmedCombat(target, player, event);
                 }
                 }
             }
             }
@@ -260,7 +260,7 @@ public final class CombatUtils {
             if (tamer != null && tamer instanceof Player && shouldProcessSkill(target, SkillType.TAMING)) {
             if (tamer != null && tamer instanceof Player && shouldProcessSkill(target, SkillType.TAMING)) {
                 Player master = (Player) tamer;
                 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);
                     processTamingCombat(target, master, wolf, event);
                 }
                 }
             }
             }
@@ -272,7 +272,7 @@ public final class CombatUtils {
             if (shooter != null && shooter instanceof Player && shouldProcessSkill(target, SkillType.ARCHERY)) {
             if (shooter != null && shooter instanceof Player && shouldProcessSkill(target, SkillType.ARCHERY)) {
                 Player player = (Player) shooter;
                 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);
                     processArcheryCombat(target, player, event, arrow);
                 }
                 }
             }
             }

+ 2 - 10
src/main/resources/locale/locale_en_US.properties

@@ -74,7 +74,6 @@ Axes.Effect.8=Greater Impact
 Axes.Effect.9=Deal bonus damage to unarmored foes
 Axes.Effect.9=Deal bonus damage to unarmored foes
 Axes.Listener=Axes: 
 Axes.Listener=Axes: 
 Axes.SkillName=AXES
 Axes.SkillName=AXES
-Axes.Skills.SS.Name=Skull Splitter
 Axes.Skills.SS.Off=[[RED]]**Skull Splitter has worn off**
 Axes.Skills.SS.Off=[[RED]]**Skull Splitter has worn off**
 Axes.Skills.SS.On=[[GREEN]]**Skull Splitter ACTIVATED**
 Axes.Skills.SS.On=[[GREEN]]**Skull Splitter ACTIVATED**
 Axes.Skills.SS.Refresh=[[GREEN]]Your [[YELLOW]]Skull Splitter [[GREEN]]ability is refreshed!
 Axes.Skills.SS.Refresh=[[GREEN]]Your [[YELLOW]]Skull Splitter [[GREEN]]ability is refreshed!
@@ -92,7 +91,6 @@ Excavation.Effect.3=Ability to dig for treasure
 Excavation.Effect.Length=[[RED]]Giga Drill Breaker Length: [[YELLOW]]{0}s
 Excavation.Effect.Length=[[RED]]Giga Drill Breaker Length: [[YELLOW]]{0}s
 Excavation.Listener=Excavation: 
 Excavation.Listener=Excavation: 
 Excavation.SkillName=EXCAVATION
 Excavation.SkillName=EXCAVATION
-Excavation.Skills.GigaDrillBreaker.Name=Giga Drill Breaker
 Excavation.Skills.GigaDrillBreaker.Off=[[RED]]**Giga Drill Breaker has worn off**
 Excavation.Skills.GigaDrillBreaker.Off=[[RED]]**Giga Drill Breaker has worn off**
 Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA DRILL BREAKER ACTIVATED**
 Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA DRILL BREAKER ACTIVATED**
 Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]Your [[YELLOW]]Giga Drill Breaker [[GREEN]]ability is refreshed!
 Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]Your [[YELLOW]]Giga Drill Breaker [[GREEN]]ability is refreshed!
@@ -164,8 +162,7 @@ Herbalism.Effect.13=Spread mycelium to dirt & grass
 Herbalism.HylianLuck=[[GREEN]]The luck of Hyrule is with you today!
 Herbalism.HylianLuck=[[GREEN]]The luck of Hyrule is with you today!
 Herbalism.Listener=Herbalism: 
 Herbalism.Listener=Herbalism: 
 Herbalism.SkillName=HERBALISM
 Herbalism.SkillName=HERBALISM
-Herbalism.Skills.GTe.Name=Green Terra
-Herbalism.Skills.GTe.Off=[[RED]]**Green Terra has worn off**
+Herbalism.Skills.GTe[[RED]]**Green Terra has worn off**
 Herbalism.Skills.GTe.On=[[GREEN]]**GREEN TERRA ACTIVATED**
 Herbalism.Skills.GTe.On=[[GREEN]]**GREEN TERRA ACTIVATED**
 Herbalism.Skills.GTe.Refresh=[[GREEN]]Your [[YELLOW]]Green Terra [[GREEN]]ability is refreshed!
 Herbalism.Skills.GTe.Refresh=[[GREEN]]Your [[YELLOW]]Green Terra [[GREEN]]ability is refreshed!
 Herbalism.Skills.GTe.Other.Off=[[RED]]Green Terra[[GREEN]] has worn off for [[YELLOW]]{0}
 Herbalism.Skills.GTe.Other.Off=[[RED]]Green Terra[[GREEN]] has worn off for [[YELLOW]]{0}
@@ -193,7 +190,6 @@ Mining.Effect.Decrease=[[RED]]Demolitions Expert Damage Decrease: [[YELLOW]]{0}
 Mining.Effect.DropChance=[[RED]]Double Drop Chance: [[YELLOW]]{0}
 Mining.Effect.DropChance=[[RED]]Double Drop Chance: [[YELLOW]]{0}
 Mining.Listener=Mining: 
 Mining.Listener=Mining: 
 Mining.SkillName=MINING
 Mining.SkillName=MINING
-Mining.Skills.SuperBreaker.Name=Super Breaker
 Mining.Skills.SuperBreaker.Off=[[RED]]**Super Breaker has worn off**
 Mining.Skills.SuperBreaker.Off=[[RED]]**Super Breaker has worn off**
 Mining.Skills.SuperBreaker.On=[[GREEN]]**SUPER BREAKER ACTIVATED**
 Mining.Skills.SuperBreaker.On=[[GREEN]]**SUPER BREAKER ACTIVATED**
 Mining.Skills.SuperBreaker.Other.Off=[[RED]]Super Breaker[[GREEN]] has worn off for [[YELLOW]]{0}
 Mining.Skills.SuperBreaker.Other.Off=[[RED]]Super Breaker[[GREEN]] has worn off for [[YELLOW]]{0}
@@ -202,7 +198,6 @@ Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Your [[YELLOW]]Super Breaker [[GREEN
 Mining.Skillup=[[YELLOW]]Mining skill increased by {0}. Total ({1})
 Mining.Skillup=[[YELLOW]]Mining skill increased by {0}. Total ({1})
 
 
 #Blast Mining
 #Blast Mining
-Mining.Blast.Name=Blast Mining
 Mining.Blast.Boom=[[GRAY]]**BOOM**
 Mining.Blast.Boom=[[GRAY]]**BOOM**
 Mining.Blast.Effect=+{0} ore yield, -{1} debris yield, {2}x drops
 Mining.Blast.Effect=+{0} ore yield, -{1} debris yield, {2}x drops
 Mining.Blast.Radius.Increase=[[RED]]Blast Radius Increase: [[YELLOW]]+{0}
 Mining.Blast.Radius.Increase=[[RED]]Blast Radius Increase: [[YELLOW]]+{0}
@@ -282,8 +277,7 @@ Swords.Effect.5={0} Tick Bleed
 Swords.Effect.6=Bleed
 Swords.Effect.6=Bleed
 Swords.Effect.7=Apply a bleed DoT
 Swords.Effect.7=Apply a bleed DoT
 Swords.Listener=Swords: 
 Swords.Listener=Swords: 
-Swords.SkillName=SWORDS
-Swords.Skills.SS.Name=Serrated Strikes
+Swords.SkillName=SWORDS 
 Swords.Skills.SS.Off=[[RED]]**Serrated Strikes has worn off**
 Swords.Skills.SS.Off=[[RED]]**Serrated Strikes has worn off**
 Swords.Skills.SS.On=[[GREEN]]**SERRATED STRIKES ACTIVATED**
 Swords.Skills.SS.On=[[GREEN]]**SERRATED STRIKES ACTIVATED**
 Swords.Skills.SS.Refresh=[[GREEN]]Your [[YELLOW]]Serrated Strikes [[GREEN]]ability is refreshed!
 Swords.Skills.SS.Refresh=[[GREEN]]Your [[YELLOW]]Serrated Strikes [[GREEN]]ability is refreshed!
@@ -366,7 +360,6 @@ Unarmed.Effect.8=Iron Grip
 Unarmed.Effect.9=Prevents you from being disarmed
 Unarmed.Effect.9=Prevents you from being disarmed
 Unarmed.Listener=Unarmed: 
 Unarmed.Listener=Unarmed: 
 Unarmed.SkillName=UNARMED
 Unarmed.SkillName=UNARMED
-Unarmed.Skills.Berserk.Name=Berserk
 Unarmed.Skills.Berserk.Off=[[RED]]**Berserk has worn off**
 Unarmed.Skills.Berserk.Off=[[RED]]**Berserk has worn off**
 Unarmed.Skills.Berserk.On=[[GREEN]]**BERSERK ACTIVATED**
 Unarmed.Skills.Berserk.On=[[GREEN]]**BERSERK ACTIVATED**
 Unarmed.Skills.Berserk.Other.Off=[[RED]]Berserk[[GREEN]] has worn off for [[YELLOW]]{0}
 Unarmed.Skills.Berserk.Other.Off=[[RED]]Berserk[[GREEN]] has worn off for [[YELLOW]]{0}
@@ -388,7 +381,6 @@ Woodcutting.Effect.4=Double Drops
 Woodcutting.Effect.5=Double the normal loot
 Woodcutting.Effect.5=Double the normal loot
 Woodcutting.Listener=Woodcutting: 
 Woodcutting.Listener=Woodcutting: 
 Woodcutting.SkillName=WOODCUTTING
 Woodcutting.SkillName=WOODCUTTING
-Woodcutting.Skills.TreeFeller.Name=Tree Feller
 Woodcutting.Skills.TreeFeller.Off=[[RED]]**Tree Feller has worn off**
 Woodcutting.Skills.TreeFeller.Off=[[RED]]**Tree Feller has worn off**
 Woodcutting.Skills.TreeFeller.On=[[GREEN]]**TREE FELLER ACTIVATED**
 Woodcutting.Skills.TreeFeller.On=[[GREEN]]**TREE FELLER ACTIVATED**
 Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]Your [[YELLOW]]Tree Feller [[GREEN]]ability is refreshed!
 Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]Your [[YELLOW]]Tree Feller [[GREEN]]ability is refreshed!