diff --git a/src/main/java/net/minecraft/client/gui/Gui.java b/src/main/java/net/minecraft/client/gui/Gui.java
index ccb531b48..73c52c8db 100644
--- a/src/main/java/net/minecraft/client/gui/Gui.java
+++ b/src/main/java/net/minecraft/client/gui/Gui.java
@@ -124,6 +124,7 @@ public class Gui
         tessellator.addVertex(x+width, y+height, 0);
         tessellator.addVertex(x+width, y, 0);
         tessellator.draw();
+        glEnable(GL_TEXTURE_2D);
     }
 
     protected void drawGradientRect(int minX, int minY, int maxX, int maxY, int argb1, int argb2)
diff --git a/src/main/java/net/minecraft/client/player/controller/PlayerController.java b/src/main/java/net/minecraft/client/player/controller/PlayerController.java
index c489d994d..9c4ff7cbe 100644
--- a/src/main/java/net/minecraft/client/player/controller/PlayerController.java
+++ b/src/main/java/net/minecraft/client/player/controller/PlayerController.java
@@ -153,7 +153,7 @@ public abstract class PlayerController {
 		Item heldItem = null;
 		ItemStack heldItemStack = player.getCurrentEquippedItem();
 		if(heldItemStack != null) {
-			if(!heldItemStack.beforeDestroyBlock(world, x, y, z, player)) {
+			if(!heldItemStack.beforeDestroyBlock(world, block.id, x, y, z, side, player)) {
 				return false;
 			}
 			heldItem = heldItemStack.getItem();
@@ -163,7 +163,7 @@ public abstract class PlayerController {
 		int meta = world.getBlockMetadata(x, y, z);
 		boolean removed = world.setBlockWithNotify(x, y, z, 0);
 		if(removed) {
-			block.onBlockDestroyedByPlayer(world, x, y, z, meta, player, heldItem);
+			block.onBlockDestroyedByPlayer(world, x, y, z, side, meta, player, heldItem);
 		}
 		return removed;
 	}
diff --git a/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java b/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java
index 6ce1a2fda..760aeae39 100644
--- a/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java
+++ b/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java
@@ -30,7 +30,7 @@ public class PlayerControllerMP extends PlayerController {
 		boolean removed = super.destroyBlock(x, y, z, side, player);
 		ItemStack item = mc.thePlayer.getCurrentEquippedItem();
 		if (item != null) {
-			item.onDestroyBlock(mc.theWorld, id, x, y, z, mc.thePlayer);
+			item.onDestroyBlock(mc.theWorld, id, x, y, z, side, mc.thePlayer);
 			if (item.stackSize <= 0) {
 				mc.thePlayer.destroyCurrentEquippedItem();
 			}
diff --git a/src/main/java/net/minecraft/client/player/controller/PlayerControllerSP.java b/src/main/java/net/minecraft/client/player/controller/PlayerControllerSP.java
index 1861f75e1..e417cc58f 100644
--- a/src/main/java/net/minecraft/client/player/controller/PlayerControllerSP.java
+++ b/src/main/java/net/minecraft/client/player/controller/PlayerControllerSP.java
@@ -23,7 +23,7 @@ public class PlayerControllerSP extends PlayerController {
 		ItemStack item = mc.thePlayer.getCurrentEquippedItem();
 
 		if (item != null) {
-			item.onDestroyBlock(mc.theWorld, id, x, y, z, mc.thePlayer);
+			item.onDestroyBlock(mc.theWorld, id, x, y, z, side, mc.thePlayer);
 		}
 		if (removed && mc.thePlayer.getGamemode().dropBlockOnBreak()) {
 			Block.blocksList[id].harvestBlock(mc.theWorld, mc.thePlayer, x, y, z, meta, tileEntity);
diff --git a/src/main/java/net/minecraft/core/block/Block.java b/src/main/java/net/minecraft/core/block/Block.java
index 0535bb271..a6752ddbc 100644
--- a/src/main/java/net/minecraft/core/block/Block.java
+++ b/src/main/java/net/minecraft/core/block/Block.java
@@ -347,7 +347,7 @@ public class Block
     /**
      * Called when a block has been broken by a player, after {@link Block#onBlockRemoved(World, int, int, int, int)}
      */
-    public void onBlockDestroyedByPlayer(World world, int x, int y, int z, int meta, EntityPlayer player, Item item) {
+    public void onBlockDestroyedByPlayer(World world, int x, int y, int z, Side side, int meta, EntityPlayer player, Item item) {
     	
     }
 
diff --git a/src/main/java/net/minecraft/core/block/BlockCropsWheat.java b/src/main/java/net/minecraft/core/block/BlockCropsWheat.java
index 7a9c4e628..decfac4ab 100644
--- a/src/main/java/net/minecraft/core/block/BlockCropsWheat.java
+++ b/src/main/java/net/minecraft/core/block/BlockCropsWheat.java
@@ -109,7 +109,7 @@ public class BlockCropsWheat extends BlockFlower implements IBonemealable
     }
 
     @Override
-    public void onBlockDestroyedByPlayer(World world, int x, int y, int z, int meta, EntityPlayer player, Item item) {
+    public void onBlockDestroyedByPlayer(World world, int x, int y, int z, Side side, int meta, EntityPlayer player, Item item) {
         boolean isFertilized = BlockFarmland.isFertilized(world.getBlockMetadata(x, y - 1, z));
         if (isFertilized && !world.isClientSide) {
             boolean shouldDefertilize = world.rand.nextInt(3) == 2;
diff --git a/src/main/java/net/minecraft/core/block/BlockLanternFirefly.java b/src/main/java/net/minecraft/core/block/BlockLanternFirefly.java
index 689087a28..9b44e6fc9 100644
--- a/src/main/java/net/minecraft/core/block/BlockLanternFirefly.java
+++ b/src/main/java/net/minecraft/core/block/BlockLanternFirefly.java
@@ -158,7 +158,7 @@ public class BlockLanternFirefly extends Block{
     }
     
     @Override
-    public void onBlockDestroyedByPlayer(World world, int x, int y, int z, int meta, EntityPlayer player, Item item) {
+    public void onBlockDestroyedByPlayer(World world, int x, int y, int z, Side side, int meta, EntityPlayer player, Item item) {
     	if(item != null && item.isSilkTouch()) {
     		return;
     	}
diff --git a/src/main/java/net/minecraft/core/entity/EntityLiving.java b/src/main/java/net/minecraft/core/entity/EntityLiving.java
index 9f302adf5..341074db2 100644
--- a/src/main/java/net/minecraft/core/entity/EntityLiving.java
+++ b/src/main/java/net/minecraft/core/entity/EntityLiving.java
@@ -975,7 +975,7 @@ public abstract class EntityLiving extends Entity
             double d1 = entityplayer.y - y;
             double d2 = entityplayer.z - z;
             double d3 = d * d + d1 * d1 + d2 * d2;
-            if(d3 > 16384D)
+            if(d3 > 16384D) // 128 * 128
             {
                 remove();
             }
diff --git a/src/main/java/net/minecraft/core/item/Item.java b/src/main/java/net/minecraft/core/item/Item.java
index 813f10aad..376f847eb 100644
--- a/src/main/java/net/minecraft/core/item/Item.java
+++ b/src/main/java/net/minecraft/core/item/Item.java
@@ -146,12 +146,12 @@ public class Item
     /**
      * Called before a block is destroyed with this item. If the return value is false, the block won't be destroyed 
      */
-    public boolean beforeDestroyBlock(World world, ItemStack itemStack, int x, int y, int z, EntityPlayer player)
+    public boolean beforeDestroyBlock(World world, ItemStack itemStack, int blockId, int x, int y, int z, Side side, EntityPlayer player)
     {
     	return true;
     }
     
-    public boolean onBlockDestroyed(World world, ItemStack itemstack, int removedBlockId, int x, int y, int z, EntityLiving entityliving)
+    public boolean onBlockDestroyed(World world, ItemStack itemstack, int removedBlockId, int x, int y, int z, Side side, EntityLiving entityliving)
     {
         return false;
     }
diff --git a/src/main/java/net/minecraft/core/item/ItemStack.java b/src/main/java/net/minecraft/core/item/ItemStack.java
index 7d52537c1..2317af41f 100644
--- a/src/main/java/net/minecraft/core/item/ItemStack.java
+++ b/src/main/java/net/minecraft/core/item/ItemStack.java
@@ -294,14 +294,14 @@ public final class ItemStack
         }
     }
     
-    public boolean beforeDestroyBlock(World world, int x, int y, int z, EntityPlayer player)
+    public boolean beforeDestroyBlock(World world, int id, int x, int y, int z, Side side, EntityPlayer player)
     {
-    	return getItem().beforeDestroyBlock(world, this, x, y, z, player);
+    	return getItem().beforeDestroyBlock(world, this, id, x, y, z, side, player);
     }
 
-    public void onDestroyBlock(World world, int id, int x, int y, int z, EntityPlayer entityplayer)
+    public void onDestroyBlock(World world, int id, int x, int y, int z, Side side, EntityPlayer entityplayer)
     {
-        boolean flag = Item.itemsList[itemID].onBlockDestroyed(world, this, id, x, y, z, entityplayer);
+        boolean flag = Item.itemsList[itemID].onBlockDestroyed(world, this, id, x, y, z, side, entityplayer);
         if(flag)
         {
             entityplayer.addStat(StatList.usedItemStats[itemID], 1);
diff --git a/src/main/java/net/minecraft/core/item/tool/ItemTool.java b/src/main/java/net/minecraft/core/item/tool/ItemTool.java
index 93c419b57..811b0b735 100644
--- a/src/main/java/net/minecraft/core/item/tool/ItemTool.java
+++ b/src/main/java/net/minecraft/core/item/tool/ItemTool.java
@@ -8,6 +8,7 @@ import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.material.ToolMaterial;
 import net.minecraft.core.item.tag.ItemTags;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 public class ItemTool extends Item
@@ -44,7 +45,7 @@ public class ItemTool extends Item
 	}
 
 	@Override
-	public boolean onBlockDestroyed(World world, ItemStack itemstack, int i, int j, int k, int l, EntityLiving entityliving) {
+	public boolean onBlockDestroyed(World world, ItemStack itemstack, int i, int j, int k, int l, Side side, EntityLiving entityliving) {
 		Block block = Block.blocksList[i];
 		if(block != null) {
 			if(block.getHardness() > 0.0f || isSilkTouch()) {
diff --git a/src/main/java/net/minecraft/core/item/tool/ItemToolAxe.java b/src/main/java/net/minecraft/core/item/tool/ItemToolAxe.java
index 8296b1195..a5847e3f0 100644
--- a/src/main/java/net/minecraft/core/item/tool/ItemToolAxe.java
+++ b/src/main/java/net/minecraft/core/item/tool/ItemToolAxe.java
@@ -9,6 +9,7 @@ import net.minecraft.core.entity.EntityLiving;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.material.ToolMaterial;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 public class ItemToolAxe extends ItemTool
@@ -26,7 +27,7 @@ public class ItemToolAxe extends ItemTool
     }
     
     @Override
-    public boolean beforeDestroyBlock(World world, ItemStack itemStack, int x, int y, int z, EntityPlayer player)
+    public boolean beforeDestroyBlock(World world, ItemStack itemStack, int blockId, int x, int y, int z, Side side, EntityPlayer player)
     {
     	if(!world.isClientSide && world.getGameRuleValue(GameRules.TREECAPITATOR) && !player.isSneaking()) {
     		int id = world.getBlockId(x, y, z);
diff --git a/src/main/java/net/minecraft/core/item/tool/ItemToolHoe.java b/src/main/java/net/minecraft/core/item/tool/ItemToolHoe.java
index e56d26f74..24b69dcaa 100644
--- a/src/main/java/net/minecraft/core/item/tool/ItemToolHoe.java
+++ b/src/main/java/net/minecraft/core/item/tool/ItemToolHoe.java
@@ -65,7 +65,7 @@ public class ItemToolHoe extends ItemTool
     }
     
     @Override
-    public boolean onBlockDestroyed(World world, ItemStack itemstack, int id, int x, int y, int z, EntityLiving entity) {
+    public boolean onBlockDestroyed(World world, ItemStack itemstack, int id, int x, int y, int z, Side side, EntityLiving entity) {
     	if(entity != null && !entity.world.isClientSide) {
         	if(id == Block.tallgrass.id || id == Block.tallgrassFern.id) {
         		if(this.material.isSilkTouch()) {
@@ -79,7 +79,7 @@ public class ItemToolHoe extends ItemTool
         		}
         	}
     	}
-    	return super.onBlockDestroyed(world, itemstack, id, x, y, z, entity);
+    	return super.onBlockDestroyed(world, itemstack, id, x, y, z, side, entity);
     }
 
 }
diff --git a/src/main/java/net/minecraft/core/item/tool/ItemToolSword.java b/src/main/java/net/minecraft/core/item/tool/ItemToolSword.java
index 2b6e96204..265c0ac15 100644
--- a/src/main/java/net/minecraft/core/item/tool/ItemToolSword.java
+++ b/src/main/java/net/minecraft/core/item/tool/ItemToolSword.java
@@ -7,6 +7,7 @@ import net.minecraft.core.block.Block;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.material.ToolMaterial;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 // Referenced classes of package net.minecraft.src:
@@ -39,7 +40,7 @@ public class ItemToolSword extends Item
     }
 
     @Override
-    public boolean onBlockDestroyed(World world, ItemStack itemstack, int i, int j, int k, int l, EntityLiving entityliving)
+    public boolean onBlockDestroyed(World world, ItemStack itemstack, int i, int j, int k, int l, Side side, EntityLiving entityliving)
     {
         Block block = Block.blocksList[i];
         if(block != null) {
diff --git a/src/main/java/net/minecraft/core/world/World.java b/src/main/java/net/minecraft/core/world/World.java
index f050ae9ef..11ee88fd6 100644
--- a/src/main/java/net/minecraft/core/world/World.java
+++ b/src/main/java/net/minecraft/core/world/World.java
@@ -1843,7 +1843,7 @@ public class World implements WorldSource {
                 break;
             }
             TileEntity tileentity = (TileEntity)iterator.next();
-            if(!tileentity.isInvalid())
+            if(!tileentity.isInvalid() && isBlockLoaded(tileentity.x, tileentity.y, tileentity.z))
             {
                 tileentity.tick();
             }
@@ -2902,23 +2902,37 @@ public class World implements WorldSource {
         return getClosestPlayer(entity.x, entity.y, entity.z, radius);
     }
 
+    /**
+     * @param radius Radius around the point to search for a player, a radius less than 0 denotes searching for the closest player with 0 regard for radius
+     */
     public EntityPlayer getClosestPlayer(double x, double y, double z, double radius)
     {
-        if (radius < 0) return null;
-
         double closestDistance = Double.POSITIVE_INFINITY;
         EntityPlayer entityplayer = null;
+        if (radius < 0) {
 
-        for (EntityPlayer entityPlayer1 : players) {
-            double currentDistance = entityPlayer1.distanceToSqr(x, y, z);
-            if (currentDistance < radius * radius && (currentDistance < closestDistance)) {
-                closestDistance = currentDistance;
-                entityplayer = entityPlayer1;
+            for (EntityPlayer entityPlayer1 : players) {
+                double currentDistance = entityPlayer1.distanceToSqr(x, y, z);
+                if ((currentDistance < closestDistance)) {
+                    closestDistance = currentDistance;
+                    entityplayer = entityPlayer1;
+                }
+            }
+        } else {
+            double rSquared = radius * radius;
+            for (EntityPlayer entityPlayer1 : players) {
+                double currentDistance = entityPlayer1.distanceToSqr(x, y, z);
+                if (currentDistance < rSquared && (currentDistance < closestDistance)) {
+                    closestDistance = currentDistance;
+                    entityplayer = entityPlayer1;
+                }
             }
         }
         return entityplayer;
     }
 
+
+
     public EntityPlayer getPlayerEntityByName(String s)
     {
         for (EntityPlayer player : players) {
diff --git a/src/main/java/net/minecraft/server/net/handler/NetServerHandler.java b/src/main/java/net/minecraft/server/net/handler/NetServerHandler.java
index 939c9e49e..a78c6a067 100644
--- a/src/main/java/net/minecraft/server/net/handler/NetServerHandler.java
+++ b/src/main/java/net/minecraft/server/net/handler/NetServerHandler.java
@@ -157,6 +157,7 @@ public class NetServerHandler extends NetHandler
     @Override
     public void handleFlying(Packet10Flying packet)
     {
+        if (!playerEntity.isAlive()) return;
         WorldServer worldserver = mcServer.getDimensionWorld(playerEntity.dimension);
 
         field_22003_h = true;
@@ -357,7 +358,7 @@ public class NetServerHandler extends NetHandler
         final int y = packet.yPosition;
         final int z = packet.zPosition;
 
-        if (!playerEntity.getGamemode().canInteract()) return;
+        if (!playerEntity.getGamemode().canInteract() || !playerEntity.isAlive()) return;
         WorldServer world = mcServer.getDimensionWorld(playerEntity.dimension);
         if(packet.status == 4) {
             // Drop single item
@@ -403,7 +404,7 @@ public class NetServerHandler extends NetHandler
             playerEntity.playerController.hitBlock(x, y, z, packet.side, packet.xHit, packet.yHit);
         } else if(packet.status == 2) {
             // Block Destroy
-            if(!playerEntity.playerController.destroyBlock(x, y, z)) {
+            if(!playerEntity.playerController.destroyBlock(x, y, z, packet.side)) {
                 playerEntity.playerNetServerHandler.sendPacket(new Packet53BlockChange(x, y, z, world));
             }
         }
@@ -421,7 +422,7 @@ public class NetServerHandler extends NetHandler
     @Override
     public void handlePlace(Packet15Place packet)
     {
-        if (!playerEntity.getGamemode().canInteract()) return;
+        if (!playerEntity.getGamemode().canInteract() || !playerEntity.isAlive()) return;
         WorldServer worldserver = mcServer.getDimensionWorld(playerEntity.dimension);
         ItemStack itemstack = playerEntity.inventory.getCurrentItem();
         boolean flag = worldserver.field_819_z = worldserver.dimension.id != 0 || mcServer.playerList.isOp(playerEntity.username);
@@ -632,6 +633,7 @@ public class NetServerHandler extends NetHandler
     @Override
     public void handleAnimation(Packet18Animation packet)
     {
+        if (!playerEntity.isAlive()) return;
         if (packet.animate == 1)
         {
             playerEntity.swingItem();
@@ -641,6 +643,7 @@ public class NetServerHandler extends NetHandler
     @Override
     public void handleEntityAction(Packet19EntityAction packet)
     {
+        if (!playerEntity.isAlive()) return;
         if (packet.state == 1)
         {
             playerEntity.setSneaking(true);
@@ -658,6 +661,7 @@ public class NetServerHandler extends NetHandler
     @Override
     public void handleBoatControl(Packet26BoatControl packet26BoatControl)
     {
+        if (!playerEntity.getGamemode().canInteract() || !playerEntity.isAlive()) return;
         if (playerEntity.vehicle != null && playerEntity.vehicle instanceof EntityBoat){
             EntityBoat boat = (EntityBoat) playerEntity.vehicle;
             boat.handleControlDirect(packet26BoatControl.targetXD, packet26BoatControl.targetZD, packet26BoatControl.targetYRot);
@@ -692,7 +696,7 @@ public class NetServerHandler extends NetHandler
     @Override
     public void handleUseEntity(Packet7UseEntity packet)
     {
-        if (!playerEntity.getGamemode().canInteract()) return;
+        if (!playerEntity.getGamemode().canInteract() || !playerEntity.isAlive()) return;
         WorldServer worldserver = mcServer.getDimensionWorld(playerEntity.dimension);
         Entity targetEntity = worldserver.getEntityFromId(packet.targetEntity);
         if (targetEntity != null && playerEntity.distanceToSqr(targetEntity) < 36D)
@@ -798,7 +802,7 @@ public class NetServerHandler extends NetHandler
     @Override
     public void handleUpdateSign(Packet130UpdateSign packet)
     {
-        if (!playerEntity.getGamemode().canInteract()) return;
+        if (!playerEntity.getGamemode().canInteract() || !playerEntity.isAlive()) return;
         WorldServer worldserver = mcServer.getDimensionWorld(playerEntity.dimension);
         if (worldserver.isBlockLoaded(packet.xPosition, packet.yPosition, packet.zPosition))
         {
diff --git a/src/main/java/net/minecraft/server/world/ServerPlayerController.java b/src/main/java/net/minecraft/server/world/ServerPlayerController.java
index c15cdb159..fba54f23b 100644
--- a/src/main/java/net/minecraft/server/world/ServerPlayerController.java
+++ b/src/main/java/net/minecraft/server/world/ServerPlayerController.java
@@ -39,7 +39,7 @@ public class ServerPlayerController
                 if(f >= 1.0F)
                 {
                     destroyBlock = false;
-                    mineBlock(destroyX, destroyY, destroyZ);
+                    mineBlock(destroyX, destroyY, destroyZ, destroySide);
                 }
             } else
             {
@@ -50,13 +50,13 @@ public class ServerPlayerController
 
 	public void startMining(int x, int y, int z, Side side) {
 		if(!player.getGamemode().doBlockBreakingAnim()) {
-			mineBlock(x, y, z);
+			mineBlock(x, y, z, side);
 			return;
 		}
 		blockHitTicks = ticksRan;
 		Block block = thisWorld.getBlock(x, y, z);
 		if(block != null && block.blockStrength(player) >= 1.0F) {
-			mineBlock(x, y, z);
+			mineBlock(x, y, z, side);
 		} else {
 			currentlyMiningX = x;
 			currentlyMiningY = y;
@@ -72,7 +72,7 @@ public class ServerPlayerController
 		}
 	}
 
-    public boolean destroyBlock(int x, int y, int z)
+    public boolean destroyBlock(int x, int y, int z, Side side)
     {
         if(x == currentlyMiningX && y == currentlyMiningY && z == currentlyMiningZ)
         {
@@ -84,7 +84,7 @@ public class ServerPlayerController
                 float f = block.blockStrength(player) * (float)(l + 1);
                 if(f >= 0.7F)
                 {
-                    return mineBlock(x, y, z);
+                    return mineBlock(x, y, z, side);
                 }
                 else if(!destroyBlock)
                 {
@@ -92,6 +92,7 @@ public class ServerPlayerController
                     destroyX = x;
                     destroyY = y;
                     destroyZ = z;
+                    destroySide = side;
                     destroyBlockTicks = blockHitTicks;
                 }
             }
@@ -99,32 +100,32 @@ public class ServerPlayerController
         return false;
     }
 
-    public boolean removeBlock(int i, int j, int k)
+    public boolean removeBlock(int x, int y, int z)
     {
-        Block block = Block.blocksList[thisWorld.getBlockId(i, j, k)];
-        int l = thisWorld.getBlockMetadata(i, j, k);
-        return thisWorld.setBlockWithNotify(i, j, k, 0);
+        Block block = Block.blocksList[thisWorld.getBlockId(x, y, z)];
+        int l = thisWorld.getBlockMetadata(x, y, z);
+        return thisWorld.setBlockWithNotify(x, y, z, 0);
     }
 
-    public boolean mineBlock(int x, int y, int z)
+    public boolean mineBlock(int x, int y, int z, Side side)
     {
     	ItemStack heldItemStack = player.getHeldItem();
+        int id = thisWorld.getBlockId(x, y, z);
+        int meta = thisWorld.getBlockMetadata(x, y, z);
     	Item heldItem = null;
     	if(heldItemStack != null) {
     		heldItem = heldItemStack.getItem();
-    		if(!heldItemStack.beforeDestroyBlock(thisWorld, x, y, z, player)) {
+    		if(!heldItemStack.beforeDestroyBlock(thisWorld, id, x, y, z, side, player)) {
     			return false;
     		}
     	}
-        int id = thisWorld.getBlockId(x, y, z);
-        int meta = thisWorld.getBlockMetadata(x, y, z);
         Block block = Block.getBlock(id);
         TileEntity tileEntity = thisWorld.getBlockTileEntity(x, y, z);
         thisWorld.playSoundEffect(player, 2001, x, y, z, id);
         boolean flag = removeBlock(x, y, z);
         if(flag) {
         	if(block != null) {
-        		block.onBlockDestroyedByPlayer(thisWorld, x, y, z, meta, player, heldItem);
+        		block.onBlockDestroyedByPlayer(thisWorld, x, y, z, side, meta, player, heldItem);
         	}
         }
         if(flag && player.canHarvestBlock(Block.blocksList[id]) && player.getGamemode().dropBlockOnBreak())
@@ -135,7 +136,7 @@ public class ServerPlayerController
         ItemStack itemstack = player.getCurrentEquippedItem();
         if(itemstack != null)
         {
-            itemstack.onDestroyBlock(thisWorld, id, x, y, z, player);
+            itemstack.onDestroyBlock(thisWorld, id, x, y, z, side, player);
             if(itemstack.stackSize <= 0)
             {
                 player.destroyCurrentEquippedItem();
@@ -195,5 +196,6 @@ public class ServerPlayerController
     private int destroyX;
     private int destroyY;
     private int destroyZ;
+    private Side destroySide;
     private int destroyBlockTicks;
 }
diff --git a/src/main/resources/assets/minecraft/textures/entity/snowman/0.png b/src/main/resources/assets/minecraft/textures/entity/snowman/0.png
index c508b5e23..3c8dda504 100644
Binary files a/src/main/resources/assets/minecraft/textures/entity/snowman/0.png and b/src/main/resources/assets/minecraft/textures/entity/snowman/0.png differ
diff --git a/src/main/resources/assets/minecraft/textures/entity/snowman/1.png b/src/main/resources/assets/minecraft/textures/entity/snowman/1.png
index 0f9915902..32043e26f 100644
Binary files a/src/main/resources/assets/minecraft/textures/entity/snowman/1.png and b/src/main/resources/assets/minecraft/textures/entity/snowman/1.png differ
diff --git a/src/main/resources/assets/minecraft/textures/entity/snowman/2.png b/src/main/resources/assets/minecraft/textures/entity/snowman/2.png
index e4aac9c56..f2e9f80a0 100644
Binary files a/src/main/resources/assets/minecraft/textures/entity/snowman/2.png and b/src/main/resources/assets/minecraft/textures/entity/snowman/2.png differ
diff --git a/src/main/resources/assets/minecraft/textures/entity/snowman/3.png b/src/main/resources/assets/minecraft/textures/entity/snowman/3.png
index 52ee37e09..6a282ee11 100644
Binary files a/src/main/resources/assets/minecraft/textures/entity/snowman/3.png and b/src/main/resources/assets/minecraft/textures/entity/snowman/3.png differ
diff --git a/src/main/resources/assets/minecraft/textures/entity/snowman/4.png b/src/main/resources/assets/minecraft/textures/entity/snowman/4.png
index 91bb13c4b..e7734a545 100644
Binary files a/src/main/resources/assets/minecraft/textures/entity/snowman/4.png and b/src/main/resources/assets/minecraft/textures/entity/snowman/4.png differ
