瀏覽代碼

Handle all our donor perks in one class.

GJ 12 年之前
父節點
當前提交
083a89c1a3

+ 2 - 17
src/main/java/com/gmail/nossr50/datatypes/McMMOPlayer.java

@@ -12,6 +12,7 @@ import com.gmail.nossr50.mods.datatypes.CustomTool;
 import com.gmail.nossr50.party.Party;
 import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.party.ShareHandler;
+import com.gmail.nossr50.skills.utilities.PerksUtils;
 import com.gmail.nossr50.skills.utilities.SkillTools;
 import com.gmail.nossr50.skills.utilities.SkillType;
 import com.gmail.nossr50.spout.huds.SpoutHud;
@@ -140,23 +141,7 @@ public class McMMOPlayer {
             }
         }
 
-        // TODO: Too many permission checks here, is there no way to avoid that? 
-        if (player.hasPermission("mcmmo.perks.xp.quadruple")) {
-            xp *= 4;
-        }
-        else if (player.hasPermission("mcmmo.perks.xp.triple")) {
-            xp *= 3;
-        }
-        else if (player.hasPermission("mcmmo.perks.xp.150percentboost")) {
-            xp *= 2.5;
-        }
-        else if (player.hasPermission("mcmmo.perks.xp.150percentboost")) {
-            xp *= 2;
-        }
-        else if (player.hasPermission("mcmmo.perks.xp.50percentboost")) {
-            xp *= 1.5;
-        }
-
+        xp = PerksUtils.handleXpPerks(player, xp);
         return xp;
     }
 

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

@@ -10,6 +10,7 @@ import org.bukkit.entity.Player;
 import com.gmail.nossr50.commands.CommandHelper;
 import com.gmail.nossr50.datatypes.PlayerProfile;
 import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.skills.utilities.PerksUtils;
 import com.gmail.nossr50.skills.utilities.SkillTools;
 import com.gmail.nossr50.skills.utilities.SkillType;
 import com.gmail.nossr50.util.StringUtils;
@@ -124,26 +125,12 @@ public abstract class SkillCommand implements CommandExecutor {
     protected String[] calculateLengthDisplayValues() {
         int maxLength = skill.getAbility().getMaxTicks();
         int length = 2 + (int) (skillValue / SkillTools.abilityLengthIncreaseLevel);
-        int enduranceLength = 0;
-
-        if (player.hasPermission("mcmmo.perks.activationtime.twelveseconds")) {
-            enduranceLength = length + 12;
-        }
-        else if (player.hasPermission("mcmmo.perks.activationtime.eightseconds")) {
-            enduranceLength = length + 8;
-        }
-        else if (player.hasPermission("mcmmo.perks.activationtime.fourseconds")) {
-            enduranceLength = length + 4;
-        }
+        int enduranceLength = PerksUtils.handleActivationPerks(player, length, maxLength);
 
         if (maxLength != 0) {
             if (length > maxLength) {
                 length = maxLength;
             }
-
-            if (enduranceLength > maxLength) {
-                enduranceLength = maxLength;
-            }
         }
 
         return new String[] { String.valueOf(length), String.valueOf(enduranceLength) };

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

@@ -1,7 +1,7 @@
 package com.gmail.nossr50.skills;
 
 import com.gmail.nossr50.datatypes.McMMOPlayer;
-import com.gmail.nossr50.skills.utilities.SkillTools;
+import com.gmail.nossr50.skills.utilities.PerksUtils;
 import com.gmail.nossr50.skills.utilities.SkillType;
 import com.gmail.nossr50.util.Permissions;
 
@@ -13,7 +13,7 @@ public abstract class SkillManager {
     public SkillManager(McMMOPlayer mcMMOPlayer, SkillType skill) {
         this.mcMMOPlayer = mcMMOPlayer;
         this.skillLevel = mcMMOPlayer.getProfile().getSkillLevel(skill);
-        this.activationChance = SkillTools.calculateActivationChance(Permissions.lucky(mcMMOPlayer.getPlayer(), skill));
+        this.activationChance = PerksUtils.handleLuckyPerks(Permissions.lucky(mcMMOPlayer.getPlayer(), skill));
     }
 
     public McMMOPlayer getMcMMOPlayer() {

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

@@ -13,7 +13,7 @@ import com.gmail.nossr50.config.TreasuresConfig;
 import com.gmail.nossr50.datatypes.McMMOPlayer;
 import com.gmail.nossr50.datatypes.treasure.ExcavationTreasure;
 import com.gmail.nossr50.mods.ModChecks;
-import com.gmail.nossr50.skills.utilities.SkillTools;
+import com.gmail.nossr50.skills.utilities.PerksUtils;
 import com.gmail.nossr50.skills.utilities.SkillType;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
@@ -105,7 +105,7 @@ public class Excavation {
 
             for (ExcavationTreasure treasure : treasures) {
                 if (mcMMOPlayer.getProfile().getSkillLevel(SkillType.EXCAVATION) >= treasure.getDropLevel()) {
-                    int activationChance = SkillTools.calculateActivationChance(Permissions.luckyExcavation(player));
+                    int activationChance = PerksUtils.handleLuckyPerks(Permissions.luckyExcavation(player));
 
                     if (Misc.getRandom().nextDouble() * activationChance <= treasure.getDropChance()) {
                         xp += treasure.getXp();

+ 3 - 2
src/main/java/com/gmail/nossr50/skills/fishing/Fishing.java

@@ -18,6 +18,7 @@ import com.gmail.nossr50.config.TreasuresConfig;
 import com.gmail.nossr50.datatypes.McMMOPlayer;
 import com.gmail.nossr50.datatypes.treasure.FishingTreasure;
 import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.skills.utilities.PerksUtils;
 import com.gmail.nossr50.skills.utilities.SkillTools;
 import com.gmail.nossr50.skills.utilities.SkillType;
 import com.gmail.nossr50.util.ItemChecks;
@@ -160,7 +161,7 @@ public final class Fishing {
 
         FishingTreasure treasure = rewards.get(Misc.getRandom().nextInt(rewards.size()));
         ItemStack treasureDrop = treasure.getDrop();
-        int activationChance = SkillTools.calculateActivationChance(Permissions.luckyFishing(player));
+        int activationChance = PerksUtils.handleLuckyPerks(Permissions.luckyFishing(player));
 
         if (Misc.getRandom().nextDouble() * activationChance > treasure.getDropChance()) {
             return null;
@@ -189,7 +190,7 @@ public final class Fishing {
             return false;
         }
 
-        int activationChance = SkillTools.calculateActivationChance(Permissions.luckyFishing(player));
+        int activationChance = PerksUtils.handleLuckyPerks(Permissions.luckyFishing(player));
 
         if (storm) {
             activationChance = (int) (activationChance * 0.909);

+ 2 - 2
src/main/java/com/gmail/nossr50/skills/fishing/ShakeMob.java

@@ -18,7 +18,7 @@ import org.bukkit.potion.PotionType;
 
 import com.gmail.nossr50.skills.fishing.Fishing.Tier;
 import com.gmail.nossr50.skills.utilities.CombatTools;
-import com.gmail.nossr50.skills.utilities.SkillTools;
+import com.gmail.nossr50.skills.utilities.PerksUtils;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 
@@ -33,7 +33,7 @@ public final class ShakeMob {
      * @param skillLevel Fishing level of the player
      */
     public static void process(Player player, LivingEntity mob, int skillLevel) {
-        int activationChance = SkillTools.calculateActivationChance(Permissions.luckyFishing(player));
+        int activationChance = PerksUtils.handleLuckyPerks(Permissions.luckyFishing(player));
 
         if (getShakeProbability(skillLevel) <= Misc.getRandom().nextInt(activationChance)) {
             return;

+ 5 - 4
src/main/java/com/gmail/nossr50/skills/herbalism/Herbalism.java

@@ -25,6 +25,7 @@ import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.mods.ModChecks;
 import com.gmail.nossr50.mods.datatypes.CustomBlock;
 import com.gmail.nossr50.skills.utilities.AbilityType;
+import com.gmail.nossr50.skills.utilities.PerksUtils;
 import com.gmail.nossr50.skills.utilities.SkillTools;
 import com.gmail.nossr50.skills.utilities.SkillType;
 import com.gmail.nossr50.util.Misc;
@@ -190,7 +191,7 @@ public class Herbalism {
         }
 
         if (Permissions.herbalismDoubleDrops(player)) {
-            int activationChance = SkillTools.calculateActivationChance(Permissions.luckyHerbalism(player));
+            int activationChance = PerksUtils.handleLuckyPerks(Permissions.luckyHerbalism(player));
             double chance = (doubleDropsMaxChance / doubleDropsMaxLevel) * SkillTools.skillCheck(herbLevel, doubleDropsMaxLevel);
 
             if (chance > Misc.getRandom().nextInt(activationChance)) {
@@ -254,7 +255,7 @@ public class Herbalism {
             return;
         }
 
-        int activationChance = SkillTools.calculateActivationChance(Permissions.luckyHerbalism(player));
+        int activationChance = PerksUtils.handleLuckyPerks(Permissions.luckyHerbalism(player));
         float chance = (float) (greenThumbMaxChance / greenThumbMaxLevel * herbLevel);
 
         if (chance > greenThumbMaxChance) {
@@ -301,7 +302,7 @@ public class Herbalism {
 
         player.setItemInHand(new ItemStack(Material.SEEDS, seeds - 1));
 
-        int activationChance = SkillTools.calculateActivationChance(Permissions.luckyHerbalism(player));
+        int activationChance = PerksUtils.handleLuckyPerks(Permissions.luckyHerbalism(player));
 
         float chance = (float) ((greenThumbMaxChance / greenThumbMaxLevel) * skillLevel);
         if (chance > greenThumbMaxChance) chance = (float) greenThumbMaxChance;
@@ -318,7 +319,7 @@ public class Herbalism {
         int skillLevel = Users.getPlayer(player).getProfile().getSkillLevel(SkillType.HERBALISM);
 
         double chance = (hylianLuckMaxChance / hylianLuckMaxLevel) * SkillTools.skillCheck(skillLevel, hylianLuckMaxLevel);
-        int activationChance = SkillTools.calculateActivationChance(Permissions.luckyHerbalism(player));
+        int activationChance = PerksUtils.handleLuckyPerks(Permissions.luckyHerbalism(player));
 
         if (chance > Misc.getRandom().nextInt(activationChance)) {
             List<HylianTreasure> treasures = new ArrayList<HylianTreasure>();

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

@@ -17,7 +17,7 @@ import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.McMMOPlayer;
 import com.gmail.nossr50.datatypes.PlayerProfile;
 import com.gmail.nossr50.locale.LocaleLoader;
-import com.gmail.nossr50.skills.utilities.SkillTools;
+import com.gmail.nossr50.skills.utilities.PerksUtils;
 import com.gmail.nossr50.skills.utilities.SkillType;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
@@ -110,7 +110,7 @@ public class Repair {
         for (Entry<Enchantment, Integer> enchant : enchants.entrySet()) {
             Enchantment enchantment = enchant.getKey();
 
-            int activationChance = SkillTools.calculateActivationChance(Permissions.luckyRepair(player));
+            int activationChance = PerksUtils.handleLuckyPerks(Permissions.luckyRepair(player));
 
             if (Misc.getRandom().nextInt(activationChance) <= getEnchantChance(rank)) {
                 int enchantLevel = enchant.getValue();
@@ -237,7 +237,7 @@ public class Repair {
         int chance = (int) ((SUPER_REPAIR_CHANCE_MAX / SUPER_REPAIR_MAX_BONUS_LEVEL) * skillLevel);
         if (skillLevel >= SUPER_REPAIR_MAX_BONUS_LEVEL) chance = (int) SUPER_REPAIR_CHANCE_MAX;
 
-        int activationChance = SkillTools.calculateActivationChance(Permissions.luckyRepair(player));
+        int activationChance = PerksUtils.handleLuckyPerks(Permissions.luckyRepair(player));
 
         if (chance > Misc.getRandom().nextInt(activationChance) && Permissions.repairBonus(player)) {
             player.sendMessage(LocaleLoader.getString("Repair.Skills.FeltEasy"));

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

@@ -6,7 +6,7 @@ import org.bukkit.event.entity.EntityDamageEvent;
 
 import com.gmail.nossr50.datatypes.McMMOPlayer;
 import com.gmail.nossr50.skills.SkillManager;
-import com.gmail.nossr50.skills.utilities.SkillTools;
+import com.gmail.nossr50.skills.utilities.PerksUtils;
 import com.gmail.nossr50.skills.utilities.SkillType;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
@@ -87,7 +87,7 @@ public class UnarmedManager extends SkillManager {
 
         double chance = (Unarmed.ironGripMaxChance / Unarmed.ironGripMaxBonusLevel) * eventHandler.skillModifier;
 
-        if (chance > Misc.getRandom().nextInt(SkillTools.calculateActivationChance(Permissions.luckyUnarmed(defender)))) {
+        if (chance > Misc.getRandom().nextInt(PerksUtils.handleLuckyPerks(Permissions.luckyUnarmed(defender)))) {
             eventHandler.sendAbilityMessages();
             return true;
         }

+ 78 - 0
src/main/java/com/gmail/nossr50/skills/utilities/PerksUtils.java

@@ -0,0 +1,78 @@
+package com.gmail.nossr50.skills.utilities;
+
+import org.bukkit.entity.Player;
+
+import com.gmail.nossr50.util.Permissions;
+
+public final class PerksUtils {
+    private static final int LUCKY_SKILL_ACTIVATION_CHANCE = 75;
+    private static final int NORMAL_SKILL_ACTIVATION_CHANCE = 100;
+
+    private PerksUtils() {};
+
+    public static int handleCooldownPerks(Player player, int cooldown) {
+        if (Permissions.cooldownsHalved(player)) {
+            cooldown *= 0.5;
+        }
+        else if (Permissions.cooldownsThirded(player)) {
+            cooldown *= (1.0 / 3.0);
+        }
+        else if (Permissions.cooldownsQuartered(player)) {
+            cooldown *= 0.75;
+        }
+
+        return cooldown;
+    }
+
+    public static int handleActivationPerks(Player player, int ticks, int maxTicks) {
+        if (Permissions.activationTwelve(player)) {
+            ticks += 12;
+        }
+        else if (Permissions.activationEight(player)) {
+            ticks += 8;
+        }
+        else if (Permissions.activationFour(player)) {
+            ticks += 4;
+        }
+
+        if (maxTicks != 0 && ticks > maxTicks) {
+            ticks = maxTicks;
+        }
+
+        return ticks;
+    }
+
+    public static int handleXpPerks(Player player, int xp) {
+        if (player.hasPermission("mcmmo.perks.xp.quadruple")) {
+            xp *= 4;
+        }
+        else if (player.hasPermission("mcmmo.perks.xp.triple")) {
+            xp *= 3;
+        }
+        else if (player.hasPermission("mcmmo.perks.xp.150percentboost")) {
+            xp *= 2.5;
+        }
+        else if (player.hasPermission("mcmmo.perks.xp.150percentboost")) {
+            xp *= 2;
+        }
+        else if (player.hasPermission("mcmmo.perks.xp.50percentboost")) {
+            xp *= 1.5;
+        }
+
+        return xp;
+    }
+
+    /**
+     * Calculate activation chance for a skill.
+     *
+     * @param isLucky true if the player has the appropriate "lucky" perk, false otherwise
+     * @return the activation chance
+     */
+    public static int handleLuckyPerks(boolean isLucky) {
+        if (isLucky) {
+            return LUCKY_SKILL_ACTIVATION_CHANCE;
+        }
+    
+        return NORMAL_SKILL_ACTIVATION_CHANCE;
+    }
+}

+ 3 - 80
src/main/java/com/gmail/nossr50/skills/utilities/SkillTools.java

@@ -41,9 +41,6 @@ public class SkillTools {
     public static int toolDurabilityLoss = Config.getInstance().getAbilityToolDamage();
     public static int abilityLengthIncreaseLevel = AdvancedConfig.getInstance().getAbilityLength();
 
-    public static final int LUCKY_SKILL_ACTIVATION_CHANCE = 75;
-    public static final int NORMAL_SKILL_ACTIVATION_CHANCE = 100;
-
     public static void handleFoodSkills(Player player, SkillType skill, FoodLevelChangeEvent event, int baseLevel, int maxLevel, int rankChange) {
         int skillLevel = Users.getPlayer(player).getProfile().getSkillLevel(skill);
 
@@ -70,18 +67,7 @@ public class SkillTools {
      */
     public static boolean cooldownOver(long oldTime, int cooldown, Player player) {
         long currentTime = System.currentTimeMillis();
-        int adjustedCooldown = cooldown;
-        
-        //Reduced Cooldown Donor Perks
-        if (Permissions.cooldownsHalved(player)) {
-            adjustedCooldown = (int) (adjustedCooldown * 0.5);
-        }
-        else if (Permissions.cooldownsThirded(player)) {
-            adjustedCooldown = (int) (adjustedCooldown * 0.66);
-        }
-        else if (Permissions.cooldownsQuartered(player)) {
-            adjustedCooldown = (int) (adjustedCooldown * 0.75);
-        }
+        int adjustedCooldown = PerksUtils.handleCooldownPerks(player, cooldown);
 
         if (currentTime - oldTime >= (adjustedCooldown * Misc.TIME_CONVERSION_FACTOR)) {
             return true;
@@ -98,20 +84,7 @@ public class SkillTools {
      * @return the number of seconds remaining before the cooldown expires
      */
     public static int calculateTimeLeft(long deactivatedTimeStamp, int cooldown, Player player) {
-        int adjustedCooldown = cooldown;
-
-        //Reduced Cooldown Donor Perks
-        if (Permissions.cooldownsHalved(player)) {
-            adjustedCooldown = (int) (adjustedCooldown * 0.5);
-        }
-        else if (Permissions.cooldownsThirded(player)) {
-            adjustedCooldown = (int) (adjustedCooldown * 0.66);
-        }
-        else if (Permissions.cooldownsQuartered(player)) {
-            adjustedCooldown = (int) (adjustedCooldown * 0.75);
-        }
-
-        return (int) (((deactivatedTimeStamp + (adjustedCooldown * Misc.TIME_CONVERSION_FACTOR)) - System.currentTimeMillis()) / Misc.TIME_CONVERSION_FACTOR);
+        return (int) (((deactivatedTimeStamp + (PerksUtils.handleCooldownPerks(player, cooldown) * Misc.TIME_CONVERSION_FACTOR)) - System.currentTimeMillis()) / Misc.TIME_CONVERSION_FACTOR);
     }
 
     /**
@@ -386,24 +359,6 @@ public class SkillTools {
         return false;
     }
 
-    /**
-     * Handle tool durability loss from abilities.
-     *
-     * @param inHand The item to damage
-     * @param durabilityLoss The durability to remove from the item
-     */
-    public static void abilityDurabilityLoss(ItemStack inHand, int durabilityLoss) {
-        if (Config.getInstance().getAbilitiesDamageTools()) {
-            if (inHand.containsEnchantment(Enchantment.DURABILITY)) {
-                int level = inHand.getEnchantmentLevel(Enchantment.DURABILITY);
-                if (Misc.getRandom().nextInt(level + 1) > 0) {
-                    return;
-                }
-            }
-            inHand.setDurability((short) (inHand.getDurability() + durabilityLoss));
-        }
-    }
-
     /**
      * Check to see if an ability can be activated.
      *
@@ -427,30 +382,12 @@ public class SkillTools {
             }
         }
 
-        int ticks = 2 + (profile.getSkillLevel(type) / abilityLengthIncreaseLevel);
-
-        if (Permissions.activationTwelve(player)) {
-            ticks = ticks + 12;
-        }
-        else if (Permissions.activationEight(player)) {
-            ticks = ticks + 8;
-        }
-        else if (Permissions.activationFour(player)) {
-            ticks = ticks + 4;
-        }
-
-        int maxTicks = ability.getMaxTicks();
-
-        if (maxTicks != 0 && ticks > maxTicks) {
-            ticks = maxTicks;
-        }
-
         if (!profile.getAbilityMode(ability) && cooldownOver(profile.getSkillDATS(ability), ability.getCooldown(), player)) {
             player.sendMessage(ability.getAbilityOn());
 
             SkillTools.sendSkillMessage(player, ability.getAbilityPlayer(player));
 
-            profile.setSkillDATS(ability, System.currentTimeMillis() + (ticks * Misc.TIME_CONVERSION_FACTOR));
+            profile.setSkillDATS(ability, System.currentTimeMillis() + (PerksUtils.handleActivationPerks(player, 2 + (profile.getSkillLevel(type) / abilityLengthIncreaseLevel), ability.getMaxTicks()) * Misc.TIME_CONVERSION_FACTOR));
             profile.setAbilityMode(ability, true);
 
             if (ability == AbilityType.BERSERK) {
@@ -504,20 +441,6 @@ public class SkillTools {
         return activate;
     }
 
-    /**
-     * Calculate activation chance for a skill.
-     *
-     * @param isLucky true if the player has the appropriate "lucky" perk, false otherwise
-     * @return the activation chance
-     */
-    public static int calculateActivationChance(boolean isLucky) {
-        if (isLucky) {
-            return LUCKY_SKILL_ACTIVATION_CHANCE;
-        }
-    
-        return NORMAL_SKILL_ACTIVATION_CHANCE;
-    }
-
     public static void sendSkillMessage(Player player, String message) {
         for (Player otherPlayer : player.getWorld().getPlayers()) {
             if (otherPlayer != player && Misc.isNear(player.getLocation(), otherPlayer.getLocation(), Misc.SKILL_MESSAGE_MAX_SENDING_DISTANCE)) {

+ 2 - 2
src/main/java/com/gmail/nossr50/skills/woodcutting/Woodcutting.java

@@ -15,7 +15,7 @@ import com.gmail.nossr50.datatypes.McMMOPlayer;
 import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
 import com.gmail.nossr50.mods.ModChecks;
 import com.gmail.nossr50.mods.datatypes.CustomBlock;
-import com.gmail.nossr50.skills.utilities.SkillTools;
+import com.gmail.nossr50.skills.utilities.PerksUtils;
 import com.gmail.nossr50.skills.utilities.SkillType;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
@@ -143,7 +143,7 @@ public final class Woodcutting {
         double configDoubleDropChance = ADVANCED_CONFIG.getWoodcuttingDoubleDropChance();
         int configDoubleDropMaxLevel = ADVANCED_CONFIG.getWoodcuttingDoubleDropMaxLevel();
         int probability = (int) ((configDoubleDropChance / configDoubleDropMaxLevel) * Users.getPlayer(player).getProfile().getSkillLevel(SkillType.WOODCUTTING));
-        int activationChance = SkillTools.calculateActivationChance(Permissions.luckyWoodcutting(player));
+        int activationChance = PerksUtils.handleLuckyPerks(Permissions.luckyWoodcutting(player));
 
         if (probability > configDoubleDropChance) {
             probability = (int) configDoubleDropChance;

+ 9 - 33
src/main/java/com/gmail/nossr50/util/Motd.java

@@ -1,11 +1,14 @@
 package com.gmail.nossr50.util;
 
+import java.text.DecimalFormat;
+
 import org.bukkit.entity.Player;
 import org.bukkit.plugin.PluginDescriptionFile;
 
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.locale.LocaleLoader;
+import com.gmail.nossr50.skills.utilities.PerksUtils;
 import com.gmail.nossr50.skills.utilities.SkillType;
 
 public final class Motd {
@@ -56,21 +59,7 @@ public final class Motd {
      * @param player Target player
      */
     public static void displayXpPerks(Player player) {
-        if (Permissions.xpQuadruple(player)) {
-            player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.xp.name"), LocaleLoader.getString("Perks.xp.desc", 4)));
-        }
-        else if (Permissions.xpTriple(player)) {
-            player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.xp.name"), LocaleLoader.getString("Perks.xp.desc", 3)));
-        }
-        else if (Permissions.xpDoubleAndOneHalf(player)) {
-            player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.xp.name"), LocaleLoader.getString("Perks.xp.desc", 2.5)));
-        }
-        else if (Permissions.xpDouble(player)) {
-            player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.xp.name"), LocaleLoader.getString("Perks.xp.desc", 2)));
-        }
-        else if (Permissions.xpOneAndOneHalf(player)) {
-            player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.xp.name"), LocaleLoader.getString("Perks.xp.desc", 1.5)));
-        }
+        player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.xp.name"), LocaleLoader.getString("Perks.xp.desc", PerksUtils.handleXpPerks(player, 1))));
     }
 
     /**
@@ -78,15 +67,10 @@ public final class Motd {
      * @param player Target player
      */
     public static void displayCooldownPerks(Player player) {
-        if (Permissions.cooldownsHalved(player)) {
-            player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.cooldowns.name"), LocaleLoader.getString("Perks.cooldowns.desc", "1/2")));
-        }
-        else if (Permissions.cooldownsThirded(player)) {
-            player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.cooldowns.name"), LocaleLoader.getString("Perks.cooldowns.desc", "1/3")));
-        }
-        else if (Permissions.cooldownsQuartered(player)) {
-            player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.cooldowns.name"), LocaleLoader.getString("Perks.cooldowns.desc", "1/4")));
-        }
+        double cooldownReduction = 1 - (PerksUtils.handleCooldownPerks(player, 12) / 12.0);
+        DecimalFormat percent = new DecimalFormat("##0.00%");
+
+        player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.cooldowns.name"), LocaleLoader.getString("Perks.cooldowns.desc", percent.format(cooldownReduction))));
     }
 
     /**
@@ -94,15 +78,7 @@ public final class Motd {
      * @param player Target player
      */
     public static void displayActivationPerks(Player player) {
-        if (Permissions.activationTwelve(player)) {
-            player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.activationtime.name"), LocaleLoader.getString("Perks.activationtime.desc", 12)));
-        }
-        else if (Permissions.activationEight(player)) {
-            player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.activationtime.name"), LocaleLoader.getString("Perks.activationtime.desc", 8)));
-        }
-        else if (Permissions.activationFour(player)) {
-            player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.activationtime.name"), LocaleLoader.getString("Perks.activationtime.desc", 4)));
-        }
+        player.sendMessage(perkPrefix + LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Perks.activationtime.name"), LocaleLoader.getString("Perks.activationtime.desc", PerksUtils.handleActivationPerks(player, 0, 0))));
     }
 
     /**