Переглянути джерело

Added ability to configure drops from Shake in treasures.yml

GJ 12 роки тому
батько
коміт
875091a1ce

+ 1 - 0
Changelog.txt

@@ -8,6 +8,7 @@ Key:
   - Removal
   
 Version 1.4.06-dev
+ + Added ability to configure drops from Shake in treasures.yml
  + Added "Master Angler" ability to Fishing.
  + Added health display for mobs during combat.
  + Added new API method to McMMOPlayerLevelUpEvent to set levels gained

+ 166 - 4
src/main/java/com/gmail/nossr50/config/treasure/TreasureConfig.java

@@ -9,13 +9,17 @@ import java.util.Set;
 
 import org.bukkit.Material;
 import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.entity.EntityType;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.material.MaterialData;
+import org.bukkit.potion.Potion;
+import org.bukkit.potion.PotionType;
 
 import com.gmail.nossr50.config.ConfigLoader;
 import com.gmail.nossr50.datatypes.treasure.ExcavationTreasure;
 import com.gmail.nossr50.datatypes.treasure.FishingTreasure;
 import com.gmail.nossr50.datatypes.treasure.HylianTreasure;
+import com.gmail.nossr50.datatypes.treasure.ShakeTreasure;
 import com.gmail.nossr50.datatypes.treasure.Treasure;
 
 public class TreasureConfig extends ConfigLoader {
@@ -33,6 +37,27 @@ public class TreasureConfig extends ConfigLoader {
     public List<HylianTreasure> hylianFromFlowers = new ArrayList<HylianTreasure>();
     public List<HylianTreasure> hylianFromPots    = new ArrayList<HylianTreasure>();
 
+    public List<ShakeTreasure> shakeFromBlaze       = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromCaveSpider  = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromSpider      = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromChicken     = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromCow         = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromCreeper     = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromEnderman    = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromGhast       = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromIronGolem   = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromMagmaCube   = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromMushroomCow = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromPig         = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromPigZombie   = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromSheep       = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromSkeleton    = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromSlime       = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromSnowman     = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromSquid       = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromWitch       = new ArrayList<ShakeTreasure>();
+    public List<ShakeTreasure> shakeFromZombie      = new ArrayList<ShakeTreasure>();
+
     public List<FishingTreasure> fishingRewards = new ArrayList<FishingTreasure>();
 
     private TreasureConfig() {
@@ -129,14 +154,31 @@ public class TreasureConfig extends ConfigLoader {
             }
 
             /*
-             * Drops From & Max Level
+             * Potions
              */
 
-            ItemStack item = (new MaterialData(id, (byte) data)).toItemStack(amount);
+            ItemStack item = null;
+
+            if (config.contains("Treasures." + treasureName + ".Potion_Type")) {
+                String potionType = config.getString("Treasures." + treasureName + ".Potion_Type");
+                try {
+                    item = new Potion(PotionType.valueOf(potionType.toUpperCase())).toItemStack(amount);
+                }
+                catch (IllegalArgumentException ex) {
+                    reason.add("Invalid Potion_Type: " + potionType);
+                }
+            }
+            else {
+                item = (new MaterialData(id, (byte) data)).toItemStack(amount);
+            }
+
+            /*
+             * Drops From & Max Level
+             */
 
             if (config.getBoolean("Treasures." + treasureName + ".Drops_From.Fishing", false)) {
                 if (config.getConfigurationSection("Treasures." + treasureName + ".Drops_From").getKeys(false).size() != 1) {
-                    reason.add("Fishing drops cannot also be excavation drops");
+                    reason.add("This can only be a fishing drop.");
                 }
 
                 if (!config.contains("Treasures." + treasureName + ".Max_Level")) {
@@ -150,6 +192,30 @@ public class TreasureConfig extends ConfigLoader {
                     treasures.put(treasureName, fTreasure);
                 }
             }
+            else if (config.getBoolean("Treasures." + treasureName + "Drops_From.Shake", false)) {
+                if (config.getConfigurationSection("Treasures." + treasureName + ".Drops_From").getKeys(false).size() != 1) {
+                    reason.add("This can only be a shake drop.");
+                }
+
+                if (!config.contains("Treasures." + treasureName + ".Mob")) {
+                    reason.add("Missing Mob");
+                }
+
+                String mobType = config.getString("Treasures." + treasureName + ".Mob");
+                EntityType mob = null;
+
+                try {
+                     mob = EntityType.valueOf(mobType.toUpperCase().trim());
+                }
+                catch (IllegalArgumentException ex){
+                    reason.add("Invalid Mob: " + mobType);
+                }
+
+                if (noErrorsInTreasure(reason)) {
+                    ShakeTreasure sTreasure = new ShakeTreasure(item, xp, dropChance, dropLevel, mob);
+                    treasures.put(treasureName, sTreasure);
+                }
+            }
             else {
                 ExcavationTreasure eTreasure = new ExcavationTreasure(item, xp, dropChance, dropLevel);
                 HylianTreasure hTreasure = new HylianTreasure(item, xp, dropChance, dropLevel);
@@ -195,7 +261,11 @@ public class TreasureConfig extends ConfigLoader {
                 }
 
                 if (config.getBoolean("Treasures." + treasureName + ".Drops_From.Fishing", false)) {
-                    reason.add("Excavation drops cannot also be fishing drops");
+                    reason.add("This cannot also be a fishing drop.");
+                }
+
+                if (config.getBoolean("Treasures." + treasureName + ".Drops_From.Shake", false)) {
+                    reason.add("This cannot also be a shake drop.");
                 }
 
                 if (noErrorsInTreasure(reason) && hTreasure.getDropsFrom() == (byte) 0x0) {
@@ -210,6 +280,7 @@ public class TreasureConfig extends ConfigLoader {
         List<String> excavationTreasures = config.getStringList("Excavation.Treasure");
         List<String> fishingTreasures = config.getStringList("Fishing.Treasure");
         List<String> hylianTreasures = config.getStringList("Hylian_Luck.Treasure");
+        List<String> shakeTreasures = config.getStringList("Shake.Treasure");
 
         for (Entry<String, Treasure> nextEntry : treasures.entrySet()) {
             String treasureKey = nextEntry.getKey();
@@ -222,6 +293,97 @@ public class TreasureConfig extends ConfigLoader {
 
                 fishingRewards.add((FishingTreasure) treasure);
             }
+            else if (treasure instanceof ShakeTreasure) {
+                if (shakeTreasures == null || !shakeTreasures.contains(treasureKey)) {
+                    continue;
+                }
+
+                ShakeTreasure e = (ShakeTreasure) treasure;
+                switch (e.getMob()) {
+                    case BLAZE:
+                        shakeFromBlaze.add(e);
+                        break;
+
+                    case CAVE_SPIDER:
+                        shakeFromCaveSpider.add(e);
+                        break;
+
+                    case CHICKEN:
+                        shakeFromChicken.add(e);
+                        break;
+
+                    case COW:
+                        shakeFromCow.add(e);
+                        break;
+
+                    case CREEPER:
+                        shakeFromCreeper.add(e);
+                        break;
+
+                    case ENDERMAN:
+                        shakeFromEnderman.add(e);
+                        break;
+
+                    case GHAST:
+                        shakeFromGhast.add(e);
+                        break;
+
+                    case IRON_GOLEM:
+                        shakeFromIronGolem.add(e);
+                        break;
+
+                    case MAGMA_CUBE:
+                        shakeFromMagmaCube.add(e);
+                        break;
+
+                    case MUSHROOM_COW:
+                        shakeFromMushroomCow.add(e);
+                        break;
+
+                    case PIG:
+                        shakeFromPig.add(e);
+                        break;
+
+                    case PIG_ZOMBIE:
+                        shakeFromPigZombie.add(e);
+                        break;
+
+                    case SHEEP:
+                        shakeFromSheep.add(e);
+                        break;
+
+                    case SKELETON:
+                        shakeFromSkeleton.add(e);
+                        break;
+
+                    case SLIME:
+                        shakeFromSlime.add(e);
+                        break;
+
+                    case SPIDER:
+                        shakeFromSpider.add(e);
+                        break;
+
+                    case SNOWMAN:
+                        shakeFromSnowman.add(e);
+                        break;
+
+                    case SQUID:
+                        shakeFromSquid.add(e);
+                        break;
+
+                    case WITCH:
+                        shakeFromWitch.add(e);
+                        break;
+
+                    case ZOMBIE:
+                        shakeFromZombie.add(e);
+                        break;
+
+                    default:
+                        break;
+                }
+            }
             else if (treasure instanceof HylianTreasure) {
                 if (hylianTreasures == null || !hylianTreasures.contains(treasureKey)) {
                     continue;

+ 21 - 0
src/main/java/com/gmail/nossr50/datatypes/treasure/ShakeTreasure.java

@@ -0,0 +1,21 @@
+package com.gmail.nossr50.datatypes.treasure;
+
+import org.bukkit.entity.EntityType;
+import org.bukkit.inventory.ItemStack;
+
+public class ShakeTreasure extends Treasure {
+    private EntityType mob;
+
+    public ShakeTreasure(ItemStack drop, int xp, double dropChance, int dropLevel, EntityType mob) {
+        super(drop, xp, dropChance, dropLevel);
+        this.mob = mob;
+    }
+
+    public EntityType getMob() {
+        return mob;
+    }
+
+    public void setMob(EntityType mob) {
+        this.mob = mob;
+    }
+}

+ 32 - 80
src/main/java/com/gmail/nossr50/skills/fishing/Fishing.java

@@ -1,16 +1,13 @@
 package com.gmail.nossr50.skills.fishing;
 
-import java.util.Map;
-import java.util.Map.Entry;
+import java.util.List;
 
-import org.bukkit.DyeColor;
-import org.bukkit.Material;
 import org.bukkit.entity.LivingEntity;
 import org.bukkit.inventory.ItemStack;
-import org.bukkit.potion.Potion;
-import org.bukkit.potion.PotionType;
 
 import com.gmail.nossr50.config.AdvancedConfig;
+import com.gmail.nossr50.config.treasure.TreasureConfig;
+import com.gmail.nossr50.datatypes.treasure.ShakeTreasure;
 import com.gmail.nossr50.util.Misc;
 
 public final class Fishing {
@@ -66,115 +63,70 @@ public final class Fishing {
      * @param target Targeted entity
      * @param possibleDrops List of ItemStack that can be dropped
      */
-    protected static void findPossibleDrops(LivingEntity target, Map<ItemStack, Integer> possibleDrops) {
+    protected static List<ShakeTreasure> findPossibleDrops(LivingEntity target) {
         switch (target.getType()) {
             case BLAZE:
-                possibleDrops.put(new ItemStack(Material.BLAZE_ROD), 100);
-                break;
+                return TreasureConfig.getInstance().shakeFromBlaze;
 
             case CAVE_SPIDER:
-            case SPIDER:
-                possibleDrops.put(new ItemStack(Material.SPIDER_EYE), 50);
-                possibleDrops.put(new ItemStack(Material.STRING), 50);
-                break;
+                return TreasureConfig.getInstance().shakeFromCaveSpider;
 
             case CHICKEN:
-                possibleDrops.put(new ItemStack(Material.FEATHER), 34);
-                possibleDrops.put(new ItemStack(Material.RAW_CHICKEN), 33);
-                possibleDrops.put(new ItemStack(Material.EGG), 33);
-                break;
+                return TreasureConfig.getInstance().shakeFromChicken;
 
             case COW:
-                possibleDrops.put(new ItemStack(Material.MILK_BUCKET), 2);
-                possibleDrops.put(new ItemStack(Material.LEATHER), 49);
-                possibleDrops.put(new ItemStack(Material.RAW_BEEF), 49);
-                break;
+                return TreasureConfig.getInstance().shakeFromCow;
 
             case CREEPER:
-                possibleDrops.put(new ItemStack(Material.SKULL_ITEM, 1, (short) 4), 1);
-                possibleDrops.put(new ItemStack(Material.SULPHUR), 99);
-                break;
+                return TreasureConfig.getInstance().shakeFromCreeper;
 
             case ENDERMAN:
-                possibleDrops.put(new ItemStack(Material.ENDER_PEARL), 100);
-                break;
+                return TreasureConfig.getInstance().shakeFromEnderman;
 
             case GHAST:
-                possibleDrops.put(new ItemStack(Material.SULPHUR), 50);
-                possibleDrops.put(new ItemStack(Material.GHAST_TEAR), 50);
-                break;
+                return TreasureConfig.getInstance().shakeFromGhast;
 
             case IRON_GOLEM:
-                possibleDrops.put(new ItemStack(Material.PUMPKIN), 3);
-                possibleDrops.put(new ItemStack(Material.IRON_INGOT), 12);
-                possibleDrops.put(new ItemStack(Material.RED_ROSE), 85);
-                break;
+                return TreasureConfig.getInstance().shakeFromIronGolem;
 
             case MAGMA_CUBE:
-                possibleDrops.put(new ItemStack(Material.MAGMA_CREAM), 100);
-                break;
+                return TreasureConfig.getInstance().shakeFromMagmaCube;
 
             case MUSHROOM_COW:
-                possibleDrops.put(new ItemStack(Material.MILK_BUCKET), 5);
-                possibleDrops.put(new ItemStack(Material.MUSHROOM_SOUP), 5);
-                possibleDrops.put(new ItemStack(Material.LEATHER), 30);
-                possibleDrops.put(new ItemStack(Material.RAW_BEEF), 30);
-                possibleDrops.put(new ItemStack(Material.RED_MUSHROOM, Misc.getRandom().nextInt(3) + 1), 30);
-                break;
+                return TreasureConfig.getInstance().shakeFromMushroomCow;
 
             case PIG:
-                possibleDrops.put(new ItemStack(Material.PORK), 100);
-                break;
+                return TreasureConfig.getInstance().shakeFromPig;
 
             case PIG_ZOMBIE:
-                possibleDrops.put(new ItemStack(Material.ROTTEN_FLESH), 50);
-                possibleDrops.put(new ItemStack(Material.GOLD_NUGGET), 50);
-                break;
+                return TreasureConfig.getInstance().shakeFromPigZombie;
 
             case SHEEP:
-                possibleDrops.put(new ItemStack(Material.WOOL, Misc.getRandom().nextInt(6) + 1), 100);
-                break;
+                return TreasureConfig.getInstance().shakeFromSheep;
 
             case SKELETON:
-                possibleDrops.put(new ItemStack(Material.SKULL_ITEM, 1, (short) 0), 2);
-                possibleDrops.put(new ItemStack(Material.BONE), 49);
-                possibleDrops.put(new ItemStack(Material.ARROW, Misc.getRandom().nextInt(3) + 1), 49);
-                break;
+                return TreasureConfig.getInstance().shakeFromSkeleton;
 
             case SLIME:
-                possibleDrops.put(new ItemStack(Material.SLIME_BALL), 100);
-                break;
+                return TreasureConfig.getInstance().shakeFromSlime;
 
             case SNOWMAN:
-                possibleDrops.put(new ItemStack(Material.PUMPKIN), 3);
-                possibleDrops.put(new ItemStack(Material.SNOW_BALL, Misc.getRandom().nextInt(4) + 1), 97);
-                break;
+                return TreasureConfig.getInstance().shakeFromSnowman;
+
+            case SPIDER:
+                return TreasureConfig.getInstance().shakeFromSpider;
 
             case SQUID:
-                possibleDrops.put(new ItemStack(Material.INK_SACK, 1, DyeColor.BLACK.getDyeData()), 100);
-                break;
+                return TreasureConfig.getInstance().shakeFromSquid;
 
             case WITCH:
-                possibleDrops.put(new Potion(PotionType.INSTANT_HEAL).toItemStack(1), 1);
-                possibleDrops.put(new Potion(PotionType.FIRE_RESISTANCE).toItemStack(1), 1);
-                possibleDrops.put(new Potion(PotionType.SPEED).toItemStack(1), 1);
-                possibleDrops.put(new ItemStack(Material.GLASS_BOTTLE), 9);
-                possibleDrops.put(new ItemStack(Material.GLOWSTONE_DUST), 13);
-                possibleDrops.put(new ItemStack(Material.SULPHUR), 12);
-                possibleDrops.put(new ItemStack(Material.REDSTONE), 13);
-                possibleDrops.put(new ItemStack(Material.SPIDER_EYE), 12);
-                possibleDrops.put(new ItemStack(Material.STICK), 13);
-                possibleDrops.put(new ItemStack(Material.SUGAR), 12);
-                possibleDrops.put(new ItemStack(Material.POTION), 13);
-                break;
+                return TreasureConfig.getInstance().shakeFromWitch;
 
             case ZOMBIE:
-                possibleDrops.put(new ItemStack(Material.SKULL_ITEM, 1, (short) 2), 2);
-                possibleDrops.put(new ItemStack(Material.ROTTEN_FLESH), 98);
-                break;
+                return TreasureConfig.getInstance().shakeFromZombie;
 
             default:
-                return;
+                return null;
         }
     }
 
@@ -184,15 +136,15 @@ public final class Fishing {
      * @param possibleDrops List of ItemStack that can be dropped
      * @return Chosen ItemStack
      */
-    protected static ItemStack chooseDrop(Map<ItemStack, Integer> possibleDrops) {
+    protected static ItemStack chooseDrop(List<ShakeTreasure> possibleDrops) {
         int dropProbability = Misc.getRandom().nextInt(100);
-        int cumulatedProbability = 0;
+        double cumulatedProbability = 0;
 
-        for (Entry<ItemStack, Integer> entry : possibleDrops.entrySet()) {
-            cumulatedProbability += entry.getValue();
+        for (ShakeTreasure treasure : possibleDrops) {
+            cumulatedProbability += treasure.getDropChance();
 
             if (dropProbability < cumulatedProbability) {
-                return entry.getKey();
+                return treasure.getDrop();
             }
         }
 

+ 3 - 6
src/main/java/com/gmail/nossr50/skills/fishing/FishingManager.java

@@ -2,9 +2,7 @@ package com.gmail.nossr50.skills.fishing;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 import org.bukkit.Material;
 import org.bukkit.enchantments.Enchantment;
@@ -24,6 +22,7 @@ import com.gmail.nossr50.config.treasure.TreasureConfig;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.skills.SkillType;
 import com.gmail.nossr50.datatypes.treasure.FishingTreasure;
+import com.gmail.nossr50.datatypes.treasure.ShakeTreasure;
 import com.gmail.nossr50.locale.LocaleLoader;
 import com.gmail.nossr50.skills.SkillManager;
 import com.gmail.nossr50.skills.fishing.Fishing.Tier;
@@ -144,11 +143,9 @@ public class FishingManager extends SkillManager {
      */
     public void shakeCheck(LivingEntity target) {
         if (getShakeProbability() > Misc.getRandom().nextInt(getActivationChance())) {
-            Map<ItemStack, Integer> possibleDrops = new HashMap<ItemStack, Integer>();
+            List<ShakeTreasure> possibleDrops = Fishing.findPossibleDrops(target);
 
-            Fishing.findPossibleDrops(target, possibleDrops);
-
-            if (possibleDrops.isEmpty()) {
+            if (possibleDrops == null || possibleDrops.isEmpty()) {
                 return;
             }
 

+ 571 - 1
src/main/resources/treasures.yml

@@ -100,6 +100,62 @@ Hylian_Luck:
         - Diamond_Gem
         - Gold_Nuggets
 #
+#	Settings for Shake
+###
+Shake:
+    Treasure:
+        - Blaze_Blaze_Rod
+        - Cave_Spider_Cobweb
+        - Cave_Spider_Potion
+        - Cave_Spider_Spider_Eye
+        - Cave_Spider_String
+        - Spider_Spider_Eye
+        - Spider_String
+        - Chicken_Feather
+        - Chicken_Raw_Chicken
+        - Chicken_Egg
+        - Cow_Milk_Bucket
+        - Cow_Leather
+        - Cow_Raw_Beef
+        - Creeper_Skull
+        - Creeper_Sulphur
+        - Enderman_Ender_Pearl
+        - Ghast_Sulphur
+        - Ghast_Ghast_Tear
+        - Iron_Golem_Pumpkin
+        - Iron_Golem_Iron_Ingot
+        - Iron_Golem_Red_Rose
+        - Magma_Cube_Magma_Cream
+        - Mushroom_Cow_Milk_Bucket
+        - Mushroom_Cow_Mushroom_Soup
+        - Mushroom_Cow_Leather
+        - Mushroom_Cow_Raw_Beef
+        - Mushroom_Cow_Red_Mushroom
+        - Pig_Pork
+        - Pig_Zombie_Rotten_Flesh
+        - Pig_Zombie_Gold_Nugget
+        - Sheep_Wool
+        - Skeleton_Skull
+        - Skeleton_Bone
+        - Skeleton_Arrow
+        - Slime_Slime_Ball
+        - Snowman_Pumpkin
+        - Snowman_Snowball
+        - Squid_Ink_Sack
+        - Witch_Heal_Potion
+        - Witch_Fire_Potion
+        - Witch_Speed_Potion
+        - Witch_Glass_Bottle
+        - Witch_Glowstone_Dust
+        - Witch_Sulphur
+        - Witch_Redstone
+        - Witch_Spider_Eye
+        - Witch_Stick
+        - Witch_Sugar
+        - Witch_Potion
+        - Zombie_Skull
+        - Zombie_Rotten_Flesh
+#
 #  Configuration to define Treasures
 ###
 Treasures:
@@ -968,4 +1024,518 @@ Treasures:
         Drop_Chance: 100.0
         Drop_Level: 0
         Drops_From:
-            Pots: true
+            Pots: true
+    Blaze_Blaze_Rod:
+        ID: 369
+        Mob: BLAZE
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 100.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Cave_Spider_Spider_Eye:
+        ID: 375
+        Mob: CAVE_SPIDER
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 49.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Cave_Spider_String:
+        ID: 287
+        Mob: CAVE_SPIDER
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 49.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Cave_Spider_Cobweb:
+        ID: 30
+        Mob: CAVE_SPIDER
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 1.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Cave_Spider_Potion:
+        ID: 373
+        Mob: CAVE_SPIDER
+        Potion_Type: POISON
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 1.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Spider_Spider_Eye:
+        ID: 375
+        Mob: SPIDER
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 50.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Spider_String:
+        ID: 287
+        Mob: SPIDER
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 50.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Chicken_Feather:
+        ID: 288
+        Mob: CHICKEN
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 33.3
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Chicken_Raw_Chicken:
+        ID: 365
+        Mob: CHICKEN
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 33.3
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Chicken_Egg:
+        ID: 344
+        Mob: CHICKEN
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 33.3
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Cow_Milk_Bucket:
+        ID: 335
+        Mob: COW
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 2.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Cow_Leather:
+        ID: 334
+        Mob: COW
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 49.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Cow_Raw_Beef:
+        ID: 363
+        Mob: COW
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 49.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Creeper_Skull:
+        ID: 397
+        Mob: CREEPER
+        Data: 4
+        Amount: 1
+        XP: 0
+        Drop_Chance: 1.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Creeper_Sulphur:
+        ID: 289
+        Mob: CREEPER
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 99.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Enderman_Ender_Pearl:
+        ID: 368
+        Mob: ENDERMAN
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 100.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Ghast_Sulphur:
+        ID: 289
+        Mob: GHAST
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 50.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Ghast_Ghast_Tear:
+        ID: 370
+        Mob: GHAST
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 50.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Iron_Golem_Pumpkin:
+        ID: 86
+        Mob: IRON_GOLEM
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 3.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Iron_Golem_Iron_Ingot:
+        ID: 265
+        Mob: IRON_GOLEM
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 12.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Iron_Golem_Red_Rose:
+        ID: 38
+        Mob: IRON_GOLEM
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 85.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Magma_Cube_Magma_Cream:
+        ID: 378
+        Mob: MAGMA_CUBE
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 100.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Mushroom_Cow_Milk_Bucket:
+        ID: 335
+        Mob: MUSHROOM_COW
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 5.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Mushroom_Cow_Mushroom_Soup:
+        ID: 282
+        Mob: MUSHROOM_COW
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 5.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Mushroom_Cow_Leather:
+        ID: 334
+        Mob: MUSHROOM_COW
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 30.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Mushroom_Cow_Raw_Beef:
+        ID: 363
+        Mob: MUSHROOM_COW
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 30.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Mushroom_Cow_Red_Mushroom:
+        ID: 40
+        Mob: MUSHROOM_COW
+        Data: 0
+        Amount: 2
+        XP: 0
+        Drop_Chance: 30.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Pig_Pork:
+        ID: 319
+        Mob: PIG
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 100.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Pig_Zombie_Rotten_Flesh:
+        ID: 367
+        Mob: PIG_ZOMBIE
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 50.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Pig_Zombie_Gold_Nugget:
+        ID: 371
+        Mob: PIG_ZOMBIE
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 50.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Sheep_Wool:
+        ID: 35
+        Mob: SHEEP
+        Data: 0
+        Amount: 3
+        XP: 0
+        Drop_Chance: 100.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Skeleton_Skull:
+        ID: 397
+        Mob: SKELETON
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 2.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Skeleton_Bone:
+        ID: 352
+        Mob: SKELETON
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 49.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Skeleton_Arrow:
+        ID: 262
+        Mob: SKELETON
+        Data: 0
+        Amount: 2
+        XP: 0
+        Drop_Chance: 49.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Slime_Slime_Ball:
+        ID: 341
+        Mob: SLIME
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 100.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Snowman_Pumpkin:
+        ID: 86
+        Mob: SNOWMAN
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 3.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Snowman_Snowball:
+        ID: 341
+        Mob: SNOWMAN
+        Data: 0
+        Amount: 2
+        XP: 0
+        Drop_Chance: 97.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Squid_Ink_Sack:
+        ID: 351
+        Mob: SQUID
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 100.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Witch_Heal_Potion:
+        ID: 373
+        Mob: WITCH
+        Potion_Type: INSTANT_HEAL
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 1.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Witch_Fire_Potion:
+        ID: 373
+        Mob: WITCH
+        Potion_Type: FIRE_RESISTANCE
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 1.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Witch_Speed_Potion:
+        ID: 373
+        Mob: WITCH
+        Potion_Type: SPEED
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 1.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Witch_Glass_Bottle:
+        ID: 374
+        Mob: WITCH
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 9.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Witch_Glowstone_Dust:
+        ID: 348
+        Mob: WITCH
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 13.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Witch_Sulphur:
+        ID: 289
+        Mob: WITCH
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 12.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Witch_Redstone:
+        ID: 331
+        Mob: WITCH
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 13.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Witch_Spider_Eye:
+        ID: 375
+        Mob: WITCH
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 12.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Witch_Stick:
+        ID: 380
+        Mob: WITCH
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 13.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Witch_Sugar:
+        ID: 353
+        Mob: WITCH
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 12.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Witch_Potion:
+        ID: 373
+        Mob: WITCH
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 13.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Zombie_Skull:
+        ID: 397
+        Mob: ZOMBIE
+        Data: 2
+        Amount: 1
+        XP: 0
+        Drop_Chance: 2.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true
+    Zombie_Rotten_Flesh:
+        ID: 367
+        Mob: ZOMBIE
+        Data: 0
+        Amount: 1
+        XP: 0
+        Drop_Chance: 98.0
+        Drop_Level: 0
+        Drops_From:
+            Shake: true