Przeglądaj źródła

Static Abuse Removal - RandomChanceUtil -> RandomChanceTools

nossr50 6 lat temu
rodzic
commit
c5a7c88e0c
24 zmienionych plików z 128 dodań i 121 usunięć
  1. 2 3
      src/main/java/com/gmail/nossr50/commands/skills/AcrobaticsCommand.java
  2. 1 2
      src/main/java/com/gmail/nossr50/commands/skills/FishingCommand.java
  3. 1 2
      src/main/java/com/gmail/nossr50/commands/skills/SkillCommand.java
  4. 9 10
      src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java
  5. 1 2
      src/main/java/com/gmail/nossr50/listeners/EntityListener.java
  6. 10 0
      src/main/java/com/gmail/nossr50/mcMMO.java
  7. 1 2
      src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java
  8. 2 3
      src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java
  9. 4 5
      src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java
  10. 2 3
      src/main/java/com/gmail/nossr50/skills/excavation/ExcavationManager.java
  11. 1 2
      src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java
  12. 5 6
      src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java
  13. 1 2
      src/main/java/com/gmail/nossr50/skills/mining/MiningManager.java
  14. 3 4
      src/main/java/com/gmail/nossr50/skills/repair/RepairManager.java
  15. 3 4
      src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java
  16. 1 2
      src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java
  17. 2 3
      src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java
  18. 3 4
      src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java
  19. 5 6
      src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java
  20. 1 2
      src/main/java/com/gmail/nossr50/skills/woodcutting/WoodcuttingManager.java
  21. 1 2
      src/main/java/com/gmail/nossr50/util/BlockUtils.java
  22. 13 7
      src/main/java/com/gmail/nossr50/util/random/RandomChanceSkill.java
  23. 3 2
      src/main/java/com/gmail/nossr50/util/random/RandomChanceSkillStatic.java
  24. 53 43
      src/main/java/com/gmail/nossr50/util/random/RandomChanceTools.java

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

@@ -6,7 +6,6 @@ import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill;
 import com.gmail.nossr50.listeners.InteractionManager;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.random.RandomChanceSkill;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import net.md_5.bungee.api.chat.TextComponent;
 import org.bukkit.entity.Player;
 
@@ -64,8 +63,8 @@ public class AcrobaticsCommand extends SkillCommand {
                 grace_rcs.setSkillLevel(grace_rcs.getSkillLevel() * 2); //Double Odds
 
                 //Chance Stat Calculations
-                rollChance = RandomChanceUtil.getRandomChanceExecutionChance(roll_rcs);
-                graceChance = RandomChanceUtil.getRandomChanceExecutionChance(grace_rcs);
+                rollChance = pluginRef.getRandomChanceTools().getRandomChanceExecutionChance(roll_rcs);
+                graceChance = pluginRef.getRandomChanceTools().getRandomChanceExecutionChance(grace_rcs);
                 //damageThreshold  = AdvancedConfig.getInstance().getRollDamageThreshold();
 
                 String[] rollStrings = getAbilityDisplayValues(player, SubSkillType.ACROBATICS_ROLL);

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

@@ -9,7 +9,6 @@ import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.fishing.Fishing;
 import com.gmail.nossr50.skills.fishing.FishingManager;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.RankUtils;
 import net.md_5.bungee.api.chat.TextComponent;
 import org.bukkit.Location;
@@ -81,7 +80,7 @@ public class FishingCommand extends SkillCommand {
 
         // FISHING_SHAKE
         if (canShake) {
-            String[] shakeStrings = RandomChanceUtil.calculateAbilityDisplayValuesStatic(player, PrimarySkillType.FISHING, fishingManager.getShakeChance());
+            String[] shakeStrings = pluginRef.getRandomChanceTools().calculateAbilityDisplayValuesStatic(player, PrimarySkillType.FISHING, fishingManager.getShakeChance());
             shakeChance = shakeStrings[0];
             shakeChanceLucky = shakeStrings[1];
         }

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

@@ -7,7 +7,6 @@ import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.child.FamilyTree;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.StringUtils;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.google.common.collect.ImmutableList;
@@ -205,7 +204,7 @@ public abstract class SkillCommand implements TabExecutor {
     }
 
     protected String[] getAbilityDisplayValues(Player player, SubSkillType subSkill) {
-        return RandomChanceUtil.calculateAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, subSkill);
+        return pluginRef.getRandomChanceTools().calculateAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, subSkill);
     }
 
     protected String[] formatLengthDisplayValues(Player player, double skillValue) {

+ 9 - 10
src/main/java/com/gmail/nossr50/datatypes/skills/subskills/acrobatics/Roll.java

@@ -8,7 +8,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.random.RandomChanceSkill;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.PerksUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
@@ -129,14 +128,14 @@ public class Roll extends AcrobaticsSubSkill {
         float skillValue = playerProfile.getSkillLevel(getPrimarySkill());
         boolean isLucky = Permissions.lucky(player, getPrimarySkill());
 
-        String[] rollStrings = RandomChanceUtil.calculateAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ACROBATICS_ROLL);
+        String[] rollStrings = pluginRef.getRandomChanceTools().calculateAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ACROBATICS_ROLL);
         rollChance = rollStrings[0];
         rollChanceLucky = rollStrings[1];
 
         /*
          * Graceful is double the odds of a normal roll
          */
-        String[] gracefulRollStrings = RandomChanceUtil.calculateAbilityDisplayValuesCustom(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ACROBATICS_ROLL, 2.0D);
+        String[] gracefulRollStrings = pluginRef.getRandomChanceTools().calculateAbilityDisplayValuesCustom(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ACROBATICS_ROLL, 2.0D);
         gracefulRollChance = gracefulRollStrings[0];
         gracefulRollChanceLucky = gracefulRollStrings[1];
 
@@ -202,7 +201,7 @@ public class Roll extends AcrobaticsSubSkill {
         double modifiedDamage = calculateModifiedRollDamage(damage, pluginRef.getConfigManager().getConfigAcrobatics().getRollDamageTheshold());
 
         if (!isFatal(player, modifiedDamage)
-                && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ACROBATICS_ROLL, player)) {
+                && pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ACROBATICS_ROLL, player)) {
             pluginRef.getNotificationManager().sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Acrobatics.Roll.Text");
             SoundManager.sendCategorizedSound(player, player.getLocation(), SoundType.ROLL_ACTIVATED, SoundCategory.PLAYERS);
 
@@ -241,7 +240,7 @@ public class Roll extends AcrobaticsSubSkill {
         rcs.setSkillLevel(rcs.getSkillLevel() * 2); //Double the effective odds
 
         if (!isFatal(player, modifiedDamage)
-                && RandomChanceUtil.checkRandomChanceExecutionSuccess(rcs)) {
+                && pluginRef.getRandomChanceTools().checkRandomChanceExecutionSuccess(rcs)) {
             pluginRef.getNotificationManager().sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Acrobatics.Ability.Proc");
             SoundManager.sendCategorizedSound(player, player.getLocation(), SoundType.ROLL_ACTIVATED, SoundCategory.PLAYERS, 0.5F);
 
@@ -373,11 +372,11 @@ public class Roll extends AcrobaticsSubSkill {
         rollGraceHalfMaxSkill.setSkillLevel(1); //Level 1 skill
 
         //Chance Stat Calculations
-        rollChanceHalfMax = RandomChanceUtil.getRandomChanceExecutionChance(rollHalfMaxSkill);
-        graceChanceHalfMax = RandomChanceUtil.getRandomChanceExecutionChance(rollGraceHalfMaxSkill);
+        rollChanceHalfMax = pluginRef.getRandomChanceTools().getRandomChanceExecutionChance(rollHalfMaxSkill);
+        graceChanceHalfMax = pluginRef.getRandomChanceTools().getRandomChanceExecutionChance(rollGraceHalfMaxSkill);
         damageThreshold = pluginRef.getConfigManager().getConfigAcrobatics().getRollDamageTheshold();
 
-        chancePerLevel = RandomChanceUtil.getRandomChanceExecutionChance(rollOneSkillLevel);
+        chancePerLevel = pluginRef.getRandomChanceTools().getRandomChanceExecutionChance(rollOneSkillLevel);
 
         double maxLevel = pluginRef.getDynamicSettingsManager().getSkillMaxBonusLevel(SubSkillType.ACROBATICS_ROLL);
 
@@ -400,8 +399,8 @@ public class Roll extends AcrobaticsSubSkill {
         graceful.setSkillLevel(graceful.getSkillLevel() * 2); //Double odds
 
         //Calculate
-        playerChanceRoll = RandomChanceUtil.getRandomChanceExecutionChance(roll);
-        playerChanceGrace = RandomChanceUtil.getRandomChanceExecutionChance(graceful);
+        playerChanceRoll = pluginRef.getRandomChanceTools().getRandomChanceExecutionChance(roll);
+        playerChanceGrace = pluginRef.getRandomChanceTools().getRandomChanceExecutionChance(graceful);
 
         Double[] stats = {playerChanceRoll, playerChanceGrace}; //DEBUG
         return stats;

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

@@ -15,7 +15,6 @@ import com.gmail.nossr50.skills.unarmed.UnarmedManager;
 import com.gmail.nossr50.util.BlockUtils;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.worldguard.WorldGuardUtils;
 import org.bukkit.Material;
@@ -137,7 +136,7 @@ public class EntityListener implements Listener {
                     return;
             }
 
-            if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_ARROW_RETRIEVAL, player)) {
+            if (pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_ARROW_RETRIEVAL, player)) {
                 projectile.setMetadata(MetadataConstants.ARROW_TRACKER_METAKEY, MetadataConstants.metadataValue);
             }
         }

+ 10 - 0
src/main/java/com/gmail/nossr50/mcMMO.java

@@ -38,6 +38,7 @@ import com.gmail.nossr50.util.nbt.NBTManager;
 import com.gmail.nossr50.util.player.NotificationManager;
 import com.gmail.nossr50.util.player.PlayerLevelTools;
 import com.gmail.nossr50.util.player.UserManager;
+import com.gmail.nossr50.util.random.RandomChanceTools;
 import com.gmail.nossr50.util.scoreboards.ScoreboardManager;
 import com.gmail.nossr50.util.skills.CombatTools;
 import com.gmail.nossr50.util.skills.RankUtils;
@@ -82,6 +83,7 @@ public class mcMMO extends JavaPlugin {
     private EventManager eventManager;
     private UserManager userManager;
     private ScoreboardManager scoreboardManager;
+    private RandomChanceTools randomChanceTools;
 
     /* Not-Managers but my naming scheme sucks */
     private DatabaseManagerFactory databaseManagerFactory;
@@ -108,6 +110,7 @@ public class mcMMO extends JavaPlugin {
     private boolean serverAPIOutdated = false;
     // XP Event Check
     private boolean xpEventEnabled;
+
     /**
      * Things to be run when the plugin is enabled.
      */
@@ -244,6 +247,9 @@ public class mcMMO extends JavaPlugin {
 
         //Init Combat Tools
         combatTools = new CombatTools(this);
+
+        //Init Random Chance Tools
+        randomChanceTools = new RandomChanceTools(this);
     }
 
     @Override
@@ -751,4 +757,8 @@ public class mcMMO extends JavaPlugin {
     public CombatTools getCombatTools() {
         return combatTools;
     }
+
+    public RandomChanceTools getRandomChanceTools() {
+        return randomChanceTools;
+    }
 }

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

@@ -11,7 +11,6 @@ import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.ParticleEffectUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
@@ -87,7 +86,7 @@ public class AcrobaticsManager extends SkillManager {
         double modifiedDamage = acrobaticsBehaviour.calculateModifiedDodgeDamage(damage, acrobaticsBehaviour.getDodgeDamageModifier());
         Player player = getPlayer();
 
-        if (!isFatal(modifiedDamage) && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ACROBATICS_DODGE, player)) {
+        if (!isFatal(modifiedDamage) && pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ACROBATICS_DODGE, player)) {
             ParticleEffectUtils.playDodgeEffect(player);
 
             if (mcMMOPlayer.useChatNotifications()) {

+ 2 - 3
src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java

@@ -10,7 +10,6 @@ import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import org.bukkit.Location;
@@ -92,7 +91,7 @@ public class ArcheryManager extends SkillManager {
      * @param defender The {@link Player} being affected by the ability
      */
     public double daze(Player defender) {
-        if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_DAZE, getPlayer())) {
+        if (!pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.ARCHERY_DAZE, getPlayer())) {
             return 0;
         }
 
@@ -120,7 +119,7 @@ public class ArcheryManager extends SkillManager {
      * @param oldDamage The raw damage value of this arrow before we modify it
      */
     public double skillShot(double oldDamage) {
-        if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.ARCHERY_SKILL_SHOT, getPlayer())) {
+        if (!pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.ARCHERY_SKILL_SHOT, getPlayer())) {
             return oldDamage;
         }
 

+ 4 - 5
src/main/java/com/gmail/nossr50/skills/axes/AxesManager.java

@@ -11,7 +11,6 @@ import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.util.ItemUtils;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.ParticleEffectUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
@@ -74,7 +73,7 @@ public class AxesManager extends SkillManager {
      * Handle the effects of the Axe Mastery ability
      */
     public double axeMastery() {
-        if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.AXES_AXE_MASTERY, getPlayer())) {
+        if (!pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.AXES_AXE_MASTERY, getPlayer())) {
             return 0;
         }
 
@@ -88,7 +87,7 @@ public class AxesManager extends SkillManager {
      * @param damage The amount of damage initially dealt by the event
      */
     public double criticalHit(LivingEntity target, double damage) {
-        if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.AXES_CRITICAL_STRIKES, getPlayer())) {
+        if (!pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.AXES_CRITICAL_STRIKES, getPlayer())) {
             return 0;
         }
 
@@ -123,7 +122,7 @@ public class AxesManager extends SkillManager {
 
         for (ItemStack armor : target.getEquipment().getArmorContents()) {
             if (armor != null && ItemUtils.isArmor(armor)) {
-                if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.AXES_ARMOR_IMPACT, getPlayer())) {
+                if (pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.AXES_ARMOR_IMPACT, getPlayer())) {
                     pluginRef.getSkillTools().handleDurabilityChange(armor, durabilityDamage, 1);
                 }
             }
@@ -141,7 +140,7 @@ public class AxesManager extends SkillManager {
      */
     public double greaterImpact(LivingEntity target) {
         //chance (3rd param)
-        if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.AXES_GREATER_IMPACT, getPlayer())) {
+        if (!pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.AXES_GREATER_IMPACT, getPlayer())) {
             return 0;
         }
 

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

@@ -10,7 +10,6 @@ import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.RankUtils;
 import org.bukkit.Location;
 import org.bukkit.block.BlockState;
@@ -46,10 +45,10 @@ public class ExcavationManager extends SkillManager {
 
                 for (ExcavationTreasure treasure : treasures) {
                     if (skillLevel >= treasure.getDropLevel()
-                            && RandomChanceUtil.checkRandomChanceExecutionSuccess(getPlayer(), PrimarySkillType.EXCAVATION, treasure.getDropChance())) {
+                            && pluginRef.getRandomChanceTools().checkRandomChanceExecutionSuccess(getPlayer(), PrimarySkillType.EXCAVATION, treasure.getDropChance())) {
 
                         //Spawn Vanilla XP orbs if a dice roll succeeds
-                        if(RandomChanceUtil.rollDice(getArchaelogyExperienceOrbChance(), 100)) {
+                        if(pluginRef.getRandomChanceTools().rollDice(getArchaelogyExperienceOrbChance(), 100)) {
                             ExperienceOrb experienceOrb = (ExperienceOrb) getPlayer().getWorld().spawnEntity(location, EntityType.EXPERIENCE_ORB);
                             experienceOrb.setExperience(getExperienceOrbsReward());
                         }

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

@@ -22,7 +22,6 @@ import com.gmail.nossr50.util.ItemUtils;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.random.RandomChanceSkillStatic;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.sounds.SoundManager;
 import com.gmail.nossr50.util.sounds.SoundType;
@@ -349,7 +348,7 @@ public class FishingManager extends SkillManager {
      * @param target The {@link LivingEntity} affected by the ability
      */
     public void shakeCheck(LivingEntity target) {
-        if (RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getShakeChance(), getPlayer(), SubSkillType.FISHING_SHAKE))) {
+        if (pluginRef.getRandomChanceTools().checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getShakeChance(), getPlayer(), SubSkillType.FISHING_SHAKE))) {
             List<ShakeTreasure> possibleDrops = fishingBehaviour.findPossibleDrops(target);
 
             if (possibleDrops == null || possibleDrops.isEmpty()) {

+ 5 - 6
src/main/java/com/gmail/nossr50/skills/herbalism/HerbalismManager.java

@@ -16,7 +16,6 @@ import com.gmail.nossr50.runnables.skills.HerbalismBlockUpdaterTask;
 import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.util.*;
 import com.gmail.nossr50.util.random.RandomChanceSkillStatic;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import org.bukkit.Location;
@@ -196,7 +195,7 @@ public class HerbalismManager extends SkillManager {
      * @return true if the ability was successful, false otherwise
      */
     public boolean processGreenThumbBlocks(BlockState blockState) {
-        if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.HERBALISM_GREEN_THUMB, getPlayer())) {
+        if (!pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.HERBALISM_GREEN_THUMB, getPlayer())) {
             pluginRef.getNotificationManager().sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE_FAILED, "Herbalism.Ability.GTh.Fail");
             return false;
         }
@@ -211,7 +210,7 @@ public class HerbalismManager extends SkillManager {
      * @return true if the ability was successful, false otherwise
      */
     public boolean processHylianLuck(BlockState blockState) {
-        if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.HERBALISM_HYLIAN_LUCK, getPlayer())) {
+        if (!pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.HERBALISM_HYLIAN_LUCK, getPlayer())) {
             return false;
         }
 
@@ -230,7 +229,7 @@ public class HerbalismManager extends SkillManager {
 
         for (HylianTreasure treasure : treasures) {
             if (skillLevel >= treasure.getDropLevel()
-                    && RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(treasure.getDropChance(), getPlayer(), SubSkillType.HERBALISM_HYLIAN_LUCK))) {
+                    && pluginRef.getRandomChanceTools().checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(treasure.getDropChance(), getPlayer(), SubSkillType.HERBALISM_HYLIAN_LUCK))) {
                 if (!pluginRef.getEventManager().simulateBlockBreak(blockState.getBlock(), player, false)) {
                     return false;
                 }
@@ -267,7 +266,7 @@ public class HerbalismManager extends SkillManager {
         playerInventory.removeItem(new ItemStack(Material.RED_MUSHROOM));
         player.updateInventory();
 
-        if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.HERBALISM_SHROOM_THUMB, player)) {
+        if (!pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.HERBALISM_SHROOM_THUMB, player)) {
             pluginRef.getNotificationManager().sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE_FAILED, "Herbalism.Ability.ShroomThumb.Fail");
             return false;
         }
@@ -320,7 +319,7 @@ public class HerbalismManager extends SkillManager {
 
         ItemStack seedStack = new ItemStack(seed);
 
-        if (!greenTerra && !RandomChanceUtil.checkRandomChanceExecutionSuccess(player, SubSkillType.HERBALISM_GREEN_THUMB)) {
+        if (!greenTerra && !pluginRef.getRandomChanceTools().checkRandomChanceExecutionSuccess(player, SubSkillType.HERBALISM_GREEN_THUMB)) {
             return;
         }
 

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

@@ -14,7 +14,6 @@ import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.util.BlockUtils;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.RankUtils;
 import org.bukkit.Material;
 import org.bukkit.block.Block;
@@ -104,7 +103,7 @@ public class MiningManager extends SkillManager {
             return;
 
         //TODO: Make this readable
-        if (RandomChanceUtil.checkRandomChanceExecutionSuccess(getPlayer(), SubSkillType.MINING_DOUBLE_DROPS)) {
+        if (pluginRef.getRandomChanceTools().checkRandomChanceExecutionSuccess(getPlayer(), SubSkillType.MINING_DOUBLE_DROPS)) {
             BlockUtils.markDropsAsBonus(blockState, mcMMOPlayer.getAbilityMode(skill.getSuperAbility()));
         }
     }

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

@@ -9,7 +9,6 @@ import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.random.RandomChanceSkillStatic;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import com.gmail.nossr50.util.sounds.SoundManager;
@@ -265,7 +264,7 @@ public class RepairManager extends SkillManager {
         if (!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.REPAIR_SUPER_REPAIR))
             return false;
 
-        if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.REPAIR_SUPER_REPAIR, getPlayer())) {
+        if (pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.REPAIR_SUPER_REPAIR, getPlayer())) {
             pluginRef.getNotificationManager().sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Repair.Skills.FeltEasy");
             return true;
         }
@@ -316,10 +315,10 @@ public class RepairManager extends SkillManager {
 
             Enchantment enchantment = enchant.getKey();
 
-            if (RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getKeepEnchantChance(), getPlayer(), SubSkillType.REPAIR_ARCANE_FORGING))) {
+            if (pluginRef.getRandomChanceTools().checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getKeepEnchantChance(), getPlayer(), SubSkillType.REPAIR_ARCANE_FORGING))) {
 
                 if (pluginRef.getConfigManager().getConfigRepair().getArcaneForging().isDowngradesEnabled() && enchantLevel > 1
-                        && (!RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(100 - getDowngradeEnchantChance(), getPlayer(), SubSkillType.REPAIR_ARCANE_FORGING)))) {
+                        && (!pluginRef.getRandomChanceTools().checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(100 - getDowngradeEnchantChance(), getPlayer(), SubSkillType.REPAIR_ARCANE_FORGING)))) {
                     item.addUnsafeEnchantment(enchantment, enchantLevel - 1);
                     downgraded = true;
                 }

+ 3 - 4
src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java

@@ -12,7 +12,6 @@ import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.StringUtils;
 import com.gmail.nossr50.util.random.RandomChanceSkillStatic;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.sounds.SoundManager;
 import com.gmail.nossr50.util.sounds.SoundType;
@@ -113,7 +112,7 @@ public class SalvageManager extends SkillManager {
 
         for(int x = 0; x < potentialSalvageYield-1; x++) {
 
-            if(RandomChanceUtil.rollDice(chanceOfSuccess, 100)) {
+            if(pluginRef.getRandomChanceTools().rollDice(chanceOfSuccess, 100)) {
                 chanceOfSuccess-=2;
                 Math.max(chanceOfSuccess, 95);
 
@@ -241,13 +240,13 @@ public class SalvageManager extends SkillManager {
 
             if (!salvageBehaviour.isArcaneSalvageEnchantLoss()
                     || Permissions.hasSalvageEnchantBypassPerk(player)
-                    || RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getExtractFullEnchantChance(), getPlayer(), SubSkillType.SALVAGE_ARCANE_SALVAGE))) {
+                    || pluginRef.getRandomChanceTools().checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getExtractFullEnchantChance(), getPlayer(), SubSkillType.SALVAGE_ARCANE_SALVAGE))) {
 
                 enchantMeta.addStoredEnchant(enchant.getKey(), enchantLevel, true);
             }
             else if (enchantLevel > 1
                     && salvageBehaviour.isArcaneSalvageDowngrades()
-                    && RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getExtractPartialEnchantChance(), getPlayer(), SubSkillType.SALVAGE_ARCANE_SALVAGE))) {
+                    && pluginRef.getRandomChanceTools().checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getExtractPartialEnchantChance(), getPlayer(), SubSkillType.SALVAGE_ARCANE_SALVAGE))) {
                 enchantMeta.addStoredEnchant(enchant.getKey(), enchantLevel - 1, true);
                 downgraded = true;
             } else {

+ 1 - 2
src/main/java/com/gmail/nossr50/skills/smelting/SmeltingManager.java

@@ -8,7 +8,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import org.bukkit.event.inventory.FurnaceBurnEvent;
@@ -21,7 +20,7 @@ public class SmeltingManager extends SkillManager {
 
     public boolean isSecondSmeltSuccessful() {
         return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.SMELTING_SECOND_SMELT)
-                && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SMELTING_SECOND_SMELT, getPlayer());
+                && pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SMELTING_SECOND_SMELT, getPlayer());
     }
 
     /**

+ 2 - 3
src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java

@@ -10,7 +10,6 @@ import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.util.ItemUtils;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import org.bukkit.entity.Entity;
@@ -58,7 +57,7 @@ public class SwordsManager extends SkillManager {
      * @param target The defending entity
      */
     public void ruptureCheck(LivingEntity target) {
-        if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_RUPTURE, getPlayer())) {
+        if (pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_RUPTURE, getPlayer())) {
 
             if (target instanceof Player) {
                 Player defender = (Player) target;
@@ -119,7 +118,7 @@ public class SwordsManager extends SkillManager {
      * @param damage   The amount of damage initially dealt by the event
      */
     public void counterAttackChecks(LivingEntity attacker, double damage) {
-        if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_COUNTER_ATTACK, getPlayer())) {
+        if (pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.SWORDS_COUNTER_ATTACK, getPlayer())) {
             pluginRef.getCombatTools().dealDamage(attacker, damage / pluginRef.getConfigManager().getConfigSwords().getCounterAttackDamageModifier(), getPlayer());
 
             pluginRef.getNotificationManager().sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Countered");

+ 3 - 4
src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java

@@ -15,7 +15,6 @@ import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.StringUtils;
 import com.gmail.nossr50.util.random.RandomChanceSkillStatic;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.ParticleEffectUtils;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
@@ -114,7 +113,7 @@ public class TamingManager extends SkillManager {
      */
     public void fastFoodService(Wolf wolf, double damage) {
         //static chance (3rd param)
-        if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.TAMING_FAST_FOOD_SERVICE, getPlayer())) {
+        if (!pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_STATIC_CHANCE, SubSkillType.TAMING_FAST_FOOD_SERVICE, getPlayer())) {
             return;
         }
 
@@ -134,7 +133,7 @@ public class TamingManager extends SkillManager {
      * @param damage The initial damage
      */
     public double gore(LivingEntity target, double damage) {
-        if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.TAMING_GORE, getPlayer())) {
+        if (!pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.TAMING_GORE, getPlayer())) {
             return 0;
         }
 
@@ -230,7 +229,7 @@ public class TamingManager extends SkillManager {
         if (!RankUtils.hasUnlockedSubskill(getPlayer(), SubSkillType.TAMING_PUMMEL))
             return;
 
-        if (!RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(AdvancedConfig.getInstance().getPummelChance(), getPlayer(), SubSkillType.TAMING_PUMMEL)))
+        if (!pluginRef.getRandomChanceTools().checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(AdvancedConfig.getInstance().getPummelChance(), getPlayer(), SubSkillType.TAMING_PUMMEL)))
             return;
 
         ParticleEffectUtils.playGreaterImpactEffect(target);

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

@@ -12,7 +12,6 @@ import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.util.ItemUtils;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import org.bukkit.Material;
@@ -67,7 +66,7 @@ public class UnarmedManager extends SkillManager {
     }
 
     public boolean blockCrackerCheck(BlockState blockState) {
-        if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.UNARMED_BLOCK_CRACKER, getPlayer())) {
+        if (!pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.UNARMED_BLOCK_CRACKER, getPlayer())) {
             return false;
         }
 
@@ -93,7 +92,7 @@ public class UnarmedManager extends SkillManager {
      * @param defender The defending player
      */
     public void disarmCheck(Player defender) {
-        if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_DISARM, getPlayer()) && !hasIronGrip(defender)) {
+        if (pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_DISARM, getPlayer()) && !hasIronGrip(defender)) {
             if (pluginRef.getEventManager().callDisarmEvent(defender).isCancelled()) {
                 return;
             }
@@ -116,7 +115,7 @@ public class UnarmedManager extends SkillManager {
      * Check for arrow deflection.
      */
     public boolean deflectCheck() {
-        if (RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_ARROW_DEFLECT, getPlayer())) {
+        if (pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_ARROW_DEFLECT, getPlayer())) {
             pluginRef.getNotificationManager().sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Combat.ArrowDeflect");
             return true;
         }
@@ -139,7 +138,7 @@ public class UnarmedManager extends SkillManager {
      * Handle the effects of the Iron Arm ability
      */
     public double ironArm() {
-        if (!RandomChanceUtil.isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.UNARMED_IRON_ARM_STYLE, getPlayer())) {
+        if (!pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.ALWAYS_FIRES, SubSkillType.UNARMED_IRON_ARM_STYLE, getPlayer())) {
             return 0;
         }
 
@@ -168,7 +167,7 @@ public class UnarmedManager extends SkillManager {
      */
     private boolean hasIronGrip(Player defender) {
         if (!Misc.isNPCEntityExcludingVillagers(defender) && Permissions.isSubSkillEnabled(defender, SubSkillType.UNARMED_IRON_GRIP)
-                && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_IRON_GRIP, getPlayer())) {
+                && pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.UNARMED_IRON_GRIP, getPlayer())) {
             pluginRef.getNotificationManager().sendPlayerInformation(defender, NotificationType.SUBSKILL_MESSAGE, "Unarmed.Ability.IronGrip.Defender");
             pluginRef.getNotificationManager().sendPlayerInformation(getPlayer(), NotificationType.SUBSKILL_MESSAGE, "Unarmed.Ability.IronGrip.Attacker");
 

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

@@ -13,7 +13,6 @@ import com.gmail.nossr50.util.BlockUtils;
 import com.gmail.nossr50.util.ItemUtils;
 import com.gmail.nossr50.util.Misc;
 import com.gmail.nossr50.util.Permissions;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import com.gmail.nossr50.util.skills.RankUtils;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import org.bukkit.Material;
@@ -53,7 +52,7 @@ public class WoodcuttingManager extends SkillManager {
     public boolean canGetDoubleDrops() {
         return Permissions.isSubSkillEnabled(getPlayer(), SubSkillType.WOODCUTTING_HARVEST_LUMBER)
                 && RankUtils.hasReachedRank(1, getPlayer(), SubSkillType.WOODCUTTING_HARVEST_LUMBER)
-                && RandomChanceUtil.isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.WOODCUTTING_HARVEST_LUMBER, getPlayer());
+                && pluginRef.getRandomChanceTools().isActivationSuccessful(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, SubSkillType.WOODCUTTING_HARVEST_LUMBER, getPlayer());
     }
 
     /**

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

@@ -6,7 +6,6 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.skills.repair.Repair;
 import com.gmail.nossr50.skills.salvage.Salvage;
 import com.gmail.nossr50.util.random.RandomChanceSkill;
-import com.gmail.nossr50.util.random.RandomChanceUtil;
 import org.bukkit.Material;
 import org.bukkit.block.Block;
 import org.bukkit.block.BlockState;
@@ -52,7 +51,7 @@ public final class BlockUtils {
      */
     public static boolean checkDoubleDrops(Player player, BlockState blockState, SubSkillType subSkillType) {
         if (pluginRef.getDynamicSettingsManager().isBonusDropsEnabled(blockState.getType()) && Permissions.isSubSkillEnabled(player, subSkillType)) {
-            return RandomChanceUtil.checkRandomChanceExecutionSuccess(new RandomChanceSkill(player, subSkillType, true));
+            return pluginRef.getRandomChanceTools().checkRandomChanceExecutionSuccess(new RandomChanceSkill(player, subSkillType, true));
         }
 
         return false;

+ 13 - 7
src/main/java/com/gmail/nossr50/util/random/RandomChanceSkill.java

@@ -2,6 +2,7 @@ package com.gmail.nossr50.util.random;
 
 import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
+import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
 import org.bukkit.entity.Player;
 
@@ -11,12 +12,15 @@ public class RandomChanceSkill implements RandomChanceExecution {
     protected final SubSkillType subSkillType;
     protected final double probabilityCap;
     protected final boolean isLucky;
-    private int skillLevel;
+    protected int skillLevel;
+    protected final mcMMO pluginRef;
 
-    public RandomChanceSkill(Player player, SubSkillType subSkillType) {
-        this.primarySkillType = subSkillType.getParentSkill();
+    public RandomChanceSkill(mcMMO pluginRef, Player player, SubSkillType subSkillType) {
+        this.pluginRef = pluginRef;
+
+        this.primarySkillType = subSkillType.getParentSkill(pluginRef);
         this.subSkillType = subSkillType;
-        this.probabilityCap = RandomChanceUtil.LINEAR_CURVE_VAR;
+        this.probabilityCap = pluginRef.getRandomChanceTools().LINEAR_CURVE_VAR;
 
         if (player != null)
             this.skillLevel = pluginRef.getUserManager().getPlayer(player).getSkillLevel(primarySkillType);
@@ -29,13 +33,15 @@ public class RandomChanceSkill implements RandomChanceExecution {
             isLucky = false;
     }
 
-    public RandomChanceSkill(Player player, SubSkillType subSkillType, boolean hasCap) {
+    public RandomChanceSkill(mcMMO pluginRef, Player player, SubSkillType subSkillType, boolean hasCap) {
+        this.pluginRef = pluginRef;
+
         if (hasCap)
             this.probabilityCap = pluginRef.getDynamicSettingsManager().getSkillMaxChance(subSkillType);
         else
-            this.probabilityCap = RandomChanceUtil.LINEAR_CURVE_VAR;
+            this.probabilityCap = pluginRef.getRandomChanceTools().LINEAR_CURVE_VAR;
 
-        this.primarySkillType = subSkillType.getParentSkill();
+        this.primarySkillType = subSkillType.getParentSkill(pluginRef);
         this.subSkillType = subSkillType;
 
         if (player != null)

+ 3 - 2
src/main/java/com/gmail/nossr50/util/random/RandomChanceSkillStatic.java

@@ -1,13 +1,14 @@
 package com.gmail.nossr50.util.random;
 
 import com.gmail.nossr50.datatypes.skills.SubSkillType;
+import com.gmail.nossr50.mcMMO;
 import org.bukkit.entity.Player;
 
 public class RandomChanceSkillStatic extends RandomChanceSkill {
     private final double xPos;
 
-    public RandomChanceSkillStatic(double xPos, Player player, SubSkillType subSkillType) {
-        super(player, subSkillType);
+    public RandomChanceSkillStatic(mcMMO pluginRef, double xPos, Player player, SubSkillType subSkillType) {
+        super(pluginRef, player, subSkillType);
 
         this.xPos = xPos;
     }

+ 53 - 43
src/main/java/com/gmail/nossr50/util/random/RandomChanceUtil.java → src/main/java/com/gmail/nossr50/util/random/RandomChanceTools.java

@@ -5,6 +5,7 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType;
 import com.gmail.nossr50.datatypes.skills.subskills.AbstractSubSkill;
 import com.gmail.nossr50.events.skills.secondaryabilities.SubSkillEvent;
 import com.gmail.nossr50.events.skills.secondaryabilities.SubSkillRandomCheckEvent;
+import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.skills.SkillActivationType;
 import org.bukkit.entity.Player;
@@ -12,10 +13,19 @@ import org.bukkit.entity.Player;
 import java.text.DecimalFormat;
 import java.util.Random;
 
-public class RandomChanceUtil {
-    public static final DecimalFormat percent = new DecimalFormat("##0.00%");
-    //public static final DecimalFormat decimal = new DecimalFormat("##0.00");
-    public static final double LINEAR_CURVE_VAR = 100.0D;
+public class RandomChanceTools {
+    
+    private final mcMMO pluginRef;
+    
+    public final DecimalFormat percent;
+    public final double LINEAR_CURVE_VAR;
+
+    public RandomChanceTools(mcMMO pluginRef) {
+        this.pluginRef = pluginRef;
+
+        percent = new DecimalFormat("##0.00%");
+        LINEAR_CURVE_VAR = 100.0D;
+    }
 
     /**
      * This method is the final step in determining if a Sub-Skill / Secondary Skill in mcMMO successfully activates either from chance or otherwise
@@ -27,7 +37,7 @@ public class RandomChanceUtil {
      * @param player The owner of this sub-skill
      * @return returns true if all conditions are met and the event is not cancelled
      */
-    public static boolean isActivationSuccessful(SkillActivationType skillActivationType, SubSkillType subSkillType, Player player) {
+    public boolean isActivationSuccessful(SkillActivationType skillActivationType, SubSkillType subSkillType, Player player) {
         switch (skillActivationType) {
             case RANDOM_LINEAR_100_SCALE_WITH_CAP:
                 return checkRandomChanceExecutionSuccess(player, subSkillType);
@@ -41,7 +51,7 @@ public class RandomChanceUtil {
         }
     }
 
-    public static double getActivationChance(SkillActivationType skillActivationType, SubSkillType subSkillType, Player player) {
+    public double getActivationChance(SkillActivationType skillActivationType, SubSkillType subSkillType, Player player) {
         switch (skillActivationType) {
             case RANDOM_LINEAR_100_SCALE_WITH_CAP:
                 return getRandomChanceExecutionSuccess(player, subSkillType, true);
@@ -57,7 +67,7 @@ public class RandomChanceUtil {
      *
      * @return true if the random chance succeeds
      */
-    public static boolean checkRandomChanceExecutionSuccess(Player player, PrimarySkillType primarySkillType, double chance) {
+    public boolean checkRandomChanceExecutionSuccess(Player player, PrimarySkillType primarySkillType, double chance) {
         //Check the odds
         chance *= 100;
 
@@ -70,7 +80,7 @@ public class RandomChanceUtil {
         return rollDice(chance, 10000);
     }
 
-    public static boolean rollDice(double chanceOfSuccess, int bound) {
+    public boolean rollDice(double chanceOfSuccess, int bound) {
         Random random = new Random();
 
         if (chanceOfSuccess > random.nextInt(bound))
@@ -85,14 +95,14 @@ public class RandomChanceUtil {
      * @param randomChance
      * @return
      */
-    public static boolean checkRandomChanceExecutionSuccess(RandomChanceSkillStatic randomChance) {
+    public boolean checkRandomChanceExecutionSuccess(RandomChanceSkillStatic randomChance) {
         double chanceOfSuccess = calculateChanceOfSuccess(randomChance);
 
         //Check the odds
         return rollDice(chanceOfSuccess, 100);
     }
 
-    public static boolean checkRandomChanceExecutionSuccess(RandomChanceSkill randomChance) {
+    public boolean checkRandomChanceExecutionSuccess(RandomChanceSkill randomChance) {
         double chanceOfSuccess = calculateChanceOfSuccess(randomChance);
 
         //Check the odds
@@ -100,25 +110,25 @@ public class RandomChanceUtil {
     }
 
 
-    /*public static double getRandomChanceExecutionChance(RandomChanceSkill randomChance)
+    /*public double getRandomChanceExecutionChance(RandomChanceSkill randomChance)
     {
         double chanceOfSuccess = calculateChanceOfSuccess(randomChance);
         return chanceOfSuccess;
     }*/
 
     /**
-     * Gets the Static Chance for something to activate
+     * Gets the Chance for something to activate
      *
      * @param randomChance
      * @return
      */
-    public static double getRandomChanceExecutionChance(RandomChanceExecution randomChance) {
+    public double getRandomChanceExecutionChance(RandomChanceExecution randomChance) {
         double chanceOfSuccess = getChanceOfSuccess(randomChance.getXPos(), randomChance.getProbabilityCap(), LINEAR_CURVE_VAR);
 
         return chanceOfSuccess;
     }
 
-    public static double getRandomChanceExecutionChance(RandomChanceStatic randomChance) {
+    public double getRandomChanceExecutionChance(RandomChanceStatic randomChance) {
         double chanceOfSuccess = getChanceOfSuccess(randomChance.getXPos(), randomChance.getProbabilityCap(), LINEAR_CURVE_VAR);
 
         chanceOfSuccess = addLuck(randomChance.isLucky(), chanceOfSuccess);
@@ -126,12 +136,12 @@ public class RandomChanceUtil {
         return chanceOfSuccess;
     }
 
-    /*private static double calculateChanceOfSuccess(RandomChanceStatic randomChance) {
+    /*private double calculateChanceOfSuccess(RandomChancerandomChance) {
         double chanceOfSuccess = getChanceOfSuccess(randomChance.getXPos(), randomChance.getProbabilityCap());
         return chanceOfSuccess;
     }*/
 
-    private static double calculateChanceOfSuccess(RandomChanceSkill randomChanceSkill) {
+    private double calculateChanceOfSuccess(RandomChanceSkill randomChanceSkill) {
         double skillLevel = randomChanceSkill.getSkillLevel();
         double maximumProbability = randomChanceSkill.getProbabilityCap();
         double maximumBonusLevel = randomChanceSkill.getMaximumBonusLevelCap();
@@ -152,7 +162,7 @@ public class RandomChanceUtil {
         return chanceOfSuccess;
     }
 
-    private static double calculateChanceOfSuccess(RandomChanceSkillStatic randomChance) {
+    private double calculateChanceOfSuccess(RandomChanceSkillStatic randomChance) {
         double chanceOfSuccess = getChanceOfSuccess(randomChance.getXPos(), 100, 100);
 
         //Add Luck
@@ -167,42 +177,42 @@ public class RandomChanceUtil {
      *
      * @return the chance of success from 0-100 (100 = guaranteed)
      */
-    private static int getChanceOfSuccess(double skillLevel, double maxProbability, double maxLevel) {
+    private int getChanceOfSuccess(double skillLevel, double maxProbability, double maxLevel) {
         //return (int) (x / (y / LINEAR_CURVE_VAR));
         return (int) (maxProbability * (skillLevel / maxLevel));
         // max probability * (weight/maxlevel) = chance of success
     }
 
-    private static int getChanceOfSuccess(double x, double y) {
+    private int getChanceOfSuccess(double x, double y) {
         return (int) (x / (y / LINEAR_CURVE_VAR));
         // max probability * (weight/maxlevel) = chance of success
     }
 
-    public static double getRandomChanceExecutionSuccess(Player player, SubSkillType subSkillType, boolean hasCap) {
-        RandomChanceSkill rcs = new RandomChanceSkill(player, subSkillType, hasCap);
+    public double getRandomChanceExecutionSuccess(Player player, SubSkillType subSkillType, boolean hasCap) {
+        RandomChanceSkill rcs = new RandomChanceSkill(pluginRef, player, subSkillType, hasCap);
         return calculateChanceOfSuccess(rcs);
     }
 
-    public static double getRandomStaticChanceExecutionSuccess(Player player, SubSkillType subSkillType) {
+    public double getRandomStaticChanceExecutionSuccess(Player player, SubSkillType subSkillType) {
         try {
-            return getRandomChanceExecutionChance(new RandomChanceSkillStatic(getStaticRandomChance(subSkillType), player, subSkillType));
+            return getRandomChanceExecutionChance(new RandomChanceSkillStatic(pluginRef, getStaticRandomChance(subSkillType), player, subSkillType));
         } catch (InvalidStaticChance invalidStaticChance) {
-            //Catch invalid static skills
+            //Catch invalid skills
             invalidStaticChance.printStackTrace();
         }
 
         return 0.1337; //Puts on shades
     }
 
-    public static boolean checkRandomChanceExecutionSuccess(Player player, SubSkillType subSkillType) {
-        return checkRandomChanceExecutionSuccess(new RandomChanceSkill(player, subSkillType));
+    public boolean checkRandomChanceExecutionSuccess(Player player, SubSkillType subSkillType) {
+        return checkRandomChanceExecutionSuccess(new RandomChanceSkill(pluginRef, player, subSkillType));
     }
 
-    public static boolean checkRandomStaticChanceExecutionSuccess(Player player, SubSkillType subSkillType) {
+    public boolean checkRandomStaticChanceExecutionSuccess(Player player, SubSkillType subSkillType) {
         try {
-            return checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(getStaticRandomChance(subSkillType), player, subSkillType));
+            return checkRandomChanceExecutionSuccess(new RandomChanceSkillStatic(pluginRef, getStaticRandomChance(subSkillType), player, subSkillType));
         } catch (InvalidStaticChance invalidStaticChance) {
-            //Catch invalid static skills
+            //Catch invalid skills
             invalidStaticChance.printStackTrace();
         }
 
@@ -210,36 +220,36 @@ public class RandomChanceUtil {
     }
 
     /**
-     * Grabs static activation rolls for Secondary Abilities
+     * Grabs activation rolls for Secondary Abilities
      *
      * @param subSkillType The secondary ability to grab properties of
-     * @return The static activation roll involved in the RNG calculation
-     * @throws InvalidStaticChance if the skill has no defined static chance this exception will be thrown and you should know you're a naughty boy
+     * @return The activation roll involved in the RNG calculation
+     * @throws InvalidStaticChance if the skill has no defined chance this exception will be thrown and you should know you're a naughty boy
      */
-    public static double getStaticRandomChance(SubSkillType subSkillType) throws InvalidStaticChance {
+    public double getStaticRandomChance(SubSkillType subSkillType) throws InvalidStaticChance {
         return pluginRef.getDynamicSettingsManager().getSkillPropertiesManager().getStaticChanceProperty(subSkillType);
     }
 
-    public static boolean sendSkillEvent(Player player, SubSkillType subSkillType, double activationChance) {
+    public boolean sendSkillEvent(Player player, SubSkillType subSkillType, double activationChance) {
         SubSkillRandomCheckEvent event = new SubSkillRandomCheckEvent(player, subSkillType, activationChance);
         return !event.isCancelled();
     }
 
-    /*public static boolean treasureDropSuccessful(Player player, double dropChance, int activationChance) {
+    /*public boolean treasureDropSuccessful(Player player, double dropChance, int activationChance) {
         SubSkillRandomCheckEvent event = new SubSkillRandomCheckEvent(player, SubSkillType.EXCAVATION_ARCHAEOLOGY, dropChance / activationChance);
         mcMMO.p.getServer().getPluginManager().callEvent(event);
         return (event.getChance() * activationChance) > (Misc.getRandom().nextDouble() * activationChance) && !event.isCancelled();
     }*/
 
-    public static boolean isActivationSuccessful(SkillActivationType skillActivationType, AbstractSubSkill abstractSubSkill, Player player) {
+    public boolean isActivationSuccessful(SkillActivationType skillActivationType, AbstractSubSkill abstractSubSkill, Player player) {
         return isActivationSuccessful(skillActivationType, abstractSubSkill.getSubSkillType(), player);
     }
 
-    public static String[] calculateAbilityDisplayValues(SkillActivationType skillActivationType, Player player, SubSkillType subSkillType) {
+    public String[] calculateAbilityDisplayValues(SkillActivationType skillActivationType, Player player, SubSkillType subSkillType) {
         double successChance = getActivationChance(skillActivationType, subSkillType, player);
         String[] displayValues = new String[2];
 
-        boolean isLucky = Permissions.lucky(player, subSkillType.getParentSkill());
+        boolean isLucky = Permissions.lucky(player, subSkillType.getParentSkill(pluginRef));
 
         displayValues[0] = percent.format(Math.min(successChance, 100.0D) / 100.0D);
         displayValues[1] = isLucky ? percent.format(Math.min(successChance * 1.3333D, 100.0D) / 100.0D) : null;
@@ -247,7 +257,7 @@ public class RandomChanceUtil {
         return displayValues;
     }
 
-    public static String[] calculateAbilityDisplayValuesStatic(Player player, PrimarySkillType primarySkillType, double chance) {
+    public String[] calculateAbilityDisplayValuesStatic(Player player, PrimarySkillType primarySkillType, double chance) {
         RandomChanceStatic rcs = new RandomChanceStatic(chance, false);
         double successChance = getRandomChanceExecutionChance(rcs);
 
@@ -264,14 +274,14 @@ public class RandomChanceUtil {
         return displayValues;
     }
 
-    public static String[] calculateAbilityDisplayValuesCustom(SkillActivationType skillActivationType, Player player, SubSkillType subSkillType, double multiplier) {
+    public String[] calculateAbilityDisplayValuesCustom(SkillActivationType skillActivationType, Player player, SubSkillType subSkillType, double multiplier) {
         double successChance = getActivationChance(skillActivationType, subSkillType, player);
         successChance *= multiplier; //Currently only used for graceful roll
         String[] displayValues = new String[2];
 
         //TODO: Account for lucky in this
 
-        boolean isLucky = Permissions.lucky(player, subSkillType.getParentSkill());
+        boolean isLucky = Permissions.lucky(player, subSkillType.getParentSkill(pluginRef));
 
         displayValues[0] = percent.format(Math.min(successChance, 100.0D) / 100.0D);
         displayValues[1] = isLucky ? percent.format(Math.min(successChance * 1.3333D, 100.0D) / 100.0D) : null;
@@ -279,14 +289,14 @@ public class RandomChanceUtil {
         return displayValues;
     }
 
-    public static double addLuck(Player player, PrimarySkillType primarySkillType, double chance) {
+    public double addLuck(Player player, PrimarySkillType primarySkillType, double chance) {
         if (Permissions.lucky(player, primarySkillType))
             return chance * 1.333D;
         else
             return chance;
     }
 
-    public static double addLuck(boolean isLucky, double chance) {
+    public double addLuck(boolean isLucky, double chance) {
         if (isLucky)
             return chance * 1.333D;
         else