diff --git a/game/client/src/main/java/net/minecraft/client/Minecraft.java b/game/client/src/main/java/net/minecraft/client/Minecraft.java
index 8c0e20f37..3b5c24ef7 100644
--- a/game/client/src/main/java/net/minecraft/client/Minecraft.java
+++ b/game/client/src/main/java/net/minecraft/client/Minecraft.java
@@ -42,6 +42,7 @@ import net.minecraft.client.render.font.FontRendererDefault;
 import net.minecraft.client.render.terrain.TerrainRendererMultiDraw;
 import net.minecraft.client.util.helper.UrlHelper;
 import net.minecraft.client.world.WorldClient;
+import net.minecraft.client.world.WorldClientMP;
 import net.minecraft.client.world.chunk.provider.ChunkProviderStatic;
 import net.minecraft.core.achievement.Achievements;
 import net.minecraft.core.block.BlockLogicLeavesBase;
@@ -1039,6 +1040,13 @@ public class Minecraft
                     
                     Debug.pop();			// 2
                 	Debug.change("tick");	// 1
+                    if (currentWorld instanceof WorldClientMP) {
+                        ((WorldClientMP) currentWorld).processPackets();
+                    }
+
+                    if (this.currentScreen instanceof ScreenSelectServer) {
+                        this.currentScreen.tick();
+                    }
                 	
                     for(int tick = 0; tick < timer.frames; tick++)
                     {
@@ -1143,7 +1151,18 @@ public class Minecraft
 						// Limit FPS in menu
 						long sleepTime = (1000 / 60 - (now - tickStartTime)) - 1;
 						if(sleepTime > 0) {
-							Thread.sleep(sleepTime);
+                            long currentSleep = 0;
+                            while (currentSleep < sleepTime - 1) {
+                                Thread.sleep(1L);
+                                currentSleep += 1L;
+                                if (currentWorld instanceof WorldClientMP) {
+                                    ((WorldClientMP) currentWorld).processPackets();
+                                }
+
+                                if (this.currentScreen instanceof ScreenSelectServer) {
+                                    this.currentScreen.tick();
+                                }
+                            }
 						}
 					}
 					
@@ -1349,12 +1368,12 @@ public class Minecraft
                     double xPlaced = 0.5d;
                     ItemStack stack = this.thePlayer.inventory.getCurrentItem();
                     int numItemsInStack = stack == null ? 0 : stack.stackSize;
-                    if (this.playerController.useItemOn(thePlayer, currentWorld, stack, blockX, blockY, blockZ, side, xPlaced, yPlaced)) {
-                        this.playerController.swingItem(true);
-                    }
                     if (stack == null) {
                         break bridge;
                     }
+                    if (this.playerController.onlyUseItemStackOn(thePlayer, currentWorld, stack, blockX, blockY, blockZ, side, xPlaced, yPlaced)) {
+                        this.playerController.swingItem(true);
+                    }
                     if (stack.stackSize <= 0) {
                         this.thePlayer.inventory.mainInventory[this.thePlayer.inventory.getCurrentItemIndex()] = null;
                     } else if (stack.stackSize != numItemsInStack) {
diff --git a/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java b/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java
index 2e78e6357..6fe80bb49 100644
--- a/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java
+++ b/game/client/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java
@@ -154,7 +154,7 @@ public class PlayerLocal extends Player
         }
 
         prevTimeInPortal = timeInPortal;
-        if(inPortal)
+        if(inPortal && !noPhysics)
         {
             if(!world.isClientSide && vehicle != null)
             {
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenAddServer.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenAddServer.java
index acb97bfb7..c69c474ec 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenAddServer.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenAddServer.java
@@ -103,7 +103,7 @@ public class ScreenAddServer extends Screen
             }
             return;
         }
-        if (eventKey == Keyboard.KEY_RETURN)
+        if (eventKey == Keyboard.KEY_RETURN || eventKey == Keyboard.KEY_NUMPADENTER)
         {
             if (buttonSave.enabled)
             {
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenLabelEditor.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenLabelEditor.java
index bb3b458bb..2a4d2613e 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenLabelEditor.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenLabelEditor.java
@@ -112,7 +112,7 @@ public class ScreenLabelEditor extends Screen implements ITextField
     @Override
 	public void keyPressed(final char eventCharacter, final int eventKey, int mx, int my)
     {
-        if (eventKey == Keyboard.KEY_RETURN || eventKey == Keyboard.KEY_ESCAPE)
+        if (eventKey == Keyboard.KEY_RETURN || eventKey == Keyboard.KEY_NUMPADENTER || eventKey == Keyboard.KEY_ESCAPE)
         {
             buttonClicked(buttons.get(0));
             return;
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScrolledSelectionList.java b/game/client/src/main/java/net/minecraft/client/gui/ScrolledSelectionList.java
index 46e4c9b7f..0838f89de 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScrolledSelectionList.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScrolledSelectionList.java
@@ -125,7 +125,7 @@ public abstract class ScrolledSelectionList {
                         clickedHeader(x - left, ((y - y0) + (int) amountScrolled) - 4);
                         flag = false;
                     }
-                    if (x >= scrollbarLeft && x <= scrollbarRight) {
+                    if (x >= scrollbarLeft && x <= scrollbarRight && getMaxPosition() != 0) {
                         scrollMultiplier = -1F;
                         int i3 = getMaxPosition() - (y1 - y0 - 4);
                         if (i3 < 1) {
@@ -230,7 +230,7 @@ public abstract class ScrolledSelectionList {
         tessellator.addVertexWithUV(x0, y1 - byte0, 0.0D, 0.0D, 0.0D);
         tessellator.draw();
         int k3 = getMaxPosition() - (y1 - y0 - 4);
-        if (k3 > 0) {
+        if (k3 > 0 && getMaxPosition() != 0) {
             int j4 = ((y1 - y0) * (y1 - y0)) / getMaxPosition();
             if (j4 < 32) {
                 j4 = 32;
diff --git a/game/client/src/main/java/net/minecraft/client/gui/chat/ScreenChat.java b/game/client/src/main/java/net/minecraft/client/gui/chat/ScreenChat.java
index c191842cd..2b4783051 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/chat/ScreenChat.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/chat/ScreenChat.java
@@ -172,7 +172,7 @@ public class ScreenChat extends Screen implements ITextField {
 				mc.displayScreen(null);
 				handled = true;
 			}
-			if (eventKey == Keyboard.KEY_RETURN) {
+			if (eventKey == Keyboard.KEY_RETURN || eventKey == Keyboard.KEY_NUMPADENTER) {
 				String s = message.trim();
 				if (s.length() > 0) {
 					String s1 = message.trim();
diff --git a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenContainerAbstract.java b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenContainerAbstract.java
index 12ac320ad..b0cd70b6c 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenContainerAbstract.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenContainerAbstract.java
@@ -36,8 +36,8 @@ public abstract class ScreenContainerAbstract extends Screen
 	public int xSize;
 	public int ySize;
 	public MenuAbstract inventorySlots;
-	TooltipElement tooltipElement;
-	ItemElement itemElement;
+	public TooltipElement tooltipElement;
+	public ItemElement itemElement;
 	public ItemDragHandler itemDragHandler;
 
 	public ScreenContainerAbstract(final MenuAbstract container)
diff --git a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenFlagEditor.java b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenFlagEditor.java
index b14381f9c..910e3dd0b 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenFlagEditor.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenFlagEditor.java
@@ -216,7 +216,7 @@ public class ScreenFlagEditor
     @Override
     public void removed() {
         super.removed();
-        if(mc.currentWorld.isClientSide) {
+        if(this.mc.currentWorld != null && mc.currentWorld.isClientSide) {
             sendUpdatePacket();
         }
     }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/popup/PopupScreen.java b/game/client/src/main/java/net/minecraft/client/gui/popup/PopupScreen.java
index 29744e003..37d3a95a2 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/popup/PopupScreen.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/popup/PopupScreen.java
@@ -117,7 +117,7 @@ public final class PopupScreen
         {
             close(statusCodeOnEsc);
         }
-        if (eventKey == Keyboard.KEY_RETURN && statusCodeOnEnter != null)
+        if ((eventKey == Keyboard.KEY_RETURN || eventKey == Keyboard.KEY_NUMPADENTER) && statusCodeOnEnter != null)
         {
             close(statusCodeOnEnter);
         }
diff --git a/game/client/src/main/java/net/minecraft/client/net/handler/PacketHandlerClient.java b/game/client/src/main/java/net/minecraft/client/net/handler/PacketHandlerClient.java
index 83ac19875..e2ab34b49 100644
--- a/game/client/src/main/java/net/minecraft/client/net/handler/PacketHandlerClient.java
+++ b/game/client/src/main/java/net/minecraft/client/net/handler/PacketHandlerClient.java
@@ -107,7 +107,7 @@ public class PacketHandlerClient extends PacketHandler
         rand = new Random();
         mc = minecraft;
         Socket socket = new Socket(InetAddress.getByName(host), port);
-        netManager = new NetworkManager(socket, "Client", this);
+        netManager = new NetworkManager(socket, "Client", this, -1);
         players = new ArrayList<>();
     }
 
diff --git a/game/client/src/main/java/net/minecraft/client/net/handler/PingPacketHandler.java b/game/client/src/main/java/net/minecraft/client/net/handler/PingPacketHandler.java
index 03db008f3..118b357b6 100644
--- a/game/client/src/main/java/net/minecraft/client/net/handler/PingPacketHandler.java
+++ b/game/client/src/main/java/net/minecraft/client/net/handler/PingPacketHandler.java
@@ -27,7 +27,7 @@ public class PingPacketHandler
         this.server = server;
         ServerAddress address = server.getServerAddress();
         Socket socket = new Socket(InetAddress.getByName(address.getIP()), address.getPort());
-        netManager = new NetworkManager(socket, "Ping", this, true);
+        netManager = new NetworkManager(socket, "Ping", this, 100, true);
     }
 
     public void processReadPackets()
diff --git a/game/client/src/main/java/net/minecraft/client/player/controller/PlayerController.java b/game/client/src/main/java/net/minecraft/client/player/controller/PlayerController.java
index b18bf9878..7d3ad0cc0 100644
--- a/game/client/src/main/java/net/minecraft/client/player/controller/PlayerController.java
+++ b/game/client/src/main/java/net/minecraft/client/player/controller/PlayerController.java
@@ -16,6 +16,8 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.tag.ItemTags;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import static net.minecraft.core.world.LevelListener.EVENT_BLOCK_BREAK;
 
@@ -259,7 +261,7 @@ public abstract class PlayerController {
 	public void adjustPlayer(Player player) {
 	}
 
-	public boolean useItemOn(Player player, World world, ItemStack itemstack, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+	public boolean useItemOn(@NotNull Player player, @NotNull World world, @Nullable ItemStack itemstack, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
 	{
 		if (!player.getGamemode().canInteract()) return false;
 		int blockId = world.getBlockId(blockX, blockY, blockZ);
@@ -276,7 +278,7 @@ public abstract class PlayerController {
 					return true;
 				}
 			}
-			if (itemstack == null) { // No stack do nothing
+			if (itemstack == null) { // No stack then do nothing
 				return false;
 			} else { // Use itemstack
 				return itemstack.useItem(player, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
@@ -293,7 +295,18 @@ public abstract class PlayerController {
 			}
 			return didPlace;
 		}
+	}
 
+	public boolean onlyUseItemStackOn(@NotNull Player player, @NotNull World world, @Nullable ItemStack itemstack, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+		if (!player.getGamemode().canInteract()) return false;
+		if (player.getHeldObject() == null) {
+			if (itemstack == null) { // No stack then do nothing
+				return false;
+			} else { // Use itemstack
+				return itemstack.useItem(player, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
+			}
+		}
+		return false;
 	}
 
 	public Player createPlayer(World world) {
diff --git a/game/client/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java b/game/client/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java
index 21bb62d48..b33ccd74b 100644
--- a/game/client/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java
+++ b/game/client/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java
@@ -66,15 +66,21 @@ public class PlayerControllerMP extends PlayerController {
 	@Override
 	public boolean useItemOn(Player entityplayer, World world, ItemStack itemstack, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
 		syncCurrentPlayItem();
-		netHandler.addToSendQueue(new PacketUseItem(blockX, blockY, blockZ, side.getDirection(), entityplayer.inventory.getCurrentItem(), xPlaced, yPlaced));
-		boolean flag = super.useItemOn(entityplayer, world, itemstack, blockX, blockY, blockZ, side, xPlaced, yPlaced);
-		return flag;
+		netHandler.addToSendQueue(new PacketUseItem(blockX, blockY, blockZ, side.getDirection(), entityplayer.inventory.getCurrentItem(), xPlaced, yPlaced, PacketUseItem.TYPE_USE_ITEM_ON));
+		return super.useItemOn(entityplayer, world, itemstack, blockX, blockY, blockZ, side, xPlaced, yPlaced);
+	}
+
+	@Override
+	public boolean onlyUseItemStackOn(Player entityplayer, World world, ItemStack itemstack, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+		syncCurrentPlayItem();
+		netHandler.addToSendQueue(new PacketUseItem(blockX, blockY, blockZ, side.getDirection(), entityplayer.inventory.getCurrentItem(), xPlaced, yPlaced, PacketUseItem.TYPE_USE_STACK_ON));
+		return super.onlyUseItemStackOn(entityplayer, world, itemstack, blockX, blockY, blockZ, side, xPlaced, yPlaced);
 	}
 
 	@Override
 	public boolean useItem(Player entityplayer, World world, ItemStack itemstack) {
 		syncCurrentPlayItem();
-		netHandler.addToSendQueue(new PacketUseItem(-1, -1, -1, Direction.NONE, entityplayer.inventory.getCurrentItem(), 0, 0));
+		netHandler.addToSendQueue(new PacketUseItem(-1, -1, -1, Direction.NONE, entityplayer.inventory.getCurrentItem(), 0, 0, PacketUseItem.TYPE_USE_ITEM));
 		boolean flag = super.useItem(entityplayer, world, itemstack);
 		return flag;
 	}
diff --git a/game/client/src/main/java/net/minecraft/client/render/texture/stitcher/AtlasStitcher.java b/game/client/src/main/java/net/minecraft/client/render/texture/stitcher/AtlasStitcher.java
index de7977032..7da1510e9 100644
--- a/game/client/src/main/java/net/minecraft/client/render/texture/stitcher/AtlasStitcher.java
+++ b/game/client/src/main/java/net/minecraft/client/render/texture/stitcher/AtlasStitcher.java
@@ -48,8 +48,10 @@ public class AtlasStitcher extends Texture {
         this.mipmap = mipmap;
         this.defaultTexture = defaultTexture;
     }
-    protected IconCoordinate getTexture(@NotNull NamespaceID sourceId, @NotNull NamespaceID id){
-        if (textureMap.containsKey(id)) return textureMap.get(id);
+
+    protected @NotNull IconCoordinate getTexture(@NotNull NamespaceID sourceId, @NotNull NamespaceID id){
+        IconCoordinate cached = textureMap.get(id); // Changed to read cached value this way as somehow this method previously managed to return null https://bugs.betterthanadventure.net/scp/tickets.php?id=246
+        if (cached != null) return cached;
 
         id.makePermanent();
         IconCoordinate iconCoordinate = new IconCoordinate(this, sourceId.makePermanent(), id, getSourceImagePath(id));
diff --git a/game/client/src/main/resources/credits.txt b/game/client/src/main/resources/credits.txt
index 41fede447..846d31485 100644
--- a/game/client/src/main/resources/credits.txt
+++ b/game/client/src/main/resources/credits.txt
@@ -31,6 +31,7 @@ Cruxy
 AndroidDr (@Pedro270707)
 DirtPiper
 Doop (@brokendoop)
+Gungun974
 H2_AIL
 LukeisStuff
 mzov4j
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicBed.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicBed.java
index d857d93e2..e17a9fe17 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicBed.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicBed.java
@@ -47,7 +47,7 @@ public class BlockLogicBed extends BlockLogic {
 				world.setBlockWithNotify(x, y, z, 0);
             }
 			player.addStat(Achievements.SLEEP_NETHER, 1);
-			world.newExplosion(null, (float) x + 0.5F, (float) y + 0.5F, (float) z + 0.5F, 5F, true, false);
+			world.createExplosion(null, (float) x + 0.5F, (float) y + 0.5F, (float) z + 0.5F, 5F, true, false);
 			return true;
 		}
 		
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicFence.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicFence.java
index b7423fbfc..ecf05a173 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicFence.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicFence.java
@@ -7,6 +7,8 @@ import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 
+import java.util.ArrayList;
+
 public class BlockLogicFence extends BlockLogic implements IPaintable
 {
 //    private static final List<BoundingVolume> selectionVolumes = new ArrayList<>();
@@ -70,7 +72,28 @@ public class BlockLogicFence extends BlockLogic implements IPaintable
     	return super.getCollisionBoundingBoxFromPool(world, x, y, z).expand(0, 0.5, 0);
     }
 
-//    @Override
+    @Override
+    public void getCollidingBoundingBoxes(World world, int x, int y, int z, AABB aabb, ArrayList<AABB> aabbList) {
+        boolean connectXPos = canConnectTo(world, x + 1, y, z);
+        boolean connectXNeg = canConnectTo(world, x - 1, y, z);
+        boolean connectZPos = canConnectTo(world, x, y, z + 1);
+        boolean connectZNeg = canConnectTo(world, x, y, z - 1);
+        final double thickness = 0.5 - 0.375;
+        if (connectXPos) {
+            addIntersectingBoundingBox(aabb, AABB.getTemporaryBB(0.5 - thickness, 0, 0.5 - thickness, 1, 1.5, 0.5 + thickness).move(x, y, z), aabbList);
+        }
+        if (connectXNeg) {
+            addIntersectingBoundingBox(aabb, AABB.getTemporaryBB(0, 0, 0.5 - thickness, 0.5 + thickness, 1.5, 0.5 + thickness).move(x, y, z), aabbList);
+        }
+        if (connectZPos) {
+            addIntersectingBoundingBox(aabb, AABB.getTemporaryBB(0.5 - thickness, 0, 0.5 - thickness, 0.5 + thickness, 1.5, 1).move(x, y, z), aabbList);
+        }
+        if (connectZNeg) {
+            addIntersectingBoundingBox(aabb, AABB.getTemporaryBB(0.5 - thickness, 0, 0, 0.5 + thickness, 1.5, 0.5 + thickness).move(x, y, z), aabbList);
+        }
+    }
+
+    //    @Override
 //    public BoundingVolume getBoundingVolume(World world, int x, int y, int z)
 //    {
 //        boolean connectXPos = canConnectTo(world, x + 1, y, z);
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicLamp.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicLamp.java
index b91269fb9..fcca9f47c 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicLamp.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicLamp.java
@@ -79,25 +79,19 @@ public class BlockLogicLamp extends BlockLogic implements IPainted {
 
     @Override
     public boolean onBlockRightClicked(final World world, final int x, final int y, final int z, final Player player, final Side side, final double xHit, final double yHit) {
-        if (this.isInverted) {
-            if (this.isActive) {
-                world.setBlockAndMetadataWithNotify(x, y, z, Blocks.LAMP_IDLE.id(), world.getBlockMetadata(x, y, z));
-            } else {
-                world.setBlockAndMetadataWithNotify(x, y, z, Blocks.LAMP_ACTIVE.id(), world.getBlockMetadata(x, y, z));
-            }
-        } else {
-            if (this.isActive) {
-                world.setBlockAndMetadataWithNotify(x, y, z, Blocks.LAMP_INVERTED_IDLE.id(), world.getBlockMetadata(x, y, z));
-            } else {
-                world.setBlockAndMetadataWithNotify(x, y, z, Blocks.LAMP_INVERTED_ACTIVE.id(), world.getBlockMetadata(x, y, z));
-            }
+        if (player.getHeldItem() == null) {
+            invertLamp(world, x, y, z);
+            return true;
         }
-
-        return true;
+        return false;
     }
 
     @Override
     public void onActivatorInteract(final World world, final int x, final int y, final int z, final TileEntityActivator activator, final Direction direction) {
+        invertLamp(world, x, y, z);
+    }
+
+    public void invertLamp(final @NotNull World world, final int x, final int y, final int z) {
         if (this.isInverted) {
             if (this.isActive) {
                 world.setBlockAndMetadataWithNotify(x, y, z, Blocks.LAMP_IDLE.id(), world.getBlockMetadata(x, y, z));
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicPressurePlate.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicPressurePlate.java
index 2edc7d431..73f02c2f2 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicPressurePlate.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicPressurePlate.java
@@ -117,9 +117,14 @@ public class BlockLogicPressurePlate<T extends Entity> extends BlockLogic implem
             default: list = world.getEntitiesWithinAABB(triggerMobClass, AABB.getTemporaryBB(1 - (isPressed ? pixel/2f : pixel), pixel, pixel, 1, 1 - pixel, 1 - pixel).move(x, y, z)); break;
         }
 
-        if(list != null && !list.isEmpty())
+        if(list != null)
         {
-            isSteppedOn = true;
+            for (int i = 0; i < list.size(); i++) {
+                if (list.get(i).canInteract()) {
+                    isSteppedOn = true;
+                    break;
+                }
+            }
         }
         if(isSteppedOn && !isPressed)
         {
diff --git a/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityBasket.java b/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityBasket.java
index 207f7e274..f8c5c3073 100644
--- a/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityBasket.java
+++ b/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityBasket.java
@@ -37,8 +37,9 @@ public class TileEntityBasket extends TileEntity
             final int unitsPerItem = getItemSizeUnits(be.getItem());
             this.numUnitsInside += (unitsPerItem * numItems);
         }
-        if (prevNum != this.numUnitsInside && this.worldObj != null){
-            this.worldObj.notifyBlockChange(this.x, this.y, this.z, this.worldObj.getBlockId(this.x, this.y, this.z));
+        if (prevNum != numUnitsInside && worldObj != null){
+            worldObj.notifyBlockChange(x, y, z, worldObj.getBlockId(x, y, z));
+            setChanged();
         }
     }
 
@@ -205,7 +206,11 @@ public class TileEntityBasket extends TileEntity
 
     @Override
     public Packet getDescriptionPacket() {
-        return new PacketTileEntityData(this);
+        if (numUnitsInside > 0) {
+            return new PacketTileEntityData(this);
+        } else {
+            return null;
+        }
     }
 
     @Override
diff --git a/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityFurnace.java b/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityFurnace.java
index 1313923c2..4ae4bb905 100644
--- a/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityFurnace.java
+++ b/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityFurnace.java
@@ -371,7 +371,10 @@ public class TileEntityFurnace extends TileEntity
 
     @Override
     public Packet getDescriptionPacket() {
-        return new PacketTileEntityData(this);
+        if (furnaceItemStacks[2] != null) {
+            return new PacketTileEntityData(this);
+        }
+        return null;
     }
 
     @Override
diff --git a/game/core/src/main/java/net/minecraft/core/block/entity/TileEntitySensor.java b/game/core/src/main/java/net/minecraft/core/block/entity/TileEntitySensor.java
index 5b07d71ad..a3baf4a3d 100644
--- a/game/core/src/main/java/net/minecraft/core/block/entity/TileEntitySensor.java
+++ b/game/core/src/main/java/net/minecraft/core/block/entity/TileEntitySensor.java
@@ -79,11 +79,13 @@ public class TileEntitySensor extends TileEntity {
 			List<Entity> list = worldObj.getEntitiesWithinAABBExcludingEntity(null, detectionBox);
 			for(int i=0; i < list.size(); i++) {
 				Entity entity = list.get(i);
-				if(entity instanceof Player) {
-					Player player = (Player) entity;
-					player.triggerAchievement(Achievements.GET_SENSED);
+				if (entity.canInteract()) {
+					if(entity instanceof Player) {
+						Player player = (Player) entity;
+						player.triggerAchievement(Achievements.GET_SENSED);
+					}
+					shouldBeActive = true;
 				}
-				shouldBeActive = true;
 			}
 		}
 		
diff --git a/game/core/src/main/java/net/minecraft/core/entity/EntityDispatcher.java b/game/core/src/main/java/net/minecraft/core/entity/EntityDispatcher.java
index 48c24361f..714838cdc 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/EntityDispatcher.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/EntityDispatcher.java
@@ -196,6 +196,7 @@ public final class EntityDispatcher
 
         // Projectiles
         addMapping(ProjectilePebble.class, NamespaceID.getPermanent("minecraft", "pebble"));
+        addMapping(ProjectileEgg.class, NamespaceID.getPermanent("minecraft", "egg"));
         addMapping(ProjectileArrow.class, NamespaceID.getPermanent("minecraft", "arrow"));
         addMapping(ProjectileArrowGolden.class, NamespaceID.getPermanent("minecraft", "arrow_golden"));
         addMapping(ProjectileArrowPurple.class, NamespaceID.getPermanent("minecraft", "arrow_purple"));
diff --git a/game/core/src/main/java/net/minecraft/core/entity/EntityPrimedTNT.java b/game/core/src/main/java/net/minecraft/core/entity/EntityPrimedTNT.java
index e0c1386ca..b4e4f925e 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/EntityPrimedTNT.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/EntityPrimedTNT.java
@@ -77,7 +77,7 @@ public class EntityPrimedTNT extends Entity
             if(!world.isClientSide)
             {
                 remove();
-                world.createExplosion(null, x, y, z, 4);
+                world.createExplosion(null, x, y + 0.5, z, 4);
             } else
             {
                 remove();
diff --git a/game/core/src/main/java/net/minecraft/core/entity/monster/MobCreeper.java b/game/core/src/main/java/net/minecraft/core/entity/monster/MobCreeper.java
index ed9e69a23..39558e6ca 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/monster/MobCreeper.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/monster/MobCreeper.java
@@ -135,10 +135,10 @@ public class MobCreeper extends MobMonster
             {
                 if(getPowered())
                 {
-                    world.createExplosion(this, x, y, z, 6F);
+                    world.createExplosion(this, x, y + bbHeight/2, z, 6F);
                 } else
                 {
-                    world.createExplosion(this, x, y, z, 3F);
+                    world.createExplosion(this, x, y + bbHeight/2, z, 3F);
                 }
                 remove();
             }
diff --git a/game/core/src/main/java/net/minecraft/core/entity/player/Player.java b/game/core/src/main/java/net/minecraft/core/entity/player/Player.java
index 5640934cb..57a47f75f 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/player/Player.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/player/Player.java
@@ -71,12 +71,14 @@ public abstract class Player
     extends Mob
     implements IArmorWearing<HumanArmorShape>, IItemHolding
 {
-
-    public static final @NotNull UUID UUID_MELON = UUID.fromString("9af822f9-ed7c-4afc-be28-2bd5b8c40b50");
-    public static final @NotNull UUID UUID_WATERMELON = UUID.fromString("f9b18145-2be6-4817-8afb-a36e91369d2a");
-
     public static final int MOTION_STATE_DEFAULT = 0;
     public static final int MOTION_STATE_CROUCHED = 1;
+    
+    public static final @NotNull UUID UUID_MAK = UUID.fromString("2c045432-9b19-46cc-b7f5-3c90a458b604");
+    public static final @NotNull UUID UUID_JONK = UUID.fromString("73eaf85f-863e-47e4-9ae4-e4dd40dbc58a");
+    public static final @NotNull UUID UUID_SHIGN = UUID.fromString("49f6ea39-30b2-4441-b07c-7bfe0beeb61e");
+    public static final @NotNull UUID UUID_MELON = UUID.fromString("9af822f9-ed7c-4afc-be28-2bd5b8c40b50");
+    public static final @NotNull UUID UUID_WATERMELON = UUID.fromString("f9b18145-2be6-4817-8afb-a36e91369d2a");
 
     public static final int DATA_UNKNOWN = 16; // I have no idea wtf this id is for
     public static final int DATA_SELECTED_ART = 17;
@@ -477,15 +479,15 @@ public abstract class Player
         setPos(x, y, z);
         lastDeathCoordinate = new ChunkCoordinates((int) x, (int) y, (int) z);
         yd = 0.1d;
-        if(username.equals("MaggAndGeez"))
+        if(UUID_MAK.equals(uuid) || username.equals("MaggAndGeez"))
         {
             dropPlayerItemWithRandomChoice(new ItemStack(Items.AMMO_FIREBALL, 1), true);
         }
-        else if (username.equals("jonkadelic"))
+        else if (UUID_JONK.equals(uuid) || username.equals("jonkadelic"))
         {
             dropPlayerItemWithRandomChoice(new ItemStack(Items.FOOD_COOKIE, 1), true);
         }
-        else if (username.equals("AnActualSign"))
+        else if (UUID_SHIGN.equals(uuid) || username.equals("ShignBright"))
         {
             dropPlayerItemWithRandomChoice(new ItemStack(Items.SIGN, 1), true);
         }
diff --git a/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileCannonball.java b/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileCannonball.java
index c632efc92..d42c51859 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileCannonball.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileCannonball.java
@@ -30,7 +30,7 @@ public class ProjectileCannonball extends Projectile
     public void onHit(HitResult hitResult){
         // Check for block collision
         if (hitResult.hitType == HitResult.HitType.TILE){
-            world.newExplosion(owner, x, y, z, 1.5F, false, true);
+            world.createExplosion(owner, x, y + bbHeight/2, z, 1.5F, false, true);
             remove();
         }
     }
diff --git a/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileCannonballBouncy.java b/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileCannonballBouncy.java
index ffcd35bb6..9d5aaebe7 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileCannonballBouncy.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileCannonballBouncy.java
@@ -94,7 +94,7 @@ public class ProjectileCannonballBouncy extends ProjectileCannonball
         {
             if (!((collidingEntities != null && collidingEntities.size() == 1) && collidingEntities.get(0) == owner && tickCount < 4))
             {
-                world.newExplosion(owner, x, y, z, 1.5F, false, true);
+                world.createExplosion(owner, x, y + bbHeight/2, z, 1.5F, false, true);
                 remove();
                 return;
             }
diff --git a/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileFireball.java b/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileFireball.java
index 8ed5c35d5..a04c24844 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileFireball.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/projectile/ProjectileFireball.java
@@ -86,7 +86,7 @@ public class ProjectileFireball extends Projectile
                         ((Player) owner).addStat(Achievements.HIT_FIREBALL, 1);
                     }
                 }
-                world.newExplosion(owner, x, y, z, 1.5F, true, false);
+                world.createExplosion(owner, x, y + bbHeight/2, z, 1.5F, true, false);
             }
             remove();
         }
diff --git a/game/core/src/main/java/net/minecraft/core/net/NetworkManager.java b/game/core/src/main/java/net/minecraft/core/net/NetworkManager.java
index 7f7cde819..c4f963a34 100644
--- a/game/core/src/main/java/net/minecraft/core/net/NetworkManager.java
+++ b/game/core/src/main/java/net/minecraft/core/net/NetworkManager.java
@@ -13,8 +13,8 @@ public class NetworkManager
 {
     private static final Logger LOGGER = LogUtils.getLogger();
 	private final boolean silent;
-	public static int PACKET_DELAY = 100;
-    public static int TIMEOUT_TIME_TICKS = 90 * 20;
+	public static int PACKET_DELAY = 1;
+    public static int TIMEOUT_TIME = 1800 * 50;
 
     public static final Object threadCounterLock = new Object();
     public static int readThreads;
@@ -39,14 +39,15 @@ public class NetworkManager
     private int estimatedRemaining;
     public int fakeLag;
     private int slowWriteDelay;
+    public final int incomingThroughput;
 
-    public NetworkManager(Socket socket, String s, PacketHandler nethandler)
+    public NetworkManager(Socket socket, String s, PacketHandler nethandler, int incomingThroughput)
         throws IOException
     {
-        this(socket, s, nethandler, false);
+        this(socket, s, nethandler, incomingThroughput, false);
     }
 
-    public NetworkManager(Socket socket, String s, PacketHandler nethandler, boolean silent)
+    public NetworkManager(Socket socket, String s, PacketHandler nethandler, int incomingThroughput, boolean silent)
         throws IOException
     {
         this.silent = silent;
@@ -61,13 +62,14 @@ public class NetworkManager
         noInputTicks = 0;
         estimatedRemaining = 0;
         fakeLag = 0;
+        this.incomingThroughput = incomingThroughput;
         slowWriteDelay = 0;
         this.socket = socket;
         address = socket.getRemoteSocketAddress();
         packetListener = nethandler;
         try
         {
-            socket.setSoTimeout(TIMEOUT_TIME_TICKS * 1000/20);
+            socket.setSoTimeout(TIMEOUT_TIME * 1000/20);
             socket.setTrafficClass(0x10 | 0x08);
         }
         catch(SocketException socketexception)
@@ -304,7 +306,7 @@ public class NetworkManager
         }
         if(incoming.isEmpty())
         {
-            if(noInputTicks++ == TIMEOUT_TIME_TICKS)
+            if(noInputTicks++ == TIMEOUT_TIME)
             {
                 networkShutdown("disconnect.timeout", new Object[0]);
             }
@@ -312,11 +314,19 @@ public class NetworkManager
         {
             noInputTicks = 0;
         }
-        for(int i = 100; !incoming.isEmpty() && i >= 0; i--)
-        {
-            Packet packet = incoming.remove(0);
-            if (!disconnected)
-                packet.handlePacket(packetListener);
+
+        if (incomingThroughput < 0) {
+            while (!incoming.isEmpty()) {
+                Packet packet = incoming.remove(0);
+                if (!disconnected)
+                    packet.handlePacket(packetListener);
+            }
+        } else {
+            for(int i = incomingThroughput; !incoming.isEmpty() && i >= 0; i--) {
+                Packet packet = incoming.remove(0);
+                if (!disconnected)
+                    packet.handlePacket(packetListener);
+            }
         }
 
         wakeThreads();
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketUseItem.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketUseItem.java
index 432226682..374b39e0b 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketUseItem.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketUseItem.java
@@ -10,6 +10,9 @@ import net.minecraft.core.util.helper.Direction;
 
 public class PacketUseItem extends Packet
 {
+    public static final byte TYPE_USE_ITEM_ON = 0;
+    public static final byte TYPE_USE_ITEM = 1;
+    public static final byte TYPE_USE_STACK_ON = 2;
 
     public int xPosition;
     public int yPosition;
@@ -18,12 +21,13 @@ public class PacketUseItem extends Packet
     public double xPlaced;
     public double yPlaced;
     public ItemStack itemStack;
+    public byte type;
 
     public PacketUseItem()
     {
     }
 
-    public PacketUseItem(int x, int y, int z, Direction direction, ItemStack itemstack, double xPlaced, double yPlaced)
+    public PacketUseItem(int x, int y, int z, Direction direction, ItemStack itemstack, double xPlaced, double yPlaced, byte type)
     {
         xPosition = x;
         yPosition = y;
@@ -32,6 +36,7 @@ public class PacketUseItem extends Packet
         itemStack = itemstack;
         this.xPlaced = xPlaced;
         this.yPlaced = yPlaced;
+        this.type = type;
     }
 
     @Override
@@ -44,6 +49,7 @@ public class PacketUseItem extends Packet
         direction = Direction.getDirectionById(dis.read());
         xPlaced = dis.readDouble();
         yPlaced = dis.readDouble();
+        type = dis.readByte();
         short word0 = dis.readShort();
         if(word0 >= 0)
         {
@@ -66,6 +72,7 @@ public class PacketUseItem extends Packet
         dos.write(direction.getId());
         dos.writeDouble(xPlaced);
         dos.writeDouble(yPlaced);
+        dos.writeByte(type);
         if(itemStack == null)
         {
             dos.writeShort(-1);
@@ -86,6 +93,6 @@ public class PacketUseItem extends Packet
     @Override
 	public int getEstimatedSize()
     {
-        return 19;
+        return 20;
     }
 }
diff --git a/game/core/src/main/java/net/minecraft/core/world/Explosion.java b/game/core/src/main/java/net/minecraft/core/world/Explosion.java
index ebafd28f2..721d688eb 100644
--- a/game/core/src/main/java/net/minecraft/core/world/Explosion.java
+++ b/game/core/src/main/java/net/minecraft/core/world/Explosion.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.world;
 
+import net.minecraft.core.block.Block;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.data.gamerule.GameRules;
 import net.minecraft.core.entity.Entity;
@@ -45,7 +46,7 @@ public class Explosion {
 	}
 
 	public void explode() {
-	    if(destroyBlocks) calculateBlocksToDestroy();
+	    calculateBlocksToDestroy();
 	    
 		damageEntities();
 		
@@ -64,7 +65,6 @@ public class Explosion {
             int y = chunkposition.y;
             int z = chunkposition.z;
             
-            int id = worldObj.getBlockId(x, y, z);
             TileEntity tileEntity = worldObj.getTileEntity(x, y, z);
             if(particles) {
                 double xPos = (double) x + worldObj.rand.nextFloat();
@@ -85,11 +85,14 @@ public class Explosion {
                 worldObj.spawnParticle("explode", (xPos + explosionX) / 2D, (yPos + explosionY) / 2D, (zPos + explosionZ) / 2D, d3, d4, d5, 0);
                 worldObj.spawnParticle("smoke", xPos, yPos, zPos, d3, d4, d5, 0);
             }
-            if(id > 0)
-            {
-                Blocks.blocksList[id].dropBlockWithCause(worldObj, EnumDropCause.EXPLOSION, x, y, z, worldObj.getBlockMetadata(x, y, z), tileEntity, null);
-                worldObj.setBlockWithNotify(x, y, z, 0);
-                Blocks.blocksList[id].onBlockDestroyedByExplosion(worldObj, x, y, z);
+            if (destroyBlocks) {
+                Block<?> block = worldObj.getBlock(x, y, z);
+                if(block != null)
+                {
+                    block.dropBlockWithCause(worldObj, EnumDropCause.EXPLOSION, x, y, z, worldObj.getBlockMetadata(x, y, z), tileEntity, null);
+                    worldObj.setBlockWithNotify(x, y, z, 0);
+                    block.onBlockDestroyedByExplosion(worldObj, x, y, z);
+                }
             }
         }
     }
diff --git a/game/core/src/main/java/net/minecraft/core/world/World.java b/game/core/src/main/java/net/minecraft/core/world/World.java
index 8f868d5f3..6e19cbfc2 100644
--- a/game/core/src/main/java/net/minecraft/core/world/World.java
+++ b/game/core/src/main/java/net/minecraft/core/world/World.java
@@ -2074,10 +2074,10 @@ public class World implements WorldSource {
 
     public Explosion createExplosion(Entity entity, double x, double y, double z, float explosionSize)
     {
-        return newExplosion(entity, x, y, z, explosionSize, false, false);
+        return createExplosion(entity, x, y, z, explosionSize, false, false);
     }
 
-    public Explosion newExplosion(Entity entity, double x, double y, double z, float explosionSize, boolean flaming, boolean isCannonBall)
+    public Explosion createExplosion(Entity entity, double x, double y, double z, float explosionSize, boolean flaming, boolean isCannonBall)
     {
         Explosion explosion;
         if(!isCannonBall)
diff --git a/game/core/src/main/java/net/minecraft/core/world/type/WorldTypes.java b/game/core/src/main/java/net/minecraft/core/world/type/WorldTypes.java
index 0fd6c03a9..67f4d3df5 100644
--- a/game/core/src/main/java/net/minecraft/core/world/type/WorldTypes.java
+++ b/game/core/src/main/java/net/minecraft/core/world/type/WorldTypes.java
@@ -22,6 +22,7 @@ public abstract class WorldTypes {
             new WorldTypeOverworld(
                     WorldTypeOverworld.defaultProperties("worldType.overworld.default")
                             .bounds(0, 127, 64)
+                            .portalBounds(0, 255)
             )
     );
     public static final WorldType NETHER_DEFAULT = register(
@@ -52,6 +53,7 @@ public abstract class WorldTypes {
                             .fillerBlock(Blocks.STONE)
                             .allowRespawn()
                             .bounds(0, 31, 0)
+                            .portalBounds(0, 255)
                             .seasonConfig(SeasonConfig.builder()
                                     .withSingleSeason(Seasons.OVERWORLD_SUMMER)
                                     .build()
@@ -79,6 +81,7 @@ public abstract class WorldTypes {
                     WorldTypeOverworld.defaultProperties("worldType.overworld.retro")
                             .seasonConfig(null)
                             .bounds(0, 127, 64)
+                            .portalBounds(0, 255)
                             .setRetro()
             )
     );
@@ -98,6 +101,7 @@ public abstract class WorldTypes {
                                     .build()
                             )
                             .bounds(0, 127, 64)
+                            .portalBounds(0, 255)
             )
     );
     public static final WorldType OVERWORLD_HELL = register(
@@ -113,6 +117,7 @@ public abstract class WorldTypes {
                             .fillerBlock(Blocks.STONE)
                             .allowRespawn()
                             .bounds(0, 127, 64)
+                            .portalBounds(0, 255)
                             .defaultWeather(Weathers.OVERWORLD_HELL_CLEAR)
             )
     );
@@ -132,6 +137,7 @@ public abstract class WorldTypes {
                                     .build()
                             )
                             .bounds(0, 127, 64)
+                            .portalBounds(0, 255)
             )
     );
     public static final WorldType OVERWORLD_INLAND = register(
@@ -148,6 +154,7 @@ public abstract class WorldTypes {
                     WorldTypeOverworld.defaultProperties("worldType.overworld.classic")
                             .seasonConfig(null)
                             .bounds(0, 127, 64)
+                            .portalBounds(0, 255)
                             .setRetro()
             )
     );
@@ -157,6 +164,7 @@ public abstract class WorldTypes {
                     WorldTypeOverworld.defaultProperties("worldType.overworld.indev")
                             .seasonConfig(null)
                             .bounds(0, 127, 64)
+                            .portalBounds(0, 255)
                             .setRetro()
             )
     );
@@ -165,6 +173,7 @@ public abstract class WorldTypes {
             new WorldTypeOverworldSkyblock(
                     WorldTypeOverworld.defaultProperties("worldType.overworld.skyblock")
                         .bounds(0, 127, 0)
+                        .portalBounds(0, 255)
             )
     );
     public static final WorldType OVERWORLD_BETA_173 = register(
diff --git a/game/server/src/main/java/net/minecraft/server/MinecraftServer.java b/game/server/src/main/java/net/minecraft/server/MinecraftServer.java
index aa7d5dd66..1763b5436 100644
--- a/game/server/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/game/server/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -244,7 +244,8 @@ public class MinecraftServer
         joinMessage = propertyManager.getStringProperty("join-message", "");
         summonLimit = propertyManager.getIntProperty("summon-limit", 10);
         sleepPercentage = propertyManager.getIntProperty("sleep-percentage", 0);
-        NetworkManager.PACKET_DELAY = propertyManager.getIntProperty("packet-delay", 20);
+        NetworkManager.PACKET_DELAY = propertyManager.getIntProperty("packet-delay", 1);
+        NetworkManager.TIMEOUT_TIME = propertyManager.getIntProperty("login-timeout-time", 1800 * 50);
         maxPlayers = propertyManager.getIntProperty("max-players", 20);
         language = propertyManager.getStringProperty("language", "en_US");
         disablePhotoMode = propertyManager.getBooleanProperty("disable-photomode", false);
@@ -638,6 +639,7 @@ public class MinecraftServer
                 int i = 0;
                 while (serverRunning)
                 {
+                    this.networkServer.handleNetworkListenThread();
                     long currentTime = System.currentTimeMillis();
                     long timeChange = currentTime - startTime;
                     if (timeChange > 2000L)
diff --git a/game/server/src/main/java/net/minecraft/server/entity/player/PlayerServer.java b/game/server/src/main/java/net/minecraft/server/entity/player/PlayerServer.java
index 8cb42b7f6..ae74d201f 100644
--- a/game/server/src/main/java/net/minecraft/server/entity/player/PlayerServer.java
+++ b/game/server/src/main/java/net/minecraft/server/entity/player/PlayerServer.java
@@ -287,7 +287,7 @@ public class PlayerServer extends Player implements ContainerListener {
             }
         }
 
-        if (inPortal)
+        if (inPortal && !noPhysics)
         {
             Dimension targetDim = ((BlockLogicPortal) Blocks.blocksList[portalID].getLogic()).targetDimension;
             boolean netherAllowed = mcServer.propertyManager.getBooleanProperty("allow-nether", true);
diff --git a/game/server/src/main/java/net/minecraft/server/net/handler/PacketHandlerLogin.java b/game/server/src/main/java/net/minecraft/server/net/handler/PacketHandlerLogin.java
index c60cd08e7..004235a1c 100644
--- a/game/server/src/main/java/net/minecraft/server/net/handler/PacketHandlerLogin.java
+++ b/game/server/src/main/java/net/minecraft/server/net/handler/PacketHandlerLogin.java
@@ -53,7 +53,7 @@ public class PacketHandlerLogin extends PacketHandler
         loginPacket = null;
         serverId = "";
         mcServer = minecraftserver;
-        netManager = new NetworkManager(socket, s, this);
+        netManager = new NetworkManager(socket, s, this, 100);
         netManager.fakeLag = 0;
     }
 
@@ -64,7 +64,7 @@ public class PacketHandlerLogin extends PacketHandler
             doLogin(loginPacket);
             loginPacket = null;
         }
-        if (loginTimer++ == 600)
+        if (loginTimer++ == 600 * 50)
         {
             kickUser("Took too long to log in");
         }
diff --git a/game/server/src/main/java/net/minecraft/server/net/handler/PacketHandlerServer.java b/game/server/src/main/java/net/minecraft/server/net/handler/PacketHandlerServer.java
index 3ee1d337c..163871243 100644
--- a/game/server/src/main/java/net/minecraft/server/net/handler/PacketHandlerServer.java
+++ b/game/server/src/main/java/net/minecraft/server/net/handler/PacketHandlerServer.java
@@ -47,7 +47,6 @@ import org.slf4j.Logger;
 
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -394,38 +393,62 @@ public class PacketHandlerServer extends PacketHandler
         WorldServer worldserver = mcServer.getDimensionWorld(playerEntity.dimension);
         ItemStack itemstack = playerEntity.inventory.getCurrentItem();
         boolean ignoreSpawnProtection = mcServer.spawnProtectionRange <= 0 || worldserver.dimension.id != 0 || mcServer.playerList.isOp(playerEntity.uuid);
-        if (packet.direction == Direction.NONE)
-        {
-            if (itemstack == null)
-            {
-                return;
+        switch (packet.type) {
+            case PacketUseItem.TYPE_USE_ITEM_ON: {
+                int x = packet.xPosition;
+                int y = packet.yPosition;
+                int z = packet.zPosition;
+                Direction direction = packet.direction;
+                double xPlaced = packet.xPlaced;
+                double yPlaced = packet.yPlaced;
+                ChunkCoordinates chunkcoordinates = worldserver.getSpawnPoint();
+                int i1 = (int) MathHelper.abs(x - chunkcoordinates.x);
+                int j1 = (int) MathHelper.abs(z - chunkcoordinates.z);
+                if (i1 > j1)
+                {
+                    j1 = i1;
+                }
+                if (hasMoved && playerEntity.distanceToSqr((double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D) < 64D && (j1 > mcServer.spawnProtectionRange || ignoreSpawnProtection))
+                {
+                    playerEntity.playerController.useItemOn(playerEntity, worldserver, itemstack, x, y, z, direction.getSide(), xPlaced, yPlaced);
+                }
+                playerEntity.playerNetServerHandler.sendPacket(new PacketBlockUpdate(x, y, z, worldserver));
+                x += direction.getOffsetX();
+                y += direction.getOffsetY();
+                z += direction.getOffsetZ();
+                playerEntity.playerNetServerHandler.sendPacket(new PacketBlockUpdate(x, y, z, worldserver));
             }
-            playerEntity.playerController.useItemOnNothing(playerEntity, worldserver, itemstack);
-        }
-        else
-        {
-            int x = packet.xPosition;
-            int y = packet.yPosition;
-            int z = packet.zPosition;
-            Direction direction = packet.direction;
-            double xPlaced = packet.xPlaced;
-            double yPlaced = packet.yPlaced;
-            ChunkCoordinates chunkcoordinates = worldserver.getSpawnPoint();
-            int i1 = (int) MathHelper.abs(x - chunkcoordinates.x);
-            int j1 = (int) MathHelper.abs(z - chunkcoordinates.z);
-            if (i1 > j1)
-            {
-                j1 = i1;
+            case PacketUseItem.TYPE_USE_ITEM: {
+                if (itemstack == null)
+                {
+                    return;
+                }
+                playerEntity.playerController.useItemOnNothing(playerEntity, worldserver, itemstack);
             }
-            if (hasMoved && playerEntity.distanceToSqr((double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D) < 64D && (j1 > mcServer.spawnProtectionRange || ignoreSpawnProtection))
-            {
-                playerEntity.playerController.activateBlockOrUseItem(playerEntity, worldserver, itemstack, x, y, z, direction.getSide(), xPlaced, yPlaced);
+            case PacketUseItem.TYPE_USE_STACK_ON: {
+                int x = packet.xPosition;
+                int y = packet.yPosition;
+                int z = packet.zPosition;
+                Direction direction = packet.direction;
+                double xPlaced = packet.xPlaced;
+                double yPlaced = packet.yPlaced;
+                ChunkCoordinates chunkcoordinates = worldserver.getSpawnPoint();
+                int i1 = (int) MathHelper.abs(x - chunkcoordinates.x);
+                int j1 = (int) MathHelper.abs(z - chunkcoordinates.z);
+                if (i1 > j1)
+                {
+                    j1 = i1;
+                }
+                if (hasMoved && playerEntity.distanceToSqr((double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D) < 64D && (j1 > mcServer.spawnProtectionRange || ignoreSpawnProtection))
+                {
+                    playerEntity.playerController.onlyUseItemStackOn(playerEntity, worldserver, itemstack, x, y, z, direction.getSide(), xPlaced, yPlaced);
+                }
+                playerEntity.playerNetServerHandler.sendPacket(new PacketBlockUpdate(x, y, z, worldserver));
+                x += direction.getOffsetX();
+                y += direction.getOffsetY();
+                z += direction.getOffsetZ();
+                playerEntity.playerNetServerHandler.sendPacket(new PacketBlockUpdate(x, y, z, worldserver));
             }
-            playerEntity.playerNetServerHandler.sendPacket(new PacketBlockUpdate(x, y, z, worldserver));
-            x += direction.getOffsetX();
-            y += direction.getOffsetY();
-            z += direction.getOffsetZ();
-            playerEntity.playerNetServerHandler.sendPacket(new PacketBlockUpdate(x, y, z, worldserver));
         }
         itemstack = playerEntity.inventory.getCurrentItem();
         if (itemstack != null && itemstack.stackSize <= 0)
diff --git a/game/server/src/main/java/net/minecraft/server/world/ServerPlayerController.java b/game/server/src/main/java/net/minecraft/server/world/ServerPlayerController.java
index b2230135f..57692bb5f 100644
--- a/game/server/src/main/java/net/minecraft/server/world/ServerPlayerController.java
+++ b/game/server/src/main/java/net/minecraft/server/world/ServerPlayerController.java
@@ -13,6 +13,8 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.LevelListener;
 import net.minecraft.core.world.World;
 import net.minecraft.server.entity.player.PlayerServer;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class ServerPlayerController
 {
@@ -161,7 +163,7 @@ public class ServerPlayerController
         }
     }
 
-    public boolean activateBlockOrUseItem(Player entityplayer, World world, ItemStack itemstack, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean useItemOn(Player entityplayer, World world, ItemStack itemstack, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         if (!entityplayer.getGamemode().canInteract()) return false;
         int blockId = world.getBlockId(blockX, blockY, blockZ);
@@ -197,6 +199,18 @@ public class ServerPlayerController
         }
     }
 
+    public boolean onlyUseItemStackOn(@NotNull Player player, @NotNull World world, @Nullable ItemStack itemstack, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+        if (!player.getGamemode().canInteract()) return false;
+        if (player.getHeldObject() == null) {
+            if (itemstack == null) { // No stack then do nothing
+                return false;
+            } else { // Use itemstack
+                return itemstack.useItem(player, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
+            }
+        }
+        return false;
+    }
+
     private WorldServer thisWorld;
     public Player player;
     private int blockHitTicks;
diff --git a/game/server/src/main/java/net/minecraft/server/world/WorldServer.java b/game/server/src/main/java/net/minecraft/server/world/WorldServer.java
index 719b54ce5..a973d0220 100644
--- a/game/server/src/main/java/net/minecraft/server/world/WorldServer.java
+++ b/game/server/src/main/java/net/minecraft/server/world/WorldServer.java
@@ -183,11 +183,11 @@ public class WorldServer extends World
 
     @Override
     public Explosion createExplosion(Entity entity, double x, double y, double z, float explosionSize) {
-        return newExplosion(entity, x, y, z, explosionSize, false, false);
+        return createExplosion(entity, x, y, z, explosionSize, false, false);
     }
 
     @Override
-    public Explosion newExplosion(Entity entity, double x, double y, double z, float explosionSize, boolean flaming, boolean isCannonBall) {
+    public Explosion createExplosion(Entity entity, double x, double y, double z, float explosionSize, boolean flaming, boolean isCannonBall) {
         Explosion explosion;
         if(!isCannonBall)
             explosion = new Explosion(this, entity, x, y, z, explosionSize);
