Răsfoiți Sursa

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

GJ 11 ani în urmă
părinte
comite
9ef3c721df
32 a modificat fișierele cu 416 adăugiri și 436 ștergeri
  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!