--- ../src-base/minecraft/net/minecraft/block/BlockLeaves.java
+++ ../src-work/minecraft/net/minecraft/block/BlockLeaves.java
@@ -18,7 +18,7 @@
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
 
-public abstract class BlockLeaves extends BlockLeavesBase
+public abstract class BlockLeaves extends BlockLeavesBase implements net.minecraftforge.common.IShearable
 {
     public static final PropertyBool field_176237_a = PropertyBool.func_177716_a("decayable");
     public static final PropertyBool field_176236_b = PropertyBool.func_177716_a("check_decay");
@@ -76,9 +76,9 @@
                         BlockPos blockpos1 = p_180663_2_.func_177982_a(i1, j1, k1);
                         IBlockState iblockstate1 = p_180663_1_.func_180495_p(blockpos1);
 
-                        if (iblockstate1.func_177230_c().func_149688_o() == Material.field_151584_j && !((Boolean)iblockstate1.func_177229_b(field_176236_b)).booleanValue())
+                        if (iblockstate1.func_177230_c().isLeaves(p_180663_1_, blockpos1))
                         {
-                            p_180663_1_.func_180501_a(blockpos1, iblockstate1.func_177226_a(field_176236_b, Boolean.valueOf(true)), 4);
+                            iblockstate1.func_177230_c().beginLeavesDecay(p_180663_1_, blockpos1);
                         }
                     }
                 }
@@ -119,11 +119,12 @@
                         {
                             for (i2 = -b0; i2 <= b0; ++i2)
                             {
-                                Block block = p_180650_1_.func_180495_p(new BlockPos(j + k1, k + l1, l + i2)).func_177230_c();
+                                BlockPos tmp = new BlockPos(j + k1, k + l1, l + i2);
+                                Block block = p_180650_1_.func_180495_p(tmp).func_177230_c();
 
-                                if (block != Blocks.field_150364_r && block != Blocks.field_150363_s)
+                                if (!block.canSustainLeaves(p_180650_1_, tmp))
                                 {
-                                    if (block.func_149688_o() == Material.field_151584_j)
+                                    if (block.isLeaves(p_180650_1_, tmp))
                                     {
                                         this.field_150128_a[(k1 + j1) * i1 + (l1 + j1) * b1 + i2 + j1] = -2;
                                     }
@@ -230,40 +231,7 @@
 
     public void func_180653_a(World p_180653_1_, BlockPos p_180653_2_, IBlockState p_180653_3_, float p_180653_4_, int p_180653_5_)
     {
-        if (!p_180653_1_.field_72995_K)
-        {
-            int j = this.func_176232_d(p_180653_3_);
-
-            if (p_180653_5_ > 0)
-            {
-                j -= 2 << p_180653_5_;
-
-                if (j < 10)
-                {
-                    j = 10;
-                }
-            }
-
-            if (p_180653_1_.field_73012_v.nextInt(j) == 0)
-            {
-                Item item = this.func_180660_a(p_180653_3_, p_180653_1_.field_73012_v, p_180653_5_);
-                func_180635_a(p_180653_1_, p_180653_2_, new ItemStack(item, 1, this.func_180651_a(p_180653_3_)));
-            }
-
-            j = 200;
-
-            if (p_180653_5_ > 0)
-            {
-                j -= 10 << p_180653_5_;
-
-                if (j < 40)
-                {
-                    j = 40;
-                }
-            }
-
-            this.func_176234_a(p_180653_1_, p_180653_2_, p_180653_3_, j);
-        }
+        super.func_180653_a(p_180653_1_, p_180653_2_, p_180653_3_, p_180653_4_, p_180653_5_);
     }
 
     protected void func_176234_a(World p_176234_1_, BlockPos p_176234_2_, IBlockState p_176234_3_, int p_176234_4_) {}
@@ -298,4 +266,48 @@
     }
 
     public abstract BlockPlanks.EnumType func_176233_b(int p_176233_1_);
+
+    @Override public boolean isShearable(ItemStack item, IBlockAccess world, BlockPos pos){ return true; }
+    @Override public boolean isLeaves(IBlockAccess world, BlockPos pos){ return true; }
+
+    @Override
+    public void beginLeavesDecay(World world, BlockPos pos)
+    {
+        IBlockState state = world.func_180495_p(pos);
+        if (!(Boolean)state.func_177229_b(field_176236_b))
+        {
+            world.func_180501_a(pos, state.func_177226_a(field_176236_b, true), 4);
+        }
+    }
+
+    @Override
+    public java.util.List<ItemStack> getDrops(IBlockAccess world, BlockPos pos, IBlockState state, int fortune)
+    {
+        java.util.List<ItemStack> ret = new java.util.ArrayList<ItemStack>();
+        Random rand = world instanceof World ? ((World)world).field_73012_v : new Random();
+        int chance = this.func_176232_d(state);
+
+        if (fortune > 0)
+        {
+            chance -= 2 << fortune;
+            if (chance < 10) chance = 10;
+        }
+
+        if (rand.nextInt(chance) == 0)
+            ret.add(new ItemStack(func_180660_a(state, rand, fortune), 1, func_180651_a(state)));
+
+        chance = 200;
+        if (fortune > 0)
+        {
+            chance -= 10 << fortune;
+            if (chance < 40) chance = 40;
+        }
+
+        this.captureDrops(true);
+        if (world instanceof World)
+            this.func_176234_a((World)world, pos, state, chance); // Dammet mojang
+        ret.addAll(this.captureDrops(false));
+        return ret;
+    }
+
 }
