 +
 +     /**
 +     * Queries if this block should render in a given layer.
-+     * ISmartBlockModel can use MinecraftForgeClient.getRenderLayer to alter their model based on layer
-+     */
++     * ISmartBlockModel can use {@link MinecraftForgeClient#getRenderLayer()} to alter their model based on layer.
++     *
++     * @deprecated New method with state sensitivity: {@link #canRenderInLayer(IBlockState, BlockRenderLayer)}
++     */
++    @Deprecated
 +    public boolean canRenderInLayer(BlockRenderLayer layer)
 +    {
 +        return func_180664_k() == layer;
 +    }
 +
++     /**
++     * Queries if this block should render in a given layer.
++     * ISmartBlockModel can use {@link MinecraftForgeClient#getRenderLayer()} to alter their model based on layer.
++     */
++    public boolean canRenderInLayer(IBlockState state, BlockRenderLayer layer)
++    {
++        return canRenderInLayer(layer);
++    }
 +    // For Internal use only to capture droped items inside getDrops
 +    protected static ThreadLocal<Boolean> captureDrops = new ThreadLocal<Boolean>()
 +    {

+        }
+    }
+
+    /* ========================================= FORGE END ======================================*/
+
     public static void func_149671_p()

     }
 
     protected ItemStack func_180643_i(IBlockState p_180643_1_)
@@ -747,9 +764,11 @@
         p_176216_2_.field_70181_x = 0.0D;
     }
 
+    @Deprecated // Forge: Use more sensitive version below: getPickBlock
     public ItemStack func_185473_a(World p_185473_1_, BlockPos p_185473_2_, IBlockState p_185473_3_)
     {
-        return new ItemStack(Item.func_150898_a(this), 1, this.func_180651_a(p_185473_3_));
+        Item item = Item.func_150898_a(this);
+        return item == null ? null : new ItemStack(item, 1, this.func_180651_a(p_185473_3_));
     }
 
     @SideOnly(Side.CLIENT)
@@ -844,6 +863,1141 @@
         return "Block{" + field_149771_c.func_177774_c(this) + "}";
     }
 
