浏览代码

Merge pull request #442 from Glitchfinder/master

Updating permissions to be more consistent.
Glitchfinder 12 年之前
父节点
当前提交
deb0b211b4
共有 48 个文件被更改,包括 783 次插入575 次删除
  1. 1 1
      src/main/java/com/gmail/nossr50/api/ChatAPI.java
  2. 13 13
      src/main/java/com/gmail/nossr50/commands/CommandHelper.java
  3. 0 1
      src/main/java/com/gmail/nossr50/commands/SkillCommand.java
  4. 2 2
      src/main/java/com/gmail/nossr50/commands/general/InspectCommand.java
  5. 9 9
      src/main/java/com/gmail/nossr50/commands/mc/MccCommand.java
  6. 2 2
      src/main/java/com/gmail/nossr50/commands/party/ACommand.java
  7. 7 4
      src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java
  8. 7 4
      src/main/java/com/gmail/nossr50/commands/skills/ArcheryCommand.java
  9. 9 6
      src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java
  10. 6 3
      src/main/java/com/gmail/nossr50/commands/skills/ExcavationCommand.java
  11. 9 6
      src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java
  12. 9 6
      src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java
  13. 9 6
      src/main/java/com/gmail/nossr50/commands/skills/MiningCommand.java
  14. 16 13
      src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java
  15. 7 4
      src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java
  16. 12 9
      src/main/java/com/gmail/nossr50/commands/skills/TamingCommand.java
  17. 8 5
      src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java
  18. 7 4
      src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java
  19. 1 1
      src/main/java/com/gmail/nossr50/commands/spout/XplockCommand.java
  20. 9 10
      src/main/java/com/gmail/nossr50/datatypes/AbilityType.java
  21. 6 5
      src/main/java/com/gmail/nossr50/datatypes/McMMOPlayer.java
  22. 12 12
      src/main/java/com/gmail/nossr50/datatypes/SkillType.java
  23. 8 10
      src/main/java/com/gmail/nossr50/listeners/BlockListener.java
  24. 5 5
      src/main/java/com/gmail/nossr50/listeners/EntityListener.java
  25. 1 1
      src/main/java/com/gmail/nossr50/listeners/HardcoreListener.java
  26. 34 34
      src/main/java/com/gmail/nossr50/listeners/PlayerListener.java
  27. 5 6
      src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java
  28. 1 1
      src/main/java/com/gmail/nossr50/skills/acrobatics/RollEventHandler.java
  29. 5 16
      src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java
  30. 3 3
      src/main/java/com/gmail/nossr50/skills/combat/Axes.java
  31. 2 2
      src/main/java/com/gmail/nossr50/skills/gathering/Excavation.java
  32. 6 6
      src/main/java/com/gmail/nossr50/skills/gathering/Fishing.java
  33. 9 9
      src/main/java/com/gmail/nossr50/skills/gathering/Herbalism.java
  34. 3 3
      src/main/java/com/gmail/nossr50/skills/gathering/WoodCutting.java
  35. 2 2
      src/main/java/com/gmail/nossr50/skills/mining/Mining.java
  36. 6 7
      src/main/java/com/gmail/nossr50/skills/repair/Repair.java
  37. 3 3
      src/main/java/com/gmail/nossr50/skills/repair/RepairItemType.java
  38. 8 8
      src/main/java/com/gmail/nossr50/skills/repair/RepairMaterialType.java
  39. 1 2
      src/main/java/com/gmail/nossr50/skills/repair/Salvage.java
  40. 1 1
      src/main/java/com/gmail/nossr50/skills/repair/SimpleRepairManager.java
  41. 5 16
      src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java
  42. 10 36
      src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java
  43. 7 21
      src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java
  44. 7 8
      src/main/java/com/gmail/nossr50/util/Combat.java
  45. 1 1
      src/main/java/com/gmail/nossr50/util/Item.java
  46. 312 199
      src/main/java/com/gmail/nossr50/util/Permissions.java
  47. 20 20
      src/main/java/com/gmail/nossr50/util/Skills.java
  48. 157 29
      src/main/resources/plugin.yml

+ 1 - 1
src/main/java/com/gmail/nossr50/api/ChatAPI.java

@@ -64,7 +64,7 @@ public final class ChatAPI {
         mcMMO.p.getLogger().info("[A]<" + chatEvent.getSender() + "> " + chatEvent.getMessage());
 
         for (Player player : mcMMO.p.getServer().getOnlinePlayers()) {
-            if (Permissions.getInstance().adminChat(player) || player.isOp())
+            if (Permissions.adminChat(player) || player.isOp())
                 player.sendMessage(aPrefix + chatEvent.getMessage());
         }
     }

+ 13 - 13
src/main/java/com/gmail/nossr50/commands/CommandHelper.java

@@ -23,7 +23,7 @@ public class CommandHelper {
         if (sender instanceof Player) {
             Player player = (Player) sender;
 
-            if (!Permissions.getInstance().permission(player, permission)) {
+            if (!Permissions.hasPermission(player, permission)) {
                 player.sendMessage(LocaleLoader.getString("mcMMO.NoPermission"));
                 return true;
             }
@@ -58,23 +58,23 @@ public class CommandHelper {
 
             display.sendMessage(LocaleLoader.getString("Stats.Header.Gathering"));
 
-            if (Permissions.getInstance().excavation(inspect)) {
+            if (Permissions.excavation(inspect)) {
                 display.sendMessage(LocaleLoader.getString("Skills.Stats", new Object[] { LocaleLoader.getString("Excavation.Listener"), profile.getSkillLevel(SkillType.EXCAVATION), profile.getSkillXpLevel(SkillType.EXCAVATION), profile.getXpToLevel(SkillType.EXCAVATION) }));
             }
 
-            if (Permissions.getInstance().fishing(inspect)) {
+            if (Permissions.fishing(inspect)) {
                 display.sendMessage(LocaleLoader.getString("Skills.Stats", new Object[] { LocaleLoader.getString("Fishing.Listener"), profile.getSkillLevel(SkillType.FISHING), profile.getSkillXpLevel(SkillType.FISHING), profile.getXpToLevel(SkillType.FISHING) }));
             }
 
-            if (Permissions.getInstance().herbalism(inspect)) {
+            if (Permissions.herbalism(inspect)) {
                 display.sendMessage(LocaleLoader.getString("Skills.Stats", new Object[] { LocaleLoader.getString("Herbalism.Listener"), profile.getSkillLevel(SkillType.HERBALISM), profile.getSkillXpLevel(SkillType.HERBALISM), profile.getXpToLevel(SkillType.HERBALISM) }));
             }
 
-            if (Permissions.getInstance().mining(inspect)) {
+            if (Permissions.mining(inspect)) {
                 display.sendMessage(LocaleLoader.getString("Skills.Stats", new Object[] { LocaleLoader.getString("Mining.Listener"), profile.getSkillLevel(SkillType.MINING), profile.getSkillXpLevel(SkillType.MINING), profile.getXpToLevel(SkillType.MINING) }));
             }
 
-            if (Permissions.getInstance().woodcutting(inspect)) {
+            if (Permissions.woodcutting(inspect)) {
                 display.sendMessage(LocaleLoader.getString("Skills.Stats", new Object[] { LocaleLoader.getString("Woodcutting.Listener"), profile.getSkillLevel(SkillType.WOODCUTTING), profile.getSkillXpLevel(SkillType.WOODCUTTING), profile.getXpToLevel(SkillType.WOODCUTTING) }));
             }
         }
@@ -101,23 +101,23 @@ public class CommandHelper {
 
             display.sendMessage(LocaleLoader.getString("Stats.Header.Combat"));
 
-            if (Permissions.getInstance().axes(inspect)) {
+            if (Permissions.axes(inspect)) {
                 display.sendMessage(LocaleLoader.getString("Skills.Stats", new Object[] { LocaleLoader.getString("Axes.Listener"), profile.getSkillLevel(SkillType.AXES), profile.getSkillXpLevel(SkillType.AXES), profile.getXpToLevel(SkillType.AXES) }));
             }
 
-            if (Permissions.getInstance().archery(inspect)) {
+            if (Permissions.archery(inspect)) {
                 display.sendMessage(LocaleLoader.getString("Skills.Stats", new Object[] { LocaleLoader.getString("Archery.Listener"), profile.getSkillLevel(SkillType.ARCHERY), profile.getSkillXpLevel(SkillType.ARCHERY), profile.getXpToLevel(SkillType.ARCHERY) }));
             }
 
-            if (Permissions.getInstance().swords(inspect)) {
+            if (Permissions.swords(inspect)) {
                 display.sendMessage(LocaleLoader.getString("Skills.Stats", new Object[] { LocaleLoader.getString("Swords.Listener"), profile.getSkillLevel(SkillType.SWORDS), profile.getSkillXpLevel(SkillType.SWORDS), profile.getXpToLevel(SkillType.SWORDS) }));
             }
 
-            if (Permissions.getInstance().taming(inspect)) {
+            if (Permissions.taming(inspect)) {
                 display.sendMessage(LocaleLoader.getString("Skills.Stats", new Object[] { LocaleLoader.getString("Taming.Listener"), profile.getSkillLevel(SkillType.TAMING), profile.getSkillXpLevel(SkillType.TAMING), profile.getXpToLevel(SkillType.TAMING) }));
             }
 
-            if (Permissions.getInstance().unarmed(inspect)) {
+            if (Permissions.unarmed(inspect)) {
                 display.sendMessage(LocaleLoader.getString("Skills.Stats", new Object[] { LocaleLoader.getString("Unarmed.Listener"), profile.getSkillLevel(SkillType.UNARMED), profile.getSkillXpLevel(SkillType.UNARMED), profile.getXpToLevel(SkillType.UNARMED) }));
             }
         }
@@ -144,11 +144,11 @@ public class CommandHelper {
 
             display.sendMessage(LocaleLoader.getString("Stats.Header.Misc"));
 
-            if (Permissions.getInstance().acrobatics(inspect)) {
+            if (Permissions.acrobatics(inspect)) {
                 display.sendMessage(LocaleLoader.getString("Skills.Stats", new Object[] { LocaleLoader.getString("Acrobatics.Listener"), profile.getSkillLevel(SkillType.ACROBATICS), profile.getSkillXpLevel(SkillType.ACROBATICS), profile.getXpToLevel(SkillType.ACROBATICS) }));
             }
 
-            if (Permissions.getInstance().repair(inspect)) {
+            if (Permissions.repair(inspect)) {
                 display.sendMessage(LocaleLoader.getString("Skills.Stats", new Object[] { LocaleLoader.getString("Repair.Listener"), profile.getSkillLevel(SkillType.REPAIR), profile.getSkillXpLevel(SkillType.REPAIR), profile.getXpToLevel(SkillType.REPAIR) }));
             }
         }

+ 0 - 1
src/main/java/com/gmail/nossr50/commands/SkillCommand.java

@@ -25,7 +25,6 @@ public abstract class SkillCommand implements CommandExecutor {
     protected float skillValue;
 
     protected DecimalFormat percent = new DecimalFormat("##0.00%");
-    protected Permissions permInstance = Permissions.getInstance();
 
     public SkillCommand(SkillType skill) {
         this.skill = skill;

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

@@ -30,7 +30,7 @@ public class InspectCommand implements CommandExecutor {
             if (mcmmoPlayer != null) {
                 Player target = mcmmoPlayer.getPlayer();
 
-                if (sender instanceof Player && !sender.isOp() && !Misc.isNear(((Player) sender).getLocation(), target.getLocation(), 5.0) && !Permissions.getInstance().inspectDistanceBypass((Player) sender)) {
+                if (sender instanceof Player && !sender.isOp() && !Misc.isNear(((Player) sender).getLocation(), target.getLocation(), 5.0) && !Permissions.inspectDistanceBypass((Player) sender)) {
                     sender.sendMessage(LocaleLoader.getString("Inspect.TooFar"));
                     return true;
                 }
@@ -44,7 +44,7 @@ public class InspectCommand implements CommandExecutor {
                 return true;
             }
             else {
-                if (sender instanceof Player && !sender.isOp() && !Permissions.getInstance().inspectOfflineBypass((Player) sender)) {
+                if (sender instanceof Player && !sender.isOp() && !Permissions.inspectOfflineBypass((Player) sender)) {
                     sender.sendMessage(LocaleLoader.getString("Inspect.Offline"));
                     return true;
                 }

+ 9 - 9
src/main/java/com/gmail/nossr50/commands/mc/MccCommand.java

@@ -24,19 +24,19 @@ public class MccCommand implements CommandExecutor {
 
         player.sendMessage(ChatColor.RED + "---[]" + ChatColor.YELLOW + "mcMMO Commands" + ChatColor.RED + "[]---"); //TODO: Needs more locale.
 
-        if (Permissions.getInstance().party(player)) {
+        if (Permissions.party(player)) {
             player.sendMessage(LocaleLoader.getString("Commands.Party.Commands"));
             player.sendMessage("/party " + LocaleLoader.getString("Commands.Party"));
             player.sendMessage("/party q " + LocaleLoader.getString("Commands.Party.Quit"));
 
-            if (Permissions.getInstance().partyChat(player)) {
+            if (Permissions.partyChat(player)) {
                 player.sendMessage("/p " + LocaleLoader.getString("Commands.Party.Toggle"));
             }
 
             player.sendMessage("/invite " + LocaleLoader.getString("Commands.Party.Invite"));
             player.sendMessage("/accept " + LocaleLoader.getString("Commands.Party.Accept"));
 
-            if (Permissions.getInstance().partyTeleport(player)) {
+            if (Permissions.partyTeleport(player)) {
                 player.sendMessage("/ptp " + LocaleLoader.getString("Commands.Party.Teleport"));
             }
         }
@@ -45,27 +45,27 @@ public class MccCommand implements CommandExecutor {
         player.sendMessage("/mcstats " + LocaleLoader.getString("Commands.Stats"));
         player.sendMessage("/mctop " + LocaleLoader.getString("Commands.Leaderboards"));
 
-        if (Config.getInstance().getCommandSkillResetEnabled() && Permissions.getInstance().skillReset(player)) {
+        if (Config.getInstance().getCommandSkillResetEnabled() && Permissions.skillReset(player)) {
             player.sendMessage("/skillreset <skill|all> " + LocaleLoader.getString("Commands.Reset"));
         }
 
-        if (Permissions.getInstance().mcAbility(player)) {
+        if (Permissions.mcAbility(player)) {
             player.sendMessage("/mcability " + LocaleLoader.getString("Commands.ToggleAbility"));
         }
 
-        if (Permissions.getInstance().adminChat(player)) {
+        if (Permissions.adminChat(player)) {
             player.sendMessage("/a " + LocaleLoader.getString("Commands.AdminToggle"));
         }
 
-        if (Permissions.getInstance().inspect(player)) {
+        if (Permissions.inspect(player)) {
             player.sendMessage("/inspect " + LocaleLoader.getString("Commands.Inspect"));
         }
 
-        if (Permissions.getInstance().mmoedit(player)) {
+        if (Permissions.mmoedit(player)) {
             player.sendMessage("/mmoedit " + LocaleLoader.getString("Commands.mmoedit"));
         }
 
-        if (Permissions.getInstance().mcgod(player)) {
+        if (Permissions.mcgod(player)) {
             player.sendMessage("/mcgod " + LocaleLoader.getString("Commands.mcgod"));
         }
 

+ 2 - 2
src/main/java/com/gmail/nossr50/commands/party/ACommand.java

@@ -81,7 +81,7 @@ public class ACommand implements CommandExecutor {
                 plugin.getLogger().info("[A]<" + player.getName() + "> " + message);
 
                 for (Player otherPlayer : plugin.getServer().getOnlinePlayers()) {
-                    if (Permissions.getInstance().adminChat(otherPlayer) || otherPlayer.isOp()) {
+                    if (Permissions.adminChat(otherPlayer) || otherPlayer.isOp()) {
                         otherPlayer.sendMessage(prefix + message);
                     }
                 }
@@ -100,7 +100,7 @@ public class ACommand implements CommandExecutor {
                 plugin.getLogger().info("[A]<*Console*> " + message);
 
                 for (Player player : plugin.getServer().getOnlinePlayers()) {
-                    if (Permissions.getInstance().adminChat(player) || player.isOp()) {
+                    if (Permissions.adminChat(player) || player.isOp()) {
                         player.sendMessage(prefix + message);
                     }
                 }

+ 7 - 4
src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java

@@ -8,6 +8,7 @@ import com.gmail.nossr50.commands.SkillCommand;
 import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.util.Permissions;
 
 public class AcrobaticsCommand extends SkillCommand {
     AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
@@ -26,6 +27,7 @@ public class AcrobaticsCommand extends SkillCommand {
     private boolean canDodge;
     private boolean canRoll;
     private boolean canGracefulRoll;
+    private boolean lucky;
 
     public AcrobaticsCommand() {
         super(SkillType.ACROBATICS);
@@ -47,9 +49,10 @@ public class AcrobaticsCommand extends SkillCommand {
 
     @Override
     protected void permissionsCheck() {
-        canDodge = permInstance.dodge(player);
-        canRoll = permInstance.roll(player);
-        canGracefulRoll = permInstance.gracefulRoll(player);
+        canDodge = Permissions.dodge(player);
+        canRoll = Permissions.roll(player);
+        canGracefulRoll = Permissions.gracefulRoll(player);
+        lucky = Permissions.luckyAcrobatics(player);
     }
 
     @Override
@@ -59,7 +62,7 @@ public class AcrobaticsCommand extends SkillCommand {
 
     @Override
     protected void effectsDisplay() {
-        if (player.hasPermission("mcmmo.perks.lucky.acrobatics")) {
+        if (lucky) {
             String perkPrefix = ChatColor.RED + "[mcMMO Perks] ";
             player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc", new Object[] { "Acrobatics" }) }));
         }

+ 7 - 4
src/main/java/com/gmail/nossr50/commands/skills/ArcheryCommand.java

@@ -8,6 +8,7 @@ import com.gmail.nossr50.commands.SkillCommand;
 import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.util.Permissions;
 
 public class ArcheryCommand extends SkillCommand {
     AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
@@ -30,6 +31,7 @@ public class ArcheryCommand extends SkillCommand {
     private boolean canSkillShot;
     private boolean canDaze;
     private boolean canRetrieve;
+    private boolean lucky;
 
     public ArcheryCommand() {
         super(SkillType.ARCHERY);
@@ -54,9 +56,10 @@ public class ArcheryCommand extends SkillCommand {
 
     @Override
     protected void permissionsCheck() {
-        canSkillShot = permInstance.archeryBonus(player);
-        canDaze = permInstance.daze(player);
-        canRetrieve = permInstance.trackArrows(player);
+        canSkillShot = Permissions.archeryBonus(player);
+        canDaze = Permissions.daze(player);
+        canRetrieve = Permissions.trackArrows(player);
+        lucky = Permissions.luckyArchery(player);
     }
 
     @Override
@@ -66,7 +69,7 @@ public class ArcheryCommand extends SkillCommand {
 
     @Override
     protected void effectsDisplay() {
-        if (player.hasPermission("mcmmo.perks.lucky.archery")) {
+        if (lucky) {
             String perkPrefix = ChatColor.RED + "[mcMMO Perks] ";
             player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc", new Object[] { "Archery" }) }));
         }

+ 9 - 6
src/main/java/com/gmail/nossr50/commands/skills/AxesCommand.java

@@ -9,6 +9,7 @@ import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.Misc;
+import com.gmail.nossr50.util.Permissions;
 
 public class AxesCommand extends SkillCommand {
     AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
@@ -32,6 +33,7 @@ public class AxesCommand extends SkillCommand {
     private boolean canBonusDamage;
     private boolean canImpact;
     private boolean canGreaterImpact;
+    private boolean lucky;
 
     public AxesCommand() {
         super(SkillType.AXES);
@@ -54,11 +56,12 @@ public class AxesCommand extends SkillCommand {
 
     @Override
     protected void permissionsCheck() {
-        canSkullSplitter = permInstance.skullSplitter(player);
-        canCritical = permInstance.criticalHit(player);
-        canBonusDamage = permInstance.axeBonus(player);
-        canImpact = permInstance.impact(player);
-        canGreaterImpact = permInstance.greaterImpact(player);
+        canSkullSplitter = Permissions.skullSplitter(player);
+        canCritical = Permissions.criticalHit(player);
+        canBonusDamage = Permissions.axeBonus(player);
+        canImpact = Permissions.impact(player);
+        canGreaterImpact = Permissions.greaterImpact(player);
+        lucky = Permissions.luckyAxes(player);
     }
 
     @Override
@@ -68,7 +71,7 @@ public class AxesCommand extends SkillCommand {
 
     @Override
     protected void effectsDisplay() {
-        if (player.hasPermission("mcmmo.perks.lucky.axes")) {
+        if (lucky) {
             String perkPrefix = ChatColor.RED + "[mcMMO Perks] ";
             player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc", new Object[] { "Axes" }) }));
         }

+ 6 - 3
src/main/java/com/gmail/nossr50/commands/skills/ExcavationCommand.java

@@ -6,6 +6,7 @@ import com.gmail.nossr50.commands.SkillCommand;
 import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.util.Permissions;
 
 public class ExcavationCommand extends SkillCommand {
     AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
@@ -15,6 +16,7 @@ public class ExcavationCommand extends SkillCommand {
 
     private boolean canGigaDrill;
     private boolean canTreasureHunt;
+    private boolean lucky;
 
     public ExcavationCommand() {
         super(SkillType.EXCAVATION);
@@ -27,8 +29,9 @@ public class ExcavationCommand extends SkillCommand {
 
     @Override
     protected void permissionsCheck() {
-        canGigaDrill = permInstance.gigaDrillBreaker(player);
-        canTreasureHunt = permInstance.excavationTreasures(player);
+        canGigaDrill = Permissions.gigaDrillBreaker(player);
+        canTreasureHunt = Permissions.excavationTreasures(player);
+        lucky = Permissions.luckyExcavation(player);
     }
 
     @Override
@@ -38,7 +41,7 @@ public class ExcavationCommand extends SkillCommand {
 
     @Override
     protected void effectsDisplay() {
-        if (player.hasPermission("mcmmo.perks.lucky.excavation")) {
+        if (lucky) {
             String perkPrefix = ChatColor.RED + "[mcMMO Perks] ";
             player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc", new Object[] { "Excavation" }) }));
         }

+ 9 - 6
src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java

@@ -7,6 +7,7 @@ import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.skills.gathering.Fishing;
+import com.gmail.nossr50.util.Permissions;
 
 public class FishingCommand extends SkillCommand {
 
@@ -22,6 +23,7 @@ public class FishingCommand extends SkillCommand {
     private boolean canMagicHunt;
     private boolean canShake;
     private boolean canFishermansDiet;
+    private boolean lucky;
 
     public FishingCommand() {
         super(SkillType.FISHING);
@@ -32,7 +34,7 @@ public class FishingCommand extends SkillCommand {
         lootTier = Fishing.getFishingLootTier(profile);
         magicChance = percent.format(lootTier / 15D);
         int dropChance = Fishing.getShakeChance(lootTier);
-        if (player.hasPermission("mcmmo.perks.lucky.fishing")) {
+        if (Permissions.luckyFishing(player)) {
             dropChance = (int) (dropChance * 1.25D);
         }
         shakeChance = String.valueOf(dropChance);
@@ -57,10 +59,11 @@ public class FishingCommand extends SkillCommand {
 
     @Override
     protected void permissionsCheck() {
-        canTreasureHunt = permInstance.fishingTreasures(player);
-        canMagicHunt = permInstance.fishingMagic(player);
-        canShake = permInstance.shakeMob(player);
-        canFishermansDiet = permInstance.fishermansDiet(player);
+        canTreasureHunt = Permissions.fishingTreasures(player);
+        canMagicHunt = Permissions.fishingMagic(player);
+        canShake = Permissions.shakeMob(player);
+        canFishermansDiet = Permissions.fishermansDiet(player);
+        lucky = Permissions.luckyFishing(player);
     }
 
     @Override
@@ -70,7 +73,7 @@ public class FishingCommand extends SkillCommand {
 
     @Override
     protected void effectsDisplay() {
-        if (player.hasPermission("mcmmo.perks.lucky.fishing")) {
+        if (lucky) {
             String perkPrefix = ChatColor.RED + "[mcMMO Perks] ";
             player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc", new Object[] { "Fishing" }) }));
         }

+ 9 - 6
src/main/java/com/gmail/nossr50/commands/skills/HerbalismCommand.java

@@ -9,6 +9,7 @@ import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.util.Permissions;
 
 public class HerbalismCommand extends SkillCommand {
     AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
@@ -35,6 +36,7 @@ public class HerbalismCommand extends SkillCommand {
     private boolean canFarmersDiet;
     private boolean canDoubleDrop;
     private boolean doubleDropsDisabled;
+    private boolean lucky;
 
     public HerbalismCommand() {
         super(SkillType.HERBALISM);
@@ -63,12 +65,13 @@ public class HerbalismCommand extends SkillCommand {
     protected void permissionsCheck() {
         Config configInstance = Config.getInstance();
 
-        canGreenTerra = permInstance.greenTerra(player);
-        canGreenThumbWheat = permInstance.greenThumbWheat(player);
-        canGreenThumbBlocks = permInstance.greenThumbBlocks(player);
-        canFarmersDiet = permInstance.farmersDiet(player);
-        canDoubleDrop = permInstance.herbalismDoubleDrops(player);
+        canGreenTerra = Permissions.greenTerra(player);
+        canGreenThumbWheat = Permissions.greenThumbWheat(player);
+        canGreenThumbBlocks = Permissions.greenThumbBlocks(player);
+        canFarmersDiet = Permissions.farmersDiet(player);
+        canDoubleDrop = Permissions.herbalismDoubleDrops(player);
         doubleDropsDisabled = configInstance.herbalismDoubleDropsDisabled();
+        lucky = Permissions.luckyHerbalism(player);
     }
 
     @Override
@@ -78,7 +81,7 @@ public class HerbalismCommand extends SkillCommand {
 
     @Override
     protected void effectsDisplay() {
-        if (player.hasPermission("mcmmo.perks.lucky.herbalism")) {
+        if (lucky) {
             String perkPrefix = ChatColor.RED + "[mcMMO Perks] ";
             player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc", new Object[] { "Herbalism" }) }));
         }

+ 9 - 6
src/main/java/com/gmail/nossr50/commands/skills/MiningCommand.java

@@ -10,6 +10,7 @@ import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.util.Misc;
+import com.gmail.nossr50.util.Permissions;
 
 public class MiningCommand extends SkillCommand {
     AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
@@ -38,6 +39,7 @@ public class MiningCommand extends SkillCommand {
     private boolean canBiggerBombs;
     private boolean canDemoExpert;
     private boolean doubleDropsDisabled;
+    private boolean lucky;
 
     public MiningCommand() {
         super(SkillType.MINING);
@@ -101,12 +103,13 @@ public class MiningCommand extends SkillCommand {
     protected void permissionsCheck() {
         Config configInstance = Config.getInstance();
 
-        canBiggerBombs = permInstance.biggerBombs(player);
-        canBlast = permInstance.blastMining(player);
-        canDemoExpert = permInstance.demolitionsExpertise(player);
-        canDoubleDrop = permInstance.miningDoubleDrops(player);
-        canSuperBreaker = permInstance.superBreaker(player);
+        canBiggerBombs = Permissions.biggerBombs(player);
+        canBlast = Permissions.blastMining(player);
+        canDemoExpert = Permissions.demolitionsExpertise(player);
+        canDoubleDrop = Permissions.miningDoubleDrops(player);
+        canSuperBreaker = Permissions.superBreaker(player);
         doubleDropsDisabled = configInstance.miningDoubleDropsDisabled();
+        lucky = Permissions.luckyMining(player);
     }
 
     @Override
@@ -116,7 +119,7 @@ public class MiningCommand extends SkillCommand {
 
     @Override
     protected void effectsDisplay() {
-        if (player.hasPermission("mcmmo.perks.lucky.mining")) {
+        if (lucky) {
             String perkPrefix = ChatColor.RED + "[mcMMO Perks] ";
             player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc", new Object[] { "Mining" }) }));
         }

+ 16 - 13
src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java

@@ -12,6 +12,7 @@ import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.skills.repair.Repair;
 import com.gmail.nossr50.skills.repair.Repairable;
+import com.gmail.nossr50.util.Permissions;
 
 public class RepairCommand extends SkillCommand {
     AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
@@ -36,6 +37,7 @@ public class RepairCommand extends SkillCommand {
     private boolean canRepairLeather;
     private boolean canRepairWood;
     private boolean arcaneBypass;
+    private boolean lucky;
 
     private int salvageLevel;
     private int diamondLevel;
@@ -74,18 +76,19 @@ public class RepairCommand extends SkillCommand {
 
     @Override
     protected void permissionsCheck() {
-        canSuperRepair = permInstance.repairBonus(player);
-        canMasterRepair = permInstance.repairMastery(player);
-        canArcaneForge = permInstance.arcaneForging(player);
-        canSalvage = permInstance.salvage(player);
-        canRepairDiamond = permInstance.diamondRepair(player);
-        canRepairGold = permInstance.goldRepair(player);
-        canRepairIron = permInstance.ironRepair(player);
-        canRepairStone = permInstance.stoneRepair(player);
-        canRepairString = permInstance.stringRepair(player);
-        canRepairLeather = permInstance.leatherRepair(player);
-        canRepairWood = permInstance.woodRepair(player);
-        arcaneBypass = permInstance.arcaneBypass(player);
+        canSuperRepair = Permissions.repairBonus(player);
+        canMasterRepair = Permissions.repairMastery(player);
+        canArcaneForge = Permissions.arcaneForging(player);
+        canSalvage = Permissions.salvage(player);
+        canRepairDiamond = Permissions.diamondRepair(player);
+        canRepairGold = Permissions.goldRepair(player);
+        canRepairIron = Permissions.ironRepair(player);
+        canRepairStone = Permissions.stoneRepair(player);
+        canRepairString = Permissions.stringRepair(player);
+        canRepairLeather = Permissions.leatherRepair(player);
+        canRepairWood = Permissions.woodRepair(player);
+        arcaneBypass = Permissions.arcaneBypass(player);
+        lucky = Permissions.luckyRepair(player);
     }
 
     @Override
@@ -95,7 +98,7 @@ public class RepairCommand extends SkillCommand {
 
     @Override
     protected void effectsDisplay() {
-        if (player.hasPermission("mcmmo.perks.lucky.repair")) {
+        if (lucky) {
             String perkPrefix = ChatColor.RED + "[mcMMO Perks] ";
             player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc", new Object[] { "Repair" }) }));
         }

+ 7 - 4
src/main/java/com/gmail/nossr50/commands/skills/SwordsCommand.java

@@ -8,6 +8,7 @@ import com.gmail.nossr50.commands.SkillCommand;
 import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.util.Permissions;
 
 public class SwordsCommand extends SkillCommand {
     AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
@@ -29,6 +30,7 @@ public class SwordsCommand extends SkillCommand {
     private boolean canCounter;
     private boolean canSerratedStrike;
     private boolean canBleed;
+    private boolean lucky;
 
     public SwordsCommand() {
         super(SkillType.SWORDS);
@@ -53,9 +55,10 @@ public class SwordsCommand extends SkillCommand {
 
     @Override
     protected void permissionsCheck() {
-        canBleed = permInstance.swordsBleed(player);
-        canCounter = permInstance.counterAttack(player);
-        canSerratedStrike = permInstance.serratedStrikes(player);
+        canBleed = Permissions.swordsBleed(player);
+        canCounter = Permissions.counterAttack(player);
+        canSerratedStrike = Permissions.serratedStrikes(player);
+        lucky = Permissions.luckySwords(player);
     }
 
     @Override
@@ -65,7 +68,7 @@ public class SwordsCommand extends SkillCommand {
 
     @Override
     protected void effectsDisplay() {
-        if (player.hasPermission("mcmmo.perks.lucky.swords")) {
+        if (lucky) {
             String perkPrefix = ChatColor.RED + "[mcMMO Perks] ";
             player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc", new Object[] { "Swords" }) }));
         }

+ 12 - 9
src/main/java/com/gmail/nossr50/commands/skills/TamingCommand.java

@@ -9,6 +9,7 @@ import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.util.Permissions;
 
 public class TamingCommand extends SkillCommand {
     AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
@@ -31,6 +32,7 @@ public class TamingCommand extends SkillCommand {
     private boolean canShockProof;
     private boolean canCallWild;
     private boolean canFastFood;
+    private boolean lucky;
 
     public TamingCommand() {
         super(SkillType.TAMING);
@@ -45,14 +47,15 @@ public class TamingCommand extends SkillCommand {
 
     @Override
     protected void permissionsCheck() {
-        canBeastLore = permInstance.beastLore(player);
-        canCallWild = permInstance.callOfTheWild(player);
-        canEnvironmentallyAware = permInstance.environmentallyAware(player);
-        canFastFood = permInstance.fastFoodService(player);
-        canGore = permInstance.gore(player);
-        canSharpenedClaws = permInstance.sharpenedClaws(player);
-        canShockProof = permInstance.shockProof(player);
-        canThickFur = permInstance.thickFur(player);
+        canBeastLore = Permissions.beastLore(player);
+        canCallWild = Permissions.callOfTheWild(player);
+        canEnvironmentallyAware = Permissions.environmentallyAware(player);
+        canFastFood = Permissions.fastFoodService(player);
+        canGore = Permissions.gore(player);
+        canSharpenedClaws = Permissions.sharpenedClaws(player);
+        canShockProof = Permissions.shockProof(player);
+        canThickFur = Permissions.thickFur(player);
+        lucky = Permissions.luckyTaming(player);
     }
 
     @Override
@@ -62,7 +65,7 @@ public class TamingCommand extends SkillCommand {
 
     @Override
     protected void effectsDisplay() {
-        if (player.hasPermission("mcmmo.perks.lucky.taming")) {
+        if (lucky) {
             String perkPrefix = ChatColor.RED + "[mcMMO Perks] ";
             player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc", new Object[] { "Taming" }) }));
         }

+ 8 - 5
src/main/java/com/gmail/nossr50/commands/skills/UnarmedCommand.java

@@ -8,6 +8,7 @@ import com.gmail.nossr50.commands.SkillCommand;
 import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.util.Permissions;
 
 public class UnarmedCommand extends SkillCommand {
     AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
@@ -28,6 +29,7 @@ public class UnarmedCommand extends SkillCommand {
     private boolean canDisarm;
     private boolean canBonusDamage;
     private boolean canDeflect;
+    private boolean lucky;
 
     public UnarmedCommand() {
         super(SkillType.UNARMED);
@@ -50,10 +52,11 @@ public class UnarmedCommand extends SkillCommand {
 
     @Override
     protected void permissionsCheck() {
-        canBerserk = permInstance.berserk(player);
-        canBonusDamage = permInstance.unarmedBonus(player);
-        canDeflect = permInstance.deflect(player);
-        canDisarm = permInstance.disarm(player);
+        canBerserk = Permissions.berserk(player);
+        canBonusDamage = Permissions.unarmedBonus(player);
+        canDeflect = Permissions.deflect(player);
+        canDisarm = Permissions.disarm(player);
+        lucky = Permissions.luckyUnarmed(player);
     }
 
     @Override
@@ -63,7 +66,7 @@ public class UnarmedCommand extends SkillCommand {
 
     @Override
     protected void effectsDisplay() {
-        if (player.hasPermission("mcmmo.perks.lucky.unarmed")) {
+        if (lucky) {
             String perkPrefix = ChatColor.RED + "[mcMMO Perks] ";
             player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc", new Object[] { "Unarmed" }) }));
         }

+ 7 - 4
src/main/java/com/gmail/nossr50/commands/skills/WoodcuttingCommand.java

@@ -9,6 +9,7 @@ import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.util.Permissions;
 
 public class WoodcuttingCommand extends SkillCommand {
     AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
@@ -24,6 +25,7 @@ public class WoodcuttingCommand extends SkillCommand {
     private boolean canLeafBlow;
     private boolean canDoubleDrop;
     private boolean doubleDropsDisabled;
+    private boolean lucky;
 
     public WoodcuttingCommand() {
         super(SkillType.WOODCUTTING);
@@ -42,10 +44,11 @@ public class WoodcuttingCommand extends SkillCommand {
     protected void permissionsCheck() {
         Config configInstance = Config.getInstance();
 
-        canTreeFell = permInstance.treeFeller(player);
-        canDoubleDrop = permInstance.woodcuttingDoubleDrops(player);
-        canLeafBlow = permInstance.leafBlower(player);
+        canTreeFell = Permissions.treeFeller(player);
+        canDoubleDrop = Permissions.woodcuttingDoubleDrops(player);
+        canLeafBlow = Permissions.leafBlower(player);
         doubleDropsDisabled = configInstance.woodcuttingDoubleDropsDisabled();
+        lucky = Permissions.luckyWoodcutting(player);
     }
 
     @Override
@@ -55,7 +58,7 @@ public class WoodcuttingCommand extends SkillCommand {
 
     @Override
     protected void effectsDisplay() {
-        if (player.hasPermission("mcmmo.perks.lucky.woodcutting")) {
+        if (lucky) {
             String perkPrefix = ChatColor.RED + "[mcMMO Perks] ";
             player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc", new Object[] { "Woodcutting" }) }));
         }

+ 1 - 1
src/main/java/com/gmail/nossr50/commands/spout/XplockCommand.java

@@ -65,7 +65,7 @@ public class XplockCommand implements CommandExecutor {
 
         case 1:
             if (Skills.isSkill(args[0])) {
-                if (Permissions.getInstance().permission(player, "mcmmo.skills." + args[0].toLowerCase())) {
+                if (Permissions.hasPermission(player, "mcmmo.skills." + args[0].toLowerCase())) {
                     spoutHud.setXpBarLocked(true);
                     spoutHud.setSkillLock(Skills.getSkillType(args[0]));
                     spoutHud.updateXpBar();

+ 9 - 10
src/main/java/com/gmail/nossr50/datatypes/AbilityType.java

@@ -144,35 +144,34 @@ public enum AbilityType {
      * @return true if the player has permissions, false otherwise
      */
     public boolean getPermissions(Player player) {
-        Permissions permInstance = Permissions.getInstance();
 
         switch (this) {
         case BERSERK:
-            return permInstance.berserk(player);
+            return Permissions.berserk(player);
 
         case BLAST_MINING:
-            return permInstance.blastMining(player);
+            return Permissions.blastMining(player);
 
         case GIGA_DRILL_BREAKER:
-            return permInstance.gigaDrillBreaker(player);
+            return Permissions.gigaDrillBreaker(player);
 
         case GREEN_TERRA:
-            return permInstance.greenTerra(player);
+            return Permissions.greenTerra(player);
 
         case LEAF_BLOWER:
-            return permInstance.leafBlower(player);
+            return Permissions.leafBlower(player);
 
         case SERRATED_STRIKES:
-            return permInstance.serratedStrikes(player);
+            return Permissions.serratedStrikes(player);
 
         case SKULL_SPLIITER:
-            return permInstance.skullSplitter(player);
+            return Permissions.skullSplitter(player);
 
         case SUPER_BREAKER:
-            return permInstance.superBreaker(player);
+            return Permissions.superBreaker(player);
 
         case TREE_FELLER:
-            return permInstance.treeFeller(player);
+            return Permissions.treeFeller(player);
 
         default:
             return false;

+ 6 - 5
src/main/java/com/gmail/nossr50/datatypes/McMMOPlayer.java

@@ -12,6 +12,7 @@ import com.gmail.nossr50.party.Party;
 import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.ModChecks;
+import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.Users;
 
 public class McMMOPlayer {
@@ -154,19 +155,19 @@ public class McMMOPlayer {
             }
         }
 
-        if (player.hasPermission("mcmmo.perks.xp.quadruple")) {
+        if (Permissions.xpQuadruple(player)) {
             xp = xp * 4;
         }
-        else if (player.hasPermission("mcmmo.perks.xp.triple")) {
+        else if (Permissions.xpTriple(player)) {
             xp = xp * 3;
         }
-        else if (player.hasPermission("mcmmo.perks.xp.150percentboost")) {
+        else if (Permissions.xpDoubleAndOneHalf(player)) {
             xp = (int) (xp * 2.5);
         }
-        else if (player.hasPermission("mcmmo.perks.xp.double")) {
+        else if (Permissions.xpDouble(player)) {
             xp = xp * 2;
         }
-        else if (player.hasPermission("mcmmo.perks.xp.50percentboost")) {
+        else if (Permissions.xpOneAndOneHalf(player)) {
             xp = (int) (xp * 1.5);
         }
 

+ 12 - 12
src/main/java/com/gmail/nossr50/datatypes/SkillType.java

@@ -75,40 +75,40 @@ public enum SkillType {
     public boolean getPermissions(Player player) {
         switch (this) {
         case ACROBATICS:
-            return Permissions.getInstance().acrobatics(player);
+            return Permissions.acrobatics(player);
 
         case ARCHERY:
-            return Permissions.getInstance().archery(player);
+            return Permissions.archery(player);
 
         case AXES:
-            return Permissions.getInstance().axes(player);
+            return Permissions.axes(player);
 
         case EXCAVATION:
-            return Permissions.getInstance().excavation(player);
+            return Permissions.excavation(player);
 
         case FISHING:
-            return Permissions.getInstance().fishing(player);
+            return Permissions.fishing(player);
 
         case HERBALISM:
-            return Permissions.getInstance().herbalism(player);
+            return Permissions.herbalism(player);
 
         case MINING:
-            return Permissions.getInstance().mining(player);
+            return Permissions.mining(player);
 
         case REPAIR:
-            return Permissions.getInstance().repair(player);
+            return Permissions.repair(player);
 
         case SWORDS:
-            return Permissions.getInstance().swords(player);
+            return Permissions.swords(player);
 
         case TAMING:
-            return Permissions.getInstance().taming(player);
+            return Permissions.taming(player);
 
         case UNARMED:
-            return Permissions.getInstance().unarmed(player);
+            return Permissions.unarmed(player);
 
         case WOODCUTTING:
-            return Permissions.getInstance().woodcutting(player);
+            return Permissions.woodcutting(player);
 
         default:
             return false;

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

@@ -184,12 +184,11 @@ public class BlockListener implements Listener {
         ItemStack inHand = player.getItemInHand();
 
         Config configInstance = Config.getInstance();
-        Permissions permInstance = Permissions.getInstance();
 
         /* HERBALISM */
         if (BlockChecks.canBeGreenTerra(block)) {
             /* Green Terra */
-            if (profile.getToolPreparationMode(ToolType.HOE) && permInstance.greenTerra(player)) {
+            if (profile.getToolPreparationMode(ToolType.HOE) && Permissions.greenTerra(player)) {
                 Skills.abilityCheck(player, SkillType.HERBALISM);
             }
 
@@ -198,13 +197,13 @@ public class BlockListener implements Listener {
                 Herbalism.herbalismProcCheck(block, player, event, plugin);
             }
 
-            if (permInstance.herbalism(player)) {
+            if (Permissions.herbalism(player)) {
                 Herbalism.herbalismProcCheck(block, player, event, plugin);
             }
         }
 
         /* MINING */
-        else if (BlockChecks.canBeSuperBroken(block) && permInstance.mining(player)) {
+        else if (BlockChecks.canBeSuperBroken(block) && Permissions.mining(player)) {
             if (configInstance.getMiningRequiresTool()) {
                 if (ItemChecks.isPickaxe(inHand)) {
                     Mining.miningBlockCheck(player, block);
@@ -216,7 +215,7 @@ public class BlockListener implements Listener {
         }
 
         /* WOOD CUTTING */
-        else if (BlockChecks.isLog(block) && permInstance.woodcutting(player)) {
+        else if (BlockChecks.isLog(block) && Permissions.woodcutting(player)) {
             if (configInstance.getWoodcuttingRequiresTool()) {
                 if (ItemChecks.isAxe(inHand)) {
                     WoodCutting.woodcuttingBlockCheck(player, block);
@@ -226,13 +225,13 @@ public class BlockListener implements Listener {
                 WoodCutting.woodcuttingBlockCheck(player, block);
             }
 
-            if (profile.getAbilityMode(AbilityType.TREE_FELLER) && permInstance.treeFeller(player) && ItemChecks.isAxe(inHand)) {
+            if (profile.getAbilityMode(AbilityType.TREE_FELLER) && Permissions.treeFeller(player) && ItemChecks.isAxe(inHand)) {
                 WoodCutting.treeFeller(event);
             }
         }
 
         /* EXCAVATION */
-        else if (BlockChecks.canBeGigaDrillBroken(block) && permInstance.excavation(player) && !mcMMO.placeStore.isTrue(block)) {
+        else if (BlockChecks.canBeGigaDrillBroken(block) && Permissions.excavation(player) && !mcMMO.placeStore.isTrue(block)) {
             if (configInstance.getExcavationRequiresTool()) {
                 if (ItemChecks.isShovel(inHand)) {
                     Excavation.excavationProcCheck(block, player);
@@ -298,7 +297,6 @@ public class BlockListener implements Listener {
         Material material = block.getType();
 
         Config configInstance = Config.getInstance();
-        Permissions permInstance = Permissions.getInstance();
 
         /*
          * ABILITY PREPARATION CHECKS
@@ -307,7 +305,7 @@ public class BlockListener implements Listener {
             if (profile.getToolPreparationMode(ToolType.HOE) && (BlockChecks.canBeGreenTerra(block) || BlockChecks.makeMossy(block))) {
                 Skills.abilityCheck(player, SkillType.HERBALISM);
             }
-            else if (profile.getToolPreparationMode(ToolType.AXE) && BlockChecks.isLog(block) && permInstance.treeFeller(player)) {  //TODO: Why are we checking the permissions here?
+            else if (profile.getToolPreparationMode(ToolType.AXE) && BlockChecks.isLog(block) && Permissions.treeFeller(player)) {  //TODO: Why are we checking the permissions here?
                 Skills.abilityCheck(player, SkillType.WOODCUTTING);
             }
             else if (profile.getToolPreparationMode(ToolType.PICKAXE) && BlockChecks.canBeSuperBroken(block)) {
@@ -329,7 +327,7 @@ public class BlockListener implements Listener {
         /*
          * ABILITY TRIGGER CHECKS
          */
-        if (profile.getAbilityMode(AbilityType.GREEN_TERRA) && permInstance.greenTerra(player) && BlockChecks.makeMossy(block)) {
+        if (profile.getAbilityMode(AbilityType.GREEN_TERRA) && Permissions.greenTerra(player) && BlockChecks.makeMossy(block)) {
             Herbalism.greenTerra(player, block);
         }
         else if (profile.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER) && Skills.triggerCheck(player, block, AbilityType.GIGA_DRILL_BREAKER)) {

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

@@ -150,7 +150,7 @@ public class EntityListener implements Listener {
                     AcrobaticsManager acroManager = new AcrobaticsManager(player);
                     acroManager.rollCheck(event);
                 }
-                else if (cause == DamageCause.BLOCK_EXPLOSION && Permissions.getInstance().demolitionsExpertise(player)) {
+                else if (cause == DamageCause.BLOCK_EXPLOSION && Permissions.demolitionsExpertise(player)) {
                     BlastMining.demolitionsExpertise(player, event);
                 }
 
@@ -218,7 +218,7 @@ public class EntityListener implements Listener {
             if (plugin.tntIsTracked(id)) {
                 Player player = plugin.getTNTPlayer(id);
 
-                if (Permissions.getInstance().biggerBombs(player)) {
+                if (Permissions.biggerBombs(player)) {
                     BlastMining.biggerBombs(player, event);
                 }
             }
@@ -362,10 +362,10 @@ public class EntityListener implements Listener {
                     return;
                 }
 
-                if (herb && !Permissions.getInstance().farmersDiet(player)) {
+                if (herb && !Permissions.farmersDiet(player)) {
                     return;
                 }
-                else if (fish && !Permissions.getInstance().fishermansDiet(player)) {
+                else if (fish && !Permissions.fishermansDiet(player)) {
                     return;
                 }
 
@@ -398,7 +398,7 @@ public class EntityListener implements Listener {
 
         if(player.hasMetadata("NPC")) return; // Check if this player is a Citizens NPC
 
-        if (Permissions.getInstance().taming(player) && !mcMMO.placeStore.isSpawnedPet((Entity) event.getEntity())) {
+        if (Permissions.taming(player) && !mcMMO.placeStore.isSpawnedPet((Entity) event.getEntity())) {
             PlayerProfile profile = Users.getProfile(player);
             EntityType type = event.getEntityType();
             int xp = 0;

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

@@ -23,7 +23,7 @@ public class HardcoreListener implements Listener {
 
         if(player.hasMetadata("NPC")) return; // Check if this player is a Citizens NPC
 
-        if (!Permissions.getInstance().hardcoremodeBypass(player)) {
+        if (!Permissions.hardcoremodeBypass(player)) {
             if (player.getKiller() != null && Config.getInstance().getHardcoreVampirismEnabled()) {
                 Hardcore.invokeVampirism(player.getKiller(), player);
             }

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

@@ -72,14 +72,14 @@ public class PlayerListener implements Listener {
         }
 
         if (profile.getGodMode()) {
-            if (!Permissions.getInstance().mcgod(player)) {
+            if (!Permissions.mcgod(player)) {
                 profile.toggleGodMode();
                 player.sendMessage(LocaleLoader.getString("Commands.GodMode.Forbidden"));
             }
         }
 
         if (profile.inParty()) {
-            if (!Permissions.getInstance().party(player)) {
+            if (!Permissions.party(player)) {
                 profile.removeParty();
                 player.sendMessage(LocaleLoader.getString("Party.Forbidden"));
             }
@@ -99,7 +99,7 @@ public class PlayerListener implements Listener {
 
         if(player.hasMetadata("NPC")) return; // Check if this player is a Citizens NPC
 
-        if (Permissions.getInstance().fishing(player)) {
+        if (Permissions.fishing(player)) {
             State state = event.getState();
 
             switch (state) {
@@ -112,7 +112,7 @@ public class PlayerListener implements Listener {
                     return;
                 }
 
-                if (Users.getProfile(player).getSkillLevel(SkillType.FISHING) >= shakeUnlockLevel && Permissions.getInstance().shakeMob(player)) {
+                if (Users.getProfile(player).getSkillLevel(SkillType.FISHING) >= shakeUnlockLevel && Permissions.shakeMob(player)) {
                     Fishing.shakeMob(event);
                 }
                 break;
@@ -184,7 +184,7 @@ public class PlayerListener implements Listener {
         if(player.hasMetadata("NPC")) return; // Check if this player is a Citizens NPC
 
         //TODO: Locale ALL the things.
-        if (Config.getInstance().getMOTDEnabled() && Permissions.getInstance().motd(player)) {
+        if (Config.getInstance().getMOTDEnabled() && Permissions.motd(player)) {
             String prefix = ChatColor.GOLD + "[mcMMO] ";
             String perkPrefix = ChatColor.RED + "[mcMMO Perks] ";
 
@@ -201,76 +201,76 @@ public class PlayerListener implements Listener {
                 }
             }
 
-            if (player.hasPermission("mcmmo.perks.xp.quadruple")) {
+            if (Permissions.xpQuadruple(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.xp.name"), LocaleLoader.getString("Perks.xp.desc", new Object[] { 4 }) }));
             }
-            else if (player.hasPermission("mcmmo.perks.xp.triple")) {
+            else if (Permissions.xpTriple(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.xp.name"), LocaleLoader.getString("Perks.xp.desc", new Object[] { 3 }) }));
             }
-            else if (player.hasPermission("mcmmo.perks.xp.150percentboost")) {
+            else if (Permissions.xpDoubleAndOneHalf(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.xp.name"), LocaleLoader.getString("Perks.xp.desc", new Object[] { 2.5 }) }));
             }
-            else if (player.hasPermission("mcmmo.perks.xp.double")) {
+            else if (Permissions.xpDouble(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.xp.name"), LocaleLoader.getString("Perks.xp.desc", new Object[] { 2 }) }));
             }
-            else if (player.hasPermission("mcmmo.perks.xp.50percentboost")) {
+            else if (Permissions.xpOneAndOneHalf(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.xp.name"), LocaleLoader.getString("Perks.xp.desc", new Object[] { 1.5 }) }));
             }
 
-            if (player.hasPermission("mcmmo.perks.cooldowns.halved")) {
+            if (Permissions.cooldownsHalved(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.cooldowns.name"), LocaleLoader.getString("Perks.cooldowns.desc", new Object[] { "1/2" }) }));
             }
-            else if (player.hasPermission("mcmmo.perks.cooldowns.thirded")) {
+            else if (Permissions.cooldownsThirded(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.cooldowns.name"), LocaleLoader.getString("Perks.cooldowns.desc", new Object[] { "1/3" }) }));
             }
-            else if (player.hasPermission("mcmmo.perks.cooldowns.quartered")) {
+            else if (Permissions.cooldownsQuartered(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.cooldowns.name"), LocaleLoader.getString("Perks.cooldowns.desc", new Object[] { "1/4" }) }));
             }
 
-            if (player.hasPermission("mcmmo.perks.activationtime.twelveseconds")) {
+            if (Permissions.activationTwelve(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.activationtime.name"), LocaleLoader.getString("Perks.activationtime.desc", new Object[] { 12 }) }));
             }
-            else if (player.hasPermission("mcmmo.perks.activationtime.eightseconds")) {
+            else if (Permissions.activationEight(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.activationtime.name"), LocaleLoader.getString("Perks.activationtime.desc", new Object[] { 8 }) }));
             }
-            else if (player.hasPermission("mcmmo.perks.activationtime.fourseconds")) {
+            else if (Permissions.activationFour(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.activationtime.name"), LocaleLoader.getString("Perks.activationtime.desc", new Object[] { 4 }) }));
             }
 
-            if (player.hasPermission("mcmmo.perks.lucky.acrobatics")) {
+            if (Permissions.luckyAcrobatics(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc.login") }));
             }
-            else if (player.hasPermission("mcmmo.perks.lucky.archery")) {
+            else if (Permissions.luckyArchery(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc.login") }));
             }
-            else if (player.hasPermission("mcmmo.perks.lucky.axes")) {
+            else if (Permissions.luckyAxes(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc.login") }));
             }
-            else if (player.hasPermission("mcmmo.perks.lucky.excavation")) {
+            else if (Permissions.luckyExcavation(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc.login") }));
             }
-            else if (player.hasPermission("mcmmo.perks.lucky.fishing")) {
+            else if (Permissions.luckyFishing(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc.login") }));
             }
-            else if (player.hasPermission("mcmmo.perks.lucky.herbalism")) {
+            else if (Permissions.luckyHerbalism(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc.login") }));
             }
-            else if (player.hasPermission("mcmmo.perks.lucky.mining")) {
+            else if (Permissions.luckyMining(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc.login") }));
             }
-            else if (player.hasPermission("mcmmo.perks.lucky.repair")) {
+            else if (Permissions.luckyRepair(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc.login") }));
             }
-            else if (player.hasPermission("mcmmo.perks.lucky.swords")) {
+            else if (Permissions.luckySwords(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc.login") }));
             }
-            else if (player.hasPermission("mcmmo.perks.lucky.taming")) {
+            else if (Permissions.luckyTaming(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc.login") }));
             }
-            else if (player.hasPermission("mcmmo.perks.lucky.unarmed")) {
+            else if (Permissions.luckyUnarmed(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc.login") }));
             }
-            else if (player.hasPermission("mcmmo.perks.lucky.woodcutting")) {
+            else if (Permissions.luckyWoodcutting(player)) {
                 player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Perks.lucky.name"), LocaleLoader.getString("Perks.lucky.desc.login") }));
             }
 
@@ -321,7 +321,7 @@ public class PlayerListener implements Listener {
         case RIGHT_CLICK_BLOCK:
 
             /* REPAIR CHECKS */
-            if (Permissions.getInstance().repair(player) && block.getTypeId() == Config.getInstance().getRepairAnvilId()) {
+            if (Permissions.repair(player) && block.getTypeId() == Config.getInstance().getRepairAnvilId()) {
                 if (mcMMO.repairManager.isRepairable(inHand)) {
                     mcMMO.repairManager.handleRepair(player, inHand);
                     event.setCancelled(true);
@@ -329,7 +329,7 @@ public class PlayerListener implements Listener {
                 }
             }
             /* SALVAGE CHECKS */
-            if (Permissions.getInstance().salvage(player) && block.getTypeId() == Config.getInstance().getSalvageAnvilId()) {
+            if (Permissions.salvage(player) && block.getTypeId() == Config.getInstance().getSalvageAnvilId()) {
                 if (Salvage.isSalvageable(inHand)) {
                     final Location location = block.getLocation();
                     Salvage.handleSalvage(player, location, inHand);
@@ -353,7 +353,7 @@ public class PlayerListener implements Listener {
             }
 
             /* GREEN THUMB CHECK */
-            if (inHand.getType().equals(Material.SEEDS) && BlockChecks.makeMossy(block) && Permissions.getInstance().greenThumbBlocks(player)) {
+            if (inHand.getType().equals(Material.SEEDS) && BlockChecks.makeMossy(block) && Permissions.greenThumbBlocks(player)) {
                 Herbalism.greenThumbBlocks(inHand, player, block);
             }
 
@@ -363,7 +363,7 @@ public class PlayerListener implements Listener {
             }
 
             /* BLAST MINING CHECK */
-            if (player.isSneaking() && inHand.getTypeId() == Config.getInstance().getDetonatorItemID() && Permissions.getInstance().blastMining(player)) {
+            if (player.isSneaking() && inHand.getTypeId() == Config.getInstance().getDetonatorItemID() && Permissions.blastMining(player)) {
                 BlastMining.detonate(event, player, plugin);
             }
 
@@ -386,7 +386,7 @@ public class PlayerListener implements Listener {
             Item.itemChecks(player);
 
             /* BLAST MINING CHECK */
-            if (player.isSneaking() && inHand.getTypeId() == Config.getInstance().getDetonatorItemID() && Permissions.getInstance().blastMining(player)) {
+            if (player.isSneaking() && inHand.getTypeId() == Config.getInstance().getDetonatorItemID() && Permissions.blastMining(player)) {
                 BlastMining.detonate(event, player, plugin);
             }
 
@@ -474,7 +474,7 @@ public class PlayerListener implements Listener {
             plugin.getLogger().info("[A]<" + playerName + "> " + chatEvent.getMessage());
 
             for (Player otherPlayer : plugin.getServer().getOnlinePlayers()) {
-                if (Permissions.getInstance().adminChat(otherPlayer) || otherPlayer.isOp()) {
+                if (Permissions.adminChat(otherPlayer) || otherPlayer.isOp()) {
                     otherPlayer.sendMessage(prefix + chatEvent.getMessage());
                 }
             }

+ 5 - 6
src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java

@@ -12,8 +12,7 @@ import com.gmail.nossr50.util.Users;
 public class AcrobaticsManager {
     private Player player;
     private PlayerProfile profile;
-    private int skillLevel;
-    private Permissions permissionInstance;
+    private int skillLevel;
 
     public AcrobaticsManager (Player player) {
         this.player = player;
@@ -31,7 +30,7 @@ public class AcrobaticsManager {
         if(player == null)
             return;
 
-        if (!permissionInstance.roll(player)) {
+        if (!Permissions.roll(player)) {
             return;
         }
 
@@ -42,7 +41,7 @@ public class AcrobaticsManager {
 
         int randomChance = 100;
 
-        if (player.hasPermission("mcmmo.perks.lucky.acrobatics")) {
+        if (Permissions.luckyAcrobatics(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
@@ -72,7 +71,7 @@ public class AcrobaticsManager {
         if(player == null)
             return;
 
-        if (!permissionInstance.dodge(player)) {
+        if (!Permissions.dodge(player)) {
             return;
         }
 
@@ -80,7 +79,7 @@ public class AcrobaticsManager {
 
         int randomChance = 100;
 
-        if (player.hasPermission("mcmmo.perks.lucky.acrobatics")) {
+        if (Permissions.luckyAcrobatics(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 

+ 1 - 1
src/main/java/com/gmail/nossr50/skills/acrobatics/RollEventHandler.java

@@ -83,7 +83,7 @@ public class RollEventHandler extends AcrobaticsEventHandler {
         if(player == null)
             return;
 
-        if (Permissions.getInstance().gracefulRoll(player)) {
+        if (Permissions.gracefulRoll(player)) {
             this.isGraceful = player.isSneaking();
         }
         else {

+ 5 - 16
src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java

@@ -13,7 +13,6 @@ public class ArcheryManager {
     private Player player;
     private PlayerProfile profile;
     private int skillLevel;
-    private Permissions permissionsInstance;
 
     public ArcheryManager (Player player) {
         this.player = player;
@@ -24,7 +23,6 @@ public class ArcheryManager {
             return;
 
         this.skillLevel = profile.getSkillLevel(SkillType.ARCHERY);
-        this.permissionsInstance =  Permissions.getInstance();
     }
 
     /**
@@ -36,17 +34,14 @@ public class ArcheryManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.trackArrows(player)) {
+        if (!Permissions.trackArrows(player)) {
             return;
         }
 
         ArrowTrackingEventHandler eventHandler = new ArrowTrackingEventHandler(this, livingEntity);
 
         int randomChance = 100;
-        if (player.hasPermission("mcmmo.perks.lucky.archery")) {
+        if (Permissions.luckyArchery(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
@@ -68,10 +63,7 @@ public class ArcheryManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.daze(player)) {
+        if (!Permissions.daze(player)) {
             return;
         }
 
@@ -79,7 +71,7 @@ public class ArcheryManager {
 
         int randomChance = 100;
 
-        if (player.hasPermission("mcmmo.perks.lucky.archery")) {
+        if (Permissions.luckyArchery(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
@@ -101,10 +93,7 @@ public class ArcheryManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.archeryBonus(player)) {
+        if (!Permissions.archeryBonus(player)) {
             return;
         }
 

+ 3 - 3
src/main/java/com/gmail/nossr50/skills/combat/Axes.java

@@ -91,7 +91,7 @@ public class Axes {
         double chance = (MAX_CHANCE / MAX_BONUS_LEVEL) * skillCheck;
         if (chance > MAX_CHANCE) chance = MAX_CHANCE;
 
-        if (attacker.hasPermission("mcmmo.perks.lucky.axes")) {
+        if (Permissions.luckyAxes(attacker)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
@@ -180,13 +180,13 @@ public class Axes {
         final double GREATER_IMPACT_MULTIPLIER = advancedConfig.getGreaterImpactModifier();
         final int GREATER_IMPACT_DAMAGE = advancedConfig.getGreaterImpactBonusDamage();
 
-        if (!Permissions.getInstance().greaterImpact(attacker)) {
+        if (!Permissions.greaterImpact(attacker)) {
             return;
         }
 
         int randomChance = 100;
 
-        if (attacker.hasPermission("mcmmo.perks.lucky.axes")) {
+        if (Permissions.luckyAxes(attacker)) {
             randomChance = (int) (randomChance * 0.75);
         }
 

+ 2 - 2
src/main/java/com/gmail/nossr50/skills/gathering/Excavation.java

@@ -61,7 +61,7 @@ public class Excavation {
             xp = Config.getInstance().getExcavationBaseXP();
         }
 
-        if (Permissions.getInstance().excavationTreasures(player)) {
+        if (Permissions.excavationTreasures(player)) {
             switch (type) {
             case DIRT:
                 treasures = TreasuresConfig.getInstance().excavationFromDirt;
@@ -99,7 +99,7 @@ public class Excavation {
                 if (skillLevel >= treasure.getDropLevel()) {
                     int randomChance = 100;
 
-                    if (player.hasPermission("mcmmo.perks.lucky.excavation")) {
+                    if (Permissions.luckyExcavation(player)) {
                         randomChance = (int) (randomChance * 0.75);
                     }
 

+ 6 - 6
src/main/java/com/gmail/nossr50/skills/gathering/Fishing.java

@@ -107,13 +107,13 @@ public class Fishing {
         }
 
         if (Config.getInstance().getFishingDropsEnabled() && rewards.size() > 0
-                && Permissions.getInstance().fishingTreasures(player)) {
+                && Permissions.fishingTreasures(player)) {
             FishingTreasure treasure = rewards.get(random.nextInt(rewards
                     .size()));
 
             int randomChance = 100;
 
-            if (player.hasPermission("mcmmo.perks.lucky.fishing")) {
+            if (Permissions.luckyFishing(player)) {
                 randomChance = (int) (randomChance * 0.75);
             }
 
@@ -167,12 +167,12 @@ public class Fishing {
             if (ItemChecks.isEnchantable(fishingResults)) {
                 int randomChance = 100;
 
-                if (player.hasPermission("mcmmo.perks.lucky.fishing")) {
+                if (Permissions.luckyFishing(player)) {
                     randomChance = (int) (randomChance * 0.75);
                 }
 
                 if (random.nextInt(randomChance) <= ENCHANTMENT_CHANCE
-                        && Permissions.getInstance().fishingMagic(player)) {
+                        && Permissions.fishingMagic(player)) {
                     for (Enchantment newEnchant : Enchantment.values()) {
                         if (newEnchant.canEnchantItem(fishingResults)) {
                             Map<Enchantment, Integer> resultEnchantments = fishingResults
@@ -226,7 +226,7 @@ public class Fishing {
     public static void shakeMob(PlayerFishEvent event) {
         int randomChance = 100;
 
-        if (event.getPlayer().hasPermission("mcmmo.perks.lucky.fishing")) {
+        if (Permissions.luckyFishing(event.getPlayer())) {
             randomChance = (int) (randomChance * 1.25);
         }
 
@@ -236,7 +236,7 @@ public class Fishing {
 
         int dropChance = getShakeChance(lootTier);
 
-        if (event.getPlayer().hasPermission("mcmmo.perks.lucky.fishing")) {
+        if (Permissions.luckyFishing(player)) {
             dropChance = (int) (dropChance * 1.25); // With lucky perk on max
             // level tier, its 100%
         }

+ 9 - 9
src/main/java/com/gmail/nossr50/skills/gathering/Herbalism.java

@@ -106,7 +106,7 @@ public class Herbalism {
 
         int randomChance = 100;
 
-        if (player.hasPermission("mcmmo.perks.lucky.herbalism")) {
+        if (Permissions.luckyHerbalism(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
@@ -142,7 +142,7 @@ public class Herbalism {
                 mat = Material.WHEAT;
                 xp = Config.getInstance().getHerbalismXPWheat();
 
-                if (Permissions.getInstance().greenThumbWheat(player)) {
+                if (Permissions.greenThumbWheat(player)) {
                     greenThumbWheat(block, player, event, plugin);
                 }
             }
@@ -160,7 +160,7 @@ public class Herbalism {
                 mat = Material.NETHER_STALK;
                 xp = Config.getInstance().getHerbalismXPNetherWart();
 
-                if (Permissions.getInstance().greenThumbNetherwart(player)) {
+                if (Permissions.greenThumbNetherwart(player)) {
                     greenThumbWheat(block, player, event, plugin);
                 }
             }
@@ -217,7 +217,7 @@ public class Herbalism {
                 xp = Config.getInstance().getHerbalismXPCocoa();
 
 
-                if (Permissions.getInstance().greenThumbCocoa(player)) {
+                if (Permissions.greenThumbCocoa(player)) {
                     greenThumbWheat(block, player, event, plugin);
                 }
             }
@@ -229,7 +229,7 @@ public class Herbalism {
                 xp = Config.getInstance().getHerbalismXPCarrot();
 
 
-                if (Permissions.getInstance().greenThumbCarrots(player)) {
+                if (Permissions.greenThumbCarrots(player)) {
                     greenThumbWheat(block, player, event, plugin);
                 }
             }
@@ -240,7 +240,7 @@ public class Herbalism {
                 mat = Material.POTATO;
                 xp = Config.getInstance().getHerbalismXPPotato();
 
-                if (Permissions.getInstance().greenThumbPotatoes(player)) {
+                if (Permissions.greenThumbPotatoes(player)) {
                     greenThumbWheat(block, player, event, plugin);
                 }
             }
@@ -260,7 +260,7 @@ public class Herbalism {
             return;
         }
 
-        if (Permissions.getInstance().herbalismDoubleDrops(player)) {
+        if (Permissions.herbalismDoubleDrops(player)) {
             ItemStack is = null;
 
             if (customPlant) {
@@ -438,7 +438,7 @@ public class Herbalism {
 
         int randomChance = 100;
 
-        if (player.hasPermission("mcmmo.perks.lucky.herbalism")) {
+        if (Permissions.luckyHerbalism(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
@@ -502,7 +502,7 @@ public class Herbalism {
 
         int randomChance = 100;
 
-        if (player.hasPermission("mcmmo.perks.lucky.herbalism")) {
+        if (Permissions.luckyHerbalism(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 

+ 3 - 3
src/main/java/com/gmail/nossr50/skills/gathering/WoodCutting.java

@@ -224,7 +224,7 @@ public class WoodCutting {
             }
         }
 
-        if (Permissions.getInstance().woodcutting(player)) {
+        if (Permissions.woodcutting(player)) {
             Skills.xpProcessing(player, profile, SkillType.WOODCUTTING, xp);
         }
     }
@@ -358,11 +358,11 @@ public class WoodCutting {
         int chance = (int) (((double) MAX_CHANCE / (double) MAX_BONUS_LEVEL) * skillLevel);
         if (chance > MAX_CHANCE) chance = MAX_CHANCE;
 
-        if (player.hasPermission("mcmmo.perks.lucky.woodcutting")) {
+        if (Permissions.luckyWoodcutting(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
-        if (chance > random.nextInt(randomChance) && Permissions.getInstance().woodcuttingDoubleDrops(player)) {
+        if (chance > random.nextInt(randomChance) && Permissions.woodcuttingDoubleDrops(player)) {
             Config configInstance = Config.getInstance();
             ItemStack item;
             Location location;

+ 2 - 2
src/main/java/com/gmail/nossr50/skills/mining/Mining.java

@@ -336,11 +336,11 @@ public class Mining {
         int randomChance = 100;
         int chance = (int) (((double) MAX_CHANCE / (double) MAX_BONUS_LEVEL) * skillCheck);
 
-        if (player.hasPermission("mcmmo.perks.lucky.mining")) {
+        if (Permissions.luckyMining(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
-        if (chance > random.nextInt(randomChance) && Permissions.getInstance().miningDoubleDrops(player)) {
+        if (chance > random.nextInt(randomChance) && Permissions.miningDoubleDrops(player)) {
             if (player.getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH)) {
                 silkTouchDrops(block);
             }

+ 6 - 7
src/main/java/com/gmail/nossr50/skills/repair/Repair.java

@@ -27,7 +27,6 @@ public class Repair {
 
     private static Random random = new Random();
     private static Config configInstance = Config.getInstance();
-    private static Permissions permInstance = Permissions.getInstance();
 
     static AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
 
@@ -92,7 +91,7 @@ public class Repair {
      * @param is Item being repaired
      */
     protected static void addEnchants(Player player, ItemStack is) {
-        if(permInstance.arcaneBypass(player)) {
+        if(Permissions.arcaneBypass(player)) {
             player.sendMessage(LocaleLoader.getString("Repair.Arcane.Perfect"));
             return;
         }
@@ -104,7 +103,7 @@ public class Repair {
 
         int rank = getArcaneForgingRank(Users.getProfile(player));
 
-        if (rank == 0 || !permInstance.arcaneForging(player)) {
+        if (rank == 0 || !Permissions.arcaneForging(player)) {
             for (Enchantment x : enchants.keySet()) {
                 is.removeEnchantment(x);
             }
@@ -120,7 +119,7 @@ public class Repair {
 
             int randomChance = 100;
 
-            if (player.hasPermission("mcmmo.perks.lucky.repair")) {
+            if (Permissions.luckyRepair(player)) {
                 randomChance = (int) (randomChance * 0.75);
             }
 
@@ -244,7 +243,7 @@ public class Repair {
         if(skillLevel >= REPAIR_MASTERY_MAX_BONUS_LEVEL) bonus = ((float) REPAIR_MASTERY_CHANCE_MAX / 100F);
         else bonus = (((float) skillLevel) / ((float) REPAIR_MASTERY_MAX_BONUS_LEVEL)) * (((float) REPAIR_MASTERY_CHANCE_MAX) / 100F);
 
-        if (permInstance.repairMastery(player)) {
+        if (Permissions.repairMastery(player)) {
             bonus = (((float) repairAmount) * bonus);
             repairAmount += (int) bonus;
         }
@@ -278,9 +277,9 @@ public class Repair {
         int chance = (int) (((double) SUPER_REPAIR_CHANCE_MAX / (double) SUPER_REPAIR_MAX_BONUS_LEVEL) * skillLevel);
         if (skillLevel >= SUPER_REPAIR_MAX_BONUS_LEVEL) chance = SUPER_REPAIR_CHANCE_MAX;
 
-        if (player.hasPermission("mcmmo.perks.lucky.repair")) randomChance = (int) (randomChance * 0.75);
+        if (Permissions.luckyRepair(player)) randomChance = (int) (randomChance * 0.75);
 
-        if (chance > random.nextInt(randomChance) && permInstance.repairBonus(player)){
+        if (chance > random.nextInt(randomChance) && Permissions.repairBonus(player)){
             player.sendMessage(LocaleLoader.getString("Repair.Skills.FeltEasy"));
             return true;
         }

+ 3 - 3
src/main/java/com/gmail/nossr50/skills/repair/RepairItemType.java

@@ -18,13 +18,13 @@ public enum RepairItemType {
     public boolean getPermissions(Player player) {
         switch (this) {
         case ARMOR:
-            return Permissions.getInstance().armorRepair(player);
+            return Permissions.armorRepair(player);
 
         case TOOL:
-            return Permissions.getInstance().toolRepair(player);
+            return Permissions.toolRepair(player);
 
         case OTHER:
-            return Permissions.getInstance().otherRepair(player);
+            return Permissions.otherRepair(player);
 
         default:
             return false;

+ 8 - 8
src/main/java/com/gmail/nossr50/skills/repair/RepairMaterialType.java

@@ -23,28 +23,28 @@ public enum RepairMaterialType {
     public boolean getPermissions(Player player) {
         switch (this) {
         case STRING:
-            return Permissions.getInstance().stringRepair(player);
+            return Permissions.stringRepair(player);
 
         case LEATHER:
-            return Permissions.getInstance().leatherRepair(player);
+            return Permissions.leatherRepair(player);
 
         case WOOD:
-            return Permissions.getInstance().woodRepair(player);
+            return Permissions.woodRepair(player);
 
         case STONE:
-            return Permissions.getInstance().stoneRepair(player);
+            return Permissions.stoneRepair(player);
 
         case IRON:
-            return Permissions.getInstance().ironRepair(player);
+            return Permissions.ironRepair(player);
 
         case GOLD:
-            return Permissions.getInstance().goldRepair(player);
+            return Permissions.goldRepair(player);
 
         case DIAMOND:
-            return Permissions.getInstance().diamondRepair(player);
+            return Permissions.diamondRepair(player);
 
         case OTHER:
-            return Permissions.getInstance().otherMaterialRepair(player);
+            return Permissions.otherMaterialRepair(player);
 
         default:
             return false;

+ 1 - 2
src/main/java/com/gmail/nossr50/skills/repair/Salvage.java

@@ -21,10 +21,9 @@ import com.gmail.nossr50.util.Users;
 public class Salvage {
 
     private static Config configInstance = Config.getInstance();
-    private static Permissions permInstance = Permissions.getInstance();
 
     public static void handleSalvage(final Player player, final Location location, final ItemStack inHand) {
-        if (!permInstance.salvage(player) || !configInstance.getSalvageEnabled()) {
+        if (!Permissions.salvage(player) || !configInstance.getSalvageEnabled()) {
             return;
         }
 

+ 1 - 1
src/main/java/com/gmail/nossr50/skills/repair/SimpleRepairManager.java

@@ -138,7 +138,7 @@ public class SimpleRepairManager implements RepairManager {
         }
 
         // Handle the enchants
-        if (Config.getInstance().getArcaneForgingEnchantLossEnabled() && !Permissions.getInstance().arcaneBypass(player)) {
+        if (Config.getInstance().getArcaneForgingEnchantLossEnabled() && !Permissions.arcaneBypass(player)) {
             // Generalize away enchantment work
             Repair.addEnchants(player, item);
         }

+ 5 - 16
src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java

@@ -13,13 +13,11 @@ public class SwordsManager {
     private Player player;
     private PlayerProfile profile;
     private int skillLevel;
-    private Permissions permissionsInstance;
 
     public SwordsManager (Player player) {
         this.player = player;
         this.profile = Users.getProfile(player);
         this.skillLevel = profile.getSkillLevel(SkillType.SWORDS);
-        this.permissionsInstance =  Permissions.getInstance();
     }
 
     /**
@@ -31,10 +29,7 @@ public class SwordsManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.swordsBleed(player)) {
+        if (!Permissions.swordsBleed(player)) {
             return;
         }
 
@@ -43,7 +38,7 @@ public class SwordsManager {
 
             int randomChance = 100;
 
-            if (player.hasPermission("mcmmo.perks.lucky.swords")) {
+            if (Permissions.luckySwords(player)) {
                 randomChance = (int) (randomChance * 0.75);
             }
 
@@ -61,10 +56,7 @@ public class SwordsManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.counterAttack(player)) {
+        if (!Permissions.counterAttack(player)) {
             return;
         }
 
@@ -75,7 +67,7 @@ public class SwordsManager {
 
             int randomChance = 100;
 
-            if (player.hasPermission("mcmmo.perks.lucky.swords")) {
+            if (Permissions.luckySwords(player)) {
                 randomChance = (int) (randomChance * 0.75);
             }
 
@@ -93,10 +85,7 @@ public class SwordsManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.serratedStrikes(player)) {
+        if (!Permissions.serratedStrikes(player)) {
             return;
         }
 

+ 10 - 36
src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java

@@ -18,14 +18,12 @@ public class TamingManager {
     private Player player;
     private PlayerProfile profile;
     private int skillLevel;
-    private Permissions permissionsInstance;
     private Config configInstance;
 
     public TamingManager (Player player) {
         this.player = player;
         this.profile = Users.getProfile(player);
         this.skillLevel = profile.getSkillLevel(SkillType.TAMING);
-        this.permissionsInstance =  Permissions.getInstance();
         this.configInstance = Config.getInstance();
     }
 
@@ -39,17 +37,14 @@ public class TamingManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.fastFoodService(player)) {
+        if (!Permissions.fastFoodService(player)) {
             return;
         }
 
         if (skillLevel >= Taming.FAST_FOOD_SERVICE_ACTIVATION_LEVEL) {
             int randomChance = 100;
 
-            if (player.hasPermission("mcmmo.perks.lucky.taming")) {
+            if (Permissions.luckyTaming(player)) {
                 randomChance = (int) (randomChance * 0.75);
             }
 
@@ -70,10 +65,7 @@ public class TamingManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.sharpenedClaws(player)) {
+        if (!Permissions.sharpenedClaws(player)) {
             return;
         }
 
@@ -93,10 +85,7 @@ public class TamingManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.gore(player)) {
+        if (!Permissions.gore(player)) {
             return;
         }
 
@@ -104,7 +93,7 @@ public class TamingManager {
 
         int randomChance = 100;
 
-        if (player.hasPermission("mcmmo.perks.lucky.taming")) {
+        if (Permissions.luckyTaming(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
@@ -174,10 +163,7 @@ public class TamingManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.beastLore(player)) {
+        if (!Permissions.beastLore(player)) {
             return;
         }
 
@@ -196,10 +182,7 @@ public class TamingManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.callOfTheWild(player)) {
+        if (!Permissions.callOfTheWild(player)) {
             return;
         }
 
@@ -234,10 +217,7 @@ public class TamingManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.environmentallyAware(player)) {
+        if (!Permissions.environmentallyAware(player)) {
             return;
         }
 
@@ -272,10 +252,7 @@ public class TamingManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.thickFur(player)) {
+        if (!Permissions.thickFur(player)) {
             return;
         }
 
@@ -295,10 +272,7 @@ public class TamingManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.shockProof(player)) {
+        if (!Permissions.shockProof(player)) {
             return;
         }
 

+ 7 - 21
src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java

@@ -12,13 +12,11 @@ public class UnarmedManager {
     private Player player;
     private PlayerProfile profile;
     private int skillLevel;
-    private Permissions permissionsInstance;
 
     public UnarmedManager (Player player) {
         this.player = player;
         this.profile = Users.getProfile(player);
         this.skillLevel = profile.getSkillLevel(SkillType.UNARMED);
-        this.permissionsInstance =  Permissions.getInstance();
     }
 
     /**
@@ -30,10 +28,7 @@ public class UnarmedManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.disarm(player)) {
+        if (!Permissions.disarm(player)) {
             return;
         }
 
@@ -44,7 +39,7 @@ public class UnarmedManager {
 
             int randomChance = 100;
 
-            if (player.hasPermission("mcmmo.perks.lucky.unarmed")) {
+            if (Permissions.luckyUnarmed(player)) {
                 randomChance = (int) (randomChance * 0.75);
             }
 
@@ -70,10 +65,7 @@ public class UnarmedManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.deflect(player)) {
+        if (!Permissions.deflect(player)) {
             return;
         }
 
@@ -81,7 +73,7 @@ public class UnarmedManager {
 
         int randomChance = 100;
 
-        if (player.hasPermission("mcmmo.perks.lucky.unarmed")) {
+        if (Permissions.luckyUnarmed(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
@@ -103,10 +95,7 @@ public class UnarmedManager {
         if(player == null)
             return;
 
-        if(permissionsInstance == null)
-            return;
-
-        if (!permissionsInstance.unarmedBonus(player)) {
+        if (!Permissions.unarmedBonus(player)) {
             return;
         }
 
@@ -126,10 +115,7 @@ public class UnarmedManager {
         if(defender == null)
             return false;
 
-        if(permissionsInstance == null)
-            return false;
-
-        if (!permissionsInstance.ironGrip(defender)) {
+        if (!Permissions.ironGrip(defender)) {
             return false;
         }
 
@@ -137,7 +123,7 @@ public class UnarmedManager {
 
         int randomChance = 100;
 
-        if (defender.hasPermission("mcmmo.perks.lucky.unarmed")) {
+        if (Permissions.luckyUnarmed(defender)) {
             randomChance = (int) (randomChance * 0.75);
         }
 

+ 7 - 8
src/main/java/com/gmail/nossr50/util/Combat.java

@@ -40,7 +40,6 @@ import com.gmail.nossr50.skills.unarmed.UnarmedManager;
 
 public class Combat {
     private static Config configInstance = Config.getInstance();
-    private static Permissions permInstance = Permissions.getInstance();
 
     /**
      * Apply combat modifiers and process and XP gain.
@@ -86,7 +85,7 @@ public class Combat {
 
                 startGainXp(attacker, attackerProfile, target, SkillType.SWORDS);
             }
-            else if (ItemChecks.isAxe(itemInHand) && permInstance.axes(attacker)) {
+            else if (ItemChecks.isAxe(itemInHand) && Permissions.axes(attacker)) {
                 if (targetIsPlayer || targetIsTamedPet) {
                     if (!configInstance.getAxesPVP()) {
                         return;
@@ -98,25 +97,25 @@ public class Combat {
 
                 Skills.abilityCheck(attacker, SkillType.AXES);
 
-                if (permInstance.axeBonus(attacker)) {
+                if (Permissions.axeBonus(attacker)) {
                     Axes.axesBonus(attacker, event);
                 }
 
-                if (permInstance.criticalHit(attacker)) {
+                if (Permissions.criticalHit(attacker)) {
                     Axes.axeCriticalCheck(attacker, event);
                 }
 
-                if (permInstance.impact(attacker)) {
+                if (Permissions.impact(attacker)) {
                     Axes.impact(attacker, target, event);
                 }
 
-                if (attackerProfile.getAbilityMode(AbilityType.SKULL_SPLIITER) && permInstance.skullSplitter(attacker)) {
+                if (attackerProfile.getAbilityMode(AbilityType.SKULL_SPLIITER) && Permissions.skullSplitter(attacker)) {
                     applyAbilityAoE(attacker, target, event.getDamage() / 2, SkillType.AXES);
                 }
 
                 startGainXp(attacker, attackerProfile, target, SkillType.AXES);
             }
-            else if (itemInHand.getType() == Material.AIR && permInstance.unarmed(attacker)) {
+            else if (itemInHand.getType() == Material.AIR && Permissions.unarmed(attacker)) {
                 if (targetIsPlayer || targetIsTamedPet) {
                     if (!configInstance.getUnarmedPVP()) {
                         return;
@@ -132,7 +131,7 @@ public class Combat {
 
                 unarmedManager.bonusDamage(event);
 
-                if (attackerProfile.getAbilityMode(AbilityType.BERSERK) && permInstance.berserk(attacker)) {
+                if (attackerProfile.getAbilityMode(AbilityType.BERSERK) && Permissions.berserk(attacker)) {
                     event.setDamage((int) (event.getDamage() * 1.5));
                 }
 

+ 1 - 1
src/main/java/com/gmail/nossr50/util/Item.java

@@ -31,7 +31,7 @@ public class Item {
         Block block = player.getLocation().getBlock();
         int amount = inHand.getAmount();
 
-        if (Permissions.getInstance().chimaeraWing(player) && inHand.getTypeId() == Config.getInstance().getChimaeraItemId()) {
+        if (Permissions.chimaeraWing(player) && inHand.getTypeId() == Config.getInstance().getChimaeraItemId()) {
             if (Skills.cooldownOver(profile.getRecentlyHurt(), 60, player) && amount >= Config.getInstance().getChimaeraCost()) {
                 player.setItemInHand(new ItemStack(Config.getInstance().getChimaeraItemId(), amount - Config.getInstance().getChimaeraCost()));
 

+ 312 - 199
src/main/java/com/gmail/nossr50/util/Permissions.java

@@ -1,219 +1,332 @@
 package com.gmail.nossr50.util;
 
+import org.bukkit.command.CommandSender;
 import org.bukkit.entity.Player;
 
 public class Permissions {
     private static volatile Permissions instance;
 
-    public boolean permission(Player player, String perm) {
-        return player.hasPermission(perm);
+    public static boolean hasPermission(CommandSender sender, String perm)
+    {
+        if(sender.hasPermission(perm))
+            return true;
+
+        return false;
     }
 
-    public static Permissions getInstance() {
-        if (instance == null) {
-            instance = new Permissions();
-        }
+    public static boolean hasPermission(Player sender, String perm)
+    {        
+        if(sender.hasPermission(perm))
+            return true;
 
-        return instance;
+        return false;
     }
 
     /*
      * GENERIC PERMISSIONS
      */
 
-    public boolean motd(Player player) {
-        return player.hasPermission("mcmmo.motd");
+    public static boolean motd(Player player) {
+        return hasPermission(player, "mcmmo.motd");
     }
 
-    public boolean admin(Player player) {
-        return player.hasPermission("mcmmo.admin");
+    public static boolean admin(Player player) {
+        return hasPermission(player, "mcmmo.admin");
     }
 
     /*
      * MCMMO.BYPASS.*
      */
-    public boolean hardcoremodeBypass(Player player) {
-        return player.hasPermission("mcmmo.bypass.hardcoremode");
+    public static boolean hardcoremodeBypass(Player player) {
+        return hasPermission(player, "mcmmo.bypass.hardcoremode");
     }
 
-    public boolean arcaneBypass(Player player) {
-        return player.hasPermission("mcmmo.bypass.arcanebypass");
+    public static boolean arcaneBypass(Player player) {
+        return hasPermission(player, "mcmmo.bypass.arcanebypass");
     }
 
-    public boolean inspectDistanceBypass(Player player) {
-        return player.hasPermission("mcmmo.bypass.inspect.distance");
+    public static boolean inspectDistanceBypass(Player player) {
+        return hasPermission(player, "mcmmo.bypass.inspect.distance");
     }
 
-    public boolean inspectOfflineBypass(Player player) {
-        return player.hasPermission("mcmmo.bypass.inspect.offline");
+    public static boolean inspectOfflineBypass(Player player) {
+        return hasPermission(player, "mcmmo.bypass.inspect.offline");
     }
 
     /*
      * MCMMO.TOOLS.*
      */
 
-    public boolean mcrefresh(Player player) {
-        return player.hasPermission("mcmmo.tools.mcrefresh");
+    public static boolean mcrefresh(Player player) {
+        return hasPermission(player, "mcmmo.tools.mcrefresh");
+    }
+
+    public static boolean mcremove(Player player) {
+        return hasPermission(player, "mcmmo.tools.mcremove");
+    }
+
+    public static boolean mmoedit(Player player) {
+        return hasPermission(player, "mcmmo.tools.mmoedit");
+    }
+
+    public static boolean mcgod(Player player) {
+        return hasPermission(player, "mcmmo.tools.mcgod");
+    }
+
+    /*
+     * MCMMO.PERKS.LUCKY*
+     */
+
+    public static boolean luckyAcrobatics(Player player) {
+        return hasPermission(player, "mcmmo.perks.lucky.acrobatics");
+    }
+
+    public static boolean luckyArchery(Player player) {
+        return hasPermission(player, "mcmmo.perks.lucky.archery");
+    }
+
+    public static boolean luckyAxes(Player player) {
+        return hasPermission(player, "mcmmo.perks.lucky.axes");
+    }
+
+    public static boolean luckyExcavation(Player player) {
+        return hasPermission(player, "mcmmo.perks.lucky.excavation");
+    }
+
+    public static boolean luckyFishing(Player player) {
+        return hasPermission(player, "mcmmo.perks.lucky.fishing");
+    }
+
+    public static boolean luckyHerbalism(Player player) {
+        return hasPermission(player, "mcmmo.perks.lucky.herbalism");
+    }
+
+    public static boolean luckyMining(Player player) {
+        return hasPermission(player, "mcmmo.perks.lucky.mining");
+    }
+
+    public static boolean luckyRepair(Player player) {
+        return hasPermission(player, "mcmmo.perks.lucky.repair");
+    }
+
+    public static boolean luckySwords(Player player) {
+        return hasPermission(player, "mcmmo.perks.lucky.swords");
+    }
+
+    public static boolean luckyTaming(Player player) {
+        return hasPermission(player, "mcmmo.perks.lucky.taming");
     }
 
-    public boolean mcremove(Player player) {
-        return player.hasPermission("mcmmo.tools.mcremove");
+    public static boolean luckyUnarmed(Player player) {
+        return hasPermission(player, "mcmmo.perks.lucky.unarmed");
+    }
+
+    public static boolean luckyWoodcutting(Player player) {
+        return hasPermission(player, "mcmmo.perks.lucky.woodcutting");
+    }
+
+    /*
+     * MCMMO.PERKS.XP*
+     */
+
+    public static boolean xpQuadruple(Player player) {
+        return hasPermission(player, "mcmmo.perks.xp.quadruple");
+    }
+
+    public static boolean xpTriple(Player player) {
+        return hasPermission(player, "mcmmo.perks.xp.triple");
+    }
+
+    public static boolean xpDoubleAndOneHalf(Player player) {
+        return hasPermission(player, "mcmmo.perks.xp.150percentboost");
+    }
+
+    public static boolean xpDouble(Player player) {
+        return hasPermission(player, "mcmmo.perks.xp.double");
+    }
+
+    public static boolean xpOneAndOneHalf(Player player) {
+        return hasPermission(player, "mcmmo.perks.xp.50percentboost");
+    }
+
+    /*
+     * MCMMO.PERKS.COOLDOWNS*
+     */
+
+    public static boolean cooldownsHalved(Player player) {
+        return hasPermission(player, "mcmmo.perks.cooldowns.halved");
+    }
+
+    public static boolean cooldownsThirded(Player player) {
+        return hasPermission(player, "mcmmo.perks.cooldowns.thirded");
+    }
+
+    public static boolean cooldownsQuartered(Player player) {
+        return hasPermission(player, "mcmmo.perks.cooldowns.quartered");
+    }
+
+    /*
+     * MCMMO.PERKS.ACTIVATIONTIME*
+     */
+
+    public static boolean activationTwelve(Player player) {
+        return hasPermission(player, "mcmmo.perks.activationtime.twelveseconds");
     }
 
-    public boolean mmoedit(Player player) {
-        return player.hasPermission("mcmmo.tools.mmoedit");
+    public static boolean activationEight(Player player) {
+        return hasPermission(player, "mcmmo.perks.activationtime.eightseconds");
     }
 
-    public boolean mcgod(Player player) {
-        return player.hasPermission("mcmmo.tools.mcgod");
+    public static boolean activationFour(Player player) {
+        return hasPermission(player, "mcmmo.perks.activationtime.fourseconds");
     }
 
     /*
      * MCMMO.ABILITY.TAMING.*
      */
 
-    public boolean fastFoodService(Player player) {
-        return player.hasPermission("mcmmo.ability.taming.fastfoodservice");
+    public static boolean fastFoodService(Player player) {
+        return hasPermission(player, "mcmmo.ability.taming.fastfoodservice");
     }
 
-    public boolean sharpenedClaws(Player player) {
-        return player.hasPermission("mcmmo.ability.taming.sharpenedclaws");
+    public static boolean sharpenedClaws(Player player) {
+        return hasPermission(player, "mcmmo.ability.taming.sharpenedclaws");
     }
 
-    public boolean gore(Player player) {
-        return player.hasPermission("mcmmo.ability.taming.gore");
+    public static boolean gore(Player player) {
+        return hasPermission(player, "mcmmo.ability.taming.gore");
     }
 
-    public boolean callOfTheWild(Player player) {
-        return player.hasPermission("mcmmo.ability.taming.callofthewild");
+    public static boolean callOfTheWild(Player player) {
+        return hasPermission(player, "mcmmo.ability.taming.callofthewild");
     }
 
-    public boolean environmentallyAware(Player player) {
-        return player.hasPermission("mcmmo.ability.taming.environmentallyaware");
+    public static boolean environmentallyAware(Player player) {
+        return hasPermission(player, "mcmmo.ability.taming.environmentallyaware");
     }
 
-    public boolean thickFur(Player player) {
-        return player.hasPermission("mcmmo.ability.taming.thickfur");
+    public static boolean thickFur(Player player) {
+        return hasPermission(player, "mcmmo.ability.taming.thickfur");
     }
 
-    public boolean shockProof(Player player) {
-        return player.hasPermission("mcmmo.ability.taming.shockproof");
+    public static boolean shockProof(Player player) {
+        return hasPermission(player, "mcmmo.ability.taming.shockproof");
     }
 
-    public boolean beastLore(Player player) {
-        return player.hasPermission("mcmmo.ability.taming.beastlore");
+    public static boolean beastLore(Player player) {
+        return hasPermission(player, "mcmmo.ability.taming.beastlore");
     }
 
     /*
      * MCMMO.ABILITY.FISHING.*
      */
 
-    public boolean shakeMob(Player player) {
-        return player.hasPermission("mcmmo.ability.fishing.shakemob");
+    public static boolean shakeMob(Player player) {
+        return hasPermission(player, "mcmmo.ability.fishing.shakemob");
     }
 
-    public boolean fishingTreasures(Player player) {
-        return player.hasPermission("mcmmo.ability.fishing.treasures");
+    public static boolean fishingTreasures(Player player) {
+        return hasPermission(player, "mcmmo.ability.fishing.treasures");
     }
 
-    public boolean fishingMagic(Player player) {
-        return player.hasPermission("mcmmo.ability.fishing.magic");
+    public static boolean fishingMagic(Player player) {
+        return hasPermission(player, "mcmmo.ability.fishing.magic");
     }
 
-    public boolean fishermansDiet(Player player) {
-        return player.hasPermission("mcmmo.ability.fishing.fishermansdiet");
+    public static boolean fishermansDiet(Player player) {
+        return hasPermission(player, "mcmmo.ability.fishing.fishermansdiet");
     }
 
     /*
      * MCMMO.ABILITY.MINING.*
      */
 
-    public boolean superBreaker(Player player) {
-        return player.hasPermission("mcmmo.ability.mining.superbreaker");
+    public static boolean superBreaker(Player player) {
+        return hasPermission(player, "mcmmo.ability.mining.superbreaker");
     }
 
-    public boolean miningDoubleDrops(Player player) {
-        return player.hasPermission("mcmmo.ability.mining.doubledrops");
+    public static boolean miningDoubleDrops(Player player) {
+        return hasPermission(player, "mcmmo.ability.mining.doubledrops");
     }
 
     /*
      * MCMMO.ABILITY.WOODCUTTING.*
      */
 
-    public boolean treeFeller(Player player) {
-        return player.hasPermission("mcmmo.ability.woodcutting.treefeller");
+    public static boolean treeFeller(Player player) {
+        return hasPermission(player, "mcmmo.ability.woodcutting.treefeller");
     }
 
-    public boolean leafBlower(Player player) {
-        return player.hasPermission("mcmmo.ability.woodcutting.leafblower");
+    public static boolean leafBlower(Player player) {
+        return hasPermission(player, "mcmmo.ability.woodcutting.leafblower");
     }
 
-    public boolean woodcuttingDoubleDrops(Player player) {
-        return player.hasPermission("mcmmo.ability.woodcutting.doubledrops");
+    public static boolean woodcuttingDoubleDrops(Player player) {
+        return hasPermission(player, "mcmmo.ability.woodcutting.doubledrops");
     }
 
     /*
      * MCMMO.ABILITY.REPAIR.*
      */
 
-    public boolean repairBonus(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.repairbonus");
+    public static boolean repairBonus(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.repairbonus");
     }
 
-    public boolean repairMastery(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.repairmastery");
+    public static boolean repairMastery(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.repairmastery");
     }
 
-    public boolean arcaneForging(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.arcaneforging");
+    public static boolean arcaneForging(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.arcaneforging");
     }
 
-    public boolean woodRepair(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.woodrepair");
+    public static boolean woodRepair(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.woodrepair");
     }
 
-    public boolean stoneRepair(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.stonerepair");
+    public static boolean stoneRepair(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.stonerepair");
     }
 
-    public boolean leatherRepair(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.leatherrepair");
+    public static boolean leatherRepair(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.leatherrepair");
     }
 
-    public boolean ironRepair(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.ironrepair");
+    public static boolean ironRepair(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.ironrepair");
     }
 
-    public boolean goldRepair(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.goldrepair");
+    public static boolean goldRepair(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.goldrepair");
     }
 
-    public boolean diamondRepair(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.diamondrepair");
+    public static boolean diamondRepair(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.diamondrepair");
     }
 
-    public boolean armorRepair(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.armorrepair");
+    public static boolean armorRepair(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.armorrepair");
     }
 
-    public boolean toolRepair(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.toolrepair");
+    public static boolean toolRepair(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.toolrepair");
     }
 
-    public boolean otherMaterialRepair(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.othermaterialrepair");
+    public static boolean otherMaterialRepair(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.othermaterialrepair");
     }
 
-    public boolean otherRepair(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.otherrepair");
+    public static boolean otherRepair(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.otherrepair");
     }
 
-    public boolean stringRepair(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.stringrepair");
+    public static boolean stringRepair(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.stringrepair");
     }
 
-    public boolean salvage(Player player) {
-        return player.hasPermission("mcmmo.ability.repair.salvage");
+    public static boolean salvage(Player player) {
+        return hasPermission(player, "mcmmo.ability.repair.salvage");
     }
 
 
@@ -221,196 +334,196 @@ public class Permissions {
      * MCMMO.ABILITY.UNARMED.*
      */
 
-    public boolean unarmedBonus(Player player) {
-        return player.hasPermission("mcmmo.ability.unarmed.bonusdamage");
+    public static boolean unarmedBonus(Player player) {
+        return hasPermission(player, "mcmmo.ability.unarmed.bonusdamage");
     }
 
-    public boolean disarm(Player player) {
-        return player.hasPermission("mcmmo.ability.unarmed.disarm");
+    public static boolean disarm(Player player) {
+        return hasPermission(player, "mcmmo.ability.unarmed.disarm");
     }
 
-    public boolean berserk(Player player) {
-        return player.hasPermission("mcmmo.ability.unarmed.berserk");
+    public static boolean berserk(Player player) {
+        return hasPermission(player, "mcmmo.ability.unarmed.berserk");
     }
 
-    public boolean deflect(Player player) {
-        return player.hasPermission("mcmmo.ability.unarmed.deflect");
+    public static boolean deflect(Player player) {
+        return hasPermission(player, "mcmmo.ability.unarmed.deflect");
     }
 
-    public boolean ironGrip(Player player) {
-        return player.hasPermission("mcmmo.ability.unarmed.irongrip");
+    public static boolean ironGrip(Player player) {
+        return hasPermission(player, "mcmmo.ability.unarmed.irongrip");
     }
 
     /*
      * MCMMO.ABILITY.ARCHERY.*
      */
 
-    public boolean trackArrows(Player player) {
-        return player.hasPermission("mcmmo.ability.archery.trackarrows");
+    public static boolean trackArrows(Player player) {
+        return hasPermission(player, "mcmmo.ability.archery.trackarrows");
     }
 
-    public boolean daze(Player player) {
-        return player.hasPermission("mcmmo.ability.archery.daze");
+    public static boolean daze(Player player) {
+        return hasPermission(player, "mcmmo.ability.archery.daze");
     }
 
-    public boolean archeryBonus(Player player) {
-        return player.hasPermission("mcmmo.ability.archery.bonusdamage");
+    public static boolean archeryBonus(Player player) {
+        return hasPermission(player, "mcmmo.ability.archery.bonusdamage");
     }
 
     /*
      * MCMMO.ABILITY.HERBALISM.*
      */
 
-    public boolean herbalismDoubleDrops(Player player) {
-        return player.hasPermission("mcmmo.ability.herbalism.doubledrops");
+    public static boolean herbalismDoubleDrops(Player player) {
+        return hasPermission(player, "mcmmo.ability.herbalism.doubledrops");
     }
 
-    public boolean greenTerra(Player player) {
-        return player.hasPermission("mcmmo.ability.herbalism.greenterra");
+    public static boolean greenTerra(Player player) {
+        return hasPermission(player, "mcmmo.ability.herbalism.greenterra");
     }
 
-    public boolean greenThumbBlocks(Player player) {
-        return player.hasPermission("mcmmo.ability.herbalism.greenthumbblocks");
+    public static boolean greenThumbBlocks(Player player) {
+        return hasPermission(player, "mcmmo.ability.herbalism.greenthumbblocks");
     }
 
-    public boolean greenThumbCarrots(Player player) {
-        return player.hasPermission("mcmmo.ability.herbalism.greenthumbcarrots");
+    public static boolean greenThumbCarrots(Player player) {
+        return hasPermission(player, "mcmmo.ability.herbalism.greenthumbcarrots");
     }
 
-    public boolean greenThumbCocoa(Player player) {
-        return player.hasPermission("mcmmo.ability.herbalism.greenthumbcocoa");
+    public static boolean greenThumbCocoa(Player player) {
+        return hasPermission(player, "mcmmo.ability.herbalism.greenthumbcocoa");
     }
 
-    public boolean greenThumbNetherwart(Player player) {
-        return player.hasPermission("mcmmo.ability.herbalism.greenthumbnetherwart");
+    public static boolean greenThumbNetherwart(Player player) {
+        return hasPermission(player, "mcmmo.ability.herbalism.greenthumbnetherwart");
     }
 
-    public boolean greenThumbPotatoes(Player player) {
-        return player.hasPermission("mcmmo.ability.herbalism.greenthumbpotatoes");
+    public static boolean greenThumbPotatoes(Player player) {
+        return hasPermission(player, "mcmmo.ability.herbalism.greenthumbpotatoes");
     }
 
-    public boolean greenThumbWheat(Player player) {
-        return player.hasPermission("mcmmo.ability.herbalism.greenthumbwheat");
+    public static boolean greenThumbWheat(Player player) {
+        return hasPermission(player, "mcmmo.ability.herbalism.greenthumbwheat");
     }
 
-    public boolean farmersDiet(Player player) {
-        return player.hasPermission("mcmmo.ability.herbalism.farmersdiet");
+    public static boolean farmersDiet(Player player) {
+        return hasPermission(player, "mcmmo.ability.herbalism.farmersdiet");
     }
 
     /*
      * MCMMO.ABILITY.EXCAVATION.*
      */
 
-    public boolean gigaDrillBreaker(Player player) {
-        return player.hasPermission("mcmmo.ability.excavation.gigadrillbreaker");
+    public static boolean gigaDrillBreaker(Player player) {
+        return hasPermission(player, "mcmmo.ability.excavation.gigadrillbreaker");
     }
 
-    public boolean excavationTreasures(Player player) {
-        return player.hasPermission("mcmmo.ability.excavation.treasures");
+    public static boolean excavationTreasures(Player player) {
+        return hasPermission(player, "mcmmo.ability.excavation.treasures");
     }
 
     /*
      * MCMMO.ABILITY.SWORDS.*
      */
 
-    public boolean swordsBleed(Player player) {
-        return player.hasPermission("mcmmo.ability.swords.bleed");
+    public static boolean swordsBleed(Player player) {
+        return hasPermission(player, "mcmmo.ability.swords.bleed");
     }
 
-    public boolean serratedStrikes(Player player) {
-        return player.hasPermission("mcmmo.ability.swords.serratedstrikes");
+    public static boolean serratedStrikes(Player player) {
+        return hasPermission(player, "mcmmo.ability.swords.serratedstrikes");
     }
 
-    public boolean counterAttack(Player player) {
-        return player.hasPermission("mcmmo.ability.swords.counterattack");
+    public static boolean counterAttack(Player player) {
+        return hasPermission(player, "mcmmo.ability.swords.counterattack");
     }
 
     /*
      * MCMMO.ABILITY.AXES.*
      */
 
-    public boolean skullSplitter(Player player) {
-        return player.hasPermission("mcmmo.ability.axes.skullsplitter");
+    public static boolean skullSplitter(Player player) {
+        return hasPermission(player, "mcmmo.ability.axes.skullsplitter");
     }
 
-    public boolean axeBonus(Player player) {
-        return player.hasPermission("mcmmo.ability.axes.bonusdamage");
+    public static boolean axeBonus(Player player) {
+        return hasPermission(player, "mcmmo.ability.axes.bonusdamage");
     }
 
-    public boolean criticalHit(Player player) {
-        return player.hasPermission("mcmmo.ability.axes.criticalhit");
+    public static boolean criticalHit(Player player) {
+        return hasPermission(player, "mcmmo.ability.axes.criticalhit");
     }
 
-    public boolean impact(Player player) {
-        return player.hasPermission("mcmmo.ability.axes.impact");
+    public static boolean impact(Player player) {
+        return hasPermission(player, "mcmmo.ability.axes.impact");
     }
 
-    public boolean greaterImpact(Player player) {
-        return player.hasPermission("mcmmo.ability.axes.greaterimpact");
+    public static boolean greaterImpact(Player player) {
+        return hasPermission(player, "mcmmo.ability.axes.greaterimpact");
     }
 
     /*
      * MCMMO.ABILITY.ACROBATICS.*
      */
 
-    public boolean roll(Player player) {
-        return player.hasPermission("mcmmo.ability.acrobatics.roll");
+    public static boolean roll(Player player) {
+        return hasPermission(player, "mcmmo.ability.acrobatics.roll");
     }
 
-    public boolean gracefulRoll(Player player) {
-        return player.hasPermission("mcmmo.ability.acrobatics.gracefulroll");
+    public static boolean gracefulRoll(Player player) {
+        return hasPermission(player, "mcmmo.ability.acrobatics.gracefulroll");
     }
 
-    public boolean dodge(Player player) {
-        return player.hasPermission("mcmmo.ability.acrobatics.dodge");
+    public static boolean dodge(Player player) {
+        return hasPermission(player, "mcmmo.ability.acrobatics.dodge");
     }
 
     /*
      * MCMMO.ABILITY.BLASTMINING.*
      */
 
-    public boolean biggerBombs(Player player) {
-        return player.hasPermission("mcmmo.ability.blastmining.biggerbombs");
+    public static boolean biggerBombs(Player player) {
+        return hasPermission(player, "mcmmo.ability.blastmining.biggerbombs");
     }
 
-    public boolean demolitionsExpertise(Player player) {
-        return player.hasPermission("mcmmo.ability.blastmining.demolitionsexpertise");
+    public static boolean demolitionsExpertise(Player player) {
+        return hasPermission(player, "mcmmo.ability.blastmining.demolitionsexpertise");
     }
 
-    public boolean blastMining(Player player) {
-        return player.hasPermission("mcmmo.ability.blastmining.detonate");
+    public static boolean blastMining(Player player) {
+        return hasPermission(player, "mcmmo.ability.blastmining.detonate");
     }
 
     /*
      * MCMMO.ITEM.*
      */
 
-    public boolean chimaeraWing(Player player) {
-        return player.hasPermission("mcmmo.item.chimaerawing");
+    public static boolean chimaeraWing(Player player) {
+        return hasPermission(player, "mcmmo.item.chimaerawing");
     }
 
     /*
      * MCMMO.COMMANDS.*
      */
 
-    public boolean mcAbility(Player player) {
-        return player.hasPermission("mcmmo.commands.ability");
+    public static boolean mcAbility(Player player) {
+        return hasPermission(player, "mcmmo.commands.ability");
     }
 
-    public boolean partyTeleport(Player player) {
-        return player.hasPermission("mcmmo.commands.ptp");
+    public static boolean partyTeleport(Player player) {
+        return hasPermission(player, "mcmmo.commands.ptp");
     }
 
-    public boolean inspect(Player player) {
-        return player.hasPermission("mcmmo.commands.inspect");
+    public static boolean inspect(Player player) {
+        return hasPermission(player, "mcmmo.commands.inspect");
     }
 
-    public boolean party(Player player) {
-        return player.hasPermission("mcmmo.commands.party");
+    public static boolean party(Player player) {
+        return hasPermission(player, "mcmmo.commands.party");
     }
 
-    public boolean skillReset(Player player) {
-        return player.hasPermission("mcmmo.skillreset");
+    public static boolean skillReset(Player player) {
+        return hasPermission(player, "mcmmo.skillreset");
     }
 
 
@@ -418,67 +531,67 @@ public class Permissions {
      * MCMMO.CHAT.*
      */
 
-    public boolean partyChat(Player player) {
-        return player.hasPermission("mcmmo.chat.partychat");
+    public static boolean partyChat(Player player) {
+        return hasPermission(player, "mcmmo.chat.partychat");
     }
 
-    public boolean partyLock(Player player) {
-        return player.hasPermission("mcmmo.chat.partylock");
+    public static boolean partyLock(Player player) {
+        return hasPermission(player, "mcmmo.chat.partylock");
     }
 
-    public boolean adminChat(Player player) {
-        return player.hasPermission("mcmmo.chat.adminchat");
+    public static boolean adminChat(Player player) {
+        return hasPermission(player, "mcmmo.chat.adminchat");
     }
 
     /*
      * MCMMO.SKILLS.*
      */
 
-    public boolean taming(Player player) {
-        return player.hasPermission("mcmmo.skills.taming");
+    public static boolean taming(Player player) {
+        return hasPermission(player, "mcmmo.skills.taming");
     }
 
-    public boolean mining(Player player) {
-        return player.hasPermission("mcmmo.skills.mining");
+    public static boolean mining(Player player) {
+        return hasPermission(player, "mcmmo.skills.mining");
     }
 
-    public boolean fishing(Player player) {
-        return player.hasPermission("mcmmo.skills.fishing");
+    public static boolean fishing(Player player) {
+        return hasPermission(player, "mcmmo.skills.fishing");
     }
 
-    public boolean woodcutting(Player player) {
-        return player.hasPermission("mcmmo.skills.woodcutting");
+    public static boolean woodcutting(Player player) {
+        return hasPermission(player, "mcmmo.skills.woodcutting");
     }
 
-    public boolean repair(Player player) {
-        return player.hasPermission("mcmmo.skills.repair");
+    public static boolean repair(Player player) {
+        return hasPermission(player, "mcmmo.skills.repair");
     }
 
-    public boolean unarmed(Player player) {
-        return player.hasPermission("mcmmo.skills.unarmed");
+    public static boolean unarmed(Player player) {
+        return hasPermission(player, "mcmmo.skills.unarmed");
     }
 
-    public boolean archery(Player player) {
-        return player.hasPermission("mcmmo.skills.archery");
+    public static boolean archery(Player player) {
+        return hasPermission(player, "mcmmo.skills.archery");
     }
 
-    public boolean herbalism(Player player) {
-        return player.hasPermission("mcmmo.skills.herbalism");
+    public static boolean herbalism(Player player) {
+        return hasPermission(player, "mcmmo.skills.herbalism");
     }
 
-    public boolean excavation(Player player) {
-        return player.hasPermission("mcmmo.skills.excavation");
+    public static boolean excavation(Player player) {
+        return hasPermission(player, "mcmmo.skills.excavation");
     }
 
-    public boolean swords(Player player) {
-        return player.hasPermission("mcmmo.skills.swords");
+    public static boolean swords(Player player) {
+        return hasPermission(player, "mcmmo.skills.swords");
     }
 
-    public boolean axes(Player player) {
-        return player.hasPermission("mcmmo.skills.axes");
+    public static boolean axes(Player player) {
+        return hasPermission(player, "mcmmo.skills.axes");
     }
 
-    public boolean acrobatics(Player player) {
-        return player.hasPermission("mcmmo.skills.acrobatics");
+    public static boolean acrobatics(Player player) {
+        return hasPermission(player, "mcmmo.skills.acrobatics");
     }
 }

+ 20 - 20
src/main/java/com/gmail/nossr50/util/Skills.java

@@ -46,13 +46,13 @@ public class Skills {
         int adjustedCooldown = cooldown;
 
         //Reduced Cooldown Donor Perks
-        if (player.hasPermission("mcmmo.perks.cooldowns.halved")) {
+        if (Permissions.cooldownsHalved(player)) {
             adjustedCooldown = (int) (adjustedCooldown * 0.5);
         }
-        else if (player.hasPermission("mcmmo.perks.cooldowns.thirded")) {
+        else if (Permissions.cooldownsThirded(player)) {
             adjustedCooldown = (int) (adjustedCooldown * 0.66);
         }
-        else if (player.hasPermission("mcmmo.perks.cooldowns.quartered")) {
+        else if (Permissions.cooldownsQuartered(player)) {
             adjustedCooldown = (int) (adjustedCooldown * 0.75);
         }
 
@@ -75,13 +75,13 @@ public class Skills {
         int adjustedCooldown = cooldown;
 
         //Reduced Cooldown Donor Perks
-        if (player.hasPermission("mcmmo.perks.cooldowns.halved")) {
+        if (Permissions.cooldownsHalved(player)) {
             adjustedCooldown = (int) (adjustedCooldown * 0.5);
         }
-        else if (player.hasPermission("mcmmo.perks.cooldowns.thirded")) {
+        else if (Permissions.cooldownsThirded(player)) {
             adjustedCooldown = (int) (adjustedCooldown * 0.66);
         }
-        else if (player.hasPermission("mcmmo.perks.cooldowns.quartered")) {
+        else if (Permissions.cooldownsQuartered(player)) {
             adjustedCooldown = (int) (adjustedCooldown * 0.75);
         }
 
@@ -343,11 +343,11 @@ public class Skills {
      * @return true if the player has combat skills, false otherwise
      */
     public static boolean hasCombatSkills(Player player) {
-        if (Permissions.getInstance().axes(player)
-                || Permissions.getInstance().archery(player)
-                || Permissions.getInstance().swords(player)
-                || Permissions.getInstance().taming(player)
-                || Permissions.getInstance().unarmed(player)) {
+        if (Permissions.axes(player)
+                || Permissions.archery(player)
+                || Permissions.swords(player)
+                || Permissions.taming(player)
+                || Permissions.unarmed(player)) {
             return true;
         }
         else {
@@ -362,11 +362,11 @@ public class Skills {
      * @return true if the player has gathering skills, false otherwise
      */
     public static boolean hasGatheringSkills(Player player) {
-        if (Permissions.getInstance().excavation(player)
-                || Permissions.getInstance().fishing(player)
-                || Permissions.getInstance().herbalism(player)
-                || Permissions.getInstance().mining(player)
-                || Permissions.getInstance().woodcutting(player)) {
+        if (Permissions.excavation(player)
+                || Permissions.fishing(player)
+                || Permissions.herbalism(player)
+                || Permissions.mining(player)
+                || Permissions.woodcutting(player)) {
             return true;
         }
         else {
@@ -381,7 +381,7 @@ public class Skills {
      * @return true if the player has misc skills, false otherwise
      */
     public static boolean hasMiscSkills(Player player) {
-        if (Permissions.getInstance().acrobatics(player) || Permissions.getInstance().repair(player)) {
+        if (Permissions.acrobatics(player) || Permissions.repair(player)) {
             return true;
         }
         else {
@@ -440,13 +440,13 @@ public class Skills {
 
         int ticks = 2 + (profile.getSkillLevel(type) / abilityLengthIncreaseLevel);
 
-        if (player.hasPermission("mcmmo.perks.activationtime.twelveseconds")) {
+        if (Permissions.activationTwelve(player)) {
             ticks = ticks + 12;
         }
-        else if (player.hasPermission("mcmmo.perks.activationtime.eightseconds")) {
+        else if (Permissions.activationEight(player)) {
             ticks = ticks + 8;
         }
-        else if (player.hasPermission("mcmmo.perks.activationtime.fourseconds")) {
+        else if (Permissions.activationFour(player)) {
             ticks = ticks + 4;
         }
 

+ 157 - 29
src/main/resources/plugin.yml

@@ -1,10 +1,19 @@
 name: mcMMO
 version: ${project.version}-b${BUILD_NUMBER}
-description: mcMMO takes core Minecraft game mechanics and expands them to add an extensive RPG experience, the goal of the project has always been a quality RPG experience. Everything in mcMMO is carefully thought out and is constantly improving. mcMMO adds eleven skills to train in and level in, while also offering a high level of customization for server admins. There are countless features, including custom sounds, graphical elements, and more added when running mcMMO in conjunction with Spout. I carefully read feedback and evaluate the mechanics of mcMMO in every update to provide an ever-evolving experience.
+description: >
+  mcMMO takes core Minecraft game mechanics and expands them to add an extensive
+  RPG experience, the goal of the project has always been a quality RPG
+  experience. Everything in mcMMO is carefully thought out and is constantly
+  improving. mcMMO adds eleven skills to train in and level in, while also
+  offering a high level of customization for server admins. There are countless
+  features, including custom sounds, graphical elements, and more added when
+  running mcMMO in conjunction with Spout. I carefully read feedback and
+  evaluate the mechanics of mcMMO in every update to provide an ever-evolving
+  experience.
 
 author: nossr50
-authors: [NuclearW, gmcferrin, bm01]
-website: http://forums.bukkit.org/threads/rpg-mech-mcmmo-v1-3-05-rpg-addiction-redefined-multi-lingual-1-2-5-r1-0.68601/
+authors: [NuclearW, gmcferrin, bm01, Glitchfinder, TfT_02]
+website: http://dev.bukkit.org/server-mods/mcmmo/
     
 main: com.gmail.nossr50.mcMMO
 softdepend: [Spout]
@@ -117,31 +126,54 @@ commands:
         description: Toggle Admin chat or send admin chat messages
 permissions:
     mcmmo.*:
+        description: Implies all mcmmo permissions.
+        children:
+            mcmmo.all: true
+    mcmmo.all:
         description: Implies all mcmmo permissions.
         children:
             mcmmo.defaults: true
-            mcmmo.tools.*: true
-            mcmmo.chat.adminchat: true
+            mcmmo.defaultsop: true
+            mcmmo.perks.all: true
+            mcmmo.bypass.all: true
     mcmmo.defaults:
         default: true
         description: mcmmo permisions that default to true
         children:
-            mcmmo.ability.*: true 
-            mcmmo.item.*: true   
+            mcmmo.ability.all: true 
+            mcmmo.item.all: true   
             mcmmo.motd: true 
-            mcmmo.commands.*: true 
+            mcmmo.commands.all: true 
             mcmmo.chat.partychat: true 
-            mcmmo.skills.*: true
+            mcmmo.skills.all: true
     mcmmo.defaultsop:
         default: op
         description: mcmmo permissions that default to op
         children:
             mcmmo.chat.adminchat: true
             mcmmo.admin: true
-            mcmmo.tools.*: true
+            mcmmo.tools.all: true
     mcmmo.admin:
-        description: Allows access to mmoupdate and other sensitive commands    
-    mcmmo.perks.activationtime:
+        description: Allows access to mmoupdate and other sensitive commands
+    mcmmo.perks.*:
+        default: false
+        description: implies access to all mcmmo perks
+        children:
+            mcmmo.perks.all: true 
+    mcmmo.perks.all:
+        default: false
+        description: implies access to all mcmmo perks
+        children:
+            mcmmo.perks.activationtime.all: true
+            mcmmo.perks.cooldowns.all: true
+            mcmmo.perks.xp.all: true
+            mcmmo.perks.lucky.all: true
+    mcmmo.perks.activationtime.*:
+        default: false
+        description: Increased activation time perks typically given to donors or VIPs
+        children:
+            mcmmo.perks.activationtime.all: true
+    mcmmo.perks.activationtime.all:
         default: false
         description: Increased activation time perks typically given to donors or VIPs
         children:
@@ -157,7 +189,12 @@ permissions:
     mcmmo.perks.activationtime.fourseconds:
         default: false
         description: Increases activation time by 4 seconds
-    mcmmo.perks.cooldowns:
+    mcmmo.perks.cooldowns.*:
+        default: false
+        description: Reduced cooldown perks typically given to donors or VIPs
+        children:
+            mcmmo.perks.cooldowns.all: true
+    mcmmo.perks.cooldowns.all:
         default: false
         description: Reduced cooldown perks typically given to donors or VIPs
         children:
@@ -173,7 +210,12 @@ permissions:
     mcmmo.perks.cooldowns.halved:
         default: false
         description: Cuts cooldowns down by 1/2
-    mcmmo.perks.xp:
+    mcmmo.perks.xp.*:
+        default: false
+        description: XP Perks typically given to donors or VIPs
+        children:
+            mcmmo.perks.xp.all: true
+    mcmmo.perks.xp.all:
         default: false
         description: XP Perks typically given to donors or VIPs
         children:
@@ -198,6 +240,11 @@ permissions:
         default: false
         description: Mulitplies incoming XP by 1.5
     mcmmo.perks.lucky.*:
+        default: false
+        description: Gives all abilities & skills a 33.3% better chance to activate.
+        children:
+            mcmmo.perks.lucky.all: true
+    mcmmo.perks.lucky.all:
         default: false
         description: Gives all abilities & skills a 33.3% better chance to activate.
         children:
@@ -250,6 +297,11 @@ permissions:
         default: false
         description: Gives Woodcutting abilities & skills a 33.3% better chance to activate.
     mcmmo.bypass.*:
+        default: false
+        description: Implies all bypass permissions.
+        children:
+            mcmmo.bypass.all: true
+    mcmmo.bypass.all:
         default: false
         description: Implies all bypass permissions.
         children:
@@ -270,6 +322,10 @@ permissions:
         default: op
         description: Allows user to bypass Inspect's offline player requirements
     mcmmo.tools.*:
+        description: Implies all mcmmo.tools permissions.
+        children:
+            mcmmo.tools.all: true 
+    mcmmo.tools.all:
         description: Implies all mcmmo.tools permissions.
         children:
             mcmmo.tools.mcrefresh: true 
@@ -287,20 +343,28 @@ permissions:
     mcmmo.ability.*:
         description: Implies all mcmmo.ability permissions.
         children:
-            mcmmo.ability.taming.*: true
-            mcmmo.ability.fishing.*: true
-            mcmmo.ability.mining.*: true
-            mcmmo.ability.woodcutting.*: true
-            mcmmo.ability.repair.*: true
-            mcmmo.ability.unarmed.*: true
-            mcmmo.ability.archery.*: true
-            mcmmo.ability.herbalism.*: true
-            mcmmo.ability.excavation.*: true
-            mcmmo.ability.swords.*: true
-            mcmmo.ability.axes.*: true
-            mcmmo.ability.acrobatics.*: true
-            mcmmo.ability.blastmining.*: true
+            mcmmo.ability.all: true
+    mcmmo.ability.all:
+        description: Implies all mcmmo.ability permissions.
+        children:
+            mcmmo.ability.taming.all: true
+            mcmmo.ability.fishing.all: true
+            mcmmo.ability.mining.all: true
+            mcmmo.ability.woodcutting.all: true
+            mcmmo.ability.repair.all: true
+            mcmmo.ability.unarmed.all: true
+            mcmmo.ability.archery.all: true
+            mcmmo.ability.herbalism.all: true
+            mcmmo.ability.excavation.all: true
+            mcmmo.ability.swords.all: true
+            mcmmo.ability.axes.all: true
+            mcmmo.ability.acrobatics.all: true
+            mcmmo.ability.blastmining.all: true
     mcmmo.ability.taming.*:
+        description: Allows access to all Taming abilities
+        children:
+            mcmmo.ability.taming.all: true
+    mcmmo.ability.taming.all:
         description: Allows access to all Taming abilities
         children:
             mcmmo.ability.taming.fastfoodservice: true
@@ -328,6 +392,10 @@ permissions:
     mcmmo.ability.taming.beastlore:
         description: Allows access to the Beast Lore ability
     mcmmo.ability.fishing.*:
+        description: Allows access to all Fishing abilities
+        children:
+            mcmmo.ability.fishing.all: true
+    mcmmo.ability.fishing.all:
         description: Allows access to all Fishing abilities
         children:
             mcmmo.ability.fishing.shakemob: true
@@ -343,6 +411,10 @@ permissions:
     mcmmo.ability.fishing.fishermansdiet:
         description: Allows access to the Fishermans's Diet ability
     mcmmo.ability.mining.*:
+        description: Allows access to all Mining abilities
+        children:
+            mcmmo.ability.mining.all: true
+    mcmmo.ability.mining.all:
         description: Allows access to all Mining abilities
         children:
             mcmmo.ability.mining.superbreaker: true
@@ -352,6 +424,10 @@ permissions:
     mcmmo.ability.mining.doubledrops:
         description: Allows double drop chance when mining
     mcmmo.ability.woodcutting.*:
+        description: Allows access to all Woodcutting abilities
+        children:
+            mcmmo.ability.woodcutting.all: true
+    mcmmo.ability.woodcutting.all:
         description: Allows access to all Woodcutting abilities
         children:
             mcmmo.ability.woodcutting.treefeller: true
@@ -364,6 +440,10 @@ permissions:
     mcmmo.ability.woodcutting.doubledrops:
         description: Allows double drop chance when woodcutting
     mcmmo.ability.repair.*:
+        description: Allows access to all Repair abilities
+        children:
+            mcmmo.ability.repair.all: true
+    mcmmo.ability.repair.all:
         description: Allows access to all Repair abilities
         children:
             mcmmo.ability.repair.repairbonus: true
@@ -412,6 +492,10 @@ permissions:
     mcmmo.ability.repair.otherrepair:
         description: Allows ability to repair items of type OTHER
     mcmmo.ability.unarmed.*:
+        description: Allows access to all Unarmed abilities
+        children:
+            mcmmo.ability.unarmed.all: true
+    mcmmo.ability.unarmed.all:
         description: Allows access to all Unarmed abilities
         children:
             mcmmo.ability.unarmed.bonusdamage: true
@@ -430,6 +514,10 @@ permissions:
     mcmmo.ability.unarmed.irongrip:
         description: Allows access to the Iron Grip ability
     mcmmo.ability.archery.*:
+        description: Allows access to all Archery abilities
+        children:
+            mcmmo.ability.archery.all: true
+    mcmmo.ability.archery.all:
         description: Allows access to all Archery abilities
         children:
             mcmmo.ability.archery.trackarrows: true
@@ -442,6 +530,10 @@ permissions:
     mcmmo.ability.archery.bonusdamage:
         description: Allows bonus damage from Archery
     mcmmo.ability.herbalism.*:
+        description: Allows access to all Herbalism abilities
+        children:
+            mcmmo.ability.herbalism.all: true
+    mcmmo.ability.herbalism.all:
         description: Allows access to all Herbalism abilities
         children:
             mcmmo.ability.herbalism.doubledrops: true
@@ -469,6 +561,10 @@ permissions:
     mcmmo.ability.herbalism.farmersdiet:
         description: Allows access to the Farmer's Diet ability
     mcmmo.ability.excavation.*:
+        description: Allows access to all Excavation abilities
+        children:
+            mcmmo.ability.excavation.all: true
+    mcmmo.ability.excavation.all:
         description: Allows access to all Excavation abilities
         children:
             mcmmo.ability.excavation.gigadrillbreaker: true
@@ -478,6 +574,10 @@ permissions:
     mcmmo.ability.excavation.treasures:
         description: Allows treasure drops from Excavation
     mcmmo.ability.swords.*:
+        description: Allows access to all Swords abilities
+        children:
+            mcmmo.ability.swords.all: true
+    mcmmo.ability.swords.all:
         description: Allows access to all Swords abilities
         children:
             mcmmo.ability.swords.bleed: true
@@ -490,6 +590,10 @@ permissions:
     mcmmo.ability.swords.counterattack:
         description: Allows access to the Counter Attack ability
     mcmmo.ability.axes.*:
+        description: Allows access to all Axes abilities
+        children:
+            mcmmo.ability.axes.all: true
+    mcmmo.ability.axes.all:
         description: Allows access to all Axes abilities
         children:
             mcmmo.ability.axes.skullsplitter: true
@@ -508,6 +612,10 @@ permissions:
     mcmmo.ability.axes.greaterimpact:
         description: Allows access to the Greater Impact ability
     mcmmo.ability.acrobatics.*:
+        description: Allows access to all Acrobatics abilities
+        children:
+            mcmmo.ability.acrobatics.all: true
+    mcmmo.ability.acrobatics.all:
         description: Allows access to all Acrobatics abilities
         children:
             mcmmo.ability.acrobatics.roll: true
@@ -520,6 +628,10 @@ permissions:
     mcmmo.ability.acrobatics.dodge:
         description: Allows access to the Dodge ability
     mcmmo.ability.blastmining.*:
+        description: Allows access to all Blast Mining abilities
+        children:
+            mcmmo.ability.blastmining.all: true
+    mcmmo.ability.blastmining.all:
         description: Allows access to all Blast Mining abilities
         children:
             mcmmo.ability.blastmining.biggerbombs: true
@@ -532,14 +644,22 @@ permissions:
     mcmmo.ability.blastmining.detonate:
         description: Allows for remote TNT detonation
     mcmmo.item.*:
+        description: Implies all mcmmo.item permissions
+        children:
+            mcmmo.item.all: true 
+    mcmmo.item.all:
         description: Implies all mcmmo.item permissions
         children:
             mcmmo.item.chimaerawing: true 
     mcmmo.item.chimaerawing:
         description: Allows use of Chimaera Wing item
     mcmmo.motd:
-        description: Allows access to the motd        
+        description: Allows access to the motd
     mcmmo.commands.*:
+        description: Implies all mcmmo.commands permissions.
+        children:
+            mcmmo.commands.all: true
+    mcmmo.commands.all:
         description: Implies all mcmmo.commands permissions.
         children:
             mcmmo.commands.ability: true  
@@ -553,8 +673,12 @@ permissions:
     mcmmo.commands.inspect:
         description: Allows access to the inspect command
     mcmmo.commands.party:
-        description: Allows acces to the party command        
+        description: Allows acces to the party command
     mcmmo.chat.*:
+        description: Implies all mcmmo.chat permissions. (Warning, contains adminchat)
+        children:
+            mcmmo.chat.all: true
+    mcmmo.chat.all:
         description: Implies all mcmmo.chat permissions. (Warning, contains adminchat)
         children:
             mcmmo.chat.adminchat: true 
@@ -564,6 +688,10 @@ permissions:
     mcmmo.chat.partychat:
         description: Allows participation in party chat
     mcmmo.skills.*:
+        description: Implies all mcmmo.skills permissions.
+        children:
+            mcmmo.skills.all: true
+    mcmmo.skills.all:
         description: Implies all mcmmo.skills permissions.
         children:
             mcmmo.skills.fishing: true