Glitchfinder 12 лет назад
Родитель
Сommit
83888f80d4
30 измененных файлов с 191 добавлено и 107 удалено
  1. 47 7
      Changelog.txt
  2. 3 2
      README.creole
  3. 9 9
      src/main/java/com/gmail/nossr50/config/AdvancedConfig.java
  4. 1 1
      src/main/java/com/gmail/nossr50/listeners/BlockListener.java
  5. 5 6
      src/main/java/com/gmail/nossr50/listeners/EntityListener.java
  6. 1 1
      src/main/java/com/gmail/nossr50/listeners/PlayerListener.java
  7. 1 1
      src/main/java/com/gmail/nossr50/listeners/WorldListener.java
  8. 16 7
      src/main/java/com/gmail/nossr50/runnables/GreenThumbTimer.java
  9. 6 1
      src/main/java/com/gmail/nossr50/skills/acrobatics/Acrobatics.java
  10. 16 5
      src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java
  11. 1 1
      src/main/java/com/gmail/nossr50/skills/acrobatics/RollEventHandler.java
  12. 2 0
      src/main/java/com/gmail/nossr50/skills/archery/Archery.java
  13. 7 10
      src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java
  14. 1 0
      src/main/java/com/gmail/nossr50/skills/combat/Axes.java
  15. 25 11
      src/main/java/com/gmail/nossr50/skills/gathering/Herbalism.java
  16. 5 0
      src/main/java/com/gmail/nossr50/skills/gathering/WoodCutting.java
  17. 1 1
      src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java
  18. 1 1
      src/main/java/com/gmail/nossr50/skills/mining/Mining.java
  19. 8 11
      src/main/java/com/gmail/nossr50/skills/repair/Repair.java
  20. 2 0
      src/main/java/com/gmail/nossr50/skills/swords/Swords.java
  21. 7 7
      src/main/java/com/gmail/nossr50/skills/swords/SwordsManager.java
  22. 1 2
      src/main/java/com/gmail/nossr50/skills/taming/CallOfTheWildEventHandler.java
  23. 1 0
      src/main/java/com/gmail/nossr50/skills/taming/Taming.java
  24. 3 4
      src/main/java/com/gmail/nossr50/skills/taming/TamingManager.java
  25. 3 0
      src/main/java/com/gmail/nossr50/skills/unarmed/Unarmed.java
  26. 9 10
      src/main/java/com/gmail/nossr50/skills/unarmed/UnarmedManager.java
  27. 2 2
      src/main/java/com/gmail/nossr50/util/Combat.java
  28. 0 1
      src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java
  29. 5 4
      src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/PrimitiveChunkStore.java
  30. 2 2
      src/main/resources/advanced.yml

+ 47 - 7
Changelog.txt

@@ -10,34 +10,74 @@ Key:
 Version 1.3.13-dev
  + Added Craftbukkit 1.4.6 compatibility
  + Added a configurable durability cap for ArmorImpact to advanced.yml
- + Added version number to /mcmmo
+ + Added the version number to /mcmmo
+ + Added bats, giants, witches, withers, and wither skeletons to the mcMMO combat experience list, and makes their experience drops configurable
+ + Added the ability to track mobs spawned by mob spawners or the Taming ability when the chunks they are in unload and reload
+ + Added wooden button to the list of items that shouldn't trigger abilities
  = Fixed issue with missing default cases from several switch/case statements
  = Fixed issue with Mining using actual skill level rather than max skill level
  = Fixed some issues with static access
  = Fixed ItemStack deprecation issues
  = Fixed Async deprecation issues
- = Fixed some issues with mySQL databases (non-alphanumeric characters preventing MySQL)
- = Fixed skill commands displaying .x% instead of 0.x%
- = Fixed Unbreaking enchantments being ignored when using Treefelling and when hit by Armor Impact
+ = Fixed a bug with MySQL databases (non-alphanumeric characters preventing MySQL access)
+ = Fixed a bug where the /skillreset command was broken
+ = Fixed a bug where skill commands displaying .x% instead of 0.x%
+ = Fixed a bug Unbreaking enchantments being ignored when using Treefelling and when hit by Armor Impact
+ = Fixed a bug where only 1 diamond was needed to fully repair a broken item: Repaired the Repair skill!
+ = Fixed a bug where a infinite loop of errors caused by mySQL database could cause the server to crash
+ = Fixed a bug where PartyChangeEvent was fired even when a player isn't able to change parties
+ = Fixed a bug which caused advanced.yml not to work for Swords
+ = Fixed a bug which caused advanced.yml not to respect every MaxChance node
+ = Fixed a bug where GreenThumb_StageChange wasn't read from advanced.yml
+ = Fixed a bug where Repair would remove enchantments but the glow effect remained
+ = Fixed a bug where dropped items did not retain custom NBT data
+ = Fixed a bug which caused a potentially infinite recursion in a btree structure
+ = Fixed a NPE with custom blocks
  ! GJ stopped being a lazy slacker and got stuff done
+ ! Changed code that uses SpoutPlugin to make it compatible with the latest version
+ ! Changed Reimplemented skill level and power level caps.
  - Removed dead code relating to null profiles
  - Removed unused imports
 
 Version 1.3.12
  + Added Craftbukkit 1.4.5 compatibility
+ + Added the new 1.3.2 items, xp and double drops for Cocao beans & Emeralds, EnderChest to the list of blocks that shouldn't trigger abilities
  + Added new items from Minecraft 1.4 to Herbalism (potatoes & carrots)
+ + Added new configuration file for advanced users.
+ + Added new permission nodes to greenthumb for the 1.4 items
  + Added new mobs from Minecraft 1.4 checks for every ability
  + Added new active ability for Repair: Salvage
  + Added options to 'config.yml' configure shake chance
  + Added the option to negate experience earned for Herbalism while in a minecart to prevent afk leveling
  + Added Green thumb now converts cobble walls to mossy cobble walls
  + Added beacons and anvils to list of blocks that don't trigger abilities
+ + Added a configuration option to disable experience gains when in a minecraft for Acrobatics and Herbalism, to prevent AFK leveling
+ + Added a new passive ability for Fishing, Fishermans diet. Increases hunger restored from fish
+ + Added a feature to display all active perks on login
  ! Changed Fishing, Shake drops changed from guaranteed to based upon fishing level and perks
  ! Changed Woodcutting, the amount of experience earned when using Tree Feller on jungle trees has increased
+ ! Changed Herbalism double drop rates for melons and netherwart
  ! Changed filesystem usage, it's reduced a lot. Should help reduce lag on larger servers
- = Fixed Woodcutting bug, excessive null chunk before earning Woodcutting experience
- = Fixed a null pointer error related to skill cooldowns
- = Fixed more NPE ?? Needs better explanation
+ ! Changed database connection handling. Support for aggressive connection timeouts, with exponential backoff for multiple failures
+ ! Changed Cobblestone walls are now mossy-able with Greenthumb
+ ! Changed the skull drop rates of the shake ability to 3%
+ = Fixed a NPE when Citizens perform certain tasks
+ = Fixed a NPE with Woodcutting, excessive null chunk before earning Woodcutting experience
+ = Fixed a NPE related to skill cooldowns
+ = Fixed a NPE when a players profile was null
+ = Fixed a NPE involving certain explosions
+ = Fixed a dupe bug when for players who were using a 'nuker' client
+ = Fixed a dupe bug where pistons were used to dupe ores
+ = Fixed a dupe bug with Salvage when players were in Creative mode
+ = Fixed a bug where the player was displayed an incorrect cooldown time
+ = Fixed a bug where players could earn experience when they were dealing 0 damage
+ = Fixed a bug where players could get double drops from mossified Cobblestone
+ = Fixed a bug where Herablism magically converted potatoes to carrots
+ = Fixed a bug where you couldn't modify the stats of offline players
+ = Fixed a bug where treefeller didn't work properly on tree's with side-way logs
+ = Fixed a bug where the Arcane forging downgrade chance should've been 0, but actually wasn't
+ = Fixed a bug where Fishing would sometimes give items with empty enchantments
+ = Fixed a bug where the lucky perk for Fishing was actually an unlucky perk
  - Removed nothing
 
 Version 1.3.11

+ 3 - 2
README.creole

@@ -1,8 +1,8 @@
 == mcMMO
 **The RPG lovers mod**
 
-=== Forums
-http://forums.mcmmo.info Talk with developers and the community about mcMMO here
+=== Dev builds
+http://nuclearw.com:8080/job/mcMMO/ Download the latest dev build of mcMMO here.
 
 === Brief 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.
@@ -20,6 +20,7 @@ Hearing that people enjoy mcMMO and seeing the daily youtube videos about my mod
 
 Required Libraries:
 * Spout API
+* JUnit
 
 Required to Run:
 * Bukkit

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

@@ -99,17 +99,17 @@ public class AdvancedConfig extends ConfigLoader {
     public int getSuperRepairMaxLevel() { return config.getInt("Skills.Repair.SuperRepair_MaxBonusLevel", 1000); }
 
     /* SWORDS */
-    public int getBleedChanceMax() { return config.getInt("Skills.Sword.Bleed_ChanceMax", 75); }
-    public int getBleedMaxBonusLevel() { return config.getInt("Skills.Sword.Bleed_MaxBonusLevel", 750); }
-    public int getBleedMaxTicks() { return config.getInt("Skills.Sword.Bleed_MaxTicks", 3); }
-    public int getBleedBaseTicks() { return config.getInt("Skills.Sword.Bleed_BaseTicks", 2); }
+    public int getBleedChanceMax() { return config.getInt("Skills.Swords.Bleed_ChanceMax", 75); }
+    public int getBleedMaxBonusLevel() { return config.getInt("Skills.Swords.Bleed_MaxBonusLevel", 750); }
+    public int getBleedMaxTicks() { return config.getInt("Skills.Swords.Bleed_MaxTicks", 3); }
+    public int getBleedBaseTicks() { return config.getInt("Skills.Swords.Bleed_BaseTicks", 2); }
 
-    public int getCounterChanceMax() { return config.getInt("Skills.Sword.Counter_ChanceMax", 30); }
-    public int getCounterMaxBonusLevel() { return config.getInt("Skills.Sword.Counter_MaxBonusLevel", 600); }
-    public int getCounterModifier() { return config.getInt("Skills.Sword.Counter_DamageModifier", 2); }
+    public int getCounterChanceMax() { return config.getInt("Skills.Swords.Counter_ChanceMax", 30); }
+    public int getCounterMaxBonusLevel() { return config.getInt("Skills.Swords.Counter_MaxBonusLevel", 600); }
+    public int getCounterModifier() { return config.getInt("Skills.Swords.Counter_DamageModifier", 2); }
 
-    public int getSerratedStrikesModifier() { return config.getInt("Skills.Sword.SerratedStrikes_DamageModifier", 4); }
-    public int getSerratedStrikesTicks() { return config.getInt("Skills.Sword.SerratedStrikes_BleedTicks", 5); }
+    public int getSerratedStrikesModifier() { return config.getInt("Skills.Swords.SerratedStrikes_DamageModifier", 4); }
+    public int getSerratedStrikesTicks() { return config.getInt("Skills.Swords.SerratedStrikes_BleedTicks", 5); }
     /* TAMING */
     public int getGoreChanceMax() { return config.getInt("Skills.Taming.Gore_ChanceMax", 100); }
     public int getGoreMaxBonusLevel() { return config.getInt("Skills.Taming.Gore_MaxBonusLevel", 1000); }

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

@@ -30,7 +30,7 @@ import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent;
 import com.gmail.nossr50.runnables.StickyPistonTracker;
 import com.gmail.nossr50.skills.gathering.Excavation;
 import com.gmail.nossr50.skills.gathering.Herbalism;
-import com.gmail.nossr50.skills.gathering.Mining;
+import com.gmail.nossr50.skills.mining.Mining;
 import com.gmail.nossr50.skills.gathering.WoodCutting;
 import com.gmail.nossr50.skills.repair.Repair;
 import com.gmail.nossr50.skills.repair.Salvage;

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

@@ -23,7 +23,6 @@ import org.bukkit.event.entity.EntityExplodeEvent;
 import org.bukkit.event.entity.EntityTameEvent;
 import org.bukkit.event.entity.ExplosionPrimeEvent;
 import org.bukkit.event.entity.FoodLevelChangeEvent;
-import org.bukkit.metadata.FixedMetadataValue;
 
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.config.AdvancedConfig;
@@ -36,7 +35,7 @@ import com.gmail.nossr50.party.PartyManager;
 import com.gmail.nossr50.runnables.BleedTimer;
 import com.gmail.nossr50.skills.acrobatics.AcrobaticsManager;
 import com.gmail.nossr50.skills.archery.Archery;
-import com.gmail.nossr50.skills.gathering.BlastMining;
+import com.gmail.nossr50.skills.mining.BlastMining;
 import com.gmail.nossr50.skills.taming.TamingManager;
 import com.gmail.nossr50.util.Combat;
 import com.gmail.nossr50.util.Misc;
@@ -184,8 +183,8 @@ public class EntityListener implements Listener {
         entity.setFireTicks(0);
         BleedTimer.remove(entity);
         Archery.arrowRetrievalCheck(entity);
-        mcMMO.p.placeStore.removeSpawnedMob(((Entity) entity));
-        mcMMO.p.placeStore.removeSpawnedPet(((Entity) entity));
+        mcMMO.placeStore.removeSpawnedMob(((Entity) entity));
+        mcMMO.placeStore.removeSpawnedPet(((Entity) entity));
     }
 
     /**
@@ -198,7 +197,7 @@ public class EntityListener implements Listener {
         SpawnReason reason = event.getSpawnReason();
 
         if ((reason.equals(SpawnReason.SPAWNER) || reason.equals(SpawnReason.SPAWNER_EGG)) && !Config.getInstance().getExperienceGainsMobspawnersEnabled()) {
-            mcMMO.p.placeStore.addSpawnedMob(((Entity) event.getEntity()));
+            mcMMO.placeStore.addSpawnedMob(((Entity) event.getEntity()));
         }
     }
 
@@ -399,7 +398,7 @@ public class EntityListener implements Listener {
 
         if(player.hasMetadata("NPC")) return; // Check if this player is a Citizens NPC
 
-        if (Permissions.taming(player) && !mcMMO.p.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/PlayerListener.java

@@ -35,9 +35,9 @@ import com.gmail.nossr50.events.chat.McMMOPartyChatEvent;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.party.Party;
 import com.gmail.nossr50.runnables.BleedTimer;
-import com.gmail.nossr50.skills.gathering.BlastMining;
 import com.gmail.nossr50.skills.gathering.Fishing;
 import com.gmail.nossr50.skills.gathering.Herbalism;
+import com.gmail.nossr50.skills.mining.BlastMining;
 import com.gmail.nossr50.skills.repair.Salvage;
 import com.gmail.nossr50.skills.taming.TamingManager;
 import com.gmail.nossr50.util.BlockChecks;

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

@@ -51,6 +51,6 @@ public class WorldListener implements Listener {
     @EventHandler
     public void onChunkLoad(ChunkLoadEvent event) {
         if(event.getChunk().getEntities().length > 0)
-            mcMMO.p.placeStore.loadChunk(event.getChunk().getX(), event.getChunk().getZ(), event.getWorld());
+            mcMMO.placeStore.loadChunk(event.getChunk().getX(), event.getChunk().getZ(), event.getWorld());
     }
 }

+ 16 - 7
src/main/java/com/gmail/nossr50/runnables/GreenThumbTimer.java

@@ -4,11 +4,13 @@ import org.bukkit.CropState;
 import org.bukkit.Material;
 import org.bukkit.block.Block;
 
+import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.datatypes.AbilityType;
 import com.gmail.nossr50.datatypes.PlayerProfile;
 import com.gmail.nossr50.datatypes.SkillType;
 
 public class GreenThumbTimer implements Runnable {
+    AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
     private Block block;
     private PlayerProfile profile;
     private Material type;
@@ -24,19 +26,26 @@ public class GreenThumbTimer implements Runnable {
         if(this.block.getType() != this.type)
             this.block.setType(this.type);
 
+        int skillLevel = this.profile.getSkillLevel(SkillType.HERBALISM);
+
+    	final int STAGE_CHANGE = advancedConfig.getGreenThumbStageChange();
+
+        int greenThumbStage = (int) ((double) skillLevel / (double) STAGE_CHANGE);
+        if (greenThumbStage > 4) greenThumbStage = 4;
+
         switch(this.type) {
         case CROPS:
         case CARROT:
         case POTATO:
             //This replants the wheat at a certain stage in development based on Herbalism Skill
             if (!this.profile.getAbilityMode(AbilityType.GREEN_TERRA)) {
-                if (this.profile.getSkillLevel(SkillType.HERBALISM) >= 600) {
+                if (greenThumbStage == 3) {
                     this.block.setData(CropState.MEDIUM.getData());
                 }
-                else if (this.profile.getSkillLevel(SkillType.HERBALISM) >= 400) {
+                else if (greenThumbStage == 2) {
                     this.block.setData(CropState.SMALL.getData());
                 }
-                else if (this.profile.getSkillLevel(SkillType.HERBALISM) >= 200) {
+                else if (greenThumbStage == 1) {
                     this.block.setData(CropState.VERY_SMALL.getData());
                 }
                 else {
@@ -49,10 +58,10 @@ public class GreenThumbTimer implements Runnable {
             break;
         case NETHER_WARTS:
             if (!this.profile.getAbilityMode(AbilityType.GREEN_TERRA)) {
-                if (this.profile.getSkillLevel(SkillType.HERBALISM) >= 600) {
+                if (greenThumbStage == 3) {
                     this.block.setData((byte) 2);
                 }
-                else if (this.profile.getSkillLevel(SkillType.HERBALISM) >= 400) {
+                else if (greenThumbStage == 2) {
                     this.block.setData((byte) 1);
                 }
                 else {
@@ -65,10 +74,10 @@ public class GreenThumbTimer implements Runnable {
             break;
         case COCOA:
             if (!this.profile.getAbilityMode(AbilityType.GREEN_TERRA)) {
-                if (this.profile.getSkillLevel(SkillType.HERBALISM) >= 600) {
+                if (greenThumbStage == 3) {
                     this.block.setData((byte) ((this.block.getData() ^ ((byte) 0xc)) | ((byte) 4)));
                 }
-                else if (this.profile.getSkillLevel(SkillType.HERBALISM) >= 400) {
+                else if (greenThumbStage == 2) {
                     this.block.setData((byte) ((this.block.getData() ^ ((byte) 0xc)) | ((byte) 4)));
                 }
                 else {

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

@@ -6,12 +6,17 @@ import com.gmail.nossr50.config.AdvancedConfig;
 
 public class Acrobatics {
     static AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
+    public static final int DODGE_MAX_CHANCE = advancedConfig.getDodgeChanceMax();
     public static final int DODGE_MAX_BONUS_LEVEL = advancedConfig.getDodgeMaxBonusLevel();
     public static final int DODGE_XP_MODIFIER = advancedConfig.getDodgeXPModifier();
 
-    public static final int FALL_XP_MODIFIER = advancedConfig.getFallXPModifier();
+    public static final int ROLL_MAX_CHANCE = advancedConfig.getRollChanceMax();
     public static final int ROLL_MAX_BONUS_LEVEL = advancedConfig.getRollMaxBonusLevel();
+    public static final int GRACEFUL_MAX_CHANCE = advancedConfig.getGracefulRollChanceMax();
+    public static final int GRACEFUL_MAX_BONUS_LEVEL = advancedConfig.getGracefulRollMaxBonusLevel();
+
     public static final int ROLL_XP_MODIFIER = advancedConfig.getRollXPModifier();
+    public static final int FALL_XP_MODIFIER = advancedConfig.getFallXPModifier();
 
     private static Random random = new Random();
 

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

@@ -12,12 +12,13 @@ import com.gmail.nossr50.util.Users;
 public class AcrobaticsManager {
     private Player player;
     private PlayerProfile profile;
-    private int skillLevel;
+    private int skillLevel;
 
     public AcrobaticsManager (Player player) {
         this.player = player;
         this.profile = Users.getProfile(player);
         this.skillLevel = profile.getSkillLevel(SkillType.ACROBATICS);
+        this.permissionInstance = Permissions.getInstance();
     }
 
     /**
@@ -38,13 +39,20 @@ public class AcrobaticsManager {
 
         RollEventHandler eventHandler = new RollEventHandler(this, event);
 
-        int randomChance = 1000;
+        int randomChance = 100;
 
         if (Permissions.luckyAcrobatics(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
-        if (Acrobatics.getRandom().nextInt(randomChance) <= eventHandler.skillModifier && !eventHandler.isFatal(eventHandler.modifiedDamage)) {
+        float chance = (float) (((double) Acrobatics.ROLL_MAX_CHANCE / (double) Acrobatics.ROLL_MAX_BONUS_LEVEL) * skillLevel);
+        if (chance > Acrobatics.ROLL_MAX_CHANCE) chance = Acrobatics.ROLL_MAX_CHANCE;
+        if (eventHandler.isGraceful) {
+        	chance = (float) (((double) Acrobatics.GRACEFUL_MAX_CHANCE / (double) Acrobatics.GRACEFUL_MAX_BONUS_LEVEL) * skillLevel);
+        	if (chance > Acrobatics.GRACEFUL_MAX_CHANCE) chance = Acrobatics.GRACEFUL_MAX_CHANCE;
+        }
+
+        if (chance > Acrobatics.getRandom().nextInt(randomChance) && !eventHandler.isFatal(eventHandler.modifiedDamage)) {
             eventHandler.modifyEventDamage();
             eventHandler.sendAbilityMessage();
             eventHandler.processXPGain(eventHandler.damage * Acrobatics.ROLL_XP_MODIFIER);
@@ -69,13 +77,16 @@ public class AcrobaticsManager {
 
         DodgeEventHandler eventHandler = new DodgeEventHandler(this, event);
 
-        int randomChance = 4000;
+        int randomChance = 100;
 
         if (Permissions.luckyAcrobatics(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
-        if (Acrobatics.getRandom().nextInt(randomChance) <= eventHandler.skillModifier && !eventHandler.isFatal(eventHandler.modifiedDamage)) {
+        float chance = (float) (((double) Acrobatics.DODGE_MAX_CHANCE / (double) Acrobatics.DODGE_MAX_BONUS_LEVEL) * skillLevel);
+        if (chance > Acrobatics.DODGE_MAX_CHANCE) chance = Acrobatics.DODGE_MAX_CHANCE;
+
+        if (chance > Acrobatics.getRandom().nextInt(randomChance) && !eventHandler.isFatal(eventHandler.modifiedDamage)) {
             eventHandler.modifyEventDamage();
             eventHandler.sendAbilityMessage();
             eventHandler.processXPGain(eventHandler.damage * Acrobatics.DODGE_XP_MODIFIER);

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

@@ -9,7 +9,7 @@ import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.Skills;
 
 public class RollEventHandler extends AcrobaticsEventHandler {
-    private boolean isGraceful;
+    public boolean isGraceful;
     private int damageThreshold;
 
     protected RollEventHandler(AcrobaticsManager manager, EntityDamageEvent event) {

+ 2 - 0
src/main/java/com/gmail/nossr50/skills/archery/Archery.java

@@ -18,12 +18,14 @@ public class Archery {
     private static List<TrackedEntity> trackedEntities = new ArrayList<TrackedEntity>();
 
     public static final int ARROW_TRACKING_MAX_BONUS_LEVEL = advancedConfig.getRetrieveMaxBonusLevel();
+    public static final int ARROW_TRACKING_MAX_BONUS = advancedConfig.getRetrieveBonusMax();
 
     public static final int BONUS_DAMAGE_INCREASE_LEVEL = advancedConfig.getSkillShotIncreaseLevel();
     public static final double BONUS_DAMAGE_INCREASE_PERCENT = advancedConfig.getSkillShotIncreasePercentage();
     public static final double BONUS_DAMAGE_MAX_BONUS_PERCENTAGE = advancedConfig.getSkillShotBonusMax();
 
     public static final int DAZE_MAX_BONUS_LEVEL = advancedConfig.getDazeMaxBonusLevel();
+    public static final int DAZE_MAX_BONUS = advancedConfig.getDazeBonusMax();
     public static final int DAZE_MODIFIER = advancedConfig.getDazeModifier();
 
     protected static void incrementTrackerValue(LivingEntity livingEntity) {

+ 7 - 10
src/main/java/com/gmail/nossr50/skills/archery/ArcheryManager.java

@@ -4,24 +4,16 @@ import org.bukkit.entity.LivingEntity;
 import org.bukkit.entity.Player;
 import org.bukkit.event.entity.EntityDamageEvent;
 
-import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.datatypes.PlayerProfile;
 import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.util.Permissions;
 import com.gmail.nossr50.util.Users;
 
 public class ArcheryManager {
-    AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
-
     private Player player;
     private PlayerProfile profile;
     private int skillLevel;
 
-    private float dazeBonusMax = advancedConfig.getDazeBonusMax();
-    private float dazeMaxBonusLevel = advancedConfig.getDazeMaxBonusLevel();
-    private float retrieveBonusMax = advancedConfig.getRetrieveBonusMax();
-    private float retrieveMaxBonusLevel = advancedConfig.getRetrieveMaxBonusLevel();
-
     public ArcheryManager (Player player) {
         this.player = player;
         this.profile = Users.getProfile(player);
@@ -52,7 +44,10 @@ public class ArcheryManager {
         if (Permissions.luckyArchery(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
-        final float chance = (float) (((double) retrieveBonusMax / (double) retrieveMaxBonusLevel) * skillLevel);
+
+        float chance = (float) (((double) Archery.ARROW_TRACKING_MAX_BONUS / (double) Archery.ARROW_TRACKING_MAX_BONUS_LEVEL) * skillLevel);
+        if (chance > Archery.ARROW_TRACKING_MAX_BONUS) chance = Archery.ARROW_TRACKING_MAX_BONUS;
+
         if (chance > Archery.getRandom().nextInt(randomChance)) {
             eventHandler.addToTracker();
         }
@@ -80,7 +75,9 @@ public class ArcheryManager {
             randomChance = (int) (randomChance * 0.75);
         }
 
-        final float chance = (float) (((double) dazeBonusMax / (double) dazeMaxBonusLevel) * skillLevel);
+        float chance = (float) (((double) Archery.DAZE_MAX_BONUS / (double) Archery.DAZE_MAX_BONUS_LEVEL) * skillLevel);
+        if (chance > Archery.DAZE_MAX_BONUS) chance = Archery.DAZE_MAX_BONUS;
+
         if (chance > Archery.getRandom().nextInt(randomChance)) {
             eventHandler.handleDazeEffect();
             eventHandler.sendAbilityMessages();

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

@@ -89,6 +89,7 @@ public class Axes {
 
         int randomChance = 100;
         double chance = (MAX_CHANCE / MAX_BONUS_LEVEL) * skillCheck;
+        if (chance > MAX_CHANCE) chance = MAX_CHANCE;
 
         if (Permissions.luckyAxes(attacker)) {
             randomChance = (int) (randomChance * 0.75);

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

@@ -13,6 +13,7 @@ import org.bukkit.inventory.PlayerInventory;
 import org.bukkit.material.MaterialData;
 
 import com.gmail.nossr50.mcMMO;
+import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.mods.CustomBlocksConfig;
 import com.gmail.nossr50.datatypes.AbilityType;
@@ -30,6 +31,7 @@ import com.gmail.nossr50.util.Users;
 public class Herbalism {
 
     private static Random random = new Random();
+    static AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
 
     /**
      * Activate the Green Terra ability.
@@ -85,7 +87,8 @@ public class Herbalism {
             return;
 
         final PlayerProfile profile = Users.getProfile(player);
-        final int MAX_BONUS_LEVEL = 1000;
+        final double MAX_CHANCE = advancedConfig.getHerbalismDoubleDropsChanceMax();
+        final int MAX_BONUS_LEVEL = advancedConfig.getHerbalismDoubleDropsMaxLevel();
 
         int herbLevel = profile.getSkillLevel(SkillType.HERBALISM);
         int id = block.getTypeId();
@@ -101,12 +104,15 @@ public class Herbalism {
 
         boolean customPlant = false;
 
-        int randomChance = 1000;
+        int randomChance = 100;
 
         if (Permissions.luckyHerbalism(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
+        float chance = (float) (((double) MAX_CHANCE / (double) MAX_BONUS_LEVEL) * herbLevel);
+        if (chance > MAX_CHANCE) chance = (float) MAX_CHANCE;
+
         switch (type) {
         case BROWN_MUSHROOM:
         case RED_MUSHROOM:
@@ -122,7 +128,7 @@ public class Herbalism {
                 if (b.getType().equals(Material.CACTUS)) {
                     mat = Material.CACTUS;
                     if (!mcMMO.placeStore.isTrue(b)) {
-                        if (herbLevel > MAX_BONUS_LEVEL || random.nextInt(randomChance) <= herbLevel) {
+                    	if (chance > random.nextInt(randomChance)) {
                             catciDrops++;
                         }
                         xp += Config.getInstance().getHerbalismXPCactus();
@@ -182,7 +188,7 @@ public class Herbalism {
                 if (b.getType().equals(Material.SUGAR_CANE_BLOCK)) {
                     mat = Material.SUGAR_CANE;
                     if (!mcMMO.placeStore.isTrue(b)) {
-                        if (herbLevel > MAX_BONUS_LEVEL || random.nextInt(randomChance) <= herbLevel) {
+                    	if (chance > random.nextInt(randomChance)) {
                             caneDrops++;
                         }
                         xp += Config.getInstance().getHerbalismXPSugarCane();
@@ -275,7 +281,7 @@ public class Herbalism {
                 }
             }
 
-            if (herbLevel > MAX_BONUS_LEVEL || random.nextInt(randomChance) <= herbLevel) {
+            if (chance > random.nextInt(randomChance)) {
                 Config configInstance = Config.getInstance();
 
                 switch (type) {
@@ -399,7 +405,8 @@ public class Herbalism {
      * @param plugin mcMMO plugin instance
      */
     private static void greenThumbWheat(Block block, Player player, BlockBreakEvent event, mcMMO plugin) {
-        final int MAX_BONUS_LEVEL = 1500;
+    	final int MAX_CHANCE = advancedConfig.getGreenThumbChanceMax();
+    	final int MAX_BONUS_LEVEL = advancedConfig.getGreenThumbMaxLevel();
 
         PlayerProfile profile = Users.getProfile(player);
         int herbLevel = profile.getSkillLevel(SkillType.HERBALISM);
@@ -429,13 +436,16 @@ public class Herbalism {
             break;
         }
 
-        int randomChance = 1500;
+        int randomChance = 100;
 
         if (Permissions.luckyHerbalism(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
-        if (hasSeeds && profile.getAbilityMode(AbilityType.GREEN_TERRA) || hasSeeds && (herbLevel > MAX_BONUS_LEVEL || random.nextInt(randomChance) <= herbLevel)) {
+        float chance = (float) (((double) MAX_CHANCE / (double) MAX_BONUS_LEVEL) * herbLevel);
+        if (chance > MAX_CHANCE) chance = (float) MAX_CHANCE;
+
+        if (hasSeeds && profile.getAbilityMode(AbilityType.GREEN_TERRA) || hasSeeds && (chance > random.nextInt(randomChance))) {
             event.setCancelled(true);
 
             switch(type) {
@@ -481,7 +491,8 @@ public class Herbalism {
      * @param block The block being used in the ability
      */
     public static void greenThumbBlocks(ItemStack is, Player player, Block block) {
-        final int MAX_BONUS_LEVEL = 1500;
+    	final int MAX_CHANCE = advancedConfig.getGreenThumbChanceMax();
+    	final int MAX_BONUS_LEVEL = advancedConfig.getGreenThumbMaxLevel();
 
         PlayerProfile profile = Users.getProfile(player);
         int skillLevel = profile.getSkillLevel(SkillType.HERBALISM);
@@ -489,13 +500,16 @@ public class Herbalism {
 
         player.setItemInHand(new ItemStack(Material.SEEDS, seeds - 1));
 
-        int randomChance = 1500;
+        int randomChance = 100;
 
         if (Permissions.luckyHerbalism(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
-        if (skillLevel > MAX_BONUS_LEVEL || random.nextInt(randomChance) <= skillLevel) {
+        float chance = (float) (((double) MAX_CHANCE / (double) MAX_BONUS_LEVEL) * skillLevel);
+        if (chance > MAX_CHANCE) chance = (float) MAX_CHANCE;
+
+        if (chance > random.nextInt(randomChance)) {
             greenTerraConvert(player, block);
         }
         else {

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

@@ -84,6 +84,8 @@ public class WoodCutting {
                 if (health >= 2) {
                     Combat.dealDamage(player, random.nextInt(health - 1));
                 }
+                inHand.setDurability((short) (inHand.getType().getMaxDurability()));
+                return;
             }
         }
         else if ((inHand.getDurability() + durabilityLoss >= inHand.getType().getMaxDurability()) || inHand.getType().equals(Material.AIR)) {
@@ -94,6 +96,8 @@ public class WoodCutting {
             if (health >= 2) {
                 Combat.dealDamage(player, random.nextInt(health - 1));
             }
+            inHand.setDurability((short) (inHand.getType().getMaxDurability()));
+            return;
         }
 
         /* Damage the tool */
@@ -352,6 +356,7 @@ public class WoodCutting {
 
         int randomChance = 100;
         int chance = (int) (((double) MAX_CHANCE / (double) MAX_BONUS_LEVEL) * skillLevel);
+        if (chance > MAX_CHANCE) chance = MAX_CHANCE;
 
         if (Permissions.luckyWoodcutting(player)) {
             randomChance = (int) (randomChance * 0.75);

+ 1 - 1
src/main/java/com/gmail/nossr50/skills/gathering/BlastMining.java → src/main/java/com/gmail/nossr50/skills/mining/BlastMining.java

@@ -1,4 +1,4 @@
-package com.gmail.nossr50.skills.gathering;
+package com.gmail.nossr50.skills.mining;
 
 import java.util.ArrayList;
 import java.util.HashSet;

+ 1 - 1
src/main/java/com/gmail/nossr50/skills/gathering/Mining.java → src/main/java/com/gmail/nossr50/skills/mining/Mining.java

@@ -1,4 +1,4 @@
-package com.gmail.nossr50.skills.gathering;
+package com.gmail.nossr50.skills.mining;
 
 import java.util.Random;
 

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

@@ -30,10 +30,10 @@ public class Repair {
 
     static AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
 
-    private static int repairMasteryChanceMax = advancedConfig.getRepairMasteryChanceMax();
-    private static int repairMasteryMaxBonusLevel = advancedConfig.getRepairMasteryMaxLevel();
-    private static int superRepairChanceMax = advancedConfig.getSuperRepairChanceMax();
-    private static int superRepairMaxBonusLevel = advancedConfig.getSuperRepairMaxLevel();
+    public static final int REPAIR_MASTERY_CHANCE_MAX = advancedConfig.getRepairMasteryChanceMax();
+    public static final int REPAIR_MASTERY_MAX_BONUS_LEVEL = advancedConfig.getRepairMasteryMaxLevel();
+    public static final int SUPER_REPAIR_CHANCE_MAX = advancedConfig.getSuperRepairChanceMax();
+    public static final int SUPER_REPAIR_MAX_BONUS_LEVEL = advancedConfig.getSuperRepairMaxLevel();
 
     /**
      * Handle the XP gain for repair events.
@@ -240,8 +240,8 @@ public class Repair {
      */
     protected static short repairCalculate(Player player, int skillLevel, short durability, int repairAmount) {
         float  bonus;
-        if(skillLevel >= repairMasteryMaxBonusLevel) bonus = ((float) repairMasteryChanceMax / 100F);
-        else bonus = (((float) skillLevel) / ((float) repairMasteryMaxBonusLevel)) * (((float) repairMasteryChanceMax) / 100F);
+        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 (Permissions.repairMastery(player)) {
             bonus = (((float) repairAmount) * bonus);
@@ -271,14 +271,11 @@ public class Repair {
      * @return true if bonus granted, false otherwise
      */
     public static boolean checkPlayerProcRepair(Player player) {
-        final int MAX_CHANCE = superRepairChanceMax;
-        final int MAX_BONUS_LEVEL = superRepairMaxBonusLevel;
-
         int skillLevel = Users.getProfile(player).getSkillLevel(SkillType.REPAIR);
 
         int randomChance = 100;
-        int chance = (int) (((double) MAX_CHANCE / (double) MAX_BONUS_LEVEL) * skillLevel);
-        if (skillLevel >= MAX_BONUS_LEVEL) chance = MAX_CHANCE;
+        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 (Permissions.luckyRepair(player)) randomChance = (int) (randomChance * 0.75);
 

+ 2 - 0
src/main/java/com/gmail/nossr50/skills/swords/Swords.java

@@ -7,10 +7,12 @@ import com.gmail.nossr50.config.AdvancedConfig;
 public class Swords {
     static AdvancedConfig advancedConfig = AdvancedConfig.getInstance();
 
+    public static final int BLEED_CHANCE_MAX = AdvancedConfig.getInstance().getBleedChanceMax();
     public static final int BLEED_MAX_BONUS_LEVEL = advancedConfig.getBleedMaxBonusLevel();
     public static final int MAX_BLEED_TICKS = advancedConfig.getBleedMaxTicks();
     public static final int BASE_BLEED_TICKS = advancedConfig.getBleedBaseTicks();
 
+    public static final int COUNTER_ATTACK_CHANCE_MAX = advancedConfig.getCounterChanceMax();
     public static final int COUNTER_ATTACK_MAX_BONUS_LEVEL = advancedConfig.getCounterMaxBonusLevel();
     public static final int COUNTER_ATTACK_MODIFIER = advancedConfig.getCounterModifier();
 

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

@@ -3,7 +3,6 @@ package com.gmail.nossr50.skills.swords;
 import org.bukkit.entity.LivingEntity;
 import org.bukkit.entity.Player;
 
-import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.datatypes.PlayerProfile;
 import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.util.Combat;
@@ -37,15 +36,15 @@ public class SwordsManager {
         if (Combat.shouldBeAffected(player, defender)) {
             BleedEventHandler eventHandler = new BleedEventHandler(this, defender);
 
-            int bleedChanceMax = AdvancedConfig.getInstance().getBleedChanceMax();
-            int bleedMaxLevel = AdvancedConfig.getInstance().getBleedMaxBonusLevel();
             int randomChance = 100;
 
             if (Permissions.luckySwords(player)) {
                 randomChance = (int) (randomChance * 0.75);
             }
 
-            final float chance = (float) (((double) bleedChanceMax / (double) bleedMaxLevel) * skillLevel);
+            float chance = (float) (((double) Swords.BLEED_CHANCE_MAX / (double) Swords.BLEED_MAX_BONUS_LEVEL) * skillLevel);
+            if (chance > Swords.BLEED_CHANCE_MAX) chance = Swords.BLEED_CHANCE_MAX;
+
             if (chance > Swords.getRandom().nextInt(randomChance)) {
                 eventHandler.addBleedTicks();
                 eventHandler.sendAbilityMessages();
@@ -65,15 +64,16 @@ public class SwordsManager {
 
         if (eventHandler.isHoldingSword()) {
             eventHandler.calculateSkillModifier();
-            int counterChanceMax = AdvancedConfig.getInstance().getCounterChanceMax();
-            int counterMaxLevel = AdvancedConfig.getInstance().getCounterMaxBonusLevel();
+
             int randomChance = 100;
 
             if (Permissions.luckySwords(player)) {
                 randomChance = (int) (randomChance * 0.75);
             }
 
-            final float chance = (float) (((double) counterChanceMax / (double) counterMaxLevel) * skillLevel);
+            float chance = (float) (((double) Swords.COUNTER_ATTACK_CHANCE_MAX / (double) Swords.COUNTER_ATTACK_MAX_BONUS_LEVEL) * skillLevel);
+            if (chance > Swords.COUNTER_ATTACK_CHANCE_MAX) chance = Swords.COUNTER_ATTACK_CHANCE_MAX;
+
             if (chance > Swords.getRandom().nextInt(randomChance)) {
                 eventHandler.dealDamage();
                 eventHandler.sendAbilityMessages();

+ 1 - 2
src/main/java/com/gmail/nossr50/skills/taming/CallOfTheWildEventHandler.java

@@ -9,7 +9,6 @@ import org.bukkit.entity.Ocelot;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Tameable;
 import org.bukkit.inventory.ItemStack;
-import org.bukkit.metadata.FixedMetadataValue;
 
 import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.locale.LocaleLoader;
@@ -68,7 +67,7 @@ public class CallOfTheWildEventHandler {
             return;
 
         LivingEntity entity = (LivingEntity) player.getWorld().spawnEntity(player.getLocation(), type);
-        mcMMO.p.placeStore.addSpawnedPet((Entity) entity);
+        mcMMO.placeStore.addSpawnedPet((Entity) entity);
 
         ((Tameable) entity).setOwner(player);
 

+ 1 - 0
src/main/java/com/gmail/nossr50/skills/taming/Taming.java

@@ -12,6 +12,7 @@ public class Taming {
     public static final int FAST_FOOD_SERVICE_ACTIVATION_CHANCE = advancedConfig.getFastFoodChance();
     public static final int FAST_FOOD_SERVICE_ACTIVATION_LEVEL = advancedConfig.getFastFoodUnlock();
 
+    public static final int GORE_CHANCE_MAX = AdvancedConfig.getInstance().getGoreChanceMax();
     public static final int GORE_BLEED_TICKS = advancedConfig.getGoreBleedTicks();
     public static final int GORE_MAX_BONUS_LEVEL = advancedConfig.getGoreMaxBonusLevel();
     public static final int GORE_MULTIPLIER = advancedConfig.getGoreModifier();

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

@@ -8,7 +8,6 @@ import org.bukkit.event.entity.EntityDamageEvent;
 import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
 import org.bukkit.inventory.ItemStack;
 
-import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.PlayerProfile;
 import com.gmail.nossr50.datatypes.SkillType;
@@ -92,15 +91,15 @@ public class TamingManager {
 
         GoreEventHandler eventHandler = new GoreEventHandler(this, event);
 
-        int goreChanceMax = AdvancedConfig.getInstance().getGoreChanceMax();
-        int goreMaxLevel = AdvancedConfig.getInstance().getGoreMaxBonusLevel();
         int randomChance = 100;
 
         if (Permissions.luckyTaming(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
-        final float chance = (float) (((double) goreChanceMax / (double) goreMaxLevel) * skillLevel);
+        float chance = (float) (((double) Taming.GORE_CHANCE_MAX / (double) Taming.GORE_MAX_BONUS_LEVEL) * skillLevel);
+        if (chance > Taming.GORE_CHANCE_MAX) chance = Taming.GORE_CHANCE_MAX;
+
         if (chance > Taming.getRandom().nextInt(randomChance)) {
             eventHandler.modifyEventDamage();
             eventHandler.applyBleed();

+ 3 - 0
src/main/java/com/gmail/nossr50/skills/unarmed/Unarmed.java

@@ -9,10 +9,13 @@ public class Unarmed {
 
     public static final int BONUS_DAMAGE_MAX_BONUS_MODIFIER = advancedConfig.getIronArmBonus();
     public static final int BONUS_DAMAGE_INCREASE_LEVEL = advancedConfig.getIronArmIncreaseLevel();
+
     public static final int DEFLECT_MAX_CHANCE = advancedConfig.getDisarmChanceMax() ;
     public static final int DEFLECT_MAX_BONUS_LEVEL = advancedConfig.getDisarmMaxBonusLevel();
+
     public static final int DISARM_MAX_CHANCE = advancedConfig.getDeflectChanceMax();
     public static final int DISARM_MAX_BONUS_LEVEL = advancedConfig.getDeflectMaxBonusLevel();
+
     public static final int IRON_GRIP_MAX_CHANCE = advancedConfig.getIronGripChanceMax();
     public static final int IRON_GRIP_MAX_BONUS_LEVEL = advancedConfig.getIronGripMaxBonusLevel();
 

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

@@ -3,7 +3,6 @@ package com.gmail.nossr50.skills.unarmed;
 import org.bukkit.entity.Player;
 import org.bukkit.event.entity.EntityDamageEvent;
 
-import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.datatypes.PlayerProfile;
 import com.gmail.nossr50.datatypes.SkillType;
 import com.gmail.nossr50.util.Permissions;
@@ -38,15 +37,15 @@ public class UnarmedManager {
         if (eventHandler.isHoldingItem()) {
             eventHandler.calculateSkillModifier();
 
-            int disarmChanceMax = AdvancedConfig.getInstance().getDisarmChanceMax();
-            int disarmMaxLevel = AdvancedConfig.getInstance().getDisarmMaxBonusLevel();
             int randomChance = 100;
 
             if (Permissions.luckyUnarmed(player)) {
                 randomChance = (int) (randomChance * 0.75);
             }
 
-            final float chance = (float) (((double) disarmChanceMax / (double) disarmMaxLevel) * skillLevel);
+            float chance = (float) (((double) Unarmed.DISARM_MAX_CHANCE / (double) Unarmed.DISARM_MAX_BONUS_LEVEL) * skillLevel);
+            if (chance > Unarmed.DISARM_MAX_CHANCE) chance = Unarmed.DISARM_MAX_CHANCE;
+
             if (chance > Unarmed.getRandom().nextInt(randomChance)) {
                 if (!hasIronGrip(defender)) {
                     eventHandler.sendAbilityMessage();
@@ -72,15 +71,15 @@ public class UnarmedManager {
 
         DeflectEventHandler eventHandler = new DeflectEventHandler(this, event);
 
-        int deflectChanceMax = AdvancedConfig.getInstance().getDeflectChanceMax();
-        int deflectMaxLevel = AdvancedConfig.getInstance().getDeflectMaxBonusLevel();
         int randomChance = 100;
 
         if (Permissions.luckyUnarmed(player)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
-        final float chance = (float) (((double) deflectChanceMax / (double) deflectMaxLevel) * skillLevel);
+        float chance = (float) (((double) Unarmed.DEFLECT_MAX_CHANCE / (double) Unarmed.DEFLECT_MAX_BONUS_LEVEL) * skillLevel);
+        if (chance > Unarmed.DEFLECT_MAX_CHANCE) chance = Unarmed.DEFLECT_MAX_CHANCE;
+
         if (chance > Unarmed.getRandom().nextInt(randomChance)) {
             eventHandler.cancelEvent();
             eventHandler.sendAbilityMessage();
@@ -122,15 +121,15 @@ public class UnarmedManager {
 
         IronGripEventHandler eventHandler = new IronGripEventHandler(this, defender);
 
-        int ironGripChanceMax = AdvancedConfig.getInstance().getIronGripChanceMax();
-        int ironGripMaxLevel = AdvancedConfig.getInstance().getIronGripMaxBonusLevel();
         int randomChance = 100;
 
         if (Permissions.luckyUnarmed(defender)) {
             randomChance = (int) (randomChance * 0.75);
         }
 
-        final float chance = (float) (((double) ironGripChanceMax / (double) ironGripMaxLevel) * skillLevel);
+        float chance = (float) (((double) Unarmed.IRON_GRIP_MAX_CHANCE / (double) Unarmed.IRON_GRIP_MAX_BONUS_LEVEL) * skillLevel);
+        if (chance > Unarmed.IRON_GRIP_MAX_CHANCE) chance = Unarmed.IRON_GRIP_MAX_CHANCE;
+
         if (chance > Unarmed.getRandom().nextInt(randomChance)) {
             eventHandler.sendAbilityMessages();
             return true;

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

@@ -398,8 +398,8 @@ public class Combat {
                 baseXP = 20 * configInstance.getPlayerVersusPlayerXP();
             }
         }
-        else if (!mcMMO.p.placeStore.isSpawnedMob(((Entity) target))) {
-            if (target instanceof Animals && !mcMMO.p.placeStore.isSpawnedPet((Entity) target)) {
+        else if (!mcMMO.placeStore.isSpawnedMob(((Entity) target))) {
+            if (target instanceof Animals && !mcMMO.placeStore.isSpawnedPet((Entity) target)) {
                 baseXP = configInstance.getAnimalsXP();
             }
             else {

+ 0 - 1
src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java

@@ -19,7 +19,6 @@ import org.bukkit.block.Block;
 import org.bukkit.entity.Entity;
 import org.bukkit.entity.LivingEntity;
 
-import com.gmail.nossr50.mcMMO;
 import com.gmail.nossr50.runnables.ChunkletUnloader;
 import com.gmail.nossr50.runnables.blockstoreconversion.BlockStoreConversionZDirectory;
 

+ 5 - 4
src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/PrimitiveChunkStore.java

@@ -22,8 +22,8 @@ public class PrimitiveChunkStore implements ChunkStore {
     private int cx;
     private int cz;
     private UUID worldUid;
-    private List spawnedMobs = new ArrayList<UUID>();
-    private List spawnedPets = new ArrayList<UUID>();
+    private List<UUID> spawnedMobs = new ArrayList<UUID>();
+    private List<UUID> spawnedPets = new ArrayList<UUID>();
     transient private int worldHeight;
     transient private int xBitShifts;
     transient private int zBitShifts;
@@ -214,8 +214,9 @@ public class PrimitiveChunkStore implements ChunkStore {
         }
 
         if(fileVersionNumber >= 6) {
-            spawnedMobs = (ArrayList) in.readObject();
-            spawnedPets = (ArrayList) in.readObject();
+            //What do we want to do about this? These casts are unchecked.
+            spawnedMobs = (ArrayList<UUID>) in.readObject();
+            spawnedPets = (ArrayList<UUID>) in.readObject();
         }
     }
 

+ 2 - 2
src/main/resources/advanced.yml

@@ -77,8 +77,8 @@ Skills:
         Bleed_MaxBonusLevel: 750
         Bleed_MaxTicks: 3
         Bleed_BaseTicks: 2
-        CounterAttack_ChanceMax: 30
-        CounterAttack_MaxBonusLevel: 600
+        Counter_ChanceMax: 30
+        Counter_MaxBonusLevel: 600
         Counter_DamageModifier: 2
         SerratedStrikes_DamageModifier: 4
         SerratedStrikes_BleedTicks: 5