diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java
index 612652f03..856451543 100644
--- a/src/main/java/net/minecraft/client/Minecraft.java
+++ b/src/main/java/net/minecraft/client/Minecraft.java
@@ -8,6 +8,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Random;
 
+import net.minecraft.client.gui.guidebook.GuiGuidebook;
 import org.lwjgl.LWJGLException;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.input.Mouse;
@@ -1069,7 +1070,17 @@ public class Minecraft
             int blockX = objectMouseOver.x;
             int blockY = objectMouseOver.y;
             int blockZ = objectMouseOver.z;
-            playerController.continueDestroyBlock(blockX, blockY, blockZ, objectMouseOver.side);
+            Side side = objectMouseOver.side;
+            double xPlaced;
+			double yPlaced = objectMouseOver.location.yCoord - objectMouseOver.y;
+			if(side.getAxis() == Axis.X) {
+				xPlaced = objectMouseOver.location.xCoord - objectMouseOver.x;
+			}else if(side.getAxis() == Axis.Z) {
+				xPlaced = objectMouseOver.location.zCoord - objectMouseOver.z;
+			}else {
+				xPlaced = objectMouseOver.location.xCoord - objectMouseOver.x;
+			}
+            playerController.continueDestroyBlock(blockX, blockY, blockZ, objectMouseOver.side, xPlaced, yPlaced);
         }
         else
         {
@@ -1111,24 +1122,18 @@ public class Minecraft
             int blockZ = objectMouseOver.z;
             Side side = objectMouseOver.side;
             double xPlaced;
-            double yPlaced = objectMouseOver.location.yCoord - objectMouseOver.y;
-
-            if (side.getAxis() == Axis.X)
-            {
-                xPlaced = objectMouseOver.location.xCoord - objectMouseOver.x;
-            }
-            else if (side.getAxis() == Axis.Z)
-            {
-                xPlaced = objectMouseOver.location.zCoord - objectMouseOver.z;
-            }
-            else
-            {
-                xPlaced = objectMouseOver.location.xCoord - objectMouseOver.x;
-            }
+			double yPlaced = objectMouseOver.location.yCoord - objectMouseOver.y;
+			if(side.getAxis() == Axis.X) {
+				xPlaced = objectMouseOver.location.xCoord - objectMouseOver.x;
+			}else if(side.getAxis() == Axis.Z) {
+				xPlaced = objectMouseOver.location.zCoord - objectMouseOver.z;
+			}else {
+				xPlaced = objectMouseOver.location.xCoord - objectMouseOver.x;
+			}
 
             if(clickType == 0)
             {
-                playerController.startDestroyBlock(blockX, blockY, blockZ, objectMouseOver.side, repeat);
+                playerController.startDestroyBlock(blockX, blockY, blockZ, objectMouseOver.side, xPlaced, yPlaced, repeat);
                 playerController.swingItem(true);
             } else
             {
@@ -1871,6 +1876,9 @@ public class Minecraft
                 gameSettings.thirdPersonView.value++;
                 gameSettings.thirdPersonView.value%=3;
             }
+            if (controllerInput.digitalPad.right.pressedThisFrame()){
+                thePlayer.displayGUIGuidebook();
+            }
         }else {
             GuiScreen currentScreen = this.currentScreen;
             if(controller.buttonB.pressedThisFrame()) {
@@ -1896,12 +1904,10 @@ public class Minecraft
             }
 
             //Inventory Controls
-            if(currentScreen instanceof GuiContainer) {
-                try{
-                    ((GuiContainer) currentScreen).controllerInput(controller);
-                }catch (Exception e) {
-                    e.printStackTrace();
-                }
+            try{
+                currentScreen.controllerInput(controller);
+            }catch (Exception e) {
+                e.printStackTrace();
             }
         }
     }
diff --git a/src/main/java/net/minecraft/client/entity/player/EntityClientPlayerMP.java b/src/main/java/net/minecraft/client/entity/player/EntityClientPlayerMP.java
index 4a7ef626d..e63d3cfb9 100644
--- a/src/main/java/net/minecraft/client/entity/player/EntityClientPlayerMP.java
+++ b/src/main/java/net/minecraft/client/entity/player/EntityClientPlayerMP.java
@@ -156,7 +156,7 @@ public class EntityClientPlayerMP extends EntityPlayerSP
 
     @Override
     public void dropCurrentItem(boolean dropFullStack) {
-        sendQueue.addToSendQueue(new Packet14BlockDig(dropFullStack ? 5 : 4, 0, 0, 0, Side.NONE));
+        sendQueue.addToSendQueue(new Packet14BlockDig(dropFullStack ? 5 : 4, 0, 0, 0, Side.NONE, 0.0, 0.0));
     }
 
     private void sendInventoryChanged()
@@ -286,7 +286,7 @@ public class EntityClientPlayerMP extends EntityPlayerSP
     
     @Override
     public void pickBlock(int x, int y, int z) {
-    	sendQueue.addToSendQueue(new Packet14BlockDig(6, x, y, z, Side.NONE));
+    	sendQueue.addToSendQueue(new Packet14BlockDig(6, x, y, z, Side.NONE, 0.0, 0.0));
     }
     public NetClientHandler sendQueue;
     private int field_9380_bx;
diff --git a/src/main/java/net/minecraft/client/gui/GuiContainer.java b/src/main/java/net/minecraft/client/gui/GuiContainer.java
index 6d63c3853..2178d5fdd 100644
--- a/src/main/java/net/minecraft/client/gui/GuiContainer.java
+++ b/src/main/java/net/minecraft/client/gui/GuiContainer.java
@@ -576,22 +576,9 @@ public abstract class GuiContainer extends GuiScreen
 //			}
 //		}
 
-		guiSpecificControllerInput(controller);
-		playControllerButtonSound(controller);
+		super.controllerInput(controller);
 	}
-	public void guiSpecificControllerInput(ControllerInput controller){
 
-	}
-
-	public void playControllerButtonSound(ControllerInput controller){
-		if(controller.buttonA.pressedThisFrame() || controller.buttonX.pressedThisFrame() || controller.buttonY.pressedThisFrame()) {
-			mc.sndManager.playSound("random.ui_click", SoundCategory.GUI_SOUNDS, 1.0f, 1.0f);
-		}
-		if(controller.buttonB.pressedThisFrame()) {
-			mc.sndManager.playSound("random.ui_back", SoundCategory.GUI_SOUNDS, 1.0f, 1.0f);
-		}
-	}
-	
 	private int getSlotId(int x, int y) {
 		Slot slot = getSlotAtPosition(x, y);
 		int x2 = (width - xSize) / 2;
diff --git a/src/main/java/net/minecraft/client/gui/GuiPhotoMode.java b/src/main/java/net/minecraft/client/gui/GuiPhotoMode.java
index b79326202..0af62e9b7 100644
--- a/src/main/java/net/minecraft/client/gui/GuiPhotoMode.java
+++ b/src/main/java/net/minecraft/client/gui/GuiPhotoMode.java
@@ -1,6 +1,8 @@
 package net.minecraft.client.gui;
 
+import net.minecraft.client.gui.modelviewer.elements.GuiListenerTextureButton;
 import net.minecraft.core.Global;
+import net.minecraft.core.util.helper.Utils;
 import net.minecraft.core.world.season.Season;
 import net.minecraft.core.world.season.Seasons;
 import org.lwjgl.input.Keyboard;
@@ -14,6 +16,7 @@ import net.minecraft.client.render.shader.PhotoModeRenderer;
 import net.minecraft.client.render.shader.Shaders;
 import net.minecraft.core.util.helper.ScreenShot;
 
+import java.io.File;
 import java.util.Locale;
 
 public class GuiPhotoMode extends GuiScreen
@@ -24,6 +27,7 @@ public class GuiPhotoMode extends GuiScreen
     private GuiSlider sliderTimeOfDay;
     private GuiButton buttonSeason;
     private GuiButton buttonTakeScreenshot;
+    private GuiListenerTextureButton buttonOpenScreenshotFolder;
     private GuiButton buttonExit;
     private GuiSlider sliderFog;
     private GuiSlider sliderTilt;
@@ -127,9 +131,11 @@ public class GuiPhotoMode extends GuiScreen
 
         buttonExit = new GuiButton(5, 0, 0, 20, 20, "X");
 
-        buttonRotateLeft = new GuiButton(0, width / 2 - 49 - 2 - 20, height - 20, 20, 20, "<");
-        buttonRotateRight = new GuiButton(1, width / 2 + 49 + 2, height - 20, 20, 20, ">");
-        buttonTakeScreenshot = new GuiButton(4, width / 2 - 49, height - 20, 98, 20, i18n.translateKey("gui.photo_mode.button.take_screenshot"));
+        buttonRotateLeft = new GuiButton(0, width / 2 - 59 - 2 - 20, height - 20, 20, 20, "<");
+        buttonRotateRight = new GuiButton(1, width / 2 + 59 + 2 + 1, height - 20, 20, 20, ">");
+        buttonTakeScreenshot = new GuiButton(4, width / 2 - 59, height - 20, 98, 20, i18n.translateKey("gui.photo_mode.button.take_screenshot"));
+        buttonOpenScreenshotFolder = new GuiListenerTextureButton(30, "/assets/minecraft/textures/gui/gui.png", buttonTakeScreenshot.getWidth() + buttonTakeScreenshot.getX() + 1, buttonTakeScreenshot.getY(), 100, 106 - 20, 20, 20);
+        buttonOpenScreenshotFolder.setActionListener(() -> Utils.openDirectory(new File(mc.getMinecraftDir(), "screenshots")));
 
         buttonCenterScreen = new GuiButton(10, width - 120, 0, 120, 20, i18n.translateKey("gui.photo_mode.button.center_camera"));
         buttonShowPlayer = new GuiButton(11, width - 120, 0, 120, 20, "");
@@ -173,6 +179,7 @@ public class GuiPhotoMode extends GuiScreen
         controlList.add(buttonRotateLeft);
         controlList.add(buttonRotateRight);
         controlList.add(buttonTakeScreenshot);
+        controlList.add(buttonOpenScreenshotFolder);
         controlList.add(buttonExit);
 
         if (desiredTOD == -1)
diff --git a/src/main/java/net/minecraft/client/gui/GuiScreen.java b/src/main/java/net/minecraft/client/gui/GuiScreen.java
index 2a8644ba0..cc38d5e21 100644
--- a/src/main/java/net/minecraft/client/gui/GuiScreen.java
+++ b/src/main/java/net/minecraft/client/gui/GuiScreen.java
@@ -5,11 +5,13 @@ import static org.lwjgl.opengl.GL11.*;
 import java.util.ArrayList;
 import java.util.List;
 import net.minecraft.client.Minecraft;
+import net.minecraft.client.input.controller.ControllerInput;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.util.debug.DebugRender;
 import net.minecraft.client.input.InputType;
 
+import net.minecraft.core.player.inventory.slot.Slot;
 import net.minecraft.core.sound.SoundCategory;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.input.Mouse;
@@ -203,6 +205,22 @@ public class GuiScreen extends Gui
     	drawTexturedModalRect(mc.controllerInput.cursorX - 8, mc.controllerInput.cursorY - 8, 224, 0, 16, 16, 32, 32);
     	glDisable(GL_BLEND);
     }
+    public void controllerInput(ControllerInput controller){
+        guiSpecificControllerInput(controller);
+        playControllerButtonSound(controller);
+    }
+
+    public void playControllerButtonSound(ControllerInput controller){
+        if(controller.buttonA.pressedThisFrame() || controller.buttonX.pressedThisFrame() || controller.buttonY.pressedThisFrame()) {
+            mc.sndManager.playSound("random.ui_click", SoundCategory.GUI_SOUNDS, 1.0f, 1.0f);
+        }
+        if(controller.buttonB.pressedThisFrame()) {
+            mc.sndManager.playSound("random.ui_back", SoundCategory.GUI_SOUNDS, 1.0f, 1.0f);
+        }
+    }
+    public void guiSpecificControllerInput(ControllerInput controller){
+
+    }
 
     public boolean pausesGame()
     {
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/GuiGuidebook.java b/src/main/java/net/minecraft/client/gui/guidebook/GuiGuidebook.java
index 419149af0..e1f9157ce 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/GuiGuidebook.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/GuiGuidebook.java
@@ -5,6 +5,8 @@ import net.minecraft.client.gui.Gui;
 import net.minecraft.client.gui.GuiScreen;
 import net.minecraft.client.gui.GuiTooltip;
 import net.minecraft.client.gui.guidebook.search.SearchPage;
+import net.minecraft.client.gui.guidebook.search.SearchSection;
+import net.minecraft.client.input.controller.ControllerInput;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.Lighting;
 import net.minecraft.client.render.OpenGLHelper;
@@ -283,6 +285,62 @@ public class GuiGuidebook
             }
         }
     }
+    public void guiSpecificControllerInput(ControllerInput controller){
+        if (controller.digitalPad.left.pressedThisFrame() || (controller.digitalPad.left.isPressed() && controller.digitalPad.left.getHoldTime() % 4 == 0)){
+            pageManager.offsetPage(-2);
+            updateTabList();
+        }
+        if (controller.digitalPad.right.pressedThisFrame() || (controller.digitalPad.right.isPressed() && controller.digitalPad.right.getHoldTime() % 4 == 0)){
+            pageManager.offsetPage(2);
+            updateTabList();
+        }
+        if (controller.buttonR.pressedThisFrame()){
+            Tab t = getTab(pageManager.getCurrentSection(), true);
+            if (t != null){
+                int currentPage = pageManager.getPageIndex(pageManager.getLeftPage());
+                pageManager.setCurrentPage(pageManager.getSectionIndex(t.getSection()), true);
+                if (currentPage == pageManager.getPageIndex(pageManager.getLeftPage())){
+                    pageManager.offsetPage(2);
+                }
+                updateTabList();
+            }
+        }
+        if (controller.buttonL.pressedThisFrame()){
+            Tab t = getTab(pageManager.getCurrentSection(), false);
+            if (t != null){
+                int currentPage = pageManager.getPageIndex(pageManager.getLeftPage());
+                pageManager.setCurrentPage(pageManager.getSectionIndex(t.getSection()), true);
+                if (currentPage == pageManager.getPageIndex(pageManager.getLeftPage())){
+                    pageManager.offsetPage(-2);
+                }
+                updateTabList();
+            }
+        }
+    }
+    private Tab getTab(GuidebookSection section, boolean searchForward){
+        Tab tab = null;
+        int index = -1;
+        for (int i = 0; i < tabs.length; i++) {
+            Tab t = tabs[i];
+            if (t == null) continue;
+            if (t.getSection() == section){
+                if (section instanceof SearchSection){
+                    index = i + 1;
+                    tab = tabs[i + 1];
+                } else {
+                    index = i;
+                    tab = t;
+                }
+                break;
+            }
+        }
+        if (tab == null) return null;
+        for (int i = 1; i < tabs.length; i++) {
+            int searchDex = (tabs.length + index + (searchForward ? i : -i)) % tabs.length;
+            if (tabs[searchDex] != null) return tabs[searchDex];
+        }
+        return null;
+    }
 
     @Override
     public void tick() {
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/GuiModelViewer.java b/src/main/java/net/minecraft/client/gui/modelviewer/GuiModelViewer.java
index aa2cec406..caf228148 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/GuiModelViewer.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/GuiModelViewer.java
@@ -1,5 +1,6 @@
 package net.minecraft.client.gui.modelviewer;
 
+import com.b100.utils.FileUtils;
 import com.b100.utils.ImageUtils;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.GuiButton;
@@ -11,6 +12,8 @@ import net.minecraft.client.gui.modelviewer.categories.ParticleCategory;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerButton;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerSlider;
 import net.minecraft.client.gui.modelviewer.elements.GuiListenerTextField;
+import net.minecraft.client.gui.modelviewer.elements.GuiListenerTextureButton;
+import net.minecraft.client.gui.modelviewer.elements.IActionListener;
 import net.minecraft.client.gui.modelviewer.elements.IListenerElement;
 import net.minecraft.client.gui.options.GuiOptions;
 import net.minecraft.client.gui.options.data.OptionsPages;
@@ -26,6 +29,7 @@ import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.util.helper.Buffer;
+import net.minecraft.core.util.helper.Utils;
 import net.minecraft.core.world.World;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.input.Mouse;
@@ -54,6 +58,7 @@ public class GuiModelViewer extends GuiPhotoMode implements GuiListenerTextField
     private GuiListenerButton buttonRotateRight;
     private GuiListenerButton buttonCenterScreen;
     private GuiListenerButton buttonTakeScreenshot;
+    private GuiListenerButton buttonOpenScreenshotFolder;
     private GuiListenerButton buttonExit;
     private GuiListenerSlider sliderTilt;
     private GuiListenerButton buttonShaders;
@@ -136,6 +141,8 @@ public class GuiModelViewer extends GuiPhotoMode implements GuiListenerTextField
 
         buttonReloadTextures = new GuiListenerButton(12, 21, height - 20, 98, 20, i18n.translateKey("gui.model_viewer.button.reload_textures"));
         buttonReloadTextures.setActionListener(() -> mc.renderEngine.refreshTexturesAndDisplayErrors());
+        buttonOpenScreenshotFolder = new GuiListenerTextureButton(30, "/assets/minecraft/textures/gui/gui.png", buttonReloadTextures.getWidth() + buttonReloadTextures.getX() + 1, buttonReloadTextures.getY(), 100, 106 - 20, 20, 20);
+        buttonOpenScreenshotFolder.setActionListener(() -> Utils.openDirectory(new File(mc.getMinecraftDir(), "")));
 
         buttonCenterScreen = new GuiListenerButton(10, 0, 0, 120, 20, i18n.translateKey("gui.photo_mode.button.center_camera"));
         buttonCenterScreen.setActionListener(() -> {
@@ -284,6 +291,7 @@ public class GuiModelViewer extends GuiPhotoMode implements GuiListenerTextField
         controlList.add(buttonRotateLeft);
         controlList.add(buttonRotateRight);
         controlList.add(buttonTakeScreenshot);
+        controlList.add(buttonOpenScreenshotFolder);
         controlList.add(buttonPrevEntry);
         controlList.add(buttonNextEntry);
         controlList.add(buttonCategory);
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerTextureButton.java b/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerTextureButton.java
new file mode 100644
index 000000000..2f9d8d47f
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/elements/GuiListenerTextureButton.java
@@ -0,0 +1,39 @@
+package net.minecraft.client.gui.modelviewer.elements;
+
+import net.minecraft.client.Minecraft;
+import org.lwjgl.opengl.GL11;
+
+public class GuiListenerTextureButton extends GuiListenerButton{
+    private String texturePath;
+    private int u;
+    private int v;
+    public GuiListenerTextureButton(int id, String texturePath, int xPosition, int yPosition, int u, int v, int width, int height) {
+        super(id, xPosition, yPosition, width, height, "");
+        this.texturePath = texturePath;
+        this.u = u;
+        this.v = v;
+    }
+
+    @Override
+    public void drawButton(Minecraft mc, int mouseX, int mouseY) {
+        if (!visible) {
+            return;
+        }
+        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture(texturePath));
+        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+        boolean isHovered = mouseX >= xPosition && mouseY >= yPosition && mouseX < xPosition + width && mouseY < yPosition + height;
+        if (!enabled)
+        {
+            drawTexturedModalRect(xPosition, yPosition, u, v, width, height);
+        }
+        else if (!isHovered)
+        {
+            drawTexturedModalRect(xPosition, yPosition, u, v + height, width, height);
+        }
+        else
+        {
+            drawTexturedModalRect(xPosition, yPosition, u, v + height * 2, width, height);
+        }
+        mouseDragged(mc, mouseX, mouseY);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/input/controller/IButton.java b/src/main/java/net/minecraft/client/input/controller/IButton.java
index 3ac3b2855..eaac271f6 100644
--- a/src/main/java/net/minecraft/client/input/controller/IButton.java
+++ b/src/main/java/net/minecraft/client/input/controller/IButton.java
@@ -11,5 +11,6 @@ public interface IButton {
 	public void update();
 	
 	public void cancelButtonPress();
+	public int getHoldTime();
 	
 }
diff --git a/src/main/java/net/minecraft/client/net/handler/NetClientHandler.java b/src/main/java/net/minecraft/client/net/handler/NetClientHandler.java
index 830b2423c..d81358efb 100644
--- a/src/main/java/net/minecraft/client/net/handler/NetClientHandler.java
+++ b/src/main/java/net/minecraft/client/net/handler/NetClientHandler.java
@@ -16,7 +16,6 @@ import net.minecraft.client.player.controller.PlayerControllerMP;
 import net.minecraft.client.world.WorldClient;
 import net.minecraft.core.Global;
 import net.minecraft.core.achievement.stat.StatList;
-import net.minecraft.core.block.Block;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.entity.TileEntityBlastFurnace;
 import net.minecraft.core.block.entity.TileEntityDispenser;
@@ -30,31 +29,20 @@ import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.data.registry.recipe.RecipeRegistry;
 import net.minecraft.core.data.registry.recipe.SearchQuery;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.EntityBobber;
 import net.minecraft.core.entity.EntityDispatcher;
-import net.minecraft.core.entity.EntityFallingSand;
 import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.entity.EntityLightningBolt;
 import net.minecraft.core.entity.EntityLiving;
 import net.minecraft.core.entity.EntityPainting;
-import net.minecraft.core.entity.EntityTNT;
 import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.entity.projectile.EntityArrow;
-import net.minecraft.core.entity.projectile.EntityArrowGolden;
-import net.minecraft.core.entity.projectile.EntityArrowPurple;
-import net.minecraft.core.entity.projectile.EntityCannonball;
-import net.minecraft.core.entity.projectile.EntityEgg;
-import net.minecraft.core.entity.projectile.EntityFireball;
-import net.minecraft.core.entity.projectile.EntityPebble;
-import net.minecraft.core.entity.projectile.EntitySnowball;
-import net.minecraft.core.entity.vehicle.EntityBoat;
-import net.minecraft.core.entity.vehicle.EntityMinecart;
+import net.minecraft.core.entity.projectile.EntityProjectile;
 import net.minecraft.core.enums.ArtType;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemMap;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.net.NetworkManager;
 import net.minecraft.core.net.PlayerProfile;
+import net.minecraft.core.net.entity.NetEntityHandler;
 import net.minecraft.core.net.handler.NetHandler;
 import net.minecraft.core.net.packet.Packet;
 import net.minecraft.core.net.packet.Packet100OpenWindow;
@@ -235,134 +223,46 @@ public class NetClientHandler extends NetHandler
     @Override
     public void handlePickupSpawn(Packet21PickupSpawn packet21pickupspawn)
     {
-        double d = (double) packet21pickupspawn.xPosition / 32D;
-        double d1 = (double) packet21pickupspawn.yPosition / 32D;
-        double d2 = (double) packet21pickupspawn.zPosition / 32D;
-        EntityItem entityitem = new EntityItem(worldClient, d, d1, d2, new ItemStack(packet21pickupspawn.itemID, packet21pickupspawn.count, packet21pickupspawn.itemDamage, packet21pickupspawn.tag));
-        entityitem.xd = (double) packet21pickupspawn.rotation / 128D;
-        entityitem.yd = (double) packet21pickupspawn.pitch / 128D;
-        entityitem.zd = (double) packet21pickupspawn.roll / 128D;
+        double x = packet21pickupspawn.xPosition / 32D;
+        double y = packet21pickupspawn.yPosition / 32D;
+        double z = packet21pickupspawn.zPosition / 32D;
+        EntityItem entityitem = new EntityItem(worldClient, x, y, z, new ItemStack(packet21pickupspawn.itemID, packet21pickupspawn.count, packet21pickupspawn.itemDamage, packet21pickupspawn.tag));
+        entityitem.xd = (double) packet21pickupspawn.xd / 128D;
+        entityitem.yd = (double) packet21pickupspawn.yd / 128D;
+        entityitem.zd = (double) packet21pickupspawn.zd / 128D;
         entityitem.serverPosX = packet21pickupspawn.xPosition;
         entityitem.serverPosY = packet21pickupspawn.yPosition;
         entityitem.serverPosZ = packet21pickupspawn.zPosition;
         worldClient.addEntityToWorld(packet21pickupspawn.entityId, entityitem);
     }
 
+
     @Override
-    public void handleVehicleSpawn(Packet23VehicleSpawn packet23vehiclespawn)
-    {
-        double xPosition = (double) packet23vehiclespawn.xPosition / 32D;
-        double yPosition = (double) packet23vehiclespawn.yPosition / 32D;
-        double zPosition = (double) packet23vehiclespawn.zPosition / 32D;
-        Entity newEntity = null;
-        if (packet23vehiclespawn.type == 10)
-        {
-            newEntity = new EntityMinecart(worldClient, xPosition, yPosition, zPosition, 0);
-        }
-        if (packet23vehiclespawn.type == 11)
-        {
-            newEntity = new EntityMinecart(worldClient, xPosition, yPosition, zPosition, 1);
-        }
-        if (packet23vehiclespawn.type == 12)
-        {
-            newEntity = new EntityMinecart(worldClient, xPosition, yPosition, zPosition, 2);
-        }
-        if (packet23vehiclespawn.type == 90)
-        {
-            newEntity = new EntityBobber(worldClient, xPosition, yPosition, zPosition);
-        }
-        if (packet23vehiclespawn.type == 60)
-        {
-            if (packet23vehiclespawn.arrowType == 2)
-            {
-                newEntity = new EntityArrowGolden(worldClient, xPosition, yPosition, zPosition);
-            }
-            else if (packet23vehiclespawn.arrowType == 1)
-            {
-                newEntity = new EntityArrowPurple(worldClient, xPosition, yPosition, zPosition);
-            }
-            else
-            {
-                newEntity = new EntityArrow(worldClient, xPosition, yPosition, zPosition, packet23vehiclespawn.arrowType);
+    public void handleVehicleSpawn(Packet23VehicleSpawn packet23) {
+        if (!NetEntityHandler.hasType(packet23.type)){ return; }
+        double xPosition = ((double) packet23.xPosition) / 32D;
+        double yPosition = ((double) packet23.yPosition) / 32D;
+        double zPosition = ((double) packet23.zPosition) / 32D;
+        Entity owner;
+        if (packet23.ownerId >= 0){
+            owner = getEntityByID(packet23.ownerId);
+        } else {
+            owner = null;
+        }
+        Entity newEntity = NetEntityHandler.getTypeEntry(packet23.type).getEntity(worldClient, xPosition, yPosition, zPosition, packet23.metaData, packet23.hasVelocity, packet23.xVelocity / 8000D, packet23.yVelocity / 8000D, packet23.zVelocity / 8000D, owner);
+        if (newEntity != null) {
+            newEntity.serverPosX = packet23.xPosition;
+            newEntity.serverPosY = packet23.yPosition;
+            newEntity.serverPosZ = packet23.zPosition;
+            newEntity.yRot = packet23.yaw;
+            newEntity.xRot = packet23.pitch;
+            newEntity.id = packet23.entityId;
+            worldClient.addEntityToWorld(packet23.entityId, newEntity);
+            if (owner instanceof EntityLiving && newEntity instanceof EntityProjectile){
+                ((EntityProjectile) newEntity).owner = (EntityLiving) owner;
             }
-        }
-        if (packet23vehiclespawn.type == 61)
-        {
-            newEntity = new EntitySnowball(worldClient, xPosition, yPosition, zPosition);
-        }
-        if (packet23vehiclespawn.type == 62)
-        {
-            newEntity = new EntityEgg(worldClient, xPosition, yPosition, zPosition);
-        }
-        if (packet23vehiclespawn.type == 63)
-        {
-            newEntity = new EntityFireball(worldClient, xPosition, yPosition, zPosition, (double) packet23vehiclespawn.xVelocity / 8000D, (double) packet23vehiclespawn.yVelocity / 8000D, (double) packet23vehiclespawn.zVelocity / 8000D);
-            packet23vehiclespawn.ownerId = 0;
-        }
-        if (packet23vehiclespawn.type == 64)
-        {
-            newEntity = new EntityPebble(worldClient, xPosition, yPosition, zPosition);
-        }
-        if (packet23vehiclespawn.type == 1)
-        {
-            newEntity = new EntityBoat(worldClient, xPosition, yPosition, zPosition);
-        }
-        if (packet23vehiclespawn.type == 50)
-        {
-            newEntity = new EntityTNT(worldClient, xPosition, yPosition, zPosition);
-        }
-        if (packet23vehiclespawn.type == 70)
-        {
-            newEntity = new EntityFallingSand(worldClient, xPosition, yPosition, zPosition, Block.sand.id);
-        }
-        if (packet23vehiclespawn.type == 71)
-        {
-            newEntity = new EntityFallingSand(worldClient, xPosition, yPosition, zPosition, Block.gravel.id);
-        }
-        if (packet23vehiclespawn.type == 73)
-        {
-            newEntity = new EntityFallingSand(worldClient, xPosition, yPosition, zPosition, Block.mud.id);
-        }
-        if (packet23vehiclespawn.type == 72)
-        {
-            newEntity = new EntityCannonball(worldClient, xPosition, yPosition, zPosition);
-        }
-        if (newEntity != null)
-        {
-            newEntity.serverPosX = packet23vehiclespawn.xPosition;
-            newEntity.serverPosY = packet23vehiclespawn.yPosition;
-            newEntity.serverPosZ = packet23vehiclespawn.zPosition;
-            newEntity.yRot = packet23vehiclespawn.yaw;
-            newEntity.xRot = packet23vehiclespawn.pitch;
-            newEntity.id = packet23vehiclespawn.entityId;
-            worldClient.addEntityToWorld(packet23vehiclespawn.entityId, newEntity);
-            if (packet23vehiclespawn.ownerId > 0)
-            {
-                if (packet23vehiclespawn.type == 60)
-                {
-                    Entity entity = getEntityByID(packet23vehiclespawn.ownerId);
-                    if (entity instanceof EntityLiving)
-                    {
-                        ((EntityArrow) newEntity).owner = (EntityLiving) entity;
-                    }
-                }
-                if (packet23vehiclespawn.type == 72)
-                {
-                    Entity entity = getEntityByID(packet23vehiclespawn.ownerId);
-                    if (entity instanceof EntityLiving)
-                    {
-                        ((EntityCannonball) newEntity).owner = (EntityLiving) entity;
-                    }
-                }
-                if (packet23vehiclespawn.type == 73)
-                {
-                    Entity entity = getEntityByID(packet23vehiclespawn.ownerId);
-                    if (entity instanceof EntityLiving)
-                    {
-                        ((EntityArrowGolden) newEntity).owner = (EntityLiving) entity;
-                    }
-                }
-                newEntity.lerpMotion((double) packet23vehiclespawn.xVelocity / 8000D, (double) packet23vehiclespawn.yVelocity / 8000D, (double) packet23vehiclespawn.zVelocity / 8000D);
+            if (packet23.hasVelocity){
+                newEntity.lerpMotion(((double) packet23.xVelocity) / 8000D, ((double) packet23.yVelocity) / 8000D, ((double) packet23.zVelocity) / 8000D);
             }
         }
     }
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 1988619e3..13334491a 100644
--- a/src/main/java/net/minecraft/client/player/controller/PlayerController.java
+++ b/src/main/java/net/minecraft/client/player/controller/PlayerController.java
@@ -14,6 +14,8 @@ import net.minecraft.core.item.tag.ItemTags;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
+import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
+
 public abstract class PlayerController {
 	
 	protected float currentDamage;
@@ -31,7 +33,7 @@ public abstract class PlayerController {
 	
 	//Called when the mouse is clicked and about 5 times per second while the button is held down
 	//Repeat is false when the mouse was clicked this frame
-	public void startDestroyBlock(int x, int y, int z, Side side, boolean repeat) {
+	public void startDestroyBlock(int x, int y, int z, Side side, double xHit, double yHit, boolean repeat) {
 		if(!mc.thePlayer.getGamemode().doBlockBreakingAnim()) {
 			swingItem(true);
 			
@@ -41,7 +43,7 @@ public abstract class PlayerController {
 			}
 			
 			destroyBlock(x, y, z, side, mc.thePlayer);
-			sendStartDigPacket(x, y, z, side);
+			sendStartDigPacket(x, y, z, side, xHit, yHit);
 			return;
 		}
 
@@ -51,15 +53,15 @@ public abstract class PlayerController {
 			
 			if(mineStrength < 1.0f) {
 				if(!repeat) {
-					sendStartDigPacket(x, y, z, side);
-					hitBlock(x, y, z, side);
+					sendStartDigPacket(x, y, z, side, xHit, yHit);
+					hitBlock(x, y, z, side, xHit, yHit);
 				}
 			}
 		}
 	}
 	
 	//Called 20 times per second when the mouse button is held and blocks are targeted
-	public void continueDestroyBlock(int x, int y, int z, Side side) {
+	public void continueDestroyBlock(int x, int y, int z, Side side, double xHit, double yHit) {
 		if(!mc.thePlayer.getGamemode().doBlockBreakingAnim()) {
 			return;
 		}
@@ -82,7 +84,7 @@ public abstract class PlayerController {
 				setMineBlock(x, y, z);
 				destroyBlock(x, y, z, side, mc.thePlayer);
 				//Start Dig Packet acts as block destroy packet when instantmining
-				sendStartDigPacket(x, y, z, side);
+				sendStartDigPacket(x, y, z, side, xHit, yHit);
 				
 				currentDamage = 0.0f;
 				previousDamage = 0.0f;
@@ -92,7 +94,7 @@ public abstract class PlayerController {
 				//Regular Mining
 				
 				if(!isMiningBlock(x, y, z)) {
-					sendStartDigPacket(x, y, z, side);
+					sendStartDigPacket(x, y, z, side, xHit, yHit);
 					currentDamage = 0.0f;
 					previousDamage = 0.0f;
 					setMineBlock(x, y, z);
@@ -104,7 +106,7 @@ public abstract class PlayerController {
 				currentDamage += mineStrength;
 				if(currentDamage > 1.0f) {
 					destroyBlock(x, y, z, side, mc.thePlayer);
-					sendDestroyBlockPacket(x, y, z, side);
+					sendDestroyBlockPacket(x, y, z, side, xHit, yHit);
 					currentDamage = 0.0f;
 					previousDamage = 0.0f;
 					soundDelay = 0;
@@ -155,7 +157,7 @@ public abstract class PlayerController {
 			heldItem = heldItemStack.getItem();
 		}
 		
-		world.playSoundEffect(2001, x, y, z, block.id);
+		world.playSoundEffect(EVENT_BLOCK_BREAK, x, y, z, block.id);
 		int meta = world.getBlockMetadata(x, y, z);
 		boolean removed = world.setBlockWithNotify(x, y, z, 0);
 		if(removed) {
@@ -174,12 +176,12 @@ public abstract class PlayerController {
 		}
 	}
 	
-	protected void hitBlock(int x, int y, int z, Side side) {
+	protected void hitBlock(int x, int y, int z, Side side, double xHit, double yHit) {
 		mc.theWorld.onBlockHit(mc.thePlayer, x, y, z, side);
 		
 		Block block = Block.getBlock(mc.theWorld.getBlockId(x, y, z));
 		if(block != null) {
-			block.onBlockClicked(mc.theWorld, x, y, z, mc.thePlayer);
+			block.onBlockLeftClicked(mc.theWorld, x, y, z, mc.thePlayer, side, xHit, yHit);
 		}
 	}
 	
@@ -250,7 +252,7 @@ public abstract class PlayerController {
 		if (!entityplayer.getGamemode().canInteract()) return false;
 		int i1 = world.getBlockId(blockX, blockY, blockZ);
 		if (!entityplayer.isSneaking() || entityplayer.inventory.getCurrentItem() == null) {
-			if (i1 > 0 && Block.blocksList[i1].blockActivated(world, blockX, blockY, blockZ, entityplayer)) {
+			if (i1 > 0 && Block.blocksList[i1].onBlockRightClicked(world, blockX, blockY, blockZ, entityplayer, side, xPlaced, yPlaced)) {
 				return true;
 			}
 		}
@@ -293,9 +295,9 @@ public abstract class PlayerController {
 
 	protected void syncCurrentPlayItem() {}
 	
-	public void sendStartDigPacket(int x, int y, int z, Side side) {}
+	public void sendStartDigPacket(int x, int y, int z, Side side, double xHit, double yHit) {}
 	
-	public void sendDestroyBlockPacket(int x, int y, int z, Side side) {}
+	public void sendDestroyBlockPacket(int x, int y, int z, Side side, double xHit, double yHit) {}
 
 	public void initLevel(World world) {}
 
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 3d6540857..6ce1a2fda 100644
--- a/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java
+++ b/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java
@@ -39,19 +39,19 @@ public class PlayerControllerMP extends PlayerController {
 	}
 	
 	@Override
-	protected void hitBlock(int x, int y, int z, Side side) {
-		super.hitBlock(x, y, z, side);
-		netHandler.addToSendQueue(new Packet14BlockDig(1, x, y, z, side));
+	protected void hitBlock(int x, int y, int z, Side side, double xHit, double yHit) {
+		super.hitBlock(x, y, z, side, xHit, yHit);
+		netHandler.addToSendQueue(new Packet14BlockDig(1, x, y, z, side, xHit, yHit));
 	}
 	
 	@Override
-	public void sendStartDigPacket(int x, int y, int z, Side side) {
-		netHandler.addToSendQueue(new Packet14BlockDig(0, x, y, z, side));
+	public void sendStartDigPacket(int x, int y, int z, Side side, double xHit, double yHit) {
+		netHandler.addToSendQueue(new Packet14BlockDig(0, x, y, z, side, xHit, yHit));
 	}
 	
 	@Override
-	public void sendDestroyBlockPacket(int x, int y, int z, Side side) {
-		netHandler.addToSendQueue(new Packet14BlockDig(2, x, y, z, side));
+	public void sendDestroyBlockPacket(int x, int y, int z, Side side, double xHit, double yHit) {
+		netHandler.addToSendQueue(new Packet14BlockDig(2, x, y, z, side, xHit, yHit));
 	}
 	
 	@Override
diff --git a/src/main/java/net/minecraft/client/render/RenderGlobal.java b/src/main/java/net/minecraft/client/render/RenderGlobal.java
index be081a4dd..a6214d30d 100644
--- a/src/main/java/net/minecraft/client/render/RenderGlobal.java
+++ b/src/main/java/net/minecraft/client/render/RenderGlobal.java
@@ -1629,89 +1629,80 @@ public class RenderGlobal
             GLAllocation.deleteDisplayList(glRenderListBase);
         }
     }
-
     @Override
     public void levelEvent(EntityPlayer player, int id, int x, int y, int z, int data)
     {
         Random random = worldObj.rand;
-        switch(id)
-        {
-        default:
-            break;
-
-        case 1001: // Dispenser empty click
-            worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, x, y, z, "random.click", 1.0F, 1.2F);
-            break;
-
-        case 1000: // Dispenser fire item
-            worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, x, y, z, "random.click", 1.0F, 1.0F);
-            break;
-
-        case 1002: // Dispenser fire projectile
-            worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, x, y, z, "random.bow", 1.0F, 1.2F);
-            break;
-
-        case 2000: // Dispenser eject particles
-            int j1 = data % 3 - 1;
-            int k1 = (data / 3) % 3 - 1;
-            double d = (double)x + (double)j1 * 0.6D + 0.5D;
-            double d1 = (double)y + 0.5D;
-            double d2 = (double)z + (double)k1 * 0.6D + 0.5D;
-            for(int l1 = 0; l1 < 10; l1++)
-            {
-                double d3 = random.nextDouble() * 0.2D + 0.01D;
-                double d4 = d + (double)j1 * 0.01D + (random.nextDouble() - 0.5D) * (double)k1 * 0.5D;
-                double d5 = d1 + (random.nextDouble() - 0.5D) * 0.5D;
-                double d6 = d2 + (double)k1 * 0.01D + (random.nextDouble() - 0.5D) * (double)j1 * 0.5D;
-                double d7 = (double)j1 * d3 + random.nextGaussian() * 0.01D;
-                double d8 = -0.03D + random.nextGaussian() * 0.01D;
-                double d9 = (double)k1 * d3 + random.nextGaussian() * 0.01D;
-                addParticle("smoke", d4, d5, d6, d7, d8, d9, 0);
-            }
+        switch(id) {
+            default:
+                break;
 
-            break;
+            case EVENT_DISPENSER_EMPTY: // Dispenser empty click
+                worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, x, y, z, "random.click", 1.0F, 1.2F);
+                break;
 
-        case 2001: // Block break effect
-            int i2 = data;
-            if(i2 > 0)
-            {
-                Block block = Block.blocksList[i2];
+            case EVENT_DISPENSER_ITEM: // Dispenser fire item
+                worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, x, y, z, "random.click", 1.0F, 1.0F);
+                break;
 
-                worldObj.playBlockSoundEffect(null, (float)x + 0.5F, (float)y + 0.5F, (float)z + 0.5F, block, EnumBlockSoundEffectType.MINE);
-            }
-            mc.effectRenderer.addBlockDestroyEffects(x, y, z, data, worldObj.getBlockMetadata(x, y, z));
-            break;
+            case EVENT_DISPENSER_PROJECTILE: // Dispenser fire projectile
+                worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, x, y, z, "random.bow", 1.0F, 1.2F);
+                break;
 
-        case 1003: // Door sound
-            if(java.lang.Math.random() < 0.5D)
-            {
-                worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double)x + 0.5D, (double)y + 0.5D, (double)z + 0.5D, "random.door_open", 1.0F, worldObj.rand.nextFloat() * 0.1F + 0.9F);
-            } else
-            {
-                worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double)x + 0.5D, (double)y + 0.5D, (double)z + 0.5D, "random.door_close", 1.0F, worldObj.rand.nextFloat() * 0.1F + 0.9F);
-            }
-            break;
+            case EVENT_DISPENSER_PARTICLES: // Dispenser eject particles
+                int j1 = data % 3 - 1;
+                int k1 = (data / 3) % 3 - 1;
+                double d = (double)x + (double)j1 * 0.6D + 0.5D;
+                double d1 = (double)y + 0.5D;
+                double d2 = (double)z + (double)k1 * 0.6D + 0.5D;
+                for(int l1 = 0; l1 < 10; l1++) {
+                    double d3 = random.nextDouble() * 0.2D + 0.01D;
+                    double d4 = d + (double)j1 * 0.01D + (random.nextDouble() - 0.5D) * (double)k1 * 0.5D;
+                    double d5 = d1 + (random.nextDouble() - 0.5D) * 0.5D;
+                    double d6 = d2 + (double)k1 * 0.01D + (random.nextDouble() - 0.5D) * (double)j1 * 0.5D;
+                    double d7 = (double)j1 * d3 + random.nextGaussian() * 0.01D;
+                    double d8 = -0.03D + random.nextGaussian() * 0.01D;
+                    double d9 = (double)k1 * d3 + random.nextGaussian() * 0.01D;
+                    addParticle("smoke", d4, d5, d6, d7, d8, d9, 0);
+                }
 
-        case 1004: // Fire extinguish sound
-            worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (float)x + 0.5F, (float)y + 0.5F, (float)z + 0.5F, "random.fizz", 0.5F, 2.6F + (random.nextFloat() - random.nextFloat()) * 0.8F);
-            break;
+                break;
 
-        case 1005: // Jukebox play/stop record
-            if(Item.itemsList[data] instanceof ItemRecord)
-            {
-                ItemRecord record = ((ItemRecord)Item.itemsList[data]);
-                worldObj.playRecord(record.recordName, record.recordAuthor, x, y, z);
-            } else
-            {
-                worldObj.playRecord(null, null, x, y, z);
-            }
-            break;
-        case 1006: // Piston extend
-            worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double)x + 0.5F, (double)y + 0.5F, (double)z + 0.5F, "tile.piston.out", 0.5F, worldObj.rand.nextFloat() * 0.25F + 0.6F);
-            break;
-        case 1007: // Piston retract
-            worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double)x + 0.5F, (double)y + 0.5F, (double)z + 0.5F, "tile.piston.in", 0.5F, worldObj.rand.nextFloat() * 0.25F + 0.6F);
-            break;
+            case EVENT_BLOCK_BREAK: // Block break effect
+                if(data > 0) {
+                    Block block = Block.blocksList[data];
+
+                    worldObj.playBlockSoundEffect(null, (float)x + 0.5F, (float)y + 0.5F, (float)z + 0.5F, block, EnumBlockSoundEffectType.MINE);
+                }
+                mc.effectRenderer.addBlockDestroyEffects(x, y, z, data, worldObj.getBlockMetadata(x, y, z));
+                break;
+
+            case EVENT_DOOR_SOUND: // Door sound
+                if(java.lang.Math.random() < 0.5D) {
+                    worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double)x + 0.5D, (double)y + 0.5D, (double)z + 0.5D, "random.door_open", 1.0F, worldObj.rand.nextFloat() * 0.1F + 0.9F);
+                } else {
+                    worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double)x + 0.5D, (double)y + 0.5D, (double)z + 0.5D, "random.door_close", 1.0F, worldObj.rand.nextFloat() * 0.1F + 0.9F);
+                }
+                break;
+
+            case EVENT_FIRE_EXTINGUISH: // Fire extinguish sound
+                worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (float)x + 0.5F, (float)y + 0.5F, (float)z + 0.5F, "random.fizz", 0.5F, 2.6F + (random.nextFloat() - random.nextFloat()) * 0.8F);
+                break;
+
+            case EVENT_JUKEBOX_TOGGLE: // Jukebox play/stop record
+                if(Item.itemsList[data] instanceof ItemRecord) {
+                    ItemRecord record = ((ItemRecord)Item.itemsList[data]);
+                    worldObj.playRecord(record.recordName, record.recordAuthor, x, y, z);
+                } else {
+                    worldObj.playRecord(null, null, x, y, z);
+                }
+                break;
+            case EVENT_PISTON_EXTEND: // Piston extend
+                worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double)x + 0.5F, (double)y + 0.5F, (double)z + 0.5F, "tile.piston.out", 0.5F, worldObj.rand.nextFloat() * 0.25F + 0.6F);
+                break;
+            case EVENT_PISTON_RETRACT: // Piston retract
+                worldObj.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double)x + 0.5F, (double)y + 0.5F, (double)z + 0.5F, "tile.piston.in", 0.5F, worldObj.rand.nextFloat() * 0.25F + 0.6F);
+                break;
         }
     }
     
diff --git a/src/main/java/net/minecraft/core/block/Block.java b/src/main/java/net/minecraft/core/block/Block.java
index 957b0eb7d..0535bb271 100644
--- a/src/main/java/net/minecraft/core/block/Block.java
+++ b/src/main/java/net/minecraft/core/block/Block.java
@@ -475,7 +475,7 @@ public class Block
     	return world.canPlaceInsideBlock(x, y, z);
     }
 
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
     {
         return false;
     }
@@ -484,7 +484,7 @@ public class Block
     {
     }
 
-    public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player)
+    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
     {
     }
 
diff --git a/src/main/java/net/minecraft/core/block/BlockBasket.java b/src/main/java/net/minecraft/core/block/BlockBasket.java
index 92a4b67f7..3ad1baa15 100644
--- a/src/main/java/net/minecraft/core/block/BlockBasket.java
+++ b/src/main/java/net/minecraft/core/block/BlockBasket.java
@@ -6,6 +6,7 @@ import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
 
@@ -17,7 +18,7 @@ public class BlockBasket extends BlockTileEntity
     }
 
     @Override
-    public boolean blockActivated(final World world, final int x, final int y, final int z, final EntityPlayer entityplayer)
+    public boolean onBlockRightClicked(final World world, final int x, final int y, final int z, final EntityPlayer entityplayer, Side side, double xPlaced, double yPlaced)
     {
         final TileEntityBasket te = (TileEntityBasket) world.getBlockTileEntity(x, y, z);
 
diff --git a/src/main/java/net/minecraft/core/block/BlockBed.java b/src/main/java/net/minecraft/core/block/BlockBed.java
index 96c218a3a..cbe0c92b2 100644
--- a/src/main/java/net/minecraft/core/block/BlockBed.java
+++ b/src/main/java/net/minecraft/core/block/BlockBed.java
@@ -7,6 +7,7 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.enums.EnumSleepStatus;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.chunk.ChunkCoordinates;
@@ -19,7 +20,7 @@ public class BlockBed extends Block {
 	}
 
 	@Override
-	public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player) {
+	public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
 		if(world.isClientSide) {
 			return true;
 		}
diff --git a/src/main/java/net/minecraft/core/block/BlockBlastFurnace.java b/src/main/java/net/minecraft/core/block/BlockBlastFurnace.java
index 0e19b5db9..405ede2c7 100644
--- a/src/main/java/net/minecraft/core/block/BlockBlastFurnace.java
+++ b/src/main/java/net/minecraft/core/block/BlockBlastFurnace.java
@@ -6,6 +6,7 @@ import net.minecraft.core.block.entity.TileEntityBlastFurnace;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
@@ -40,7 +41,7 @@ public class BlockBlastFurnace extends BlockFurnace
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         if(world.isClientSide)
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockBrazier.java b/src/main/java/net/minecraft/core/block/BlockBrazier.java
index 33ceaedab..c73e3aa86 100644
--- a/src/main/java/net/minecraft/core/block/BlockBrazier.java
+++ b/src/main/java/net/minecraft/core/block/BlockBrazier.java
@@ -7,6 +7,7 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemFirestriker;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
@@ -40,7 +41,7 @@ public class BlockBrazier
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player) {
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
         ItemStack heldItem = player.getHeldItem();
         if (heldItem != null && heldItem.getItem() instanceof ItemFirestriker && !burning) {
             if (world.getBlock(x + 1, y, z) instanceof BlockFluid ||
diff --git a/src/main/java/net/minecraft/core/block/BlockButton.java b/src/main/java/net/minecraft/core/block/BlockButton.java
index 9db91b6d5..4fc0ae902 100644
--- a/src/main/java/net/minecraft/core/block/BlockButton.java
+++ b/src/main/java/net/minecraft/core/block/BlockButton.java
@@ -233,15 +233,15 @@ public class BlockButton extends Block
     }
 
     @Override
-    public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player)
+    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
     {
     	if(!Item.hasTag(player.getCurrentEquippedItem(), ItemTags.PREVENT_LEFT_CLICK_INTERACTIONS)) {
-    		blockActivated(world, x, y, z, player);
+    		onBlockRightClicked(world, x, y, z, player, null, 0.0, 0.0);
     	}
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         int l = world.getBlockMetadata(x, y, z);
         int i1 = l & 7;
diff --git a/src/main/java/net/minecraft/core/block/BlockChest.java b/src/main/java/net/minecraft/core/block/BlockChest.java
index 0b4afd914..75f45cbc8 100644
--- a/src/main/java/net/minecraft/core/block/BlockChest.java
+++ b/src/main/java/net/minecraft/core/block/BlockChest.java
@@ -245,7 +245,7 @@ public class BlockChest extends BlockTileEntity {
 	}
 	
 	@Override
-	public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player) {
+	public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
 		if(world.isClientSide) return true;
 		
 		checkIfOtherHalfExists(world, x, y, z);
diff --git a/src/main/java/net/minecraft/core/block/BlockChestLegacy.java b/src/main/java/net/minecraft/core/block/BlockChestLegacy.java
index f647566d7..8b16e2890 100644
--- a/src/main/java/net/minecraft/core/block/BlockChestLegacy.java
+++ b/src/main/java/net/minecraft/core/block/BlockChestLegacy.java
@@ -9,6 +9,7 @@ import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 @Deprecated
@@ -47,14 +48,14 @@ public class BlockChestLegacy extends BlockTileEntity {
 	}
 	
 	@Override
-	public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player) {
+	public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
 		if(world.isClientSide) {
 			return true;
 		}
 		if(isLegacyChest(world, x, y, z)) {
 			updateLegacyChest(world, x, y, z);
 		}
-		return world.getBlock(x, y, z).blockActivated(world, x, y, z, player);
+		return world.getBlock(x, y, z).onBlockRightClicked(world, x, y, z, player, side, xPlaced, yPlaced);
 	}
 	
 	private void updateLegacyChest(World world, int x, int y, int z) {
diff --git a/src/main/java/net/minecraft/core/block/BlockDispenser.java b/src/main/java/net/minecraft/core/block/BlockDispenser.java
index 7eb395c69..b41656665 100644
--- a/src/main/java/net/minecraft/core/block/BlockDispenser.java
+++ b/src/main/java/net/minecraft/core/block/BlockDispenser.java
@@ -8,6 +8,7 @@ import net.minecraft.core.entity.projectile.*;
 import net.minecraft.core.item.IDispensable;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.entity.TileEntityDispenser;
@@ -74,7 +75,7 @@ public class BlockDispenser extends BlockTileEntityRotatable
 
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         if(world.isClientSide)
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockDoor.java b/src/main/java/net/minecraft/core/block/BlockDoor.java
index f2240c32c..cbfa6e537 100644
--- a/src/main/java/net/minecraft/core/block/BlockDoor.java
+++ b/src/main/java/net/minecraft/core/block/BlockDoor.java
@@ -10,6 +10,7 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.tag.ItemTags;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.util.phys.Vec3d;
 import net.minecraft.core.world.World;
@@ -106,14 +107,14 @@ public class BlockDoor extends Block
     }
     
     @Override
-	public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) {
+	public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit) {
     	if(!Item.hasTag(player.getCurrentEquippedItem(), ItemTags.PREVENT_LEFT_CLICK_INTERACTIONS)) {
-    		blockActivated(world, x, y, z, player);
+    		onBlockRightClicked(world, x, y, z, player, side, xHit, yHit);
     	}
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         if(blockMaterial == Material.metal)
         {
@@ -124,7 +125,7 @@ public class BlockDoor extends Block
         {
             if(Block.blocksList[world.getBlockId(x, y - 1, z)] instanceof BlockDoor)
             {
-            	Block.blocksList[world.getBlockId(x, y - 1, z)].blockActivated(world, x, y - 1, z, player);
+            	Block.blocksList[world.getBlockId(x, y - 1, z)].onBlockRightClicked(world, x, y - 1, z, player, side, xPlaced, yPlaced);
             }
             return true;
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockEdible.java b/src/main/java/net/minecraft/core/block/BlockEdible.java
index dc0930049..76e6a1230 100644
--- a/src/main/java/net/minecraft/core/block/BlockEdible.java
+++ b/src/main/java/net/minecraft/core/block/BlockEdible.java
@@ -6,6 +6,7 @@ import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
 
@@ -72,7 +73,7 @@ public abstract class BlockEdible extends Block {
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         eatSlice(world, x, y, z, player);
         return true;
diff --git a/src/main/java/net/minecraft/core/block/BlockFenceGate.java b/src/main/java/net/minecraft/core/block/BlockFenceGate.java
index d66cf1349..295482077 100644
--- a/src/main/java/net/minecraft/core/block/BlockFenceGate.java
+++ b/src/main/java/net/minecraft/core/block/BlockFenceGate.java
@@ -90,14 +90,14 @@ public class BlockFenceGate extends Block
     }
     
     @Override
-	public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) {
+	public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit) {
     	if(!Item.hasTag(player.getCurrentEquippedItem(), ItemTags.PREVENT_LEFT_CLICK_INTERACTIONS)) {
-    		blockActivated(world, x, y, z, player);
+    		onBlockRightClicked(world, x, y, z, player, null, 0.0, 0.0);
     	}
     }
     
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         int l = world.getBlockMetadata(x, y, z);
         if(func_35291_d(l))
diff --git a/src/main/java/net/minecraft/core/block/BlockFlag.java b/src/main/java/net/minecraft/core/block/BlockFlag.java
index bc752bd81..fcbac8b3c 100644
--- a/src/main/java/net/minecraft/core/block/BlockFlag.java
+++ b/src/main/java/net/minecraft/core/block/BlockFlag.java
@@ -8,6 +8,8 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import com.mojang.nbt.CompoundTag;
+
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
@@ -52,7 +54,7 @@ public class BlockFlag extends BlockTileEntity{
     }
 
 	@Override
-	public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player) {
+	public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
 		if (!world.isClientSide) {
 			TileEntityFlag flag = (TileEntityFlag) world.getBlockTileEntity(x, y, z);
 			if (flag.owner != null && !flag.owner.isEmpty() && !player.username.equals(flag.owner)) {
diff --git a/src/main/java/net/minecraft/core/block/BlockFurnace.java b/src/main/java/net/minecraft/core/block/BlockFurnace.java
index 1f14dd775..3c150634e 100644
--- a/src/main/java/net/minecraft/core/block/BlockFurnace.java
+++ b/src/main/java/net/minecraft/core/block/BlockFurnace.java
@@ -8,6 +8,7 @@ import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
@@ -86,7 +87,7 @@ public class BlockFurnace extends BlockTileEntityRotatable
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         if (!world.isClientSide) {
             TileEntityFurnace tileentityfurnace = (TileEntityFurnace) world.getBlockTileEntity(x, y, z);
diff --git a/src/main/java/net/minecraft/core/block/BlockJar.java b/src/main/java/net/minecraft/core/block/BlockJar.java
index f2dcf713c..09b8681c1 100644
--- a/src/main/java/net/minecraft/core/block/BlockJar.java
+++ b/src/main/java/net/minecraft/core/block/BlockJar.java
@@ -9,6 +9,7 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.block.ItemBlock;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
@@ -70,7 +71,7 @@ public class BlockJar extends BlockTileEntity{
         return false;
     }
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         if(player.getHeldItem() == null) {
             if (world.getBlockMetadata(x, y, z) == 0) {
diff --git a/src/main/java/net/minecraft/core/block/BlockJukeBox.java b/src/main/java/net/minecraft/core/block/BlockJukeBox.java
index 4ecbe18b0..4d2c5b06e 100644
--- a/src/main/java/net/minecraft/core/block/BlockJukeBox.java
+++ b/src/main/java/net/minecraft/core/block/BlockJukeBox.java
@@ -7,6 +7,7 @@ package net.minecraft.core.block;
 import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.entity.TileEntityRecordPlayer;
@@ -21,7 +22,7 @@ public class BlockJukeBox extends BlockTileEntity
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         if(world.getBlockMetadata(x, y, z) == 0)
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockLanternFirefly.java b/src/main/java/net/minecraft/core/block/BlockLanternFirefly.java
index 9fa4b9588..689087a28 100644
--- a/src/main/java/net/minecraft/core/block/BlockLanternFirefly.java
+++ b/src/main/java/net/minecraft/core/block/BlockLanternFirefly.java
@@ -85,7 +85,7 @@ public class BlockLanternFirefly extends Block{
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         world.setBlockRaw(x, y, z, 0);
         world.playSoundAtEntity(player, player, "random.pop", 0.2F, 0.5f);
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesCacao.java b/src/main/java/net/minecraft/core/block/BlockLeavesCacao.java
index 87693f8af..0fdba8fcf 100644
--- a/src/main/java/net/minecraft/core/block/BlockLeavesCacao.java
+++ b/src/main/java/net/minecraft/core/block/BlockLeavesCacao.java
@@ -48,13 +48,13 @@ public class BlockLeavesCacao extends BlockLeavesBase implements IBonemealable {
     }
 
     @Override
-    public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player)
+    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
     {
-        blockActivated(world, x, y, z, player);
+        onBlockRightClicked(world, x, y, z, player, null, 0.0, 0.0);
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         int meta = world.getBlockMetadata(x, y, z);
         int decayData = meta & 0x0F;
@@ -70,7 +70,7 @@ public class BlockLeavesCacao extends BlockLeavesBase implements IBonemealable {
             world.scheduleBlockUpdate(x, y, z, leavesCacao.id, tickRate());
             return true;
         }
-        return super.blockActivated(world, x, y, z, player);
+        return super.onBlockRightClicked(world, x, y, z, player, side, xPlaced, yPlaced);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesCherryFlowering.java b/src/main/java/net/minecraft/core/block/BlockLeavesCherryFlowering.java
index faa4f1e7f..0b99fdac4 100644
--- a/src/main/java/net/minecraft/core/block/BlockLeavesCherryFlowering.java
+++ b/src/main/java/net/minecraft/core/block/BlockLeavesCherryFlowering.java
@@ -32,13 +32,13 @@ public class BlockLeavesCherryFlowering extends BlockLeavesCherry implements IBo
     }
 
     @Override
-    public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player)
+    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
     {
-        blockActivated(world, x, y, z, player);
+        onBlockRightClicked(world, x, y, z, player, null, 0.0, 0.0);
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         int meta = world.getBlockMetadata(x, y, z);
         int decayData = meta & 0x0F;
@@ -54,7 +54,7 @@ public class BlockLeavesCherryFlowering extends BlockLeavesCherry implements IBo
             world.scheduleBlockUpdate(x, y, z, leavesCherryFlowering.id, tickRate());
             return true;
         }
-        return super.blockActivated(world, x, y, z, player);
+        return super.onBlockRightClicked(world, x, y, z, player, side, xPlaced, yPlaced);
 
     }
 
diff --git a/src/main/java/net/minecraft/core/block/BlockLever.java b/src/main/java/net/minecraft/core/block/BlockLever.java
index ab833806a..1cb905685 100644
--- a/src/main/java/net/minecraft/core/block/BlockLever.java
+++ b/src/main/java/net/minecraft/core/block/BlockLever.java
@@ -189,15 +189,15 @@ public class BlockLever extends Block
     }
 
     @Override
-    public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player)
+    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
     {
     	if(!Item.hasTag(player.getCurrentEquippedItem(), ItemTags.PREVENT_LEFT_CLICK_INTERACTIONS)) {
-    		blockActivated(world, x, y, z, player);
+    		onBlockRightClicked(world, x, y, z, player, null, 0.0, 0.0);
     	}
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         int l = world.getBlockMetadata(x, y, z);
         int i1 = l & 15;
diff --git a/src/main/java/net/minecraft/core/block/BlockMeshGold.java b/src/main/java/net/minecraft/core/block/BlockMeshGold.java
index 8241f1ad1..feac5ea56 100644
--- a/src/main/java/net/minecraft/core/block/BlockMeshGold.java
+++ b/src/main/java/net/minecraft/core/block/BlockMeshGold.java
@@ -7,6 +7,7 @@ import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 public class BlockMeshGold extends BlockTileEntity{
@@ -35,7 +36,7 @@ public class BlockMeshGold extends BlockTileEntity{
         return true;
     }
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         TileEntityMeshGold meshGold = (TileEntityMeshGold) world.getBlockTileEntity(x, y, z);
         ItemStack heldItem = player.getHeldItem();
diff --git a/src/main/java/net/minecraft/core/block/BlockMobSpawner.java b/src/main/java/net/minecraft/core/block/BlockMobSpawner.java
index 77f5efeda..8091527ec 100644
--- a/src/main/java/net/minecraft/core/block/BlockMobSpawner.java
+++ b/src/main/java/net/minecraft/core/block/BlockMobSpawner.java
@@ -23,7 +23,7 @@ public class BlockMobSpawner extends BlockTileEntity
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player) {
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
         if (player.getGamemode() != Gamemode.creative) {
             return false;
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockNote.java b/src/main/java/net/minecraft/core/block/BlockNote.java
index a67449bb4..22e27adc0 100644
--- a/src/main/java/net/minecraft/core/block/BlockNote.java
+++ b/src/main/java/net/minecraft/core/block/BlockNote.java
@@ -7,6 +7,7 @@ package net.minecraft.core.block;
 
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.entity.TileEntityNote;
@@ -39,7 +40,7 @@ public class BlockNote extends BlockTileEntity
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         if(world.isClientSide)
         {
@@ -54,7 +55,7 @@ public class BlockNote extends BlockTileEntity
     }
 
     @Override
-    public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player)
+    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
     {
         if(world.isClientSide)
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockOreRedstone.java b/src/main/java/net/minecraft/core/block/BlockOreRedstone.java
index 2c3bf3034..3feaebfaa 100644
--- a/src/main/java/net/minecraft/core/block/BlockOreRedstone.java
+++ b/src/main/java/net/minecraft/core/block/BlockOreRedstone.java
@@ -7,6 +7,7 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Color;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.client.util.helper.Colors;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
@@ -39,10 +40,10 @@ public class BlockOreRedstone extends Block
     }
 
     @Override
-    public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player)
+    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
     {
         lightRedstone(world, x, y, z);
-        super.onBlockClicked(world, x, y, z, player);
+        super.onBlockLeftClicked(world, x, y, z, player, side, xHit, yHit);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BlockPumpkin.java b/src/main/java/net/minecraft/core/block/BlockPumpkin.java
index adae9d701..ba00a02a0 100644
--- a/src/main/java/net/minecraft/core/block/BlockPumpkin.java
+++ b/src/main/java/net/minecraft/core/block/BlockPumpkin.java
@@ -9,6 +9,7 @@ import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.tool.ItemToolSword;
 import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 public class BlockPumpkin extends BlockRotatableHorizontal
@@ -22,7 +23,7 @@ public class BlockPumpkin extends BlockRotatableHorizontal
         this.isCarvable = isCarvable;
     }
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player) {
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
         if (!isCarvable) return false;
         ItemStack heldItem = player.getHeldItem();
         if (heldItem != null && heldItem.getItem() instanceof ItemToolSword){
diff --git a/src/main/java/net/minecraft/core/block/BlockRedstoneRepeater.java b/src/main/java/net/minecraft/core/block/BlockRedstoneRepeater.java
index 7722ed4f6..518b6d4e1 100644
--- a/src/main/java/net/minecraft/core/block/BlockRedstoneRepeater.java
+++ b/src/main/java/net/minecraft/core/block/BlockRedstoneRepeater.java
@@ -157,7 +157,7 @@ public class BlockRedstoneRepeater extends Block
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         int l = world.getBlockMetadata(x, y, z);
         int i1 = (l & 0xc) >> 2;
diff --git a/src/main/java/net/minecraft/core/block/BlockRope.java b/src/main/java/net/minecraft/core/block/BlockRope.java
index e55537a66..3b4843561 100644
--- a/src/main/java/net/minecraft/core/block/BlockRope.java
+++ b/src/main/java/net/minecraft/core/block/BlockRope.java
@@ -8,6 +8,7 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.ItemToolShears;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
@@ -65,7 +66,7 @@ public class BlockRope
         setBlockBounds(minX, minY, minZ, maxX, maxY, maxZ);
     }
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         ItemStack heldItem = player.getHeldItem();
         if (heldItem != null && heldItem.getItem() instanceof ItemToolShears){
diff --git a/src/main/java/net/minecraft/core/block/BlockSeat.java b/src/main/java/net/minecraft/core/block/BlockSeat.java
index 1eb172196..c6141a2fa 100644
--- a/src/main/java/net/minecraft/core/block/BlockSeat.java
+++ b/src/main/java/net/minecraft/core/block/BlockSeat.java
@@ -7,6 +7,7 @@ import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 public class BlockSeat
@@ -19,7 +20,7 @@ public class BlockSeat
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player) {
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
         if (world.isBlockNormalCube(x, y + 1, z)) {
             return false;
         }
diff --git a/src/main/java/net/minecraft/core/block/BlockSign.java b/src/main/java/net/minecraft/core/block/BlockSign.java
index 62efa5712..c6c706203 100644
--- a/src/main/java/net/minecraft/core/block/BlockSign.java
+++ b/src/main/java/net/minecraft/core/block/BlockSign.java
@@ -5,6 +5,7 @@ import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.entity.TileEntity;
@@ -166,7 +167,7 @@ public class BlockSign extends BlockTileEntity
         return new ItemStack[] { new ItemStack(Item.sign) };
     }
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player) {
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
         TileEntitySign tileentitysign = (TileEntitySign)world.getBlockTileEntity(x, y, z);
         if(tileentitysign != null && tileentitysign.getIsEditable(player))
         {
diff --git a/src/main/java/net/minecraft/core/block/BlockSlab.java b/src/main/java/net/minecraft/core/block/BlockSlab.java
index 6baeb3387..e04b5018a 100644
--- a/src/main/java/net/minecraft/core/block/BlockSlab.java
+++ b/src/main/java/net/minecraft/core/block/BlockSlab.java
@@ -153,9 +153,9 @@ public class BlockSlab extends Block
         modelBlock.updateTick(world, x, y, z, rand);
     }
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
-        return modelBlock.blockActivated(world, x, y, z, player);
+        return modelBlock.onBlockRightClicked(world, x, y, z, player, side, xPlaced, yPlaced);
     }
     @Override
     public void onBlockDestroyedByExplosion(World world, int x, int y, int z)
@@ -200,9 +200,9 @@ public class BlockSlab extends Block
     }
     
     @Override
-    public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player)
+    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
     {
-        modelBlock.onBlockClicked(world, x, y, z, player);
+        modelBlock.onBlockLeftClicked(world, x, y, z, player, side, xHit, yHit);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BlockStairs.java b/src/main/java/net/minecraft/core/block/BlockStairs.java
index bcae219a6..d0ebaaf7c 100644
--- a/src/main/java/net/minecraft/core/block/BlockStairs.java
+++ b/src/main/java/net/minecraft/core/block/BlockStairs.java
@@ -187,9 +187,9 @@ public class BlockStairs extends Block
     }
 
     @Override
-    public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player)
+    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit)
     {
-        modelBlock.onBlockClicked(world, x, y, z, player);
+        modelBlock.onBlockLeftClicked(world, x, y, z, player, side, xHit, yHit);
     }
 
     @Override
@@ -273,9 +273,9 @@ public class BlockStairs extends Block
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
-        return modelBlock.blockActivated(world, x, y, z, player);
+        return modelBlock.onBlockRightClicked(world, x, y, z, player, side, xPlaced, yPlaced);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/BlockTNT.java b/src/main/java/net/minecraft/core/block/BlockTNT.java
index ad5d66c0c..7001b63cc 100644
--- a/src/main/java/net/minecraft/core/block/BlockTNT.java
+++ b/src/main/java/net/minecraft/core/block/BlockTNT.java
@@ -7,6 +7,7 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemFirestriker;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
 
@@ -69,19 +70,19 @@ public class BlockTNT extends Block {
 	}
 
 	@Override
-	public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) {
+	public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit) {
 		if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemFirestriker) {
 			world.setBlockMetadata(x, y, z, 1);
 		}
-		super.onBlockClicked(world, x, y, z, player);
+		super.onBlockLeftClicked(world, x, y, z, player, side, xHit, yHit);
 	}
 
 	@Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player) {
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced) {
 		if (player.inventory.getCurrentItem() != null && player.inventory.getCurrentItem().getItem() instanceof ItemFirestriker) {
 			ignite(world, x, y, z, player, true);
 			return true;
 		}
-		return super.blockActivated(world, x, y, z, player);
+		return super.onBlockRightClicked(world, x, y, z, player, side, xPlaced, yPlaced);
 	}
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockTrapDoor.java b/src/main/java/net/minecraft/core/block/BlockTrapDoor.java
index f369ea782..a14558983 100644
--- a/src/main/java/net/minecraft/core/block/BlockTrapDoor.java
+++ b/src/main/java/net/minecraft/core/block/BlockTrapDoor.java
@@ -97,14 +97,14 @@ public class BlockTrapDoor extends Block
     }
     
     @Override
-    public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) {
+    public void onBlockLeftClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xHit, double yHit) {
     	if(!Item.hasTag(player.getCurrentEquippedItem(), ItemTags.PREVENT_LEFT_CLICK_INTERACTIONS)) {
-    		blockActivated(world, x, y, z, player);
+    		onBlockRightClicked(world, x, y, z, player, null, 0.0, 0.0);
     	}
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         if (blockMaterial != Material.metal) {
             int l = world.getBlockMetadata(x, y, z);
diff --git a/src/main/java/net/minecraft/core/block/BlockTrommel.java b/src/main/java/net/minecraft/core/block/BlockTrommel.java
index d1a330dd1..feb818e32 100644
--- a/src/main/java/net/minecraft/core/block/BlockTrommel.java
+++ b/src/main/java/net/minecraft/core/block/BlockTrommel.java
@@ -8,6 +8,7 @@ import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
@@ -44,7 +45,7 @@ public class BlockTrommel extends BlockTileEntityRotatable
     }
     
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         if (!world.isClientSide) {
             TileEntityTrommel tileEntityTrommel = (TileEntityTrommel) world.getBlockTileEntity(x, y, z);
diff --git a/src/main/java/net/minecraft/core/block/BlockWorkbench.java b/src/main/java/net/minecraft/core/block/BlockWorkbench.java
index 6d17551f1..6621d0d0c 100644
--- a/src/main/java/net/minecraft/core/block/BlockWorkbench.java
+++ b/src/main/java/net/minecraft/core/block/BlockWorkbench.java
@@ -4,6 +4,7 @@ package net.minecraft.core.block;
 //            Block, Material, World, EntityPlayer
 
 import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
 
@@ -16,7 +17,7 @@ public class BlockWorkbench extends Block
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         if (!world.isClientSide)
         {
diff --git a/src/main/java/net/minecraft/core/block/entity/TileEntitySensor.java b/src/main/java/net/minecraft/core/block/entity/TileEntitySensor.java
index 40b63c8ca..faea99ca2 100644
--- a/src/main/java/net/minecraft/core/block/entity/TileEntitySensor.java
+++ b/src/main/java/net/minecraft/core/block/entity/TileEntitySensor.java
@@ -20,10 +20,10 @@ public class TileEntitySensor extends TileEntity {
 			return 0;
 		}
 		
-		int range = 2;
+		int range = 4;
 		int blockInFront = world.getBlockId(x + facing.getOffsetX(), y + facing.getOffsetY(), z + facing.getOffsetZ());
 		if(Block.hasTag(blockInFront, BlockTags.EXTENDS_MOTION_SENSOR_RANGE)) {
-			range = 5;
+			range = 8;
 		}
 		
 		for(int i = 1; i <= range; i++) {
diff --git a/src/main/java/net/minecraft/core/block/piston/BlockPistonMoving.java b/src/main/java/net/minecraft/core/block/piston/BlockPistonMoving.java
index 12c175d21..f5c4d0778 100644
--- a/src/main/java/net/minecraft/core/block/piston/BlockPistonMoving.java
+++ b/src/main/java/net/minecraft/core/block/piston/BlockPistonMoving.java
@@ -6,6 +6,7 @@ import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.logic.PistonDirections;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
@@ -75,7 +76,7 @@ public class BlockPistonMoving extends BlockTileEntity
     }
 
     @Override
-    public boolean blockActivated(World world, int x, int y, int z, EntityPlayer player)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, EntityPlayer player, Side side, double xPlaced, double yPlaced)
     {
         if(!world.isClientSide && world.getBlockTileEntity(x, y, z) == null)
         {
diff --git a/src/main/java/net/minecraft/core/entity/Entity.java b/src/main/java/net/minecraft/core/entity/Entity.java
index c7ce5292d..b2bd80477 100644
--- a/src/main/java/net/minecraft/core/entity/Entity.java
+++ b/src/main/java/net/minecraft/core/entity/Entity.java
@@ -1,9 +1,13 @@
 package net.minecraft.core.entity;
 
+import java.util.List;
+import java.util.Random;
+
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.DoubleTag;
 import com.mojang.nbt.FloatTag;
 import com.mojang.nbt.ListTag;
+
 import net.minecraft.client.gui.guidebook.mobs.MobInfoRegistry;
 import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.core.Global;
@@ -16,7 +20,6 @@ import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
-import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.phys.AABB;
@@ -24,9 +27,7 @@ import net.minecraft.core.util.phys.Vec3d;
 import net.minecraft.core.world.IVehicle;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.data.SynchedEntityData;
-
-import java.util.List;
-import java.util.Random;
+import org.jetbrains.annotations.Nullable;
 
 public abstract class Entity
     implements IVehicle
@@ -812,7 +813,8 @@ public abstract class Entity
     	}
     	
     	int blockX = MathHelper.floor_double(x);
-    	int blockY = MathHelper.floor_double(y);
+        double d = (bb.maxY - bb.minY) * 0.66D;
+    	int blockY = MathHelper.floor_double((y - (double) heightOffset) + d);
     	int blockZ = MathHelper.floor_double(z);
     	
     	int skylight = world.getSavedLightValue(LightLayer.Sky, blockX, blockY, blockZ);
@@ -1279,7 +1281,8 @@ public abstract class Entity
     public void handlePortal(int portalTileId)
     {
     }
-    
+
+    @Nullable
     public ItemStack[] getInventory()
     {
         return null;
diff --git a/src/main/java/net/minecraft/core/entity/EntityItem.java b/src/main/java/net/minecraft/core/entity/EntityItem.java
index 0769b291d..70bb17571 100644
--- a/src/main/java/net/minecraft/core/entity/EntityItem.java
+++ b/src/main/java/net/minecraft/core/entity/EntityItem.java
@@ -25,16 +25,14 @@ import net.minecraft.core.world.World;
 public class EntityItem extends Entity
 {
 
-    public EntityItem(World world, double d, double d1, double d2,
-                      ItemStack itemstack)
-    {
+    public EntityItem(World world, double x, double y, double z, ItemStack itemstack) {
         super(world);
         age = 0;
         health = 5;
         initialRotation = (float)(java.lang.Math.random() * Math.PI * 2D);
         setSize(0.25F, 0.25F);
         heightOffset = bbHeight / 2.0F;
-        setPos(d, d1, d2);
+        setPos(x, y, z);
         item = itemstack;
         yRot = (float)(java.lang.Math.random() * 360D);
         xd = (float)(java.lang.Math.random() * 0.20000000298023224D - 0.10000000149011612D);
diff --git a/src/main/java/net/minecraft/core/item/Item.java b/src/main/java/net/minecraft/core/item/Item.java
index 88ed427ec..813f10aad 100644
--- a/src/main/java/net/minecraft/core/item/Item.java
+++ b/src/main/java/net/minecraft/core/item/Item.java
@@ -86,7 +86,7 @@ public class Item
         return this;
     }
 
-    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         return false;
     }
@@ -96,7 +96,7 @@ public class Item
         return 1.0F;
     }
 
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         return itemstack;
     }
diff --git a/src/main/java/net/minecraft/core/item/ItemBed.java b/src/main/java/net/minecraft/core/item/ItemBed.java
index ab29d4272..380fc57de 100644
--- a/src/main/java/net/minecraft/core/item/ItemBed.java
+++ b/src/main/java/net/minecraft/core/item/ItemBed.java
@@ -21,7 +21,7 @@ public class ItemBed extends Item
     }
 
     @Override
-    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
     	if(!world.canPlaceInsideBlock(blockX, blockY, blockZ)) {
     		blockX += side.getOffsetX();
diff --git a/src/main/java/net/minecraft/core/item/ItemBoat.java b/src/main/java/net/minecraft/core/item/ItemBoat.java
index d0d861d16..cbea601c3 100644
--- a/src/main/java/net/minecraft/core/item/ItemBoat.java
+++ b/src/main/java/net/minecraft/core/item/ItemBoat.java
@@ -24,7 +24,7 @@ public class ItemBoat extends Item
     }
 
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         float f = 1.0F;
         float f1 = entityplayer.xRotO + (entityplayer.xRot - entityplayer.xRotO) * f;
diff --git a/src/main/java/net/minecraft/core/item/ItemBow.java b/src/main/java/net/minecraft/core/item/ItemBow.java
index 6df182e85..ccedc20be 100644
--- a/src/main/java/net/minecraft/core/item/ItemBow.java
+++ b/src/main/java/net/minecraft/core/item/ItemBow.java
@@ -22,7 +22,7 @@ public class ItemBow extends Item
     }
 
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         ItemStack quiverSlot = entityplayer.inventory.armorItemInSlot(2);
         if(quiverSlot != null && quiverSlot.itemID == Item.armorQuiver.id && quiverSlot.getMetadata() < quiverSlot.getMaxDamage()){
diff --git a/src/main/java/net/minecraft/core/item/ItemBucket.java b/src/main/java/net/minecraft/core/item/ItemBucket.java
index 7786f940b..5c8e2672b 100644
--- a/src/main/java/net/minecraft/core/item/ItemBucket.java
+++ b/src/main/java/net/minecraft/core/item/ItemBucket.java
@@ -36,7 +36,7 @@ public class ItemBucket extends Item
     }
 
     @Override
-	public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
+	public ItemStack onUseItem(ItemStack stack, World world, EntityPlayer player) {
 		float f = 1.0F;
 		float f1 = player.xRotO + (player.xRot - player.xRotO) * f;
 		float f2 = player.yRotO + (player.yRot - player.yRotO) * f;
diff --git a/src/main/java/net/minecraft/core/item/ItemBucketEmpty.java b/src/main/java/net/minecraft/core/item/ItemBucketEmpty.java
index 1e5c0b636..a69352c07 100644
--- a/src/main/java/net/minecraft/core/item/ItemBucketEmpty.java
+++ b/src/main/java/net/minecraft/core/item/ItemBucketEmpty.java
@@ -23,7 +23,7 @@ public class ItemBucketEmpty extends Item
     }
 
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         float f = 1.0F;
         float f1 = entityplayer.xRotO + (entityplayer.xRot - entityplayer.xRotO) * f;
diff --git a/src/main/java/net/minecraft/core/item/ItemBucketIceCream.java b/src/main/java/net/minecraft/core/item/ItemBucketIceCream.java
index 8e2f8d4d2..43c34952f 100644
--- a/src/main/java/net/minecraft/core/item/ItemBucketIceCream.java
+++ b/src/main/java/net/minecraft/core/item/ItemBucketIceCream.java
@@ -11,10 +11,10 @@ public class ItemBucketIceCream extends ItemFood {
         maxStackSize = 1;
     }
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         if (entityplayer.getHealth() < entityplayer.getMaxHealth()){
-            super.onItemRightClick(itemstack, world, entityplayer);
+            super.onUseItem(itemstack, world, entityplayer);
             return new ItemStack(Item.bucket);
         }
         return itemstack;
diff --git a/src/main/java/net/minecraft/core/item/ItemDoor.java b/src/main/java/net/minecraft/core/item/ItemDoor.java
index ae5af701a..c2db036d9 100644
--- a/src/main/java/net/minecraft/core/item/ItemDoor.java
+++ b/src/main/java/net/minecraft/core/item/ItemDoor.java
@@ -25,7 +25,7 @@ public class ItemDoor extends Item {
     }
 
 	@Override
-	public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
 		if(!world.canPlaceInsideBlock(blockX, blockY, blockZ)) {
 			blockX += side.getOffsetX();
 			blockY += side.getOffsetY();
diff --git a/src/main/java/net/minecraft/core/item/ItemDoorPainted.java b/src/main/java/net/minecraft/core/item/ItemDoorPainted.java
index a03b6fdce..c283b0002 100644
--- a/src/main/java/net/minecraft/core/item/ItemDoorPainted.java
+++ b/src/main/java/net/minecraft/core/item/ItemDoorPainted.java
@@ -13,7 +13,7 @@ public class ItemDoorPainted extends ItemDoor{
         super(name, id, doorBottom, doorTopId);
     }
     @Override
-    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         if(!world.canPlaceInsideBlock(blockX, blockY, blockZ)) {
             blockX += side.getOffsetX();
             blockY += side.getOffsetY();
diff --git a/src/main/java/net/minecraft/core/item/ItemDye.java b/src/main/java/net/minecraft/core/item/ItemDye.java
index ef766900a..59af2e1dc 100644
--- a/src/main/java/net/minecraft/core/item/ItemDye.java
+++ b/src/main/java/net/minecraft/core/item/ItemDye.java
@@ -32,7 +32,7 @@ public class ItemDye extends Item
     }
 
     @Override
-    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         if (world.getBlockId(blockX, blockY, blockZ) == Block.signPostPlanksOak.id || world.getBlockId(blockX, blockY, blockZ) == Block.signWallPlanksOak.id)
         {
diff --git a/src/main/java/net/minecraft/core/item/ItemEgg.java b/src/main/java/net/minecraft/core/item/ItemEgg.java
index f75878bd4..07f939637 100644
--- a/src/main/java/net/minecraft/core/item/ItemEgg.java
+++ b/src/main/java/net/minecraft/core/item/ItemEgg.java
@@ -22,7 +22,7 @@ public class ItemEgg
     }
 
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         itemstack.consumeItem(entityplayer);
         world.playSoundAtEntity(entityplayer, entityplayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
diff --git a/src/main/java/net/minecraft/core/item/ItemFirestriker.java b/src/main/java/net/minecraft/core/item/ItemFirestriker.java
index 08636dc7d..1b56bec82 100644
--- a/src/main/java/net/minecraft/core/item/ItemFirestriker.java
+++ b/src/main/java/net/minecraft/core/item/ItemFirestriker.java
@@ -22,7 +22,7 @@ public class ItemFirestriker extends Item
     }
 
     @Override
-    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
     	blockX += side.getOffsetX();
     	blockY += side.getOffsetY();
diff --git a/src/main/java/net/minecraft/core/item/ItemFishingRod.java b/src/main/java/net/minecraft/core/item/ItemFishingRod.java
index e617831de..74a2070d7 100644
--- a/src/main/java/net/minecraft/core/item/ItemFishingRod.java
+++ b/src/main/java/net/minecraft/core/item/ItemFishingRod.java
@@ -19,7 +19,7 @@ public class ItemFishingRod extends Item
     }
 
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         if(entityplayer.bobberEntity != null)
         {
diff --git a/src/main/java/net/minecraft/core/item/ItemFlag.java b/src/main/java/net/minecraft/core/item/ItemFlag.java
index 74ec0a021..dcabac23f 100644
--- a/src/main/java/net/minecraft/core/item/ItemFlag.java
+++ b/src/main/java/net/minecraft/core/item/ItemFlag.java
@@ -28,7 +28,7 @@ public class ItemFlag extends Item
     }
 
     @Override
-    public boolean onItemUse(ItemStack stack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack stack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         // copy flag data to empty flag
 		if (world.getBlockId(blockX, blockY, blockZ) == Block.flag.id && !entityplayer.isSneaking()) {
diff --git a/src/main/java/net/minecraft/core/item/ItemFood.java b/src/main/java/net/minecraft/core/item/ItemFood.java
index 2868deb76..a4ff0d6c3 100644
--- a/src/main/java/net/minecraft/core/item/ItemFood.java
+++ b/src/main/java/net/minecraft/core/item/ItemFood.java
@@ -20,7 +20,7 @@ public class ItemFood extends Item
     }
 
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         if(entityplayer.getHealth() < entityplayer.getMaxHealth()
                 && entityplayer.getHealth() + entityplayer.getTotalHealingRemaining() < entityplayer.getMaxHealth()
diff --git a/src/main/java/net/minecraft/core/item/ItemHandCannonLoaded.java b/src/main/java/net/minecraft/core/item/ItemHandCannonLoaded.java
index 13f6cb549..6822ceb7c 100644
--- a/src/main/java/net/minecraft/core/item/ItemHandCannonLoaded.java
+++ b/src/main/java/net/minecraft/core/item/ItemHandCannonLoaded.java
@@ -19,7 +19,7 @@ public class ItemHandCannonLoaded extends Item
     }
 
 	@Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
 		world.playSoundAtEntity(entityplayer, entityplayer, "random.bow", 0.3F, 1.0F / (itemRand.nextFloat() * -0.2F + -0.4F));
 
diff --git a/src/main/java/net/minecraft/core/item/ItemHandCannonUnloaded.java b/src/main/java/net/minecraft/core/item/ItemHandCannonUnloaded.java
index 9319f67e6..7dc08561d 100644
--- a/src/main/java/net/minecraft/core/item/ItemHandCannonUnloaded.java
+++ b/src/main/java/net/minecraft/core/item/ItemHandCannonUnloaded.java
@@ -18,7 +18,7 @@ public class ItemHandCannonUnloaded extends Item
     }
 
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         if (entityplayer.inventory.consumeInventoryItem(Item.ammoChargeExplosive.id))
         {
diff --git a/src/main/java/net/minecraft/core/item/ItemJar.java b/src/main/java/net/minecraft/core/item/ItemJar.java
index 97620208e..bb0762fa8 100644
--- a/src/main/java/net/minecraft/core/item/ItemJar.java
+++ b/src/main/java/net/minecraft/core/item/ItemJar.java
@@ -16,7 +16,7 @@ public class ItemJar extends ItemPlaceable{
     }
 
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         List<Entity> list = world.getEntitiesWithinAABBExcludingEntity(entityplayer,entityplayer.bb.expand(2, 2, 2));
         
diff --git a/src/main/java/net/minecraft/core/item/ItemLabel.java b/src/main/java/net/minecraft/core/item/ItemLabel.java
index 5c681a44c..d0f953fe8 100644
--- a/src/main/java/net/minecraft/core/item/ItemLabel.java
+++ b/src/main/java/net/minecraft/core/item/ItemLabel.java
@@ -11,7 +11,7 @@ public class ItemLabel extends Item
     }
 
 	@Override
-	public ItemStack onItemRightClick(final ItemStack stack, final World world, final EntityPlayer player) {
+	public ItemStack onUseItem(final ItemStack stack, final World world, final EntityPlayer player) {
 		if(stack.hasCustomName()) {
 			return stack;
 		}
diff --git a/src/main/java/net/minecraft/core/item/ItemMap.java b/src/main/java/net/minecraft/core/item/ItemMap.java
index b82cb45e3..b40c8de75 100644
--- a/src/main/java/net/minecraft/core/item/ItemMap.java
+++ b/src/main/java/net/minecraft/core/item/ItemMap.java
@@ -62,7 +62,7 @@ public class ItemMap extends ItemComplex
     }
 
 	@Override
-	public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
 		if (world.getBlockId(blockX, blockY, blockZ) == Block.flag.id) {
 			ItemMapSavedData mapData = (ItemMapSavedData)world.getSavedData(ItemMapSavedData.class, "map_" + itemstack.getMetadata());
 			TileEntityFlag flag = (TileEntityFlag) world.getBlockTileEntity(blockX, blockY, blockZ);
diff --git a/src/main/java/net/minecraft/core/item/ItemMinecart.java b/src/main/java/net/minecraft/core/item/ItemMinecart.java
index 0150f1ef7..88c497351 100644
--- a/src/main/java/net/minecraft/core/item/ItemMinecart.java
+++ b/src/main/java/net/minecraft/core/item/ItemMinecart.java
@@ -23,7 +23,7 @@ public class ItemMinecart extends Item
     }
 
     @Override
-    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         int i1 = world.getBlockId(blockX, blockY, blockZ);
         if(BlockRail.isRailBlock(i1))
diff --git a/src/main/java/net/minecraft/core/item/ItemPainting.java b/src/main/java/net/minecraft/core/item/ItemPainting.java
index 1822c1bff..1ee4e066b 100644
--- a/src/main/java/net/minecraft/core/item/ItemPainting.java
+++ b/src/main/java/net/minecraft/core/item/ItemPainting.java
@@ -21,7 +21,7 @@ public class ItemPainting extends Item
     }
 
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         if (!world.isClientSide && !entityplayer.isSneaking())
         {
@@ -32,7 +32,7 @@ public class ItemPainting extends Item
     }
 
     @Override
-    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
     	int sideHit = side.getId();
         if(sideHit == 0)
diff --git a/src/main/java/net/minecraft/core/item/ItemPebble.java b/src/main/java/net/minecraft/core/item/ItemPebble.java
index cb2ce19f0..abe1f861e 100644
--- a/src/main/java/net/minecraft/core/item/ItemPebble.java
+++ b/src/main/java/net/minecraft/core/item/ItemPebble.java
@@ -30,7 +30,7 @@ public class ItemPebble
 
 
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         itemstack.consumeItem(entityplayer);
         world.playSoundAtEntity(entityplayer, entityplayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
@@ -42,7 +42,7 @@ public class ItemPebble
     }
 
     @Override
-    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         int id = world.getBlockId(blockX, blockY, blockZ);
         int meta = world.getBlockMetadata(blockX, blockY, blockZ);
diff --git a/src/main/java/net/minecraft/core/item/ItemPlaceable.java b/src/main/java/net/minecraft/core/item/ItemPlaceable.java
index 7b109ac42..02ce828c2 100644
--- a/src/main/java/net/minecraft/core/item/ItemPlaceable.java
+++ b/src/main/java/net/minecraft/core/item/ItemPlaceable.java
@@ -1,11 +1,14 @@
 package net.minecraft.core.item;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockFluid;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
+import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
+
 public class ItemPlaceable extends Item {
 	
 	public Block blockToPlace;
@@ -17,7 +20,7 @@ public class ItemPlaceable extends Item {
 	}
 
 	@Override
-	public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean onUseItemOnBlock(ItemStack stack, EntityPlayer player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
 		if(stack.stackSize <= 0) {
 			return false;
 		}
@@ -27,14 +30,15 @@ public class ItemPlaceable extends Item {
 			blockY += side.getOffsetY();
 			blockZ += side.getOffsetZ();
 		}
-		boolean placedInside = world.getBlock(blockX, blockY, blockZ) != null;
+		Block currentBlock = world.getBlock(blockX, blockY, blockZ);
+		boolean placedInside = currentBlock != null && !(currentBlock instanceof BlockFluid);
 
 		if(blockY < 0 || blockY >= world.getHeightBlocks()) {
 			return false;
 		}
 		if(world.canBlockBePlacedAt(blockToPlace.id, blockX, blockY, blockZ, false, side) && stack.consumeItem(player)) {
 			if (placedInside && !world.isClientSide){
-				world.playSoundEffect(2001, blockX, blockY, blockZ, world.getBlockId(blockX, blockY, blockZ));
+				world.playSoundEffect(EVENT_BLOCK_BREAK, blockX, blockY, blockZ, world.getBlockId(blockX, blockY, blockZ));
 			}
 			if(world.setBlockWithNotify(blockX, blockY, blockZ, blockToPlace.id)) {
 				blockToPlace.onBlockPlaced(world, blockX, blockY, blockZ, side, player, yPlaced);
diff --git a/src/main/java/net/minecraft/core/item/ItemRecord.java b/src/main/java/net/minecraft/core/item/ItemRecord.java
index 92f661a18..1ed624050 100644
--- a/src/main/java/net/minecraft/core/item/ItemRecord.java
+++ b/src/main/java/net/minecraft/core/item/ItemRecord.java
@@ -26,7 +26,7 @@ public class ItemRecord extends Item
     }
 
     @Override
-    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         if(world.getBlockId(blockX, blockY, blockZ) == Block.jukebox.id && world.getBlockMetadata(blockX, blockY, blockZ) == 0)
         {
diff --git a/src/main/java/net/minecraft/core/item/ItemRope.java b/src/main/java/net/minecraft/core/item/ItemRope.java
index c78a9b665..1dc653271 100644
--- a/src/main/java/net/minecraft/core/item/ItemRope.java
+++ b/src/main/java/net/minecraft/core/item/ItemRope.java
@@ -1,17 +1,20 @@
 package net.minecraft.core.item;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockFluid;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
+import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
+
 public class ItemRope extends ItemPlaceable{
     public ItemRope(String name, int id, Block blockToPlace) {
         super(name, id, blockToPlace);
     }
     @Override
-    public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onUseItemOnBlock(ItemStack stack, EntityPlayer player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         if(stack.stackSize <= 0) {
             return false;
         }
@@ -35,14 +38,15 @@ public class ItemRope extends ItemPlaceable{
             blockY += side.getOffsetY();
             blockZ += side.getOffsetZ();
         }
-        boolean placedInside = world.getBlock(blockX, blockY, blockZ) != null;
+        Block currentBlock = world.getBlock(blockX, blockY, blockZ);
+        boolean placedInside = currentBlock != null && !(currentBlock instanceof BlockFluid);
 
         if(blockY < 0 || blockY >= world.getHeightBlocks()) {
             return false;
         }
         if(world.canBlockBePlacedAt(blockToPlace.id, blockX, blockY, blockZ, false, side) && stack.consumeItem(player)) {
             if (placedInside && !world.isClientSide){
-                world.playSoundEffect(2001, blockX, blockY, blockZ, world.getBlockId(blockX, blockY, blockZ));
+                world.playSoundEffect(EVENT_BLOCK_BREAK, blockX, blockY, blockZ, world.getBlockId(blockX, blockY, blockZ));
             }
             if(world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockToPlace.id, placeOnSide ? 0b1000_0000 : 0)) {
                 blockToPlace.onBlockPlaced(world, blockX, blockY, blockZ, side, player, yPlaced);
diff --git a/src/main/java/net/minecraft/core/item/ItemSeeds.java b/src/main/java/net/minecraft/core/item/ItemSeeds.java
index 916433ab4..3c55af613 100644
--- a/src/main/java/net/minecraft/core/item/ItemSeeds.java
+++ b/src/main/java/net/minecraft/core/item/ItemSeeds.java
@@ -16,7 +16,7 @@ public class ItemSeeds extends Item {
 	}
 
 	@Override
-	public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
 		if(!world.canPlaceInsideBlock(blockX, blockY, blockZ)) {
 			blockX += side.getOffsetX();
 			blockY += side.getOffsetY();
diff --git a/src/main/java/net/minecraft/core/item/ItemSign.java b/src/main/java/net/minecraft/core/item/ItemSign.java
index 6cfd7192b..a8914be56 100644
--- a/src/main/java/net/minecraft/core/item/ItemSign.java
+++ b/src/main/java/net/minecraft/core/item/ItemSign.java
@@ -23,7 +23,7 @@ public class ItemSign extends Item
     }
 
     @Override
-    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
     	int sideHit = side.getId();
         if(side == Side.BOTTOM)
diff --git a/src/main/java/net/minecraft/core/item/ItemSnowball.java b/src/main/java/net/minecraft/core/item/ItemSnowball.java
index ccc94d892..fd3ee37fb 100644
--- a/src/main/java/net/minecraft/core/item/ItemSnowball.java
+++ b/src/main/java/net/minecraft/core/item/ItemSnowball.java
@@ -22,7 +22,7 @@ public class ItemSnowball
     }
 
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         itemstack.consumeItem(entityplayer);
         world.playSoundAtEntity(entityplayer, entityplayer, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
diff --git a/src/main/java/net/minecraft/core/item/ItemSoup.java b/src/main/java/net/minecraft/core/item/ItemSoup.java
index dfc8d27bb..71c70cee6 100644
--- a/src/main/java/net/minecraft/core/item/ItemSoup.java
+++ b/src/main/java/net/minecraft/core/item/ItemSoup.java
@@ -12,9 +12,9 @@ public class ItemSoup extends ItemFood
     }
 
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
-        ItemStack stack = super.onItemRightClick(itemstack, world, entityplayer);
+        ItemStack stack = super.onUseItem(itemstack, world, entityplayer);
         return stack.stackSize <= 0 ? Item.bowl.getDefaultStack() : stack;
     }
 }
diff --git a/src/main/java/net/minecraft/core/item/ItemStack.java b/src/main/java/net/minecraft/core/item/ItemStack.java
index c2b3ae546..7d52537c1 100644
--- a/src/main/java/net/minecraft/core/item/ItemStack.java
+++ b/src/main/java/net/minecraft/core/item/ItemStack.java
@@ -117,7 +117,7 @@ public final class ItemStack
 
     public boolean useItem(EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
-        boolean flag = getItem().onItemUse(this, entityplayer, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
+        boolean flag = getItem().onUseItemOnBlock(this, entityplayer, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
         if(flag)
         {
             entityplayer.addStat(StatList.usedItemStats[itemID], 1);
@@ -132,7 +132,7 @@ public final class ItemStack
 
     public ItemStack useItemRightClick(World world, EntityPlayer entityplayer)
     {
-        return getItem().onItemRightClick(this, world, entityplayer);
+        return getItem().onUseItem(this, world, entityplayer);
     }
 
 	public CompoundTag writeToNBT(CompoundTag nbt) {
diff --git a/src/main/java/net/minecraft/core/item/ItemWandSpawner.java b/src/main/java/net/minecraft/core/item/ItemWandSpawner.java
index 937bf320c..f6abf76b3 100644
--- a/src/main/java/net/minecraft/core/item/ItemWandSpawner.java
+++ b/src/main/java/net/minecraft/core/item/ItemWandSpawner.java
@@ -23,7 +23,7 @@ public class ItemWandSpawner
         super(name, id);
     }
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer player)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer player)
     {
         if (player.gamemode != Gamemode.creative){
             player.sendTranslatedChatMessage("wand.wrongmode");
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlock.java b/src/main/java/net/minecraft/core/item/block/ItemBlock.java
index d6b8aa628..6489ee451 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlock.java
+++ b/src/main/java/net/minecraft/core/item/block/ItemBlock.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.item.block;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockFluid;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.Item;
@@ -8,6 +9,8 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
+import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
+
 // Referenced classes of package net.minecraft.src:
 //            Item, Block, World, ItemStack, 
 //            Material, StepSound, EntityPlayer
@@ -30,7 +33,7 @@ public class ItemBlock extends Item
     }
 
     @Override
-	public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean onUseItemOnBlock(ItemStack stack, EntityPlayer player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
 		if(stack.stackSize <= 0) {
 			return false;
 		}
@@ -39,14 +42,16 @@ public class ItemBlock extends Item
 			blockY += side.getOffsetY();
 			blockZ += side.getOffsetZ();
 		}
-        boolean placedInside = world.getBlock(blockX, blockY, blockZ) != null;
+        Block currentBlock = world.getBlock(blockX, blockY, blockZ);
+        boolean placedInside = currentBlock != null && !(currentBlock instanceof BlockFluid);
+
         if(blockY < 0 || blockY >= world.getHeightBlocks()) {
         	return false;
         }
 		if(world.canBlockBePlacedAt(blockID, blockX, blockY, blockZ, false, side) && stack.consumeItem(player)) {
 			Block block = Block.blocksList[blockID];
             if (placedInside && !world.isClientSide){
-                world.playSoundEffect(2001, blockX, blockY, blockZ, world.getBlockId(blockX, blockY, blockZ));
+                world.playSoundEffect(EVENT_BLOCK_BREAK, blockX, blockY, blockZ, world.getBlockId(blockX, blockY, blockZ));
             }
 			if(world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, getPlacedBlockMetadata(stack.getMetadata()))) {
 				block.onBlockPlaced(world, blockX, blockY, blockZ, side, player, yPlaced);
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockAlgae.java b/src/main/java/net/minecraft/core/item/block/ItemBlockAlgae.java
index 2b506bf17..fa0e47a1a 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockAlgae.java
+++ b/src/main/java/net/minecraft/core/item/block/ItemBlockAlgae.java
@@ -25,13 +25,13 @@ public class ItemBlockAlgae extends ItemBlock
     }
     
     @Override
-    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
     	return false;
     }
     
     @Override
-    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, EntityPlayer entityplayer)
     {
         float f = 1.0F;
         float f1 = entityplayer.xRotO + (entityplayer.xRot - entityplayer.xRotO) * f;
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockLadder.java b/src/main/java/net/minecraft/core/item/block/ItemBlockLadder.java
index ef2e9ddad..4fde46643 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockLadder.java
+++ b/src/main/java/net/minecraft/core/item/block/ItemBlockLadder.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.item.block;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockFluid;
 import net.minecraft.core.block.BlockLadder;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
@@ -8,6 +9,8 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
+import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
+
 public class ItemBlockLadder extends ItemBlock {
 
 	private BlockLadder blockLadder;
@@ -19,7 +22,7 @@ public class ItemBlockLadder extends ItemBlock {
 	}
 	
 	@Override
-	public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+	public boolean onUseItemOnBlock(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
 		Block clickedBlock = world.getBlock(x, y, z);
 		
 		if(clickedBlock == blockLadder && !player.isSneaking()) {
@@ -55,8 +58,8 @@ public class ItemBlockLadder extends ItemBlock {
 	public boolean placeBlock(World world, int x, int y, int z, int meta, EntityPlayer player, ItemStack stack, Side side, double sideHeight) {
 		Block currentBlock = world.getBlock(x, y, z);
 		if(world.canPlaceInsideBlock(x, y, z) && world.canBlockBePlacedAt(blockID, x, y, z, false, side) && stack.consumeItem(player)) {
-			if (currentBlock != null && !world.isClientSide){
-				world.playSoundEffect(2001, x, y, z, world.getBlockId(x, y, z));
+			if (currentBlock != null && !(currentBlock instanceof BlockFluid) && !world.isClientSide){
+				world.playSoundEffect(EVENT_BLOCK_BREAK, x, y, z, world.getBlockId(x, y, z));
 			}
 			if(world.setBlockAndMetadataWithNotify(x, y, z, blockID, meta)) {
 				Block.getBlock(blockID).onBlockPlaced(world, x, y, z, side, player, sideHeight);
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockLayer.java b/src/main/java/net/minecraft/core/item/block/ItemBlockLayer.java
index 30410ce3c..844e1d42b 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockLayer.java
+++ b/src/main/java/net/minecraft/core/item/block/ItemBlockLayer.java
@@ -6,6 +6,7 @@ package net.minecraft.core.item.block;
 
 import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockFluid;
 import net.minecraft.core.block.BlockLayerBase;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.player.EntityPlayer;
@@ -15,6 +16,8 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 
+import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
+
 
 public class ItemBlockLayer extends ItemBlock
 {
@@ -24,7 +27,7 @@ public class ItemBlockLayer extends ItemBlock
 	}
 
 	@Override
-	public boolean onItemUse(final ItemStack itemstack, final EntityPlayer entityplayer, final World world, int blockX, int blockY, int blockZ, final Side side, double xPlaced, final double yPlaced)
+	public boolean onUseItemOnBlock(final ItemStack itemstack, final EntityPlayer entityplayer, final World world, int blockX, int blockY, int blockZ, final Side side, double xPlaced, final double yPlaced)
 	{
 		int id = world.getBlockId(blockX, blockY, blockZ);
 		int meta = world.getBlockMetadata(blockX, blockY, blockZ);
@@ -126,11 +129,11 @@ public class ItemBlockLayer extends ItemBlock
 		{
 			final Block block = Block.blocksList[blockID];
 			Block currentBlock = world.getBlock(blockX, blockY, blockZ);
-			boolean placedInside = currentBlock != null;
+			boolean placedInside = currentBlock != null && !(currentBlock instanceof BlockFluid);
 			if (world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, getPlacedBlockMetadata(itemstack.getMetadata())))
 			{
 				if (placedInside && !world.isClientSide){
-					world.playSoundEffect(2001, blockX, blockY, blockZ, currentBlock.id);
+					world.playSoundEffect(EVENT_BLOCK_BREAK, blockX, blockY, blockZ, currentBlock.id);
 				}
 				Block.blocksList[blockID].onBlockPlaced(world, blockX, blockY, blockZ, null, entityplayer, yPlaced);
 				world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, block, EnumBlockSoundEffectType.PLACE);
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockLayerLeaves.java b/src/main/java/net/minecraft/core/item/block/ItemBlockLayerLeaves.java
index 3057c289d..43f001ff3 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockLayerLeaves.java
+++ b/src/main/java/net/minecraft/core/item/block/ItemBlockLayerLeaves.java
@@ -4,6 +4,7 @@ package net.minecraft.core.item.block;
 
 import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockFluid;
 import net.minecraft.core.block.BlockLayerBase;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.player.EntityPlayer;
@@ -13,6 +14,8 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 
+import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
+
 public class ItemBlockLayerLeaves extends ItemBlock
 {
 	public ItemBlockLayerLeaves(Block block)
@@ -21,7 +24,7 @@ public class ItemBlockLayerLeaves extends ItemBlock
 	}
 
 	@Override
-	public boolean onItemUse(final ItemStack itemstack, final EntityPlayer entityplayer, final World world, int blockX, int blockY, int blockZ, final Side side, double xPlaced, final double yPlaced)
+	public boolean onUseItemOnBlock(final ItemStack itemstack, final EntityPlayer entityplayer, final World world, int blockX, int blockY, int blockZ, final Side side, double xPlaced, final double yPlaced)
 	{
 		int id = world.getBlockId(blockX, blockY, blockZ);
 		int meta = world.getBlockMetadata(blockX, blockY, blockZ);
@@ -123,11 +126,11 @@ public class ItemBlockLayerLeaves extends ItemBlock
 		{
 			final Block block = Block.blocksList[blockID];
 			Block currentBlock = world.getBlock(blockX, blockY, blockZ);
-			boolean placedInside = currentBlock != null;
+			boolean placedInside = currentBlock != null && !(currentBlock instanceof BlockFluid);
 			if (world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, getPlacedBlockMetadata(itemstack.getMetadata())))
 			{
 				if (placedInside && !world.isClientSide){
-					world.playSoundEffect(2001, blockX, blockY, blockZ, currentBlock.id);
+					world.playSoundEffect(EVENT_BLOCK_BREAK, blockX, blockY, blockZ, currentBlock.id);
 				}
 				Block.blocksList[blockID].onBlockPlaced(world, blockX, blockY, blockZ, null, entityplayer, yPlaced);
 				world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, block, EnumBlockSoundEffectType.PLACE);
diff --git a/src/main/java/net/minecraft/core/item/block/ItemBlockSlab.java b/src/main/java/net/minecraft/core/item/block/ItemBlockSlab.java
index 115984e3b..f5f72bd45 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockSlab.java
+++ b/src/main/java/net/minecraft/core/item/block/ItemBlockSlab.java
@@ -2,6 +2,7 @@ package net.minecraft.core.item.block;
 
 import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BlockFluid;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
@@ -10,6 +11,8 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 
+import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
+
 
 // Referenced classes of package net.minecraft.src:
 //            Item, Block, World, ItemStack, 
@@ -24,7 +27,7 @@ public class ItemBlockSlab extends ItemBlock
     }
 
     @Override
-    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
     	int id = world.getBlockId(blockX, blockY, blockZ);
     	int meta = world.getBlockMetadata(blockX, blockY, blockZ) & 0x3;
@@ -93,11 +96,11 @@ public class ItemBlockSlab extends ItemBlock
         {
             Block block = Block.blocksList[blockID];
             Block currentBlock = world.getBlock(blockX, blockY, blockZ);
-            boolean placedInside = currentBlock != null;
+            boolean placedInside = currentBlock != null && !(currentBlock instanceof BlockFluid);
             if(world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, getPlacedBlockMetadata(itemstack.getMetadata())))
             {
                 if (placedInside && !world.isClientSide){
-                    world.playSoundEffect(2001, blockX, blockY, blockZ, currentBlock.id);
+                    world.playSoundEffect(EVENT_BLOCK_BREAK, blockX, blockY, blockZ, currentBlock.id);
                 }
             	Block.blocksList[blockID].onBlockPlaced(world, blockX, blockY, blockZ, side, entityplayer, yPlaced);
                 world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, block, EnumBlockSoundEffectType.PLACE);
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 6a205e810..e56d26f74 100644
--- a/src/main/java/net/minecraft/core/item/tool/ItemToolHoe.java
+++ b/src/main/java/net/minecraft/core/item/tool/ItemToolHoe.java
@@ -31,7 +31,7 @@ public class ItemToolHoe extends ItemTool
     }
 
     @Override
-    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         int id = world.getBlockId(blockX, blockY, blockZ);
         int j1 = world.getBlockId(blockX, blockY + 1, blockZ);
diff --git a/src/main/java/net/minecraft/core/item/tool/ItemToolShovel.java b/src/main/java/net/minecraft/core/item/tool/ItemToolShovel.java
index d92026e05..61037b618 100644
--- a/src/main/java/net/minecraft/core/item/tool/ItemToolShovel.java
+++ b/src/main/java/net/minecraft/core/item/tool/ItemToolShovel.java
@@ -27,7 +27,7 @@ public class ItemToolShovel extends ItemTool
     }
 
     @Override
-    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         int i1 = world.getBlockId(blockX, blockY, blockZ);
         int j1 = world.getBlockId(blockX, blockY + 1, blockZ);
diff --git a/src/main/java/net/minecraft/core/net/entity/INetworkEntry.java b/src/main/java/net/minecraft/core/net/entity/INetworkEntry.java
new file mode 100644
index 000000000..51a23f9f9
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/INetworkEntry.java
@@ -0,0 +1,8 @@
+package net.minecraft.core.net.entity;
+
+import org.jetbrains.annotations.NotNull;
+
+public interface INetworkEntry<T> {
+    @NotNull
+    Class<? extends T> getAppliedClass();
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/IPacketEntry.java b/src/main/java/net/minecraft/core/net/entity/IPacketEntry.java
new file mode 100644
index 000000000..71870482e
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/IPacketEntry.java
@@ -0,0 +1,8 @@
+package net.minecraft.core.net.entity;
+
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.server.entity.EntityTrackerEntry;
+
+public interface IPacketEntry<T> extends INetworkEntry<T> {
+    Packet getSpawnPacket(EntityTrackerEntry tracker, T trackedObject);
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/ITrackedEntry.java b/src/main/java/net/minecraft/core/net/entity/ITrackedEntry.java
new file mode 100644
index 000000000..31786c2ec
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/ITrackedEntry.java
@@ -0,0 +1,11 @@
+package net.minecraft.core.net.entity;
+
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+
+public interface ITrackedEntry<T> extends INetworkEntry<T> {
+    int getTrackingDistance();
+    int getPacketDelay();
+    boolean sendMotionUpdates();
+    void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, T trackedObject);
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/IVehicleEntry.java b/src/main/java/net/minecraft/core/net/entity/IVehicleEntry.java
new file mode 100644
index 000000000..ca2eca917
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/IVehicleEntry.java
@@ -0,0 +1,11 @@
+package net.minecraft.core.net.entity;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.world.World;
+import net.minecraft.server.entity.EntityTrackerEntry;
+
+public interface IVehicleEntry<T> extends IPacketEntry<T> {
+    Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner);
+    Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, T trackedObject);
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/NetEntityHandler.java b/src/main/java/net/minecraft/core/net/entity/NetEntityHandler.java
new file mode 100644
index 000000000..1f32af28f
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/NetEntityHandler.java
@@ -0,0 +1,152 @@
+package net.minecraft.core.net.entity;
+
+import net.minecraft.core.net.entity.entries.AnimalNetEntry;
+import net.minecraft.core.net.entity.entries.ArrowNetEntry;
+import net.minecraft.core.net.entity.entries.BoatNetEntry;
+import net.minecraft.core.net.entity.entries.BobberEntry;
+import net.minecraft.core.net.entity.entries.CannonballEntry;
+import net.minecraft.core.net.entity.entries.EggNetEntry;
+import net.minecraft.core.net.entity.entries.FallingSandNetEntry;
+import net.minecraft.core.net.entity.entries.FireballNetEntry;
+import net.minecraft.core.net.entity.entries.FireflyNetEntry;
+import net.minecraft.core.net.entity.entries.ItemNetEntry;
+import net.minecraft.core.net.entity.entries.MinecartNetEntry;
+import net.minecraft.core.net.entity.entries.PaintingNetEntry;
+import net.minecraft.core.net.entity.entries.PebbleEntry;
+import net.minecraft.core.net.entity.entries.PlayerMPNetEntry;
+import net.minecraft.core.net.entity.entries.SnowballNetEntry;
+import net.minecraft.core.net.entity.entries.SquidNetEntry;
+import net.minecraft.core.net.entity.entries.TNTNetEntry;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+public class NetEntityHandler {
+    private static final Map<Class<?>, INetworkEntry<?>> entryClassMap = new LinkedHashMap<>();
+    private static final List<INetworkEntry<?>> netEntries = new ArrayList<>();
+    private static final List<IPacketEntry<?>> packetEntries = new ArrayList<>();
+    private static final List<ITrackedEntry<?>> trackedEntries = new ArrayList<>();
+    private static final Map<Integer, IVehicleEntry<?>> typeToProviderMap = new HashMap<>();
+    private static final Map<IVehicleEntry<?>, Integer> providerToTypeMap = new HashMap<>();
+    private static boolean isListDirty = false;
+    public static <T> void registerNetworkEntry(INetworkEntry<T> networkEntity){
+        addEntryRaw(networkEntity, -1);
+    }
+    public static <T> void registerNetworkEntry(IVehicleEntry<T> typedEntity, int type){
+        addEntryRaw(typedEntity, type);
+    }
+    private static <T> void addEntryRaw(INetworkEntry<T> entry, int type){
+        Class<? extends T> entityClass = entry.getAppliedClass();
+        if (entryClassMap.containsKey(entityClass)){
+            INetworkEntry<?> previousEntry = entryClassMap.get(entityClass);
+            netEntries.remove(previousEntry);
+            packetEntries.remove(previousEntry);
+            trackedEntries.remove(previousEntry);
+
+            entryClassMap.remove(entityClass);
+
+            if (type >= 0 && typeToProviderMap.containsKey(type)){
+                providerToTypeMap.remove(typeToProviderMap.remove(type));
+            }
+        }
+        entryClassMap.put(entityClass, entry);
+        netEntries.add(entry);
+
+        if (type >= 0 && entry instanceof IVehicleEntry){
+            typeToProviderMap.put(type, (IVehicleEntry<?>) entry);
+            providerToTypeMap.put((IVehicleEntry<?>) entry, type);
+        }
+
+        if (entry instanceof IPacketEntry){
+            packetEntries.add((IPacketEntry<?>) entry);
+        }
+
+        if (entry instanceof ITrackedEntry){
+            trackedEntries.add((ITrackedEntry<?>) entry);
+        }
+
+        isListDirty = true;
+    }
+
+    @SuppressWarnings("unchecked") // I sign off on this check :)
+    public static Packet getSpawnPacket(@NotNull EntityTrackerEntry trackerEntry) {
+        if (isListDirty){
+            sortEntries();
+        }
+        for (IPacketEntry netEnt : packetEntries){
+            if (netEnt.getAppliedClass().isAssignableFrom(trackerEntry.trackedEntity.getClass())){
+                Packet packet;
+                if (netEnt instanceof IVehicleEntry){
+                    packet = ((IVehicleEntry)netEnt).getSpawnPacket(trackerEntry, trackerEntry.trackedEntity).setType(providerToTypeMap.get(netEnt));
+                } else {
+                    packet = netEnt.getSpawnPacket(trackerEntry, trackerEntry.trackedEntity);
+                }
+                return packet;
+            }
+        }
+        throw new IllegalArgumentException("Don't know how to add " + trackerEntry.trackedEntity.getClass() + "!");
+    }
+    @SuppressWarnings("unchecked")
+    public static <T> ITrackedEntry<T> getTrackedEntry(T entity){
+        if (isListDirty){
+            sortEntries();
+        }
+        for (ITrackedEntry tracked : trackedEntries){
+            if (tracked.getAppliedClass().isAssignableFrom(entity.getClass())){
+                return tracked;
+            }
+        }
+        return null;
+    }
+
+    public static boolean hasType(int type){
+        return typeToProviderMap.containsKey(type);
+    }
+    public static IVehicleEntry<?> getTypeEntry(int type){
+        return typeToProviderMap.get(type);
+    }
+    private static void sortEntries(){
+        Comparator<INetworkEntry<?>> networkEntryComparator = (o1, o2) -> {
+            if (o1.getAppliedClass().isAssignableFrom(o2.getAppliedClass())) return  1;
+            if (o2.getAppliedClass().isAssignableFrom(o1.getAppliedClass())) return -1;
+            return o1.getAppliedClass().getSimpleName().compareTo(o2.getAppliedClass().getSimpleName());
+        };
+        // Sort Higher level classes to the bottom of the list, and base classes to the top, so that base level classes don't "shadow" higher level entries
+        netEntries.sort(networkEntryComparator);
+        packetEntries.sort(networkEntryComparator);
+        trackedEntries.sort(networkEntryComparator);
+        isListDirty = false;
+    }
+
+    static {
+        registerNetworkEntry(new AnimalNetEntry<>());
+        registerNetworkEntry(new SquidNetEntry());
+        registerNetworkEntry(new FireflyNetEntry());
+        registerNetworkEntry(new ItemNetEntry());
+        registerNetworkEntry(new PaintingNetEntry());
+        registerNetworkEntry(new PlayerMPNetEntry());
+
+        registerNetworkEntry(new ArrowNetEntry(), 1);
+        registerNetworkEntry(new CannonballEntry(), 2);
+        registerNetworkEntry(new EggNetEntry(), 3);
+        registerNetworkEntry(new FireballNetEntry(), 4);
+        registerNetworkEntry(new PebbleEntry(), 5);
+        registerNetworkEntry(new SnowballNetEntry(), 6);
+
+        registerNetworkEntry(new BoatNetEntry(), 10);
+        registerNetworkEntry(new MinecartNetEntry(), 11);
+
+        registerNetworkEntry(new FallingSandNetEntry(), 20);
+        registerNetworkEntry(new TNTNetEntry(), 21);
+
+        registerNetworkEntry(new BobberEntry(), 30);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/AnimalNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/AnimalNetEntry.java
new file mode 100644
index 000000000..c512115ad
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/AnimalNetEntry.java
@@ -0,0 +1,43 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.animal.IAnimal;
+import net.minecraft.core.net.entity.IPacketEntry;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet24MobSpawn;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+public class AnimalNetEntry<T extends IAnimal> implements IPacketEntry<T>, ITrackedEntry<T> {
+    @Override
+    public @NotNull Class<T> getAppliedClass() {
+        return (Class<T>) IAnimal.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 160;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return 3;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return false;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, IAnimal trackedObject) {
+
+    }
+
+    @Override
+    public Packet getSpawnPacket(EntityTrackerEntry tracker, IAnimal trackedObject) {
+        return new Packet24MobSpawn((EntityLiving) trackedObject);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/ArrowNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/ArrowNetEntry.java
new file mode 100644
index 000000000..2e025486c
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/ArrowNetEntry.java
@@ -0,0 +1,61 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.projectile.EntityArrow;
+import net.minecraft.core.entity.projectile.EntityArrowGolden;
+import net.minecraft.core.entity.projectile.EntityArrowPurple;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.entity.IVehicleEntry;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.world.World;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+public class ArrowNetEntry implements IVehicleEntry<EntityArrow>, ITrackedEntry<EntityArrow> {
+    @Override
+    public @NotNull Class<EntityArrow> getAppliedClass() {
+        return EntityArrow.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 64;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return 20;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return false;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityArrow trackedObject) {
+
+    }
+
+    @Override
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+        if (metadata == 2) {
+            return new EntityArrowGolden(world, x, y, z);
+        } else if (metadata == 1) {
+            return new EntityArrowPurple(world, x, y, z);
+        } else {
+            return new EntityArrow(world, x, y, z, metadata);
+        }
+    }
+
+    @Override
+    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityArrow trackedObject) {
+        EntityLiving entityliving = trackedObject.owner;
+        return new Packet23VehicleSpawn(trackedObject,
+            trackedObject.getArrowType(), entityliving == null ? -1 : entityliving.id,
+            trackedObject.xd, trackedObject.yd, trackedObject.zd);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/BoatNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/BoatNetEntry.java
new file mode 100644
index 000000000..5dae1d34e
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/BoatNetEntry.java
@@ -0,0 +1,49 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.vehicle.EntityBoat;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.entity.IVehicleEntry;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.world.World;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+public class BoatNetEntry implements IVehicleEntry<EntityBoat>, ITrackedEntry<EntityBoat> {
+    @Override
+    public @NotNull Class<EntityBoat> getAppliedClass() {
+        return EntityBoat.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 160;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return 1;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return true;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityBoat trackedObject) {
+
+    }
+
+    @Override
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+        return new EntityBoat(world, x, y, z);
+    }
+
+    @Override
+    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityBoat trackedObject) {
+        return new Packet23VehicleSpawn(trackedObject);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/BobberEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/BobberEntry.java
new file mode 100644
index 000000000..77cce06c3
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/BobberEntry.java
@@ -0,0 +1,49 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.EntityBobber;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.entity.IVehicleEntry;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.world.World;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+public class BobberEntry implements IVehicleEntry<EntityBobber>, ITrackedEntry<EntityBobber> {
+    @Override
+    public @NotNull Class<EntityBobber> getAppliedClass() {
+        return EntityBobber.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 64;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return 5;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return true;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityBobber trackedObject) {
+
+    }
+
+    @Override
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+        return new EntityBobber(world, x, y, z);
+    }
+
+    @Override
+    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityBobber trackedObject) {
+        return new Packet23VehicleSpawn(trackedObject);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/CannonballEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/CannonballEntry.java
new file mode 100644
index 000000000..b6c80012b
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/CannonballEntry.java
@@ -0,0 +1,53 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.projectile.EntityCannonball;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.entity.IVehicleEntry;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.world.World;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+public class CannonballEntry implements IVehicleEntry<EntityCannonball>, ITrackedEntry<EntityCannonball> {
+    @Override
+    public @NotNull Class<EntityCannonball> getAppliedClass() {
+        return EntityCannonball.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 64;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return 10;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return false;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityCannonball trackedObject) {
+
+    }
+
+    @Override
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+        return new EntityCannonball(world, x, y, z);
+    }
+
+    @Override
+    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityCannonball trackedObject) {
+        EntityLiving entityliving = trackedObject.owner;
+        return new Packet23VehicleSpawn(trackedObject, -1,
+            entityliving == null ? -1 : entityliving.id,
+            trackedObject.xd, trackedObject.yd, trackedObject.zd);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/EggNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/EggNetEntry.java
new file mode 100644
index 000000000..0f28b1408
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/EggNetEntry.java
@@ -0,0 +1,49 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.projectile.EntityEgg;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.entity.IVehicleEntry;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.world.World;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+public class EggNetEntry implements IVehicleEntry<EntityEgg>, ITrackedEntry<EntityEgg> {
+    @Override
+    public @NotNull Class<EntityEgg> getAppliedClass() {
+        return EntityEgg.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 64;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return 10;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return true;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityEgg trackedObject) {
+
+    }
+
+    @Override
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+        return new EntityEgg(world, x, y, z);
+    }
+
+    @Override
+    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityEgg trackedObject) {
+        return new Packet23VehicleSpawn(trackedObject);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/FallingSandNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/FallingSandNetEntry.java
new file mode 100644
index 000000000..c7368b4d2
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/FallingSandNetEntry.java
@@ -0,0 +1,51 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.block.Block;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.EntityFallingSand;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.entity.IVehicleEntry;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.world.World;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+public class FallingSandNetEntry implements IVehicleEntry<EntityFallingSand>, ITrackedEntry<EntityFallingSand> {
+    @Override
+    public @NotNull Class<EntityFallingSand> getAppliedClass() {
+        return EntityFallingSand.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 160;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return 20;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return true;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityFallingSand trackedObject) {
+
+    }
+
+    @Override
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+        return new EntityFallingSand(world, x, y, z, MathHelper.clamp(metadata, 0, Block.blocksList.length));
+    }
+
+    @Override
+    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityFallingSand trackedObject) {
+        return new Packet23VehicleSpawn(trackedObject, trackedObject.blockID);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/FireballNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/FireballNetEntry.java
new file mode 100644
index 000000000..879fdf2b3
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/FireballNetEntry.java
@@ -0,0 +1,49 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.projectile.EntityFireball;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.entity.IVehicleEntry;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.world.World;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+public class FireballNetEntry implements IVehicleEntry<EntityFireball>, ITrackedEntry<EntityFireball> {
+    @Override
+    public @NotNull Class<EntityFireball> getAppliedClass() {
+        return EntityFireball.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 64;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return 10;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return false;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityFireball trackedObject) {
+
+    }
+
+    @Override
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+        return new EntityFireball(world, x, y, z, xd, yd, zd);
+    }
+
+    @Override
+    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityFireball trackedObject) {
+        return new Packet23VehicleSpawn(trackedObject, -1, -1, trackedObject.accelX, trackedObject.accelY, trackedObject.accelZ);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/FireflyNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/FireflyNetEntry.java
new file mode 100644
index 000000000..e1eacd0dd
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/FireflyNetEntry.java
@@ -0,0 +1,15 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.animal.EntityFireflyCluster;
+import org.jetbrains.annotations.NotNull;
+
+public class FireflyNetEntry extends AnimalNetEntry<EntityFireflyCluster>{
+    @Override
+    public @NotNull Class<EntityFireflyCluster> getAppliedClass() {
+        return EntityFireflyCluster.class;
+    }
+    @Override
+    public int getPacketDelay() {
+        return 40;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/ItemNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/ItemNetEntry.java
new file mode 100644
index 000000000..6bf51138d
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/ItemNetEntry.java
@@ -0,0 +1,46 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.EntityItem;
+import net.minecraft.core.net.entity.IPacketEntry;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet21PickupSpawn;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+public class ItemNetEntry implements IPacketEntry<EntityItem>, ITrackedEntry<EntityItem> {
+    @Override
+    public @NotNull Class<EntityItem> getAppliedClass() {
+        return EntityItem.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 64;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return 20;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return true;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityItem trackedObject) {
+
+    }
+
+    @Override
+    public Packet getSpawnPacket(EntityTrackerEntry tracker, EntityItem trackedObject) {
+        Packet21PickupSpawn packet21pickupspawn = new Packet21PickupSpawn(trackedObject);
+        trackedObject.x = packet21pickupspawn.xPosition / 32D;
+        trackedObject.y = packet21pickupspawn.yPosition / 32D;
+        trackedObject.z = packet21pickupspawn.zPosition / 32D;
+        return packet21pickupspawn;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/MinecartNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/MinecartNetEntry.java
new file mode 100644
index 000000000..cbbb7ae7c
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/MinecartNetEntry.java
@@ -0,0 +1,49 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.vehicle.EntityMinecart;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.entity.IVehicleEntry;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.world.World;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+public class MinecartNetEntry implements IVehicleEntry<EntityMinecart>, ITrackedEntry<EntityMinecart> {
+    @Override
+    public @NotNull Class<EntityMinecart> getAppliedClass() {
+        return EntityMinecart.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 160;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return 1;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return true;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityMinecart trackedObject) {
+
+    }
+
+    @Override
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+        return new EntityMinecart(world, x, y, z, metadata);
+    }
+
+    @Override
+    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityMinecart trackedObject) {
+        return new Packet23VehicleSpawn(trackedObject, trackedObject.minecartType);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/PaintingNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/PaintingNetEntry.java
new file mode 100644
index 000000000..9f3994db1
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/PaintingNetEntry.java
@@ -0,0 +1,42 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.EntityPainting;
+import net.minecraft.core.net.entity.IPacketEntry;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet25EntityPainting;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+public class PaintingNetEntry implements IPacketEntry<EntityPainting>, ITrackedEntry<EntityPainting> {
+    @Override
+    public @NotNull Class<EntityPainting> getAppliedClass() {
+        return EntityPainting.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 160;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return Integer.MAX_VALUE;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return false;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityPainting trackedObject) {
+
+    }
+
+    @Override
+    public Packet getSpawnPacket(EntityTrackerEntry tracker, EntityPainting trackedObject) {
+        return new Packet25EntityPainting(trackedObject);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/PebbleEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/PebbleEntry.java
new file mode 100644
index 000000000..342911034
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/PebbleEntry.java
@@ -0,0 +1,49 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.projectile.EntityPebble;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.entity.IVehicleEntry;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.world.World;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+public class PebbleEntry implements IVehicleEntry<EntityPebble>, ITrackedEntry<EntityPebble> {
+    @Override
+    public @NotNull Class<EntityPebble> getAppliedClass() {
+        return EntityPebble.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 64;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return 10;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return true;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityPebble trackedObject) {
+
+    }
+
+    @Override
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+        return new EntityPebble(world, x, y, z);
+    }
+
+    @Override
+    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityPebble trackedObject) {
+        return new Packet23VehicleSpawn(trackedObject);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/PlayerMPNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/PlayerMPNetEntry.java
new file mode 100644
index 000000000..092ecd0cb
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/PlayerMPNetEntry.java
@@ -0,0 +1,46 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.net.entity.IPacketEntry;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet20NamedEntitySpawn;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import net.minecraft.server.entity.player.EntityPlayerMP;
+import org.jetbrains.annotations.NotNull;
+
+public class PlayerMPNetEntry implements IPacketEntry<EntityPlayerMP>, ITrackedEntry<EntityPlayerMP> {
+    @Override
+    public @NotNull Class<EntityPlayerMP> getAppliedClass() {
+        return EntityPlayerMP.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 512;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return 2;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return false;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityPlayerMP trackedObject) {
+        for (EntityTrackerEntry entitytrackerentry : tracker.trackedEntitySet) {
+            if (entitytrackerentry.trackedEntity != trackedObject) {
+                entitytrackerentry.updatePlayerEntity(trackedObject);
+            }
+        }
+    }
+
+    @Override
+    public Packet getSpawnPacket(EntityTrackerEntry tracker, EntityPlayerMP trackedObject) {
+        return new Packet20NamedEntitySpawn(trackedObject);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/SnowballNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/SnowballNetEntry.java
new file mode 100644
index 000000000..946d33e55
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/SnowballNetEntry.java
@@ -0,0 +1,48 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.projectile.EntitySnowball;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.entity.IVehicleEntry;
+import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.world.World;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+public class SnowballNetEntry implements IVehicleEntry<EntitySnowball>, ITrackedEntry<EntitySnowball> {
+    @Override
+    public @NotNull Class<EntitySnowball> getAppliedClass() {
+        return EntitySnowball.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 64;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return 10;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return true;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntitySnowball trackedObject) {
+
+    }
+
+    @Override
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+        return new EntitySnowball(world, x, y, z);
+    }
+
+    @Override
+    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntitySnowball trackedObject) {
+        return new Packet23VehicleSpawn(trackedObject);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/SquidNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/SquidNetEntry.java
new file mode 100644
index 000000000..fab9a5cd7
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/SquidNetEntry.java
@@ -0,0 +1,16 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.animal.EntitySquid;
+import org.jetbrains.annotations.NotNull;
+
+public class SquidNetEntry extends AnimalNetEntry<EntitySquid>{
+    @Override
+    public @NotNull Class<EntitySquid> getAppliedClass() {
+        return EntitySquid.class;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return true;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/TNTNetEntry.java b/src/main/java/net/minecraft/core/net/entity/entries/TNTNetEntry.java
new file mode 100644
index 000000000..8842f9e15
--- /dev/null
+++ b/src/main/java/net/minecraft/core/net/entity/entries/TNTNetEntry.java
@@ -0,0 +1,48 @@
+package net.minecraft.core.net.entity.entries;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.EntityTNT;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.entity.IVehicleEntry;
+import net.minecraft.core.net.packet.Packet23VehicleSpawn;
+import net.minecraft.core.world.World;
+import net.minecraft.server.entity.EntityTracker;
+import net.minecraft.server.entity.EntityTrackerEntry;
+import org.jetbrains.annotations.NotNull;
+
+public class TNTNetEntry implements IVehicleEntry<EntityTNT>, ITrackedEntry<EntityTNT> {
+    @Override
+    public @NotNull Class<EntityTNT> getAppliedClass() {
+        return EntityTNT.class;
+    }
+
+    @Override
+    public int getTrackingDistance() {
+        return 160;
+    }
+
+    @Override
+    public int getPacketDelay() {
+        return 10;
+    }
+
+    @Override
+    public boolean sendMotionUpdates() {
+        return true;
+    }
+
+    @Override
+    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, EntityTNT trackedObject) {
+
+    }
+
+    @Override
+    public Entity getEntity(World world, double x, double y, double z, int metadata, boolean hasVelocity, double xd, double yd, double zd, Entity owner) {
+        return new EntityTNT(world, x, y, z);
+    }
+
+    @Override
+    public Packet23VehicleSpawn getSpawnPacket(EntityTrackerEntry tracker, EntityTNT trackedObject) {
+        return new Packet23VehicleSpawn(trackedObject);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet14BlockDig.java b/src/main/java/net/minecraft/core/net/packet/Packet14BlockDig.java
index 88472b82f..21251c43f 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet14BlockDig.java
+++ b/src/main/java/net/minecraft/core/net/packet/Packet14BlockDig.java
@@ -17,13 +17,15 @@ public class Packet14BlockDig extends Packet
     {
     }
 
-    public Packet14BlockDig(int i, int j, int k, int l, Side side)
+    public Packet14BlockDig(int i, int j, int k, int l, Side side, double xHit, double yHit)
     {
         status = i;
         xPosition = j;
         yPosition = k;
         zPosition = l;
         this.side = side;
+        this.xHit = xHit;
+        this.yHit = yHit;
     }
 
     @Override
@@ -35,6 +37,8 @@ public class Packet14BlockDig extends Packet
         yPosition = dis.read();
         zPosition = dis.readInt();
         side = Side.getSideById(dis.read());
+        xHit = dis.readDouble();
+        yHit = dis.readDouble();
     }
 
     @Override
@@ -46,6 +50,8 @@ public class Packet14BlockDig extends Packet
         dos.write(yPosition);
         dos.writeInt(zPosition);
         dos.write(side.getId());
+        dos.writeDouble(xHit);
+        dos.writeDouble(yHit);
     }
 
     @Override
@@ -57,12 +63,14 @@ public class Packet14BlockDig extends Packet
     @Override
 	public int getPacketSize()
     {
-        return 11;
+        return 19;
     }
 
     public int xPosition;
     public int yPosition;
     public int zPosition;
     public Side side;
+    public double xHit;
+    public double yHit;
     public int status;
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet15Place.java b/src/main/java/net/minecraft/core/net/packet/Packet15Place.java
index b8e2a83e9..9a9c35e9e 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet15Place.java
+++ b/src/main/java/net/minecraft/core/net/packet/Packet15Place.java
@@ -37,6 +37,7 @@ public class Packet15Place extends Packet
         yPosition = dis.read();
         zPosition = dis.readInt();
         direction = Direction.getDirectionById(dis.read());
+        xPlaced = dis.readDouble();
         yPlaced = dis.readDouble();
         short word0 = dis.readShort();
         if(word0 >= 0)
@@ -58,6 +59,7 @@ public class Packet15Place extends Packet
         dos.write(yPosition);
         dos.writeInt(zPosition);
         dos.write(direction.getId());
+        dos.writeDouble(xPlaced);
         dos.writeDouble(yPlaced);
         if(itemStack == null)
         {
@@ -79,7 +81,7 @@ public class Packet15Place extends Packet
     @Override
 	public int getPacketSize()
     {
-        return 15;
+        return 19;
     }
 
     public int xPosition;
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet21PickupSpawn.java b/src/main/java/net/minecraft/core/net/packet/Packet21PickupSpawn.java
index 521d1e7df..1bcbea2a4 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet21PickupSpawn.java
+++ b/src/main/java/net/minecraft/core/net/packet/Packet21PickupSpawn.java
@@ -1,25 +1,28 @@
 package net.minecraft.core.net.packet;
 
 import net.minecraft.core.entity.EntityItem;
-import net.minecraft.core.util.helper.MathHelper;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.util.helper.MathHelper;
 
 import java.io.*;
 
-// Referenced classes of package net.minecraft.src:
-//            Packet, EntityItem, ItemStack, MathHelper, 
-//            NetHandler
-
-public class Packet21PickupSpawn extends Packet
-{
+public class Packet21PickupSpawn extends Packet {
+    public int entityId;
+    public int xPosition;
+    public int yPosition;
+    public int zPosition;
+    public byte xd;
+    public byte yd;
+    public byte zd;
+    public int itemID;
+    public int count;
+    public int itemDamage;
+    public CompoundTag tag;
 
-    public Packet21PickupSpawn()
-    {
-    }
+    public Packet21PickupSpawn() {}
 
-    public Packet21PickupSpawn(EntityItem entityitem)
-    {
+    public Packet21PickupSpawn(EntityItem entityitem) {
         entityId = entityitem.id;
         itemID = entityitem.item.itemID;
         count = entityitem.item.stackSize;
@@ -28,15 +31,13 @@ public class Packet21PickupSpawn extends Packet
         xPosition = MathHelper.floor_double(entityitem.x * 32D);
         yPosition = MathHelper.floor_double(entityitem.y * 32D);
         zPosition = MathHelper.floor_double(entityitem.z * 32D);
-        rotation = (byte)(int)(entityitem.xd * 128D);
-        pitch = (byte)(int)(entityitem.yd * 128D);
-        roll = (byte)(int)(entityitem.zd * 128D);
+        xd = (byte)(int)(entityitem.xd * 128D);
+        yd = (byte)(int)(entityitem.yd * 128D);
+        zd = (byte)(int)(entityitem.zd * 128D);
     }
 
     @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
+	public void readPacketData(DataInputStream dis) throws IOException {
         entityId = dis.readInt();
         itemID = dis.readShort();
         count = dis.readByte();
@@ -45,15 +46,13 @@ public class Packet21PickupSpawn extends Packet
         xPosition = dis.readInt();
         yPosition = dis.readInt();
         zPosition = dis.readInt();
-        rotation = dis.readByte();
-        pitch = dis.readByte();
-        roll = dis.readByte();
+        xd = dis.readByte();
+        yd = dis.readByte();
+        zd = dis.readByte();
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
+	public void writePacketData(DataOutputStream dos) throws IOException {
         dos.writeInt(entityId);
         dos.writeShort(itemID);
         dos.writeByte(count);
@@ -62,9 +61,9 @@ public class Packet21PickupSpawn extends Packet
         dos.writeInt(xPosition);
         dos.writeInt(yPosition);
         dos.writeInt(zPosition);
-        dos.writeByte(rotation);
-        dos.writeByte(pitch);
-        dos.writeByte(roll);
+        dos.writeByte(xd);
+        dos.writeByte(yd);
+        dos.writeByte(zd);
     }
 
     @Override
@@ -78,16 +77,4 @@ public class Packet21PickupSpawn extends Packet
     {
         return 24;
     }
-
-    public int entityId;
-    public int xPosition;
-    public int yPosition;
-    public int zPosition;
-    public byte rotation;
-    public byte pitch;
-    public byte roll;
-    public int itemID;
-    public int count;
-    public int itemDamage;
-    public CompoundTag tag;
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/Packet23VehicleSpawn.java b/src/main/java/net/minecraft/core/net/packet/Packet23VehicleSpawn.java
index 8ec0ff7c7..26008562e 100644
--- a/src/main/java/net/minecraft/core/net/packet/Packet23VehicleSpawn.java
+++ b/src/main/java/net/minecraft/core/net/packet/Packet23VehicleSpawn.java
@@ -1,124 +1,129 @@
 package net.minecraft.core.net.packet;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.projectile.EntityArrow;
-import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.net.handler.NetHandler;
+import net.minecraft.core.util.helper.MathHelper;
 
-import java.io.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Packet, NetHandler
-
-public class Packet23VehicleSpawn extends Packet
-{
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
 
-    public Packet23VehicleSpawn()
-    {
-    }
-    
-    public Packet23VehicleSpawn(Entity entity, int id)
+public class Packet23VehicleSpawn extends Packet {
+    public int entityId;
+    public int xPosition;
+    public int yPosition;
+    public int zPosition;
+    public float pitch;
+    public float yaw;
+    public boolean hasVelocity = false;
+    public short xVelocity = 0;
+    public short yVelocity = 0;
+    public short zVelocity = 0;
+    public short type = -1;
+    public int ownerId = -1;
+    public int metaData = -1;
+    public Packet23VehicleSpawn() {}
+    public Packet23VehicleSpawn(Entity entity)
     {
-        this(entity, id, 0);
+        this(entity, -1, -1, null, null, null);
     }
-    
-    public Packet23VehicleSpawn(Entity entity, int type, int id)
-    {
-        entityId = entity.id;
-        xPosition = MathHelper.floor_double(entity.x * 32D);
-        yPosition = MathHelper.floor_double(entity.y * 32D);
-        zPosition = MathHelper.floor_double(entity.z * 32D);
-        pitch = entity.xRot;
-        yaw = entity.yRot;
-        this.type = type;
-        ownerId = id;
-        if(id > 0)
-        {
-            double d = entity.xd;
-            double d1 = entity.yd;
-            double d2 = entity.zd;
-            double d3 = 3.9D;
-            if(d < -d3)
-            {
-                d = -d3;
-            }
-            if(d1 < -d3)
-            {
-                d1 = -d3;
-            }
-            if(d2 < -d3)
-            {
-                d2 = -d3;
-            }
-            if(d > d3)
-            {
-                d = d3;
-            }
-            if(d1 > d3)
-            {
-                d1 = d3;
-            }
-            if(d2 > d3)
-            {
-                d2 = d3;
-            }
-            xVelocity = (int)(d * 8000D);
-            yVelocity = (int)(d1 * 8000D);
-            zVelocity = (int)(d2 * 8000D);
-        }
-        if(entity instanceof EntityArrow){
-            arrowType = ((EntityArrow) entity).getArrowType();
+    public Packet23VehicleSpawn(Entity entity, int metaData){ this(entity, metaData, -1, null, null, null); }
+    public Packet23VehicleSpawn(Entity entity, int metaData, int ownerId){ this(entity, metaData, ownerId, null, null, null); }
+    public Packet23VehicleSpawn(Entity entity, int metaData, int ownerId, Double xVelocity, Double yVelocity, Double zVelocity) {
+        this.entityId = entity.id;
+        this.xPosition = MathHelper.floor_double(entity.x * 32D);
+        this.yPosition = MathHelper.floor_double(entity.y * 32D);
+        this.zPosition = MathHelper.floor_double(entity.z * 32D);
+        this.pitch = entity.xRot;
+        this.yaw = entity.yRot;
+        this.metaData = metaData;
+        this.ownerId = ownerId;
+        if (xVelocity != null || yVelocity != null || zVelocity != null){
+            this.xVelocity = (short) ((xVelocity == null ? 0 : xVelocity) * 8000D);
+            this.yVelocity = (short) ((yVelocity == null ? 0 : yVelocity) * 8000D);
+            this.zVelocity = (short) ((zVelocity == null ? 0 : zVelocity) * 8000D);
+            this.hasVelocity = true;
+        } else {
+            this.hasVelocity = false;
         }
     }
+    public Packet23VehicleSpawn setType(int type){
+        this.type = (short) type;
+        return this;
+    }
 
 
     @Override
-	public void readPacketData(DataInputStream dis)
-        throws IOException
-    {
+	public void readPacketData(DataInputStream dis) throws IOException {
         entityId = dis.readInt();
-        type = dis.readByte();
+        type = dis.readShort();
         xPosition = dis.readInt();
         yPosition = dis.readInt();
         zPosition = dis.readInt();
         pitch = dis.readFloat();
         yaw = dis.readFloat();
-        ownerId = dis.readInt();
-        if(ownerId > 0)
-        {
+        byte optionals = dis.readByte();
+
+        if (hasVelocity(optionals)){
             xVelocity = dis.readShort();
             yVelocity = dis.readShort();
             zVelocity = dis.readShort();
+            hasVelocity = true;
+        }
+        if (hasOwner(optionals)){
+            ownerId = dis.readInt();
         }
-        if(type == 60)
-        {
-            arrowType = dis.readInt();
+        if (hasMeta(optionals)){
+            metaData = dis.readInt();
         }
     }
 
     @Override
-	public void writePacketData(DataOutputStream dos)
-        throws IOException
-    {
+	public void writePacketData(DataOutputStream dos) throws IOException {
         dos.writeInt(entityId);
-        dos.writeByte(type);
+        dos.writeShort(type);
         dos.writeInt(xPosition);
         dos.writeInt(yPosition);
         dos.writeInt(zPosition);
         dos.writeFloat(pitch);
         dos.writeFloat(yaw);
-        dos.writeInt(ownerId);
-        if(ownerId > 0)
-        {
+        byte optionals = makeOptionalsByte(hasVelocity, ownerId >= 0, metaData >= 0);
+        dos.writeByte(optionals);
+
+        if(hasVelocity(optionals)) {
             dos.writeShort(xVelocity);
             dos.writeShort(yVelocity);
             dos.writeShort(zVelocity);
         }
-        if(type == 60|| type == 73)
-        {
-            dos.writeInt(arrowType);
+        if(hasOwner(optionals)) {
+            dos.writeInt(ownerId);
+        }
+        if(hasMeta(optionals)) {
+            dos.writeInt(metaData);
         }
     }
+    public boolean hasOwner(byte val){
+        return (val &   0b1) != 0;
+    }
+    public boolean hasMeta(byte val){
+        return (val &  0b10) != 0;
+    }
+    public boolean hasVelocity(byte val){
+        return (val & 0b100) != 0;
+    }
+    public byte makeOptionalsByte(boolean hasVelocity, boolean hasOwner, boolean hasMeta){
+        byte val = 0;
+        if (hasOwner){
+            val |=   0b1;
+        }
+        if (hasMeta){
+            val |=  0b10;
+        }
+        if (hasVelocity){
+            val |= 0b100;
+        }
+        return val;
+    }
 
     @Override
 	public void processPacket(NetHandler netHandler)
@@ -131,17 +136,4 @@ public class Packet23VehicleSpawn extends Packet
     {
         return 21 + ownerId <= 0 ? 0 : 6;
     }
-
-    public int entityId;
-    public int xPosition;
-    public int yPosition;
-    public int zPosition;
-    public float pitch;
-    public float yaw;
-    public int xVelocity;
-    public int yVelocity;
-    public int zVelocity;
-    public int type;
-    public int ownerId;
-    public int arrowType;
 }
diff --git a/src/main/java/net/minecraft/core/world/LevelListener.java b/src/main/java/net/minecraft/core/world/LevelListener.java
index 0a509079a..03d381c3f 100644
--- a/src/main/java/net/minecraft/core/world/LevelListener.java
+++ b/src/main/java/net/minecraft/core/world/LevelListener.java
@@ -10,6 +10,16 @@ import net.minecraft.core.sound.SoundCategory;
 
 public interface LevelListener
 {
+    public static final int EVENT_DISPENSER_ITEM = 1000;
+    public static final int EVENT_DISPENSER_EMPTY = 1001;
+    public static final int EVENT_DISPENSER_PROJECTILE = 1002;
+    public static final int EVENT_DOOR_SOUND = 1003;
+    public static final int EVENT_DISPENSER_PARTICLES = 2000;
+    public static final int EVENT_BLOCK_BREAK = 2001;
+    public static final int EVENT_FIRE_EXTINGUISH = 1004;
+    public static final int EVENT_JUKEBOX_TOGGLE = 1005;
+    public static final int EVENT_PISTON_EXTEND = 1006;
+    public static final int EVENT_PISTON_RETRACT = 1007;
 
 	/**
 	 * Redraw block in singleplayer and send block change packet in multiplayer. <br>
diff --git a/src/main/java/net/minecraft/server/entity/EntityTracker.java b/src/main/java/net/minecraft/server/entity/EntityTracker.java
index e4229ae8e..2534a1d2f 100644
--- a/src/main/java/net/minecraft/server/entity/EntityTracker.java
+++ b/src/main/java/net/minecraft/server/entity/EntityTracker.java
@@ -1,31 +1,26 @@
 package net.minecraft.server.entity;
 
-import java.util.*;
-
-import net.minecraft.core.entity.*;
-import net.minecraft.core.entity.animal.EntityFireflyCluster;
-import net.minecraft.core.entity.animal.EntitySquid;
-import net.minecraft.core.entity.animal.IAnimal;
-import net.minecraft.server.entity.player.EntityPlayerMP;
-import net.minecraft.core.entity.projectile.*;
-import net.minecraft.core.entity.vehicle.EntityBoat;
-import net.minecraft.core.entity.vehicle.EntityMinecart;
-import net.minecraft.server.MinecraftServer;
-import net.minecraft.core.world.pathfinder.IdHashMap;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.net.entity.ITrackedEntry;
+import net.minecraft.core.net.entity.NetEntityHandler;
 import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.world.pathfinder.IdHashMap;
+import net.minecraft.server.MinecraftServer;
+import net.minecraft.server.entity.player.EntityPlayerMP;
 
-// Referenced classes of package net.minecraft.src:
-//            MCHash, ServerConfigurationManager, EntityPlayerMP, EntityTrackerEntry, 
-//            EntityFish, EntityArrow, EntityFireball, EntitySnowball, 
-//            EntityEgg, EntityItem, EntityMinecart, EntityBoat, 
-//            EntitySquid, IAnimals, EntityTNTPrimed, EntityFallingSand, 
-//            EntityPainting, Entity, WorldServer, Packet
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
 
-public class EntityTracker
-{
+public class EntityTracker {
+    public final Set<EntityTrackerEntry> trackedEntitySet;
+    public final IdHashMap<EntityTrackerEntry> trackedEntityHashTable;
+    public final MinecraftServer mcServer;
+    public final int maxTrackingDistanceThreshold;
+    public final int dimension;
 
-    public EntityTracker(MinecraftServer minecraftserver, int dimId)
-    {
+    public EntityTracker(MinecraftServer minecraftserver, int dimId) {
         trackedEntitySet = new HashSet<>();
         trackedEntityHashTable = new IdHashMap<>();
         mcServer = minecraftserver;
@@ -33,108 +28,27 @@ public class EntityTracker
         maxTrackingDistanceThreshold = minecraftserver.playerList.getMaxTrackingDistance();
     }
 
-    public void trackEntity(Entity entity)
-    {
-        if(entity instanceof EntityPlayerMP)
-        {
-            trackEntity(entity, 512, 2, false);
-            EntityPlayerMP entityplayermp = (EntityPlayerMP)entity;
-            Iterator<EntityTrackerEntry> iterator = trackedEntitySet.iterator();
-            do
-            {
-                if(!iterator.hasNext())
-                {
-                    break;
-                }
-                EntityTrackerEntry entitytrackerentry = iterator.next();
-                if(entitytrackerentry.trackedEntity != entityplayermp)
-                {
-                    entitytrackerentry.updatePlayerEntity(entityplayermp);
-                }
-            } while(true);
-        } else
-        if(entity instanceof EntityFireflyCluster)
-        {
-            trackEntity(entity, 160, 40, false);
-        } else
-        if(entity instanceof EntityBobber)
-        {
-            trackEntity(entity, 64, 5, true);
-        } else
-        if(entity instanceof EntityArrow)
-        {
-            trackEntity(entity, 64, 20, false);
-        } else
-        if(entity instanceof EntityCannonball)
-        {
-            trackEntity(entity, 64, 10, false);
-        } else
-        if(entity instanceof EntityFireball)
-        {
-            trackEntity(entity, 64, 10, false);
-        } else
-        if(entity instanceof EntitySnowball)
-        {
-            trackEntity(entity, 64, 10, true);
-        } else
-        if(entity instanceof EntityEgg)
-        {
-            trackEntity(entity, 64, 10, true);
-        } else
-        if(entity instanceof EntityPebble)
-        {
-            trackEntity(entity, 64, 10, true);
-        } else
-        if(entity instanceof EntityItem)
-        {
-            trackEntity(entity, 64, 20, true);
-        } else
-        if(entity instanceof EntityMinecart)
-        {
-            trackEntity(entity, 160, 1, true);
-        } else
-        if(entity instanceof EntityBoat)
-        {
-            trackEntity(entity, 160, 1, true);
-        } else
-        if(entity instanceof EntitySquid)
-        {
-            trackEntity(entity, 160, 3, true);
-        } else
-        if(entity instanceof IAnimal)
-        {
-            trackEntity(entity, 160, 3, false);
-        } else
-        if(entity instanceof EntityTNT)
-        {
-            trackEntity(entity, 160, 10, true);
-        } else
-        if(entity instanceof EntityFallingSand)
-        {
-            trackEntity(entity, 160, 20, true);
-        } else
-        if(entity instanceof EntityPainting)
-        {
-            trackEntity(entity, 160, 0x7fffffff, false);
+    public void trackEntity(Entity entity) {
+        ITrackedEntry<Entity> trackedConfig = NetEntityHandler.getTrackedEntry(entity);
+        if (trackedConfig != null){
+            EntityTrackerEntry trackerEntry = trackEntity(entity, trackedConfig.getTrackingDistance(), trackedConfig.getPacketDelay(), trackedConfig.sendMotionUpdates());
+            trackedConfig.onEntityTracked(this, trackerEntry, entity);
         }
     }
 
-    public void trackEntity(Entity entity, int trackingDistance, int packetDelay, boolean shouldSendMotionUpdates)
+    public EntityTrackerEntry trackEntity(Entity entity, int trackingDistance, int packetDelay, boolean shouldSendMotionUpdates)
     {
-        if(trackingDistance > maxTrackingDistanceThreshold)
-        {
+        if(trackingDistance > maxTrackingDistanceThreshold) {
             trackingDistance = maxTrackingDistanceThreshold;
         }
-        if(trackedEntityHashTable.containsItem(entity.id))
-        {
+        if(trackedEntityHashTable.containsItem(entity.id)) {
             throw new IllegalStateException("Entity is already tracked!");
-        } else
-        {
-            EntityTrackerEntry entitytrackerentry = new EntityTrackerEntry(entity, trackingDistance, packetDelay, shouldSendMotionUpdates);
-            trackedEntitySet.add(entitytrackerentry);
-            trackedEntityHashTable.add(entity.id, entitytrackerentry);
-            entitytrackerentry.updatePlayerEntities(mcServer.getDimensionWorld(dimension).players);
         }
+        EntityTrackerEntry trackerEntry = new EntityTrackerEntry(entity, trackingDistance, packetDelay, shouldSendMotionUpdates);
+        trackedEntitySet.add(trackerEntry);
+        trackedEntityHashTable.add(entity.id, trackerEntry);
+        trackerEntry.updatePlayerEntities(mcServer.getDimensionWorld(dimension).players);
+        return trackerEntry;
     }
 
     public void untrackEntity(Entity entity)
@@ -160,20 +74,12 @@ public class EntityTracker
     public void tick()
     {
         ArrayList<Entity> arraylist = new ArrayList<>();
-        Iterator<EntityTrackerEntry> iterator = trackedEntitySet.iterator();
-        do
-        {
-            if(!iterator.hasNext())
-            {
-                break;
-            }
-            EntityTrackerEntry entitytrackerentry = iterator.next();
+        for (EntityTrackerEntry entitytrackerentry : trackedEntitySet) {
             entitytrackerentry.tick(mcServer.getDimensionWorld(dimension).players);
-            if(entitytrackerentry.playerEntitiesUpdated && (entitytrackerentry.trackedEntity instanceof EntityPlayerMP))
-            {
+            if (entitytrackerentry.playerEntitiesUpdated && (entitytrackerentry.trackedEntity instanceof EntityPlayerMP)) {
                 arraylist.add(entitytrackerentry.trackedEntity);
             }
-        } while(true);
+        }
 label0:
         for(int i = 0; i < arraylist.size(); i++)
         {
@@ -222,10 +128,4 @@ label0:
         }
 
     }
-
-    private final Set<EntityTrackerEntry> trackedEntitySet;
-    private final IdHashMap<EntityTrackerEntry> trackedEntityHashTable;
-    private final MinecraftServer mcServer;
-    private final int maxTrackingDistanceThreshold;
-    private final int dimension;
 }
diff --git a/src/main/java/net/minecraft/server/entity/EntityTrackerEntry.java b/src/main/java/net/minecraft/server/entity/EntityTrackerEntry.java
index f06687be0..244c133c8 100644
--- a/src/main/java/net/minecraft/server/entity/EntityTrackerEntry.java
+++ b/src/main/java/net/minecraft/server/entity/EntityTrackerEntry.java
@@ -1,41 +1,57 @@
 package net.minecraft.server.entity;
 
-import net.minecraft.core.entity.*;
-import net.minecraft.core.entity.animal.IAnimal;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.EntityLiving;
 import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.server.entity.player.EntityPlayerMP;
-import net.minecraft.core.entity.projectile.*;
-import net.minecraft.core.entity.vehicle.EntityBoat;
-import net.minecraft.core.entity.vehicle.EntityMinecart;
-import net.minecraft.core.world.data.SynchedEntityData;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.block.Block;
+import net.minecraft.core.net.entity.NetEntityHandler;
+import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.Packet17Sleep;
+import net.minecraft.core.net.packet.Packet28EntityVelocity;
+import net.minecraft.core.net.packet.Packet29DestroyEntity;
+import net.minecraft.core.net.packet.Packet31RelEntityMove;
+import net.minecraft.core.net.packet.Packet32EntityLook;
+import net.minecraft.core.net.packet.Packet33RelEntityMoveLook;
+import net.minecraft.core.net.packet.Packet34EntityTeleport;
+import net.minecraft.core.net.packet.Packet35EntityNickname;
+import net.minecraft.core.net.packet.Packet40EntityMetadata;
+import net.minecraft.core.net.packet.Packet42EntityTagData;
+import net.minecraft.core.net.packet.Packet5PlayerInventory;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.net.packet.*;
-
-import java.util.*;
-
-// Referenced classes of package net.minecraft.src:
-//            Entity, MathHelper, Packet34EntityTeleport, Packet33RelEntityMoveLook, 
-//            Packet31RelEntityMove, Packet32EntityLook, Packet28EntityVelocity, DataWatcher, 
-//            Packet40EntityMetadata, EntityPlayerMP, NetServerHandler, Packet29DestroyEntity, 
-//            Packet5PlayerInventory, EntityPlayer, Packet17Sleep, EntityItem, 
-//            Packet21PickupSpawn, Packet20NamedEntitySpawn, EntityMinecart, Packet23VehicleSpawn, 
-//            EntityBoat, IAnimals, Packet24MobSpawn, EntityLiving, 
-//            EntityFish, EntityArrow, EntitySnowball, EntityFireball, 
-//            EntityEgg, EntityTNTPrimed, EntityFallingSand, Block, 
-//            EntityPainting, Packet25EntityPainting, Packet
+import net.minecraft.core.world.data.SynchedEntityData;
+import net.minecraft.server.entity.player.EntityPlayerMP;
 
-public class EntityTrackerEntry
-{
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
-    public EntityTrackerEntry(Entity entity, int trackingDistance, int packetDelay, boolean shouldSendMotionUpdates)
-    {
+public class EntityTrackerEntry {
+    public Entity trackedEntity;
+    public int trackingDistance;
+    public int packetDelay;
+    public int encodedPosX;
+    public int encodedPosY;
+    public int encodedPosZ;
+    public int encodedRotationYaw;
+    public int encodedRotationPitch;
+    public double lastTrackedEntityMotionX;
+    public double lastTrackedEntityMotionY;
+    public double lastTrackedEntityMotionZ;
+    public int updateCounter;
+    private double lastTrackedEntityPosX;
+    private double lastTrackedEntityPosY;
+    private double lastTrackedEntityPosZ;
+    private boolean firstUpdateDone;
+    private final boolean shouldSendMotionUpdates;
+    private int ticksSinceLastTeleport;
+    public boolean playerEntitiesUpdated;
+    public Set<EntityPlayerMP> trackedPlayers;
+    public EntityTrackerEntry(Entity entity, int trackingDistance, int packetDelay, boolean shouldSendMotionUpdates) {
         updateCounter = 0;
+        ticksSinceLastTeleport = 0;
         firstUpdateDone = false;
-        field_28165_t = 0;
         playerEntitiesUpdated = false;
-        trackedPlayers = new HashSet();
+        trackedPlayers = new HashSet<>();
         trackedEntity = entity;
         this.trackingDistance = trackingDistance;
         this.packetDelay = packetDelay;
@@ -48,15 +64,9 @@ public class EntityTrackerEntry
     }
 
     @Override
-	public boolean equals(Object obj)
-    {
-        if(obj instanceof EntityTrackerEntry)
-        {
-            return ((EntityTrackerEntry)obj).trackedEntity.id == trackedEntity.id;
-        } else
-        {
-            return false;
-        }
+	public boolean equals(Object obj) {
+        if (!(obj instanceof EntityTrackerEntry)) return false;
+        return ((EntityTrackerEntry)obj).trackedEntity.id == trackedEntity.id;
     }
 
     @Override
@@ -65,11 +75,9 @@ public class EntityTrackerEntry
         return trackedEntity.id;
     }
 
-    public void tick(List list)
-    {
+    public void tick(List<EntityPlayer> list) {
         playerEntitiesUpdated = false;
-        if(!firstUpdateDone || trackedEntity.distanceToSqr(lastTrackedEntityPosX, lastTrackedEntityPosY, lastTrackedEntityPosZ) > 16D)
-        {
+        if(!firstUpdateDone || trackedEntity.distanceToSqr(lastTrackedEntityPosX, lastTrackedEntityPosY, lastTrackedEntityPosZ) > 16D) {
             lastTrackedEntityPosX = trackedEntity.x;
             lastTrackedEntityPosY = trackedEntity.y;
             lastTrackedEntityPosZ = trackedEntity.z;
@@ -77,9 +85,8 @@ public class EntityTrackerEntry
             playerEntitiesUpdated = true;
             updatePlayerEntities(list);
         }
-        field_28165_t++;
-        if(++updateCounter % packetDelay == 0)
-        {
+        ticksSinceLastTeleport++;
+        if(++updateCounter % packetDelay == 0) {
             int entityX = MathHelper.floor_double(trackedEntity.x * 32D);
             int entityY = MathHelper.floor_double(trackedEntity.y * 32D);
             int entityZ = MathHelper.floor_double(trackedEntity.z * 32D);
@@ -88,142 +95,106 @@ public class EntityTrackerEntry
             int dx = entityX - encodedPosX;
             int dy = entityY - encodedPosY;
             int dz = entityZ - encodedPosZ;
-            Object obj = null;
+            Packet packet = null;
             boolean hasMoved = java.lang.Math.abs(entityX) >= 8 || java.lang.Math.abs(entityY) >= 8 || java.lang.Math.abs(entityZ) >= 8;
             boolean hasLooked = java.lang.Math.abs(entityYaw - encodedRotationYaw) >= 8 || java.lang.Math.abs(entityPitch - encodedRotationPitch) >= 8;
-            if(dx < -128 || dx >= 128 || dy < -128 || dy >= 128 || dz < -128 || dz >= 128 || field_28165_t > 400)
-            {
-                field_28165_t = 0;
+            if(dx < -128 || dx >= 128 || dy < -128 || dy >= 128 || dz < -128 || dz >= 128 || ticksSinceLastTeleport > 400) {
+                ticksSinceLastTeleport = 0;
                 trackedEntity.x = (double)entityX / 32D;
                 trackedEntity.y = (double)entityY / 32D;
                 trackedEntity.z = (double)entityZ / 32D;
-                obj = new Packet34EntityTeleport(trackedEntity.id, entityX, entityY, entityZ, (byte)entityYaw, (byte)entityPitch);
-            } else
-            if(hasMoved && hasLooked)
-            {
-                obj = new Packet33RelEntityMoveLook(trackedEntity.id, (byte)dx, (byte)dy, (byte)dz, (byte)entityYaw, (byte)entityPitch);
-            } else
-            if(hasMoved)
-            {
-                obj = new Packet31RelEntityMove(trackedEntity.id, (byte)dx, (byte)dy, (byte)dz);
-            } else
-            if(hasLooked)
-            {
-                obj = new Packet32EntityLook(trackedEntity.id, (byte)entityYaw, (byte)entityPitch);
+                packet = new Packet34EntityTeleport(trackedEntity.id, entityX, entityY, entityZ, (byte)entityYaw, (byte)entityPitch);
+            } else if(hasMoved && hasLooked) {
+                packet = new Packet33RelEntityMoveLook(trackedEntity.id, (byte)dx, (byte)dy, (byte)dz, (byte)entityYaw, (byte)entityPitch);
+            } else if(hasMoved) {
+                packet = new Packet31RelEntityMove(trackedEntity.id, (byte)dx, (byte)dy, (byte)dz);
+            } else if(hasLooked) {
+                packet = new Packet32EntityLook(trackedEntity.id, (byte)entityYaw, (byte)entityPitch);
             }
-            if(shouldSendMotionUpdates)
-            {
+            if(shouldSendMotionUpdates) {
                 double d = trackedEntity.xd - lastTrackedEntityMotionX;
                 double d1 = trackedEntity.yd - lastTrackedEntityMotionY;
                 double d2 = trackedEntity.zd - lastTrackedEntityMotionZ;
                 double d3 = 0.02D;
                 double d4 = d * d + d1 * d1 + d2 * d2;
-                if(d4 > d3 * d3 || d4 > 0.0D && trackedEntity.xd == 0.0D && trackedEntity.yd == 0.0D && trackedEntity.zd == 0.0D)
-                {
+                if(d4 > d3 * d3 || d4 > 0.0D && trackedEntity.xd == 0.0D && trackedEntity.yd == 0.0D && trackedEntity.zd == 0.0D) {
                     lastTrackedEntityMotionX = trackedEntity.xd;
                     lastTrackedEntityMotionY = trackedEntity.yd;
                     lastTrackedEntityMotionZ = trackedEntity.zd;
                     sendPacketToTrackedPlayers(new Packet28EntityVelocity(trackedEntity.id, lastTrackedEntityMotionX, lastTrackedEntityMotionY, lastTrackedEntityMotionZ));
                 }
             }
-            if(obj != null)
-            {
-                sendPacketToTrackedPlayers(((Packet) (obj)));
+            if(packet != null) {
+                sendPacketToTrackedPlayers(packet);
             }
-            SynchedEntityData datawatcher = trackedEntity.getEntityData();
-            if(datawatcher.isDirty())
-            {
-                sendPacketToTrackedPlayersAndTrackedEntity(new Packet40EntityMetadata(trackedEntity.id, datawatcher));
+            SynchedEntityData synchedEntityData = trackedEntity.getEntityData();
+            if(synchedEntityData.isDirty()) {
+                sendPacketToTrackedPlayersAndTrackedEntity(new Packet40EntityMetadata(trackedEntity.id, synchedEntityData));
             }
-            if(hasMoved)
-            {
+            if(hasMoved) {
                 encodedPosX = entityX;
                 encodedPosY = entityY;
                 encodedPosZ = entityZ;
             }
-            if(hasLooked)
-            {
+            if(hasLooked) {
                 encodedRotationYaw = entityYaw;
                 encodedRotationPitch = entityPitch;
             }
         }
-        if(trackedEntity.hurtMarked)
-        {
+        if(trackedEntity.hurtMarked) {
             sendPacketToTrackedPlayersAndTrackedEntity(new Packet28EntityVelocity(trackedEntity));
             trackedEntity.hurtMarked = false;
         }
-        if (trackedEntity.hadNicknameSet)
-        {
+        if (trackedEntity.hadNicknameSet) {
             sendPacketToTrackedPlayersAndTrackedEntity(new Packet35EntityNickname(trackedEntity.id, ((EntityLiving) trackedEntity).nickname, ((EntityLiving) trackedEntity).chatColor));
             trackedEntity.hadNicknameSet = false;
         }
     }
 
-    public void sendPacketToTrackedPlayers(Packet packet)
-    {
-        EntityPlayerMP entityplayermp;
-        for(Iterator iterator = trackedPlayers.iterator(); iterator.hasNext(); entityplayermp.playerNetServerHandler.sendPacket(packet))
-        {
-            entityplayermp = (EntityPlayerMP)iterator.next();
+    public void sendPacketToTrackedPlayers(Packet packet) {
+        for (EntityPlayerMP playerMP : trackedPlayers){
+            playerMP.playerNetServerHandler.sendPacket(packet);
         }
-
     }
 
-    public void sendPacketToTrackedPlayersAndTrackedEntity(Packet packet)
-    {
+    public void sendPacketToTrackedPlayersAndTrackedEntity(Packet packet) {
         sendPacketToTrackedPlayers(packet);
-        if(trackedEntity instanceof EntityPlayerMP)
-        {
+        if(trackedEntity instanceof EntityPlayerMP) {
             ((EntityPlayerMP)trackedEntity).playerNetServerHandler.sendPacket(packet);
         }
     }
 
-    public void sendDestroyEntityPacketToTrackedPlayers()
-    {
+    public void sendDestroyEntityPacketToTrackedPlayers() {
         sendPacketToTrackedPlayers(new Packet29DestroyEntity(trackedEntity.id));
     }
 
-    public void removeFromTrackedPlayers(EntityPlayerMP entityplayermp)
-    {
-        if(trackedPlayers.contains(entityplayermp))
-        {
-            trackedPlayers.remove(entityplayermp);
-        }
+    public void removeFromTrackedPlayers(EntityPlayerMP playerMP) {
+        trackedPlayers.remove(playerMP);
     }
 
-    public void updatePlayerEntity(EntityPlayerMP entityplayermp)
-    {
-
-        if(entityplayermp == trackedEntity)
-        {
+    public void updatePlayerEntity(EntityPlayerMP entityplayermp) {
+        if(entityplayermp == trackedEntity) {
             return;
         }
-        double d = entityplayermp.x - (double)(encodedPosX / 32);
-        double d1 = entityplayermp.z - (double)(encodedPosZ / 32);
-        if(d >= (double)(-trackingDistance) && d <= (double)trackingDistance && d1 >= (double)(-trackingDistance) && d1 <= (double)trackingDistance)
-        {
-            if(!trackedPlayers.contains(entityplayermp))
-            {
+        double dx = entityplayermp.x - (double)(encodedPosX / 32);
+        double dz = entityplayermp.z - (double)(encodedPosZ / 32);
+        if(dx >= (double)(-trackingDistance) && dx <= (double)trackingDistance && dz >= (double)(-trackingDistance) && dz <= (double)trackingDistance) {
+            if(!trackedPlayers.contains(entityplayermp)) {
                 trackedPlayers.add(entityplayermp);
-                entityplayermp.playerNetServerHandler.sendPacket(getSpawnPacket());
+                entityplayermp.playerNetServerHandler.sendPacket(NetEntityHandler.getSpawnPacket(this));
                 if (trackedEntity.sendAdditionalData) {
                     entityplayermp.playerNetServerHandler.sendPacket(new Packet42EntityTagData(trackedEntity));
                 }
-                if(shouldSendMotionUpdates)
-                {
+                if(shouldSendMotionUpdates) {
                     entityplayermp.playerNetServerHandler.sendPacket(new Packet28EntityVelocity(trackedEntity.id, trackedEntity.xd, trackedEntity.yd, trackedEntity.zd));
                 }
-                ItemStack aitemstack[] = trackedEntity.getInventory();
-                if(aitemstack != null)
-                {
-                    for(int i = 0; i < aitemstack.length; i++)
-                    {
+                ItemStack[] aitemstack = trackedEntity.getInventory();
+                if(aitemstack != null) {
+                    for(int i = 0; i < aitemstack.length; i++) {
                         entityplayermp.playerNetServerHandler.sendPacket(new Packet5PlayerInventory(trackedEntity.id, i, aitemstack[i]));
                     }
-
                 }
-                if(trackedEntity instanceof EntityPlayer)
-                {
+                if(trackedEntity instanceof EntityPlayer) {
                     EntityPlayer entityplayer = (EntityPlayer)trackedEntity;
                     if(entityplayer.isPlayerSleeping())
                     {
@@ -231,153 +202,21 @@ public class EntityTrackerEntry
                     }
                 }
             }
-        } else
-        if(trackedPlayers.contains(entityplayermp))
-        {
+        } else if(trackedPlayers.contains(entityplayermp)) {
             trackedPlayers.remove(entityplayermp);
             entityplayermp.playerNetServerHandler.sendPacket(new Packet29DestroyEntity(trackedEntity.id));
         }
     }
 
-    public void updatePlayerEntities(List list)
-    {
-        for(int i = 0; i < list.size(); i++)
-        {
-            updatePlayerEntity((EntityPlayerMP)list.get(i));
-        }
-
-    }
-
-    private Packet getSpawnPacket()
-    {
-        if(trackedEntity instanceof EntityItem)
-        {
-            EntityItem entityitem = (EntityItem)trackedEntity;
-            Packet21PickupSpawn packet21pickupspawn = new Packet21PickupSpawn(entityitem);
-            entityitem.x = (double)packet21pickupspawn.xPosition / 32D;
-            entityitem.y = (double)packet21pickupspawn.yPosition / 32D;
-            entityitem.z = (double)packet21pickupspawn.zPosition / 32D;
-            return packet21pickupspawn;
-        }
-        if(trackedEntity instanceof EntityPlayerMP)
-        {
-            return new Packet20NamedEntitySpawn((EntityPlayer)trackedEntity);
-        }
-        if(trackedEntity instanceof EntityMinecart)
-        {
-            EntityMinecart entityminecart = (EntityMinecart)trackedEntity;
-            if(entityminecart.minecartType == 0)
-            {
-                return new Packet23VehicleSpawn(trackedEntity, 10);
-            }
-            if(entityminecart.minecartType == 1)
-            {
-                return new Packet23VehicleSpawn(trackedEntity, 11);
-            }
-            if(entityminecart.minecartType == 2)
-            {
-                return new Packet23VehicleSpawn(trackedEntity, 12);
-            }
-        }
-        if(trackedEntity instanceof EntityBoat)
-        {
-            return new Packet23VehicleSpawn(trackedEntity, 1);
-        }
-        if(trackedEntity instanceof IAnimal)
-        {
-            return new Packet24MobSpawn((EntityLiving)trackedEntity);
-        }
-        if(trackedEntity instanceof EntityBobber)
-        {
-            return new Packet23VehicleSpawn(trackedEntity, 90);
-        }
-        if(trackedEntity instanceof EntityArrow)
-        {
-            EntityLiving entityliving = ((EntityArrow)trackedEntity).owner;
-            return new Packet23VehicleSpawn(trackedEntity, 60, entityliving == null ? trackedEntity.id : entityliving.id);
-        }
-        if(trackedEntity instanceof EntityCannonball)
-        {
-            EntityLiving entityliving = ((EntityCannonball)trackedEntity).owner;
-            return new Packet23VehicleSpawn(trackedEntity, 72, entityliving == null ? trackedEntity.id : entityliving.id);
-        }
-        if(trackedEntity instanceof EntitySnowball)
-        {
-            return new Packet23VehicleSpawn(trackedEntity, 61);
-        }
-        if(trackedEntity instanceof EntityFireball)
-        {
-            EntityFireball entityfireball = (EntityFireball)trackedEntity;
-            Packet23VehicleSpawn packet23vehiclespawn = new Packet23VehicleSpawn(trackedEntity, 63, 1);
-            packet23vehiclespawn.xVelocity = (int)(entityfireball.accelX * 8000D);
-            packet23vehiclespawn.yVelocity = (int)(entityfireball.accelY * 8000D);
-            packet23vehiclespawn.zVelocity = (int)(entityfireball.accelZ * 8000D);
-            return packet23vehiclespawn;
-        }
-        if(trackedEntity instanceof EntityEgg)
-        {
-            return new Packet23VehicleSpawn(trackedEntity, 62);
-        }
-        if(trackedEntity instanceof EntityPebble)
-        {
-            return new Packet23VehicleSpawn(trackedEntity, 64);
-        }
-        if(trackedEntity instanceof EntityTNT)
-        {
-            return new Packet23VehicleSpawn(trackedEntity, 50);
-        }
-        if(trackedEntity instanceof EntityFallingSand)
-        {
-            EntityFallingSand entityfallingsand = (EntityFallingSand)trackedEntity;
-            if(entityfallingsand.blockID == Block.sand.id)
-            {
-                return new Packet23VehicleSpawn(trackedEntity, 70);
-            }
-            if(entityfallingsand.blockID == Block.gravel.id)
-            {
-                return new Packet23VehicleSpawn(trackedEntity, 71);
-            }
-            if(entityfallingsand.blockID == Block.mud.id)
-            {
-                return new Packet23VehicleSpawn(trackedEntity, 73);
-            }
-        }
-        if(trackedEntity instanceof EntityPainting)
-        {
-            return new Packet25EntityPainting((EntityPainting)trackedEntity);
-        } else
-        {
-            throw new IllegalArgumentException((new StringBuilder()).append("Don't know how to add ").append(trackedEntity.getClass()).append("!").toString());
+    public void updatePlayerEntities(List<EntityPlayer> list) {
+        for (EntityPlayer player : list) {
+            updatePlayerEntity((EntityPlayerMP) player);
         }
     }
-
-    public void removeTrackedPlayerSymmetric(EntityPlayerMP entityplayermp)
-    {
-        if(trackedPlayers.contains(entityplayermp))
-        {
-            trackedPlayers.remove(entityplayermp);
-            entityplayermp.playerNetServerHandler.sendPacket(new Packet29DestroyEntity(trackedEntity.id));
+    public void removeTrackedPlayerSymmetric(EntityPlayerMP playerMP) {
+        if(trackedPlayers.contains(playerMP)) {
+            trackedPlayers.remove(playerMP);
+            playerMP.playerNetServerHandler.sendPacket(new Packet29DestroyEntity(trackedEntity.id));
         }
     }
-
-    public Entity trackedEntity;
-    public int trackingDistance;
-    public int packetDelay;
-    public int encodedPosX;
-    public int encodedPosY;
-    public int encodedPosZ;
-    public int encodedRotationYaw;
-    public int encodedRotationPitch;
-    public double lastTrackedEntityMotionX;
-    public double lastTrackedEntityMotionY;
-    public double lastTrackedEntityMotionZ;
-    public int updateCounter;
-    private double lastTrackedEntityPosX;
-    private double lastTrackedEntityPosY;
-    private double lastTrackedEntityPosZ;
-    private boolean firstUpdateDone;
-    private boolean shouldSendMotionUpdates;
-    private int field_28165_t;
-    public boolean playerEntitiesUpdated;
-    public Set trackedPlayers;
 }
diff --git a/src/main/java/net/minecraft/server/entity/player/EntityPlayerMP.java b/src/main/java/net/minecraft/server/entity/player/EntityPlayerMP.java
index 5ffdfc737..a879c59f6 100644
--- a/src/main/java/net/minecraft/server/entity/player/EntityPlayerMP.java
+++ b/src/main/java/net/minecraft/server/entity/player/EntityPlayerMP.java
@@ -4,17 +4,10 @@ import net.minecraft.core.achievement.stat.Stat;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.BlockPortal;
 import net.minecraft.core.block.entity.*;
-import net.minecraft.core.block.material.Material;
 import net.minecraft.core.crafting.ICrafting;
 import net.minecraft.core.entity.*;
-import net.minecraft.core.entity.animal.EntityPig;
-import net.minecraft.core.entity.animal.EntityWolf;
-import net.minecraft.core.entity.monster.*;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.entity.projectile.EntityArrow;
-import net.minecraft.core.entity.projectile.EntityArrowGolden;
-import net.minecraft.core.entity.projectile.EntityCannonball;
-import net.minecraft.core.entity.projectile.EntityFireball;
 import net.minecraft.core.enums.EnumSleepStatus;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemComplex;
@@ -35,13 +28,13 @@ import net.minecraft.core.player.inventory.*;
 import net.minecraft.core.player.inventory.slot.SlotCrafting;
 import net.minecraft.core.util.helper.AES;
 import net.minecraft.core.util.helper.DamageType;
-import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.server.world.WorldServer;
 import net.minecraft.core.world.chunk.ChunkCoordinate;
 import net.minecraft.core.world.chunk.ChunkCoordinates;
 import net.minecraft.server.MinecraftServer;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -188,7 +181,7 @@ public class EntityPlayerMP extends EntityPlayer implements ICrafting {
     }
 
     @Override
-	public ItemStack[] getInventory()
+	public @Nullable ItemStack @Nullable [] getInventory()
     {
         return playerInventory;
     }
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 82434c3b3..2f341f0d7 100644
--- a/src/main/java/net/minecraft/server/net/handler/NetServerHandler.java
+++ b/src/main/java/net/minecraft/server/net/handler/NetServerHandler.java
@@ -399,7 +399,7 @@ public class NetServerHandler extends NetHandler
             playerEntity.playerController.startMining(x, y, z, packet.side);
         } else if(packet.status == 1) {
             // Hit Block
-            playerEntity.playerController.hitBlock(x, y, z, packet.side);
+            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)) {
diff --git a/src/main/java/net/minecraft/server/world/ServerPlayerController.java b/src/main/java/net/minecraft/server/world/ServerPlayerController.java
index 669d3bda7..c15cdb159 100644
--- a/src/main/java/net/minecraft/server/world/ServerPlayerController.java
+++ b/src/main/java/net/minecraft/server/world/ServerPlayerController.java
@@ -64,11 +64,11 @@ public class ServerPlayerController
 		}
 	}
     
-	public void hitBlock(int x, int y, int z, Side side) {
+	public void hitBlock(int x, int y, int z, Side side, double xHit, double yHit) {
 		thisWorld.onBlockHit(player, x, y, z, side);
 		Block block = thisWorld.getBlock(x, y, z);
 		if(block != null) {
-			block.onBlockClicked(thisWorld, x, y, z, player);
+			block.onBlockLeftClicked(thisWorld, x, y, z, player, side, xHit, yHit);
 		}
 	}
 
@@ -169,7 +169,7 @@ public class ServerPlayerController
         int i1 = world.getBlockId(i, j, k);
         if ((entityplayer.isSneaking() && entityplayer.getCurrentEquippedItem() == null) || (!entityplayer.isSneaking()))
         {
-            if (i1 > 0 && Block.blocksList[i1].blockActivated(world, i, j, k, entityplayer))
+            if (i1 > 0 && Block.blocksList[i1].onBlockRightClicked(world, i, j, k, entityplayer, side, xPlaced, yPlaced))
             {
                 return true;
             }
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_white_bottom.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_white_bottom.png
index 2d419ee78..b031e5397 100644
Binary files a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_white_bottom.png and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_white_bottom.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_white_top.png b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_white_top.png
index 6338fe24c..c4a810d05 100644
Binary files a/src/main/resources/assets/minecraft/textures/block/door_planks_oak_white_top.png and b/src/main/resources/assets/minecraft/textures/block/door_planks_oak_white_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/planks_oak_painted_white.png b/src/main/resources/assets/minecraft/textures/block/planks_oak_painted_white.png
index 06ecbcd73..59949cfde 100644
Binary files a/src/main/resources/assets/minecraft/textures/block/planks_oak_painted_white.png and b/src/main/resources/assets/minecraft/textures/block/planks_oak_painted_white.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_white_side.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_white_side.png
index 8c78938be..9db25bb59 100644
Binary files a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_white_side.png and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_white_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_white_top.png b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_white_top.png
index 0d115b72e..19f344088 100644
Binary files a/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_white_top.png and b/src/main/resources/assets/minecraft/textures/block/trapdoor_planks_oak_white_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/gui.png b/src/main/resources/assets/minecraft/textures/gui/gui.png
index a54c4b1aa..ce1567d86 100644
Binary files a/src/main/resources/assets/minecraft/textures/gui/gui.png and b/src/main/resources/assets/minecraft/textures/gui/gui.png differ
