diff --git a/src/main/java/net/betterthanadventure/utils/BiomeFinder.java b/src/main/java/net/betterthanadventure/utils/BiomeFinder.java
index f1e10fa1b..58981b96e 100644
--- a/src/main/java/net/betterthanadventure/utils/BiomeFinder.java
+++ b/src/main/java/net/betterthanadventure/utils/BiomeFinder.java
@@ -10,7 +10,6 @@ import net.minecraft.core.data.registry.Registries;
 import net.minecraft.core.entity.SkinVariantList;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.world.Dimension;
-import net.minecraft.core.world.SpawnerMobs;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biome;
 import net.minecraft.core.world.biome.provider.BiomeProvider;
@@ -20,7 +19,7 @@ import net.minecraft.core.world.chunk.IChunkLoader;
 import net.minecraft.core.world.chunk.provider.IChunkProvider;
 import net.minecraft.core.world.save.LevelStorage;
 import net.minecraft.core.world.save.SaveFormatBase;
-import net.minecraft.core.world.save.SaveHandlerClientMP;
+import net.minecraft.client.world.save.SaveHandlerClientMP;
 import net.minecraft.core.world.save.mcregion.SaveFormat19134;
 import net.minecraft.core.world.type.WorldType;
 import net.minecraft.core.world.type.WorldTypes;
diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java
index 8e339a871..70bd167ab 100644
--- a/src/main/java/net/minecraft/client/Minecraft.java
+++ b/src/main/java/net/minecraft/client/Minecraft.java
@@ -27,6 +27,8 @@ import net.minecraft.client.gui.chat.ScreenSleepMP;
 import net.minecraft.client.gui.toasts.GuiElementToastsHud;
 import net.minecraft.client.holiday.Holidays;
 import net.minecraft.client.net.handler.PacketHandlerClient;
+import net.minecraft.client.sound.SoundEvent;
+import net.minecraft.client.world.WorldClient;
 import net.minecraft.client.world.chunk.provider.ChunkProviderStatic;
 import net.minecraft.core.achievement.Achievements;
 import net.minecraft.core.block.BlockLeavesBase;
@@ -100,7 +102,7 @@ import net.minecraft.client.render.texturepack.TexturePackList;
 import net.minecraft.client.render.window.GameWindow;
 import net.minecraft.client.render.window.GameWindowGLFW;
 import net.minecraft.client.sound.SoundEngine;
-import net.minecraft.client.util.debug.Debug;
+import net.minecraft.core.util.debug.Debug;
 import net.minecraft.client.util.debug.DebugRender;
 import net.minecraft.client.util.helper.ScreenshotHelper;
 import net.minecraft.client.util.helper.Textures;
@@ -188,7 +190,7 @@ public class Minecraft
     public boolean hasCrashed;
     public UnexpectedThrowable lastCrash;
     private final Timer timer;
-    public World theWorld;
+    public WorldClient currentWorld;
     public RenderGlobal renderGlobal;
     public PlayerLocal thePlayer;
     public ICamera activeCamera;
@@ -522,7 +524,7 @@ public class Minecraft
         TextureRegistry.blockAtlas.bind();
         renderGlobal = new RenderGlobal(this, textureManager);
         glViewport(0, 0, gameWindow.getWidthPixels(), gameWindow.getHeightPixels());
-        particleEngine = new ParticleEngine(theWorld);
+        particleEngine = new ParticleEngine(currentWorld);
         try
         {
             LOGGER.info("Starting Resource Download Thread...");
@@ -807,7 +809,7 @@ public class Minecraft
         if(statsCounter != null){
             statsCounter.saveStats();
         }
-        if(screen == null && theWorld == null)
+        if(screen == null && currentWorld == null)
         {
             screen = new ScreenMainMenu();
         }
@@ -899,7 +901,7 @@ public class Minecraft
                     Vec3.initializePool();
                     
                     if(gameWindow.shouldClose()) shutdown();
-                    if(isGamePaused && theWorld != null && !(currentScreen instanceof ScreenModelViewer))
+                    if(isGamePaused && currentWorld != null && !(currentScreen instanceof ScreenModelViewer))
                     {
                         float temp = timer.partialTicks;
                         timer.advanceTime();
@@ -929,7 +931,7 @@ public class Minecraft
                         }
                         catch(MinecraftException e)
                         {
-                            theWorld = null;
+                            currentWorld = null;
                             LOGGER.error("MinecraftException occurred while attempting to run tick, exiting world!", e);
                         }
                         changeWorld(null);
@@ -945,11 +947,11 @@ public class Minecraft
                     BlockLeavesBase.enableTreeShadowing = gameSettings.treeShadows.value;
                     sndManager.updateListener(thePlayer, timer.partialTicks);
                     glEnable(GL_TEXTURE_2D);
-                    if(theWorld != null)
+                    if(currentWorld != null)
                     {
                     	Debug.change("updatelight");
                         try {
-                            theWorld.updatingLighting();
+                            currentWorld.updatingLighting();
                         } catch (Throwable t) {
                             LOGGER.error("Unhandled exception when updating lighting!", t);
                         }
@@ -1017,7 +1019,7 @@ public class Minecraft
                         currentTime += 1000L;
                         fpsCounter = 0;
                     }
-					if(theWorld == null) {
+					if(currentWorld == null) {
 						long now = System.currentTimeMillis();
 						// Limit FPS in menu
 						long sleepTime = (1000 / 60 - (now - tickStartTime)) - 1;
@@ -1036,7 +1038,7 @@ public class Minecraft
                 }
                 catch(MinecraftException minecraftexception)
                 {
-                    theWorld = null;
+                    currentWorld = null;
                     changeWorld(null);
                     displayScreen(new ScreenConflictWarning());
                 }
@@ -1048,7 +1050,7 @@ public class Minecraft
                 }
                 catch(Throwable throwable)
                 {
-                    if (theWorld != null) {
+                    if (currentWorld != null) {
                         try {
                             changeWorld(null);
                         } catch (Throwable t) {
@@ -1227,7 +1229,7 @@ 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, theWorld, stack, blockX, blockY, blockZ, side, xPlaced, yPlaced)) {
+                    if (this.playerController.useItemOn(thePlayer, currentWorld, stack, blockX, blockY, blockZ, side, xPlaced, yPlaced)) {
                         this.playerController.swingItem(true);
                     }
                     if (stack == null) {
@@ -1285,7 +1287,7 @@ public class Minecraft
             {
                 ItemStack stack = thePlayer.inventory.getCurrentItem();
                 int numItemsInStack = stack == null ? 0 : stack.stackSize;
-                if(playerController.useItemOn(thePlayer, theWorld, stack, blockX, blockY, blockZ, side, xPlaced, yPlaced))
+                if(playerController.useItemOn(thePlayer, currentWorld, stack, blockX, blockY, blockZ, side, xPlaced, yPlaced))
                 {
                     flag = false;
                     playerController.swingItem(true);
@@ -1307,7 +1309,7 @@ public class Minecraft
         if(flag && clickType == 1)
         {
             ItemStack itemstack = thePlayer.inventory.getCurrentItem();
-            if(itemstack != null && playerController.useItem(thePlayer, theWorld, itemstack))
+            if(itemstack != null && playerController.useItem(thePlayer, currentWorld, itemstack))
             {
                 worldRenderer.itemRenderer.resetEquippedProgress();
             }
@@ -1368,12 +1370,12 @@ public class Minecraft
         worldRenderer.getMouseOver(1.0F);
         if(thePlayer != null)
         {
-            IChunkProvider chunkProvider = theWorld.getChunkProvider();
+            IChunkProvider chunkProvider = currentWorld.getChunkProvider();
             int playerChunkX = MathHelper.floor_float((int)thePlayer.x) >> 4;
             int playerChunkZ = MathHelper.floor_float((int)thePlayer.z) >> 4;
             chunkProvider.setCurrentChunkOver(playerChunkX, playerChunkZ);
         }
-        if(!isGamePaused && theWorld != null)
+        if(!isGamePaused && currentWorld != null)
         {
             playerController.tick();
         }
@@ -1387,9 +1389,9 @@ public class Minecraft
             {
                 displayScreen(null);
             }
-            else if(thePlayer.isPlayerSleeping() && theWorld != null)
+            else if(thePlayer.isPlayerSleeping() && currentWorld != null)
             {
-                if(theWorld.isClientSide)
+                if(currentWorld.isClientSide)
                 {
                     displayScreen(new ScreenSleepMP());
                 }
@@ -1535,7 +1537,7 @@ public class Minecraft
                             }
                             else if(gameSettings.keySwitchGamemode.isPressEvent())
                             {
-                                if (theWorld.getLevelData().getCheatsEnabled() || theWorld.isClientSide)
+                                if (currentWorld.getLevelData().getCheatsEnabled() || currentWorld.isClientSide)
                                 {
                                     if (thePlayer.getGamemode() == Gamemode.creative)
                                     {
@@ -1568,7 +1570,7 @@ public class Minecraft
                                 }
                                 else
                                 {
-                                    if (theWorld.getLevelData().getCheatsEnabled())
+                                    if (currentWorld.getLevelData().getCheatsEnabled())
                                     {
                                         fullbright = !fullbright;
                                         if(!LightmapHelper.isLightmapEnabled()) {
@@ -1664,7 +1666,7 @@ public class Minecraft
             handleControllerInput();
         }
         Debug.change("misc");
-        if(theWorld != null)
+        if(currentWorld != null)
         {
             if(thePlayer != null)
             {
@@ -1672,7 +1674,7 @@ public class Minecraft
                 if(joinPlayerCounter == 30)
                 {
                     joinPlayerCounter = 0;
-                    theWorld.joinEntityInSurroundings(thePlayer);
+                    currentWorld.joinEntityInSurroundings(thePlayer);
                 }
                 thePlayer.setFlySpeed(gameSettings.flightSpeed.value);
                 thePlayer.setFlightSmoothness(gameSettings.flightSmoothness.value);
@@ -1689,12 +1691,12 @@ public class Minecraft
             if(!isGamePaused)
             {
                 Debug.change("entity");
-                if(theWorld.lightningFlicker > 0)
+                if(currentWorld.lightningFlicker > 0)
                 {
-                    theWorld.lightningFlicker--;
+                    currentWorld.lightningFlicker--;
                 }
                 try {
-                    theWorld.updateEntities();
+                    currentWorld.updateEntities();
                 } catch (StackOverflowError stackOverflowError) {
                     LOGGER.error("Stack overflow while updating world entities! Closing world!", stackOverflowError);
                     changeWorld(null);
@@ -1710,7 +1712,7 @@ public class Minecraft
             {
                 Debug.change("world");
                 try {
-                    theWorld.tick();
+                    currentWorld.tick();
                 } catch (StackOverflowError stackOverflowError) {
                     LOGGER.error("Stack overflow while updating world entities! Closing world!", stackOverflowError);
                     changeWorld(null);
@@ -1722,10 +1724,10 @@ public class Minecraft
                 }
                 Debug.change("misc");
             }
-            if(!isGamePaused && theWorld != null)
+            if(!isGamePaused && currentWorld != null)
             {
                 Debug.change("randomDisplayTick");
-                theWorld.randomDisplayUpdates(MathHelper.floor(thePlayer.x), MathHelper.floor(thePlayer.y), MathHelper.floor(thePlayer.z));
+                currentWorld.randomDisplayUpdates(MathHelper.floor(thePlayer.x), MathHelper.floor(thePlayer.y), MathHelper.floor(thePlayer.z));
                 Debug.change("misc");
             }
             if(!isGamePaused)
@@ -2103,7 +2105,7 @@ public class Minecraft
 
     public boolean isMultiplayerWorld()
     {
-        return theWorld != null && theWorld.isClientSide;
+        return currentWorld != null && currentWorld.isClientSide;
     }
 
     public void startWorld(String worldDirName, String worldName, long seed)
@@ -2150,7 +2152,7 @@ public class Minecraft
                     }
                 }
             }
-            World world = new World(saveHandler, worldName, seed, null, null);
+            WorldClient world = new WorldClient(saveHandler, worldName, seed, null, null);
             if(world.isNewWorld)
             {
                 statsCounter.add(StatList.createWorldStat, 1);
@@ -2171,7 +2173,7 @@ public class Minecraft
         Dimension newDim = Dimension.getDimensionList().get(dim);
         LOGGER.info("Switching to dimension \"{}\"!!", newDim.getTranslatedName());
         thePlayer.dimension = dim;
-        theWorld.setEntityDead(thePlayer);
+        currentWorld.setEntityDead(thePlayer);
         thePlayer.removed = false;
         double x = thePlayer.x;
         double z = thePlayer.z;
@@ -2193,9 +2195,9 @@ public class Minecraft
         thePlayer.dimensionEnterCoordinate = newCoordinates;
         if(thePlayer.isAlive())
         {
-            theWorld.updateEntityWithOptionalForce(thePlayer, false);
+            currentWorld.updateEntityWithOptionalForce(thePlayer, false);
         }
-        World world = new World(theWorld, newDim);
+        WorldClient world = new WorldClient(currentWorld, newDim);
 
         I18n i18n = I18n.getInstance();
         if (newDim == lastDim.homeDim)
@@ -2207,26 +2209,26 @@ public class Minecraft
             changeWorld(world, i18n.translateKeyAndFormat("gui.loading.label.entering", newDim.getTranslatedName()), thePlayer);
         }
 
-        thePlayer.world = theWorld;
+        thePlayer.world = currentWorld;
         if(thePlayer.isAlive())
         {
             thePlayer.moveTo(x, y, z, thePlayer.yRot, thePlayer.xRot);
-            theWorld.updateEntityWithOptionalForce(thePlayer, false);
-            (new PortalHandler()).teleportEntity(theWorld, thePlayer, portalColor, lastDim, newDim);
+            currentWorld.updateEntityWithOptionalForce(thePlayer, false);
+            (new PortalHandler()).teleportEntity(currentWorld, thePlayer, portalColor, lastDim, newDim);
         }
     }
 
-    public void changeWorld(World world)
+    public void changeWorld(WorldClient world)
     {
         changeWorld(world, "");
     }
 
-    public void changeWorld(World world, String loadingTitle)
+    public void changeWorld(WorldClient world, String loadingTitle)
     {
         changeWorld(world, loadingTitle, null);
     }
 
-    public void changeWorld(World world, String loadingTitle, Player player)
+    public void changeWorld(WorldClient world, String loadingTitle, Player player)
     {
     	mainMenuBackground.deleteTextures();
     	gameSettings.showCollisionBoxes.value = false;
@@ -2243,11 +2245,11 @@ public class Minecraft
         }
 
         sndManager.stopMusic();
-        if(theWorld != null)
+        if(currentWorld != null)
         {
-            theWorld.saveWorldIndirectly(loadingScreen);
-            if (theWorld.saveHandler != null) {
-                IChunkLoader loader = theWorld.saveHandler.getChunkLoader(theWorld.dimension);
+            currentWorld.saveWorldIndirectly(loadingScreen);
+            if (currentWorld.saveHandler != null) {
+                IChunkLoader loader = currentWorld.saveHandler.getChunkLoader(currentWorld.dimension);
                 if (loader != null) {
                     while (loader.isSaving()) {
                         try {
@@ -2257,12 +2259,12 @@ public class Minecraft
                         }
                     }
                 }
-                theWorld.getChunkProvider().unloadAllChunks();
-                theWorld.onUnload();
+                currentWorld.getChunkProvider().unloadAllChunks();
+                currentWorld.onUnload();
             }
         }
-        theWorld = world;
-        if(theWorld != null) {
+        currentWorld = world;
+        if(currentWorld != null) {
             Colorizers.update(true);
         }
         if(world != null)
@@ -2371,15 +2373,15 @@ public class Minecraft
 
     private void prepareLevel(String loadingTitle)
     {
-        loadingScreen.updateLoadingBackground(theWorld.dimension);
+        loadingScreen.updateLoadingBackground(currentWorld.dimension);
         loadingScreen.progressStartNoAbort(loadingTitle);
         loadingScreen.progressStage("Building terrain");
         char c = 128;
         int i = 0;
         int j = (c * 2) / 16 + 1;
         j *= j;
-        IChunkProvider ichunkprovider = theWorld.getChunkProvider();
-        ChunkCoordinates chunkcoordinates = theWorld.getSpawnPoint();
+        IChunkProvider ichunkprovider = currentWorld.getChunkProvider();
+        ChunkCoordinates chunkcoordinates = currentWorld.getSpawnPoint();
         if(thePlayer != null)
         {
             chunkcoordinates.x = (int)thePlayer.x;
@@ -2391,8 +2393,8 @@ public class Minecraft
             for(int l = -c; l <= c; l += Chunk.CHUNK_SIZE_Z)
             {
                 loadingScreen.progressStagePercentage((i++ * 100) / j);
-                theWorld.getBlockId(chunkcoordinates.x + k, 64, chunkcoordinates.z + l);
-                while(theWorld.updatingLighting()) ;
+                currentWorld.getBlockId(chunkcoordinates.x + k, 64, chunkcoordinates.z + l);
+                while(currentWorld.updatingLighting()) ;
             }
 
         }
@@ -2400,7 +2402,7 @@ public class Minecraft
         loadingScreen.progressStage("Simulating world for a bit...");
         loadingScreen.progressStop();
         j = 2000;
-        theWorld.dropOldChunks();
+        currentWorld.dropOldChunks();
     }
 
     public String getRendererDebugInfo()
@@ -2415,18 +2417,18 @@ public class Minecraft
 
     public String getChunkProviderInfoString()
     {
-        return theWorld.getChunkProviderInfoString();
+        return currentWorld.getChunkProviderInfoString();
     }
     
     public String getEntityCountsInfoString()
     {
-        return "P: " + particleEngine.countParticles() + ". T: " + theWorld.getNumLoadedEntitiesString();
+        return "P: " + particleEngine.countParticles() + ". T: " + currentWorld.getNumLoadedEntitiesString();
     }
 
     public void respawn(boolean multiplayer, int targetDimension)
     {
     	@Nullable Player previousPlayer = thePlayer;
-        if(!theWorld.isClientSide && !theWorld.dimension.defaultWorldType.mayRespawn())
+        if(!currentWorld.isClientSide && !currentWorld.dimension.defaultWorldType.mayRespawn())
         {
             usePortal(targetDimension, null);
         }
@@ -2441,7 +2443,7 @@ public class Minecraft
             lastDeathCoordinates = thePlayer.getLastDeathCoordinate();
             if(spawnCoordinates != null)
             {
-                bedSpawnCoordinates = Player.getValidBedSpawnCoordinates(theWorld, spawnCoordinates);
+                bedSpawnCoordinates = Player.getValidBedSpawnCoordinates(currentWorld, spawnCoordinates);
                 if(bedSpawnCoordinates == null)
                 {
                     thePlayer.sendTranslatedChatMessage("bed.notValid");
@@ -2450,22 +2452,22 @@ public class Minecraft
         }
         if(bedSpawnCoordinates == null)
         {
-            bedSpawnCoordinates = theWorld.getSpawnPoint();
+            bedSpawnCoordinates = currentWorld.getSpawnPoint();
             canRespawnAtBed = false;
         }
-        IChunkProvider ichunkprovider = theWorld.getChunkProvider();
+        IChunkProvider ichunkprovider = currentWorld.getChunkProvider();
         ichunkprovider.setCurrentChunkOver(bedSpawnCoordinates.x >> 4, bedSpawnCoordinates.z >> 4);
-        theWorld.getRespawnLocation();
-        theWorld.updateEntityList();
+        currentWorld.getRespawnLocation();
+        currentWorld.updateEntityList();
         int j = 0;
         Gamemode playerGamemode = Gamemode.survival;
         if(thePlayer != null)
         {
             j = thePlayer.id;
-            theWorld.setEntityDead(thePlayer);
+            currentWorld.setEntityDead(thePlayer);
             playerGamemode = thePlayer.getGamemode();
         }
-        thePlayer = (PlayerLocal)playerController.createPlayer(theWorld);
+        thePlayer = (PlayerLocal)playerController.createPlayer(currentWorld);
         thePlayer.dimension = targetDimension;
         thePlayer.setGamemode(playerGamemode);
         if (previousPlayer != null && previousPlayer.getHeldObject() != null) {
@@ -2478,7 +2480,7 @@ public class Minecraft
         
         if(previousPlayer != null) {
             thePlayer.messageHistory = previousPlayer.messageHistory;
-        	if(!theWorld.isClientSide) {
+        	if(!currentWorld.isClientSide) {
         		thePlayer.inventory.transferAllContents(previousPlayer.inventory);
         	}
         }
@@ -2490,7 +2492,7 @@ public class Minecraft
         }
         thePlayer.setLastDeathCoordinate(lastDeathCoordinates);
         playerController.initPlayer(thePlayer);
-        theWorld.spawnPlayerWithLoadedChunks(thePlayer);
+        currentWorld.spawnPlayerWithLoadedChunks(thePlayer);
         thePlayer.input = new PlayerInput(this);
         thePlayer.id = j;
         thePlayer.animate4();
@@ -2673,11 +2675,17 @@ public class Minecraft
         }
     }
 
+
     @Override
     public SkinVariantList getSkinVariantList() {
         return skinVariantList;
     }
 
+    @Override
+    public Collection<String> getAvailableSoundKeys() {
+        return SoundRepository.allKeys;
+    }
+
     public boolean isAmbientOcclusionEnabled()
     {
         return gameSettings.ambientOcclusion.value;
diff --git a/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java b/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java
index e956b0a20..212d9267e 100644
--- a/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java
+++ b/src/main/java/net/minecraft/client/discord/RichPresenceHandlerThread.java
@@ -145,7 +145,7 @@ public class RichPresenceHandlerThread extends Thread {
         activity.assets().setLargeImage("bta-logo");
         activity.timestamps().setStart(startTime);
 
-        if (minecraft.theWorld == null) {
+        if (minecraft.currentWorld == null) {
             activity.setState("In the main menu");
         } else if (minecraft.thePlayer != null) {
             if (minecraft.thePlayer instanceof PlayerLocalMultiplayer) {
@@ -161,8 +161,8 @@ public class RichPresenceHandlerThread extends Thread {
                 }
             }
             Dimension activeDimension = Dimension.getDimensionList().get(minecraft.thePlayer.dimension);
-            Biome biome = minecraft.theWorld.getBlockBiome((int) minecraft.thePlayer.x, (int) minecraft.thePlayer.y, (int) minecraft.thePlayer.z);
-            Weather weather = minecraft.theWorld.getCurrentWeather();
+            Biome biome = minecraft.currentWorld.getBlockBiome((int) minecraft.thePlayer.x, (int) minecraft.thePlayer.y, (int) minecraft.thePlayer.z);
+            Weather weather = minecraft.currentWorld.getCurrentWeather();
 
             boolean displayDimension = activeDimension != null && dimensionNamesMap.containsKey(activeDimension);
             boolean displayBiome = biome != null && biomeNamesMap.containsKey(biome);
diff --git a/src/main/java/net/minecraft/client/entity/particle/ParticleDispatcher.java b/src/main/java/net/minecraft/client/entity/particle/ParticleDispatcher.java
index d0bd0297e..32d9a47d9 100644
--- a/src/main/java/net/minecraft/client/entity/particle/ParticleDispatcher.java
+++ b/src/main/java/net/minecraft/client/entity/particle/ParticleDispatcher.java
@@ -4,11 +4,13 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.util.dispatch.Dispatcher;
+import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.animal.MobFireflyCluster;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.Items;
+import net.minecraft.core.net.command.arguments.ArgumentTypeParticleId;
 import net.minecraft.core.util.helper.BlockParticleHelper;
 import net.minecraft.core.util.helper.MathHelper;
 
@@ -16,7 +18,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 public final class ParticleDispatcher extends Dispatcher<String, ParticleLambda> {
-    private static final ParticleDispatcher INSTANCE = new ParticleDispatcher();
+    private static ParticleDispatcher INSTANCE = new ParticleDispatcher();
     private static final ParticleLambda BLANK = (world, x, y, z, motionX, motionY, motionZ, data) -> null;
 
     public static ParticleDispatcher getInstance() {
@@ -33,6 +35,7 @@ public final class ParticleDispatcher extends Dispatcher<String, ParticleLambda>
     }
 
     private ParticleDispatcher() {
+        INSTANCE = this;
         Minecraft mc = Minecraft.getMinecraft(this);
         addDispatch("bubble", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleBubble(world, x, y, z, motionX, motionY, motionZ, true));
         addDispatch("smoke", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleSmoke(world, x, y, z, motionX, motionY, motionX));
@@ -46,7 +49,8 @@ public final class ParticleDispatcher extends Dispatcher<String, ParticleLambda>
         addDispatch("footstep", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleFootstep(mc.textureManager, world, x, y, z));
         addDispatch("splash", (world1, d, d1, d2, d3, d4, d5, data) -> new ParticleSplash(world1, d, d1, d2, d3, d4, d5));
         addDispatch("largesmoke", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleSmoke(world, x, y, z, motionX, motionY, motionX, 2.5f));
-        addDispatch("reddust", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleRedstoneDust(world, x, y, z, (float) motionX, (float) motionY, (float) motionZ, data));
+        addDispatch("puffrgb", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticlePuffRGB(world, x, y, z, (float) motionX, (float) motionY, (float) motionZ, data));
+        addDispatch("reddust", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleRedstoneDust(world, x, y, z, data));
         addDispatch("item", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleItemBreaking(world, x, y, z, Item.itemsList[MathHelper.clamp(data, 0, Item.itemsList.length - 1)]));
         addDispatch("block", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleBlockBreaking(world, x, y, z, motionX, motionY, motionZ, Block.blocksList[BlockParticleHelper.decodeBlockID(data)], BlockParticleHelper.decodeBlockSide(data), BlockParticleHelper.decodeBlockMeta(data)).init((int) x, (int) y, (int) z));
         addDispatch("snowshovel", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleSnowShovel(world, x, y, z, motionX, motionY, motionX));
@@ -74,5 +78,14 @@ public final class ParticleDispatcher extends Dispatcher<String, ParticleLambda>
             return new ParticleFluidDrip(world, x, y, z, color, TextureRegistry.getTexture("minecraft:block/water_flowing"));
         });
         addDispatch("dripLava", (world, x, y, z, motionX, motionY, motionZ, data) -> new ParticleFluidDrip(world, x, y, z, 0xFFFFFF, TextureRegistry.getTexture("minecraft:block/lava_flowing")).setFullBright());
+
+        if (Global.ASSERTIONS_ENABLED) {
+            for (String s : INSTANCE.getParticleIds()) {
+                assert ArgumentTypeParticleId.particleIds.contains(s) : "ArgumentTypeParticleId is missing id " + s + "!";
+            }
+            for (String s : ArgumentTypeParticleId.particleIds) {
+                assert dispatches.containsKey(s) : "ArgumentTypeParticleId defined particle " + s + " which doesn't have an assigned particle lambda!";
+            }
+        }
     }
 }
diff --git a/src/main/java/net/minecraft/client/entity/particle/ParticlePuffRGB.java b/src/main/java/net/minecraft/client/entity/particle/ParticlePuffRGB.java
new file mode 100644
index 000000000..51abc180b
--- /dev/null
+++ b/src/main/java/net/minecraft/client/entity/particle/ParticlePuffRGB.java
@@ -0,0 +1,108 @@
+package net.minecraft.client.entity.particle;
+
+import net.minecraft.client.render.LightmapHelper;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.enums.LightLayer;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.world.World;
+
+public class ParticlePuffRGB extends Particle {
+    private final float oSize;
+    private int brightness;
+
+    public ParticlePuffRGB(World world, double x, double y, double z, float red, float green, float blue, int brightness) {
+        this(world, x, y, z, 1.0F, red, green, blue, brightness);
+    }
+
+    public ParticlePuffRGB(World world, double x, double y, double z, float scale, float red, float green, float blue, int brightness) {
+        super(world, x, y, z, 0.0D, 0.0D, 0.0D);
+        this.brightness = -1;
+        if (brightness >= 0) {
+            this.brightness = brightness;
+        }
+        this.xd *= 0.1D;
+        this.yd *= 0.1D;
+        this.zd *= 0.1D;
+        float n = (float) Math.random() * 0.4F + 0.6F;
+        this.rCol = ((float) (Math.random() * 0.2D) + 0.8F) * red * n;
+        this.gCol = ((float) (Math.random() * 0.2D) + 0.8F) * green * n;
+        this.bCol = ((float) (Math.random() * 0.2D) + 0.8F) * blue * n;
+        this.size *= 0.75F;
+        this.size *= scale;
+        this.oSize = this.size;
+        this.lifetime = (int) (8D / (Math.random() * 0.8D + 0.2D));
+        this.lifetime *= (int) scale;
+        this.noPhysics = false;
+    }
+
+    @Override
+    public void render(Tessellator t, float partialTick, double xOff, double yOff, double zOff, float xa, float ya, float za, float xa2, float za2) {
+        float l = ((this.age + partialTick) / this.lifetime) * 32F;
+        if (l < 0.0F) {
+            l = 0.0F;
+        }
+        if (l > 1.0F) {
+            l = 1.0F;
+        }
+        this.size = this.oSize * l;
+        if (this.tex == null) return;
+
+        float u0 = (float) this.tex.getIconUMin();
+        float u2 = (float) this.tex.getSubIconU(1);
+        float v0 = (float) this.tex.getIconVMin();
+        float v2 = (float) this.tex.getSubIconV(1);
+        float r = 0.1F * this.size;
+        float x = (float) (this.xo + (this.x - this.xo) * partialTick - xOff);
+        float y = (float) (this.yo + (this.y - this.yo) * partialTick - yOff);
+        float z = (float) (this.zo + (this.z - this.zo) * partialTick - zOff);
+        float br = 1f;
+        if (LightmapHelper.isLightmapEnabled()) {
+            int xTile = MathHelper.floor(this.x);
+            int yTile = MathHelper.floor(this.y);
+            int zTile = MathHelper.floor(this.z);
+            int lmc;
+            if (this.brightness >= 0) {
+                lmc = LightmapHelper.getLightmapCoord(this.world.getSavedLightValue(LightLayer.Sky, xTile, yTile, zTile), Math.max(this.world.getSavedLightValue(LightLayer.Block, xTile, yTile, zTile), this.brightness));
+            } else {
+                lmc = getLightmapCoord(partialTick);
+            }
+            t.setLightmapCoord(lmc);
+        } else {
+            br = Math.max(getBrightness(partialTick), this.brightness / 15f);
+        }
+        t.setColorOpaque_F(this.rCol * br, this.gCol * br, this.bCol * br);
+        t.addVertexWithUV(x - xa * r - xa2 * r, y - ya * r, z - za * r - za2 * r, u2, v2);
+        t.addVertexWithUV(x - xa * r + xa2 * r, y + ya * r, z - za * r + za2 * r, u2, v0);
+        t.addVertexWithUV(x + xa * r + xa2 * r, y + ya * r, z + za * r + za2 * r, u0, v0);
+        t.addVertexWithUV(x + xa * r - xa2 * r, y - ya * r, z + za * r - za2 * r, u0, v2);
+    }
+
+    @Override
+    public void tick() {
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        if (this.age++ >= this.lifetime) {
+            this.remove();
+        }
+        int val = (7 - ((this.age * 8) / this.lifetime));
+        if (val >= 0) {
+            this.tex = TextureRegistry.getTexture("minecraft:particle/puff_" + val);
+        } else {
+            this.tex = null;
+        }
+        this.move(this.xd, this.yd, this.zd);
+        if (this.y == this.yo) {
+            this.xd *= 1.1D;
+            this.zd *= 1.1D;
+        }
+        this.xd *= 0.96D;
+        this.yd *= 0.96D;
+        this.zd *= 0.96D;
+        if (this.onGround) {
+            this.xd *= 0.7D;
+            this.zd *= 0.7D;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/entity/particle/ParticleRedstoneDust.java b/src/main/java/net/minecraft/client/entity/particle/ParticleRedstoneDust.java
index 1dc9ee71b..77c9b3129 100644
--- a/src/main/java/net/minecraft/client/entity/particle/ParticleRedstoneDust.java
+++ b/src/main/java/net/minecraft/client/entity/particle/ParticleRedstoneDust.java
@@ -1,9 +1,11 @@
 package net.minecraft.client.entity.particle;
 
 import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.client.util.helper.Colors;
 import net.minecraft.core.enums.LightLayer;
+import net.minecraft.core.util.helper.Color;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 
@@ -11,11 +13,11 @@ public class ParticleRedstoneDust extends Particle {
     private final float oSize;
     private int brightness;
 
-    public ParticleRedstoneDust(World world, double x, double y, double z, float red, float green, float blue, int brightness) {
-        this(world, x, y, z, 1.0F, red, green, blue, brightness);
+    public ParticleRedstoneDust(World world, double x, double y, double z, int brightness) {
+        this(world, x, y, z, 1.0F, brightness);
     }
 
-    public ParticleRedstoneDust(World world, double x, double y, double z, float scale, float red, float green, float blue, int brightness) {
+    public ParticleRedstoneDust(World world, double x, double y, double z, float scale, int brightness) {
         super(world, x, y, z, 0.0D, 0.0D, 0.0D);
         this.brightness = -1;
         if (brightness >= 0) {
@@ -25,6 +27,12 @@ public class ParticleRedstoneDust extends Particle {
         this.yd *= 0.1D;
         this.zd *= 0.1D;
         float n = (float) Math.random() * 0.4F + 0.6F;
+
+        Color color = Colors.allRedstoneColors[MathHelper.clamp(brightness, 0, Colors.allRedstoneColors.length)];
+        float red = color.getRed() / 255.0f;
+        float green = color.getGreen() / 255.0f;
+        float blue = color.getBlue() / 255.0f;
+
         this.rCol = ((float) (Math.random() * 0.2D) + 0.8F) * red * n;
         this.gCol = ((float) (Math.random() * 0.2D) + 0.8F) * green * n;
         this.bCol = ((float) (Math.random() * 0.2D) + 0.8F) * blue * n;
diff --git a/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java b/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java
index 7e84bd66d..9e1fa0388 100644
--- a/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java
+++ b/src/main/java/net/minecraft/client/entity/player/PlayerLocal.java
@@ -335,7 +335,7 @@ public class PlayerLocal extends Player
     public void onItemPickup(Entity entity, ItemStack item)
     {
         addStat(item.getItem().getStat(StatList.STAT_PICKED_UP), 1);
-        mc.particleEngine.add(new ParticlePickupAnimation(mc.theWorld, entity, this, -0.5F));
+        mc.particleEngine.add(new ParticlePickupAnimation(mc.currentWorld, entity, this, -0.5F));
     }
 
     public int getPlayerProtectionAmount()
diff --git a/src/main/java/net/minecraft/client/gui/Gui.java b/src/main/java/net/minecraft/client/gui/Gui.java
index 63ab05fa1..355a19db6 100644
--- a/src/main/java/net/minecraft/client/gui/Gui.java
+++ b/src/main/java/net/minecraft/client/gui/Gui.java
@@ -2,7 +2,7 @@ package net.minecraft.client.gui;
 
 import static org.lwjgl.opengl.GL11.*;
 
-import net.minecraft.client.lang.text.Text;
+import net.minecraft.core.lang.text.Text;
 import net.minecraft.client.render.Font;
 import net.minecraft.client.render.TextureManager;
 import net.minecraft.client.render.texture.Texture;
@@ -10,8 +10,6 @@ import net.minecraft.client.render.texture.meta.gui.GuiTextureProperties;
 import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.tessellator.Tessellator;
 
-import net.minecraft.client.render.texture.stitcher.TextureRegistry;
-import net.minecraft.core.util.helper.Color;
 import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.opengl.GL11;
 
diff --git a/src/main/java/net/minecraft/client/gui/Screen.java b/src/main/java/net/minecraft/client/gui/Screen.java
index 494c62451..04e5939b2 100644
--- a/src/main/java/net/minecraft/client/gui/Screen.java
+++ b/src/main/java/net/minecraft/client/gui/Screen.java
@@ -146,7 +146,7 @@ public abstract class Screen extends Gui {
     }
 
     public void renderBackground() {
-        if (mc.theWorld != null) {
+        if (mc.currentWorld != null) {
             int color = mc.gameSettings.guiBackgroundColor.value.getARGB();
             drawGradientRect(0, 0, width, height, color, color);
         } else {
diff --git a/src/main/java/net/minecraft/client/gui/ScreenCreateWorld.java b/src/main/java/net/minecraft/client/gui/ScreenCreateWorld.java
index 421bbc415..0de6dc236 100644
--- a/src/main/java/net/minecraft/client/gui/ScreenCreateWorld.java
+++ b/src/main/java/net/minecraft/client/gui/ScreenCreateWorld.java
@@ -135,7 +135,7 @@ public class ScreenCreateWorld extends Screen {
                 mc.thePlayer.inventory.insertItem(Items.TOOL_AXE_WOOD.getDefaultStack(), true);
             }
             if (mc.worldPresetName != null) mc.thePlayer.setPos(overrideSpawnX, overrideSpawnY, overrideSpawnZ);
-            mc.theWorld.getLevelData().setCheatsEnabled(cheatsEnabled);
+            mc.currentWorld.getLevelData().setCheatsEnabled(cheatsEnabled);
             mc.displayScreen(null);
         } else if (button == gamemodeButton) {
             I18n i18n = I18n.getInstance();
diff --git a/src/main/java/net/minecraft/client/gui/ScreenCredits.java b/src/main/java/net/minecraft/client/gui/ScreenCredits.java
index 3a48b3a61..473ec6d56 100644
--- a/src/main/java/net/minecraft/client/gui/ScreenCredits.java
+++ b/src/main/java/net/minecraft/client/gui/ScreenCredits.java
@@ -224,7 +224,7 @@ public class ScreenCredits extends Screen {
     }
 
     private void overlayBackground(int minX, int maxX, int minY, int maxY) {
-        if (mc.theWorld == null) {
+        if (mc.currentWorld == null) {
             Tessellator tessellator = Tessellator.instance;
             mc.textureManager.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
             GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
diff --git a/src/main/java/net/minecraft/client/gui/ScreenGameOver.java b/src/main/java/net/minecraft/client/gui/ScreenGameOver.java
index 3eb517bb8..317c7110f 100644
--- a/src/main/java/net/minecraft/client/gui/ScreenGameOver.java
+++ b/src/main/java/net/minecraft/client/gui/ScreenGameOver.java
@@ -57,7 +57,7 @@ public class ScreenGameOver extends Screen
         if(button.id == 2)
         {
             if (mc.isMultiplayerWorld()) {
-                mc.theWorld.sendQuittingDisconnectingPacket();
+                mc.currentWorld.sendQuittingDisconnectingPacket();
             }
             mc.changeWorld(null);
             mc.displayScreen(new ScreenMainMenu());
diff --git a/src/main/java/net/minecraft/client/gui/ScreenLabelEditor.java b/src/main/java/net/minecraft/client/gui/ScreenLabelEditor.java
index 31c650846..c928bc18d 100644
--- a/src/main/java/net/minecraft/client/gui/ScreenLabelEditor.java
+++ b/src/main/java/net/minecraft/client/gui/ScreenLabelEditor.java
@@ -56,7 +56,7 @@ public class ScreenLabelEditor extends Screen
         	item.setCustomName(text);
             mc.displayScreen(null);
 
-            if (mc.theWorld.isClientSide)
+            if (mc.currentWorld.isClientSide)
             {
                 mc.getSendQueue().addToSendQueue(new SetItemNamePacket(slot, text));
             }
diff --git a/src/main/java/net/minecraft/client/gui/ScreenMobPicker.java b/src/main/java/net/minecraft/client/gui/ScreenMobPicker.java
index 2e0249903..197fde605 100644
--- a/src/main/java/net/minecraft/client/gui/ScreenMobPicker.java
+++ b/src/main/java/net/minecraft/client/gui/ScreenMobPicker.java
@@ -60,8 +60,8 @@ public class ScreenMobPicker
             .withOnCloseListener((statusCode, results) -> {
                 if (statusCode == 1) {
                     mobId = monsters.get((Integer) results.get("list"));
-                    if (!mc.theWorld.isClientSide) {
-                        TileEntityMobSpawner spawner = (TileEntityMobSpawner) mc.theWorld.getBlockEntity(x, y, z);
+                    if (!mc.currentWorld.isClientSide) {
+                        TileEntityMobSpawner spawner = (TileEntityMobSpawner) mc.currentWorld.getBlockEntity(x, y, z);
                         if (spawner == null) {
                             return;
                         }
diff --git a/src/main/java/net/minecraft/client/gui/ScreenPause.java b/src/main/java/net/minecraft/client/gui/ScreenPause.java
index d6d91d239..fa3b0380b 100644
--- a/src/main/java/net/minecraft/client/gui/ScreenPause.java
+++ b/src/main/java/net/minecraft/client/gui/ScreenPause.java
@@ -67,7 +67,7 @@ public class ScreenPause extends Screen
             mc.statsCounter.add(StatList.leaveGameStat, 1);
             if(mc.isMultiplayerWorld())
             {
-                mc.theWorld.sendQuittingDisconnectingPacket();
+                mc.currentWorld.sendQuittingDisconnectingPacket();
                 Registries.RECIPES = Registries.RECIPES_LOCAL_COPY;
                 GuidebookPageSearch.searchField.setText("");
                 GuidebookPageManager.searchQuery = SearchQuery.resolve(GuidebookPageSearch.searchField.getText());
@@ -114,11 +114,11 @@ public class ScreenPause extends Screen
     {
         I18n i = I18n.getInstance();
         renderBackground();
-        if(mc == null || mc.theWorld == null) {
+        if(mc == null || mc.currentWorld == null) {
         	mc.displayScreen(null);
         	return;
         }
-        boolean isSaving = !mc.theWorld.pauseScreenSave(updateCounter2++);
+        boolean isSaving = !mc.currentWorld.pauseScreenSave(updateCounter2++);
         if(isSaving || updateCounter < 20)
         {
             float f1 = ((float)(updateCounter % 10) + partialTick) / 10F;
diff --git a/src/main/java/net/minecraft/client/gui/ScreenPhotoMode.java b/src/main/java/net/minecraft/client/gui/ScreenPhotoMode.java
index bc9e7ffc3..2f0f807b9 100644
--- a/src/main/java/net/minecraft/client/gui/ScreenPhotoMode.java
+++ b/src/main/java/net/minecraft/client/gui/ScreenPhotoMode.java
@@ -88,8 +88,8 @@ public class ScreenPhotoMode extends Screen
         }
         
         this.previousRenderer = mc.renderer;
-        mc.theWorld.updateSeasonAndLight();
-        originalTOD = mc.theWorld.getWorldTime();
+        mc.currentWorld.updateSeasonAndLight();
+        originalTOD = mc.currentWorld.getWorldTime();
     }
 
     public float getRotation(float partialTick)
@@ -165,7 +165,7 @@ public class ScreenPhotoMode extends Screen
             mc.setRenderer(photoModeRenderer);
         }
 
-        if (!mc.theWorld.isClientSide) {
+        if (!mc.currentWorld.isClientSide) {
             buttons.add(sliderTimeOfDay);
             buttons.add(sliderFog);
             buttons.add(buttonSeason);
@@ -204,13 +204,13 @@ public class ScreenPhotoMode extends Screen
     @Override
     public void removed()
     {
-        mc.theWorld.setWorldTimeUpdateTicks(originalTOD);
+        mc.currentWorld.setWorldTimeUpdateTicks(originalTOD);
         
         if(Shaders.enableShaders) {
             mc.setRenderer(previousRenderer);
         }
 
-        mc.theWorld.updateSeasonAndLight();
+        mc.currentWorld.updateSeasonAndLight();
     }
 
     @Override
@@ -240,8 +240,8 @@ public class ScreenPhotoMode extends Screen
                 desiredDay = (long) Global.DAY_LENGTH_TICKS * 7 * desiredSeason + Global.DAY_LENGTH_TICKS * 3L;
             }
 
-            mc.theWorld.setWorldTimeUpdateTicks(desiredDay + desiredTOD);
-            mc.theWorld.updateSeasonAndLight();
+            mc.currentWorld.setWorldTimeUpdateTicks(desiredDay + desiredTOD);
+            mc.currentWorld.updateSeasonAndLight();
         }
         else if (button == buttonTakeScreenshot)
         {
@@ -407,8 +407,8 @@ public class ScreenPhotoMode extends Screen
                 desiredTOD = sliderTOD;
             }
 
-            mc.theWorld.setWorldTimeUpdateTicks(desiredDay + desiredTOD);
-            mc.theWorld.updateSeasonAndLight();
+            mc.currentWorld.setWorldTimeUpdateTicks(desiredDay + desiredTOD);
+            mc.currentWorld.updateSeasonAndLight();
 
             updateButtonsText();
         }
diff --git a/src/main/java/net/minecraft/client/gui/ScreenSignEditor.java b/src/main/java/net/minecraft/client/gui/ScreenSignEditor.java
index aa5c6720d..1e7dc56f8 100644
--- a/src/main/java/net/minecraft/client/gui/ScreenSignEditor.java
+++ b/src/main/java/net/minecraft/client/gui/ScreenSignEditor.java
@@ -45,7 +45,7 @@ public class ScreenSignEditor extends Screen
         Keyboard.enableRepeatEvents(false);
         // I have no idea how the hell the world is null sometimes
         // but thaboar was getting a crash from the world being null
-        if(mc.theWorld != null && mc.theWorld.isClientSide)
+        if(mc.currentWorld != null && mc.currentWorld.isClientSide)
         {
             mc.getSendQueue().addToSendQueue(new SignUpdatePacket(entitySign.x, entitySign.y, entitySign.z, entitySign.signText, entitySign.getPicture().getId(), entitySign.getColor().id));
         }
diff --git a/src/main/java/net/minecraft/client/gui/ScreenSoundTest.java b/src/main/java/net/minecraft/client/gui/ScreenSoundTest.java
index 58a2f9a78..410b6b9fc 100644
--- a/src/main/java/net/minecraft/client/gui/ScreenSoundTest.java
+++ b/src/main/java/net/minecraft/client/gui/ScreenSoundTest.java
@@ -175,7 +175,7 @@ public class ScreenSoundTest extends Screen {
     public void renderBackground() {
         super.renderBackground();
 
-        if (mc.theWorld == null)
+        if (mc.currentWorld == null)
         {
             Tessellator tessellator = Tessellator.instance;
             mc.textureManager.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
@@ -211,7 +211,7 @@ public class ScreenSoundTest extends Screen {
 
     private void overlayBackground(int minX, int maxX, int minY, int maxY)
     {
-        if (mc.theWorld == null)
+        if (mc.currentWorld == null)
         {
             Tessellator tessellator = Tessellator.instance;
             mc.textureManager.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
diff --git a/src/main/java/net/minecraft/client/gui/ScreenTextureViewer.java b/src/main/java/net/minecraft/client/gui/ScreenTextureViewer.java
index ceca4cbfd..24bc5aa4f 100644
--- a/src/main/java/net/minecraft/client/gui/ScreenTextureViewer.java
+++ b/src/main/java/net/minecraft/client/gui/ScreenTextureViewer.java
@@ -208,7 +208,7 @@ public class ScreenTextureViewer extends Screen {
     public void renderBackground() {
         super.renderBackground();
 
-        if (mc.theWorld == null)
+        if (mc.currentWorld == null)
         {
             Tessellator tessellator = Tessellator.instance;
             mc.textureManager.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
diff --git a/src/main/java/net/minecraft/client/gui/ScreenWandMobPicker.java b/src/main/java/net/minecraft/client/gui/ScreenWandMobPicker.java
index fad7d17c6..648a958f7 100644
--- a/src/main/java/net/minecraft/client/gui/ScreenWandMobPicker.java
+++ b/src/main/java/net/minecraft/client/gui/ScreenWandMobPicker.java
@@ -54,7 +54,7 @@ public class ScreenWandMobPicker extends Screen {
                 .withOnCloseListener((statusCode, results) -> {
                     if (statusCode == 1) {
                         mobId = monsters.get((Integer) results.get("list"));
-                        if (!mc.theWorld.isClientSide) {
+                        if (!mc.currentWorld.isClientSide) {
                             wand.getData().putString("monster", mobId);
                         } else {
                             mc.getSendQueue().addToSendQueue(new CustomPayloadPacket("BTA|WandMonster", mobId.getBytes(StandardCharsets.UTF_8)));
diff --git a/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java b/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java
index 652d1b877..39f482a97 100644
--- a/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java
+++ b/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java
@@ -153,7 +153,7 @@ public class ScreenAchievements extends Screen
         int achMaxX = Integer.MIN_VALUE;
         int achMaxY = Integer.MIN_VALUE;
 
-        for (Achievement ach : currentPage.getAchievements()){
+        for (AchievementPage.AchievementEntry ach : currentPage.getAchievementEntries()){
             if (ach.x < achMinX){
                 achMinX = ach.x;
             }
@@ -179,7 +179,7 @@ public class ScreenAchievements extends Screen
         shiftMaxY += (int) (viewportHeight/4d);
 
         // Centers the screen on the Open ContainerInventory achievement
-        Achievement ach = currentPage.onOpenAchievement();
+        AchievementPage.AchievementEntry ach = currentPage.onOpenAchievement();
         oldShiftX = targetShiftX = currentShiftX = ach.x * ACHIEVEMENT_CELL_WIDTH + ACHIEVEMENT_CELL_WIDTH/2d;
         oldShiftY = targetShiftY = currentShiftY = ach.y * ACHIEVEMENT_CELL_HEIGHT + ACHIEVEMENT_CELL_HEIGHT/2d;
     }
@@ -399,12 +399,6 @@ public class ScreenAchievements extends Screen
 
             if (hoveredPage != null){
                 String msg = font.wrapFormattedStringToWidth(hoveredPage.getDescription(), TOOLTIP_BOX_WIDTH_MIN);
-                int completed = 0;
-                for (Achievement a : hoveredPage.getAchievements()){
-                    if (statsCounter.isUnlocked(a)){
-                        completed++;
-                    }
-                }
                 msg += "\n" + TextFormatting.LIGHT_GRAY + I18n.getInstance().translateKeyAndFormat("gui.achievements.label.completion",  Math.round(hoveredPage.getCompletionFraction(statsCounter) * 100) + "%");
                 tooltip.render(msg, xm, ym, TOOLTIP_OFF_X, TOOLTIP_OFF_Y);
             }
@@ -526,7 +520,7 @@ public class ScreenAchievements extends Screen
                 layer.resize(tilesWide, tilesTall);
             }
 
-            long worldSeed = mc.theWorld == null ? 0 : mc.theWorld.getRandomSeed();
+            long worldSeed = mc.currentWorld == null ? 0 : mc.currentWorld.getRandomSeed();
             for (int _y = 0; _y < tilesTall; _y++){
                 for (int _x = 0; _x < tilesWide; _x++) {
                     int tileX = orgX + _x + viewTileX;
@@ -729,17 +723,19 @@ public class ScreenAchievements extends Screen
     private void drawConnectingLines(int mouseX, int mouseY, double shiftX, double shiftY){
         double zoom = viewportZoom;
 
-        for(Achievement ach : currentPage.getAchievements()) {
-            if(ach.parent == null) {
+        for(AchievementPage.AchievementEntry entry : currentPage.getAchievementEntries()) {
+            Achievement ach = entry.achievement;
+            AchievementPage.AchievementEntry parentEntry = currentPage.getEntry(ach.parent);
+            if(parentEntry == null) {
                 continue;
             }
             if (!currentPage.hasAchievement(ach) || !currentPage.hasAchievement(ach.parent)){
                 continue;
             }
-            double childX = (viewportLeft + viewportWidth/2d) + ((ach.x * ACHIEVEMENT_CELL_WIDTH - shiftX) + 11) * zoom;
-            double childY = (viewportTop + viewportHeight/2d) + ((ach.y * ACHIEVEMENT_CELL_HEIGHT - shiftY) + 11) * zoom;
-            double parentX = (viewportLeft + viewportWidth/2d) + ((ach.parent.x * ACHIEVEMENT_CELL_WIDTH - shiftX) + 11) * zoom;
-            double parentY = (viewportTop + viewportHeight/2d) + ((ach.parent.y * ACHIEVEMENT_CELL_HEIGHT - shiftY) + 11) * zoom;
+            double childX = (viewportLeft + viewportWidth/2d) + ((entry.x * ACHIEVEMENT_CELL_WIDTH - shiftX) + 11) * zoom;
+            double childY = (viewportTop + viewportHeight/2d) + ((entry.y * ACHIEVEMENT_CELL_HEIGHT - shiftY) + 11) * zoom;
+            double parentX = (viewportLeft + viewportWidth/2d) + ((parentEntry.x * ACHIEVEMENT_CELL_WIDTH - shiftX) + 11) * zoom;
+            double parentY = (viewportTop + viewportHeight/2d) + ((parentEntry.y * ACHIEVEMENT_CELL_HEIGHT - shiftY) + 11) * zoom;
             boolean unlocked = statsCounter.isUnlocked(ach);
             boolean canUnlock = statsCounter.canUnlock(ach);
 
@@ -787,9 +783,10 @@ public class ScreenAchievements extends Screen
         double zoom = viewportZoom;
 
         Achievement hoveredAchievment = null;
-        for(Achievement ach : currentPage.getAchievements()) {
-            double achViewX = (viewportLeft + viewportWidth/2d) + (ach.x * ACHIEVEMENT_CELL_WIDTH - shiftX ) * zoom;
-            double achViewY = (viewportTop + viewportHeight/2d) + (ach.y * ACHIEVEMENT_CELL_HEIGHT - shiftY) * zoom;
+        for(AchievementPage.AchievementEntry entry : currentPage.getAchievementEntries()) {
+            Achievement ach = entry.achievement;
+            double achViewX = (viewportLeft + viewportWidth/2d) + (entry.x * ACHIEVEMENT_CELL_WIDTH - shiftX ) * zoom;
+            double achViewY = (viewportTop + viewportHeight/2d) + (entry.y * ACHIEVEMENT_CELL_HEIGHT - shiftY) * zoom;
             if(achViewX < viewportLeft - ACHIEVEMENT_CELL_WIDTH * zoom || achViewY < viewportTop - ACHIEVEMENT_CELL_HEIGHT * zoom || achViewX > viewportRight || achViewY > viewportBottom) { // Continue if outside viewport
                 continue;
             }
diff --git a/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPage.java b/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPage.java
index 689a41eeb..70521a8a7 100644
--- a/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPage.java
+++ b/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPage.java
@@ -12,22 +12,27 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Random;
 
 public abstract class AchievementPage {
-    private final List<Achievement> achievementList = new ArrayList<>();
+    private final Map<Achievement, AchievementEntry> entryMap = new HashMap<>();
+    private final List<AchievementEntry> achievementList = new ArrayList<>();
 
     public abstract @NotNull String getName();
 
     public abstract @NotNull String getDescription();
 
-    public void addAchievement(@NotNull Achievement achievement) {
-        achievementList.add(Objects.requireNonNull(achievement));
+    public void addAchievement(@NotNull Achievement achievement, int x, int y) {
+        AchievementEntry entry = new AchievementEntry(Objects.requireNonNull(achievement), x, y);
+        achievementList.add(entry);
+        entryMap.put(achievement, entry);
     }
 
-    public abstract @NotNull Achievement onOpenAchievement();
+    public abstract @NotNull AchievementEntry onOpenAchievement();
 
     public abstract @Nullable IconCoordinate getBackgroundTile(ScreenAchievements screen, int layer, Random random, int tileX, int tileY);
 
@@ -35,14 +40,18 @@ public abstract class AchievementPage {
 
     public abstract @NotNull ItemStack getIcon();
 
-    public @NotNull List<Achievement> getAchievements() {
+    public @NotNull List<AchievementEntry> getAchievementEntries() {
         return achievementList;
     }
 
+    public @Nullable AchievementEntry getEntry(Achievement achievement) {
+        return entryMap.get(achievement);
+    }
+
     public double getCompletionFraction(StatsCounter counter) {
         int completed = 0;
-        for (Achievement a : achievementList) {
-            if (counter.isUnlocked(a)) {
+        for (AchievementEntry a : achievementList) {
+            if (counter.isUnlocked(a.achievement)) {
                 completed++;
             }
         }
@@ -54,7 +63,7 @@ public abstract class AchievementPage {
     public abstract int backgroundColor();
 
     public boolean hasAchievement(Achievement achievement) {
-        return achievementList.contains(achievement);
+        return entryMap.containsKey(achievement);
     }
 
     public abstract IconCoordinate getAchievementIcon(Achievement achievement);
@@ -68,4 +77,15 @@ public abstract class AchievementPage {
     public static IconCoordinate getTextureFromBlock(Block block) {
         return BlockModelDispatcher.getInstance().getDispatch(block).getBlockTextureFromSideAndMetadata(Side.TOP, 0);
     }
+
+    public static class AchievementEntry {
+        public final int x;
+        public final int y;
+        public final @NotNull Achievement achievement;
+        public AchievementEntry(@NotNull Achievement achievement, int x, int y) {
+            this.achievement = achievement;
+            this.x = x;
+            this.y = y;
+        }
+    }
 }
diff --git a/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPages.java b/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPages.java
index 9ea666060..7e1f912c4 100644
--- a/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPages.java
+++ b/src/main/java/net/minecraft/client/gui/achievements/data/AchievementPages.java
@@ -19,10 +19,50 @@ public class AchievementPages {
         if (hasInit) return;
         hasInit = true;
         overworldPage = register(new AchievementPageOverworld("gui.achievements.page.overworld", Blocks.GRASS.getDefaultStack()));
+        overworldPage.addAchievement(Achievements.OPEN_INVENTORY, 0, 0);
+        overworldPage.addAchievement(Achievements.MINE_WOOD, 2, 1);
+        overworldPage.addAchievement(Achievements.BUILD_WORKBENCH, 4, -1);
+        overworldPage.addAchievement(Achievements.BUILD_PICKAXE, 4, 2);
+        overworldPage.addAchievement(Achievements.BUILD_FURNACE, 3, 4);
+        overworldPage.addAchievement(Achievements.ACQUIRE_IRON, 1, 4);
+        overworldPage.addAchievement(Achievements.GET_DIAMONDS, -1, 4);
+        overworldPage.addAchievement(Achievements.BUILD_HOE, 1, -3);
+        overworldPage.addAchievement(Achievements.MAKE_BREAD, -2, -3);
+        overworldPage.addAchievement(Achievements.BAKE_CAKE, -1, -5);
+        overworldPage.addAchievement(Achievements.CRAFT_ICECREAM, 1, -6);
+        overworldPage.addAchievement(Achievements.CRAFT_PUMPKIN_PIE, -1, -1);
+        overworldPage.addAchievement(Achievements.BUILD_BETTER_PICKAXE, 6, 2);
+        overworldPage.addAchievement(Achievements.COOK_FISH, 2, 6);
+        overworldPage.addAchievement(Achievements.ON_A_RAIL, 2, 3);
+        overworldPage.addAchievement(Achievements.BUILD_SWORD, 6, -1);
+        overworldPage.addAchievement(Achievements.ALL_ARMOR_TYPES, 13, 1);
+        overworldPage.addAchievement(Achievements.KILL_ENEMY, 8, -1);
+        overworldPage.addAchievement(Achievements.KILL_COW, 7, -3);
+        overworldPage.addAchievement(Achievements.FLY_PIG, 8, -4);
+        overworldPage.addAchievement(Achievements.GET_SENSED, 9, -3);
+        overworldPage.addAchievement(Achievements.CRAFT_HANDCANNON, 8, 2);
+        overworldPage.addAchievement(Achievements.COLLECT_STONE, 5, 4);
+        overworldPage.addAchievement(Achievements.CRUSH_BLOCKS, 7, 4);
+        overworldPage.addAchievement(Achievements.REPAIR_ARMOR, 9, 0);
+        overworldPage.addAchievement(Achievements.GET_CHAINMAIL, 11, 0);
+        overworldPage.addAchievement(Achievements.OPEN_GUIDEBOOK, 0, 2);
+        overworldPage.addAchievement(Achievements.CAUGHT_EM_ALL, 4, -4);
+        overworldPage.addAchievement(Achievements.ALL_MUSIC_DISCS, -3, 4);
+        overworldPage.addAchievement(Achievements.TRIPLE_HIT, 11, -2);
+
         netherPage = register(new AchievementPageNether("gui.achievements.page.nether", Blocks.COBBLE_NETHERRACK.getDefaultStack()));
+        netherPage.addAchievement(Achievements.ENTER_NETHER, 2, 0);
+        netherPage.addAchievement(Achievements.GET_NETHERCOAL, 1, 2);
+        netherPage.addAchievement(Achievements.LIGHT_SIGN, 4, 0);
+        netherPage.addAchievement(Achievements.SWIM_NETHER, 3, 2);
+        netherPage.addAchievement(Achievements.HIT_FIREBALL, 3, -2);
+        netherPage.addAchievement(Achievements.SLEEP_NETHER, 1, -2);
+        netherPage.addAchievement(Achievements.ENTER_OLDWORLD, 0, -5);
+        netherPage.addAchievement(Achievements.ENTER_WARRENS, 0, 5);
+        netherPage.addAchievement(Achievements.MOST_WANTED, 0, -1);
+        netherPage.addAchievement(Achievements.FAST_TRAVEL, 0, 1);
     }
     static {
-        Achievements.init();
         init();
     }
 }
diff --git a/src/main/java/net/minecraft/client/gui/achievements/pages/AchievementPageNether.java b/src/main/java/net/minecraft/client/gui/achievements/pages/AchievementPageNether.java
index 2a97efc55..58d99ad0a 100644
--- a/src/main/java/net/minecraft/client/gui/achievements/pages/AchievementPageNether.java
+++ b/src/main/java/net/minecraft/client/gui/achievements/pages/AchievementPageNether.java
@@ -12,6 +12,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
 import org.jetbrains.annotations.NotNull;
 
+import java.util.Objects;
 import java.util.Random;
 
 public class AchievementPageNether extends AchievementPage {
@@ -36,8 +37,8 @@ public class AchievementPageNether extends AchievementPage {
     }
 
     @Override
-    public @NotNull Achievement onOpenAchievement() {
-        return Achievements.ENTER_NETHER;
+    public @NotNull AchievementEntry onOpenAchievement() {
+        return Objects.requireNonNull(getEntry(Achievements.ENTER_NETHER));
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/achievements/pages/AchievementPageOverworld.java b/src/main/java/net/minecraft/client/gui/achievements/pages/AchievementPageOverworld.java
index 8d5edbd90..242718d51 100644
--- a/src/main/java/net/minecraft/client/gui/achievements/pages/AchievementPageOverworld.java
+++ b/src/main/java/net/minecraft/client/gui/achievements/pages/AchievementPageOverworld.java
@@ -16,6 +16,7 @@ import net.minecraft.core.util.helper.MathHelper;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import java.util.Objects;
 import java.util.Random;
 import java.util.function.BiFunction;
 
@@ -41,8 +42,8 @@ public class AchievementPageOverworld extends AchievementPage {
     }
 
     @Override
-    public @NotNull Achievement onOpenAchievement() {
-        return Achievements.BUILD_WORKBENCH;
+    public @NotNull AchievementEntry onOpenAchievement() {
+        return Objects.requireNonNull(getEntry(Achievements.BUILD_WORKBENCH));
     }
 
     protected static final int ORE_COAL = 0;
diff --git a/src/main/java/net/minecraft/client/gui/chat/GuiElementChatSuggestions.java b/src/main/java/net/minecraft/client/gui/chat/GuiElementChatSuggestions.java
index 9607f5302..f5b571bcf 100644
--- a/src/main/java/net/minecraft/client/gui/chat/GuiElementChatSuggestions.java
+++ b/src/main/java/net/minecraft/client/gui/chat/GuiElementChatSuggestions.java
@@ -87,7 +87,7 @@ public class GuiElementChatSuggestions extends Gui {
     }
 
     public CommandManager getManager() {
-        return this.mc.theWorld == null ? new CommandManager(false) : mc.theWorld.getCommandManager();
+        return this.mc.currentWorld == null ? new CommandManager(false) : mc.currentWorld.getCommandManager();
     }
 
     public void drawScreen() {
diff --git a/src/main/java/net/minecraft/client/gui/container/ScreenFlagEditor.java b/src/main/java/net/minecraft/client/gui/container/ScreenFlagEditor.java
index 3c4c59b61..5eba67777 100644
--- a/src/main/java/net/minecraft/client/gui/container/ScreenFlagEditor.java
+++ b/src/main/java/net/minecraft/client/gui/container/ScreenFlagEditor.java
@@ -411,7 +411,7 @@ public class ScreenFlagEditor
         if (eventKey == Keyboard.KEY_ESCAPE || mc.gameSettings.keyInventory.isKeyboardKey(eventKey) || eventKey == Keyboard.KEY_BACK)
         {
     		// Flag packet needs to be sent before the close screen packet is sent!
-    		if(mc.theWorld.isClientSide) {
+    		if(mc.currentWorld.isClientSide) {
     			mc.getSendQueue().addToSendQueue(new CustomPayloadPacket("BTA|Flag", flagEntity.flagColors));
     		}
             mc.thePlayer.closeScreen();
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/mobs/GuidebookPageMob.java b/src/main/java/net/minecraft/client/gui/guidebook/mobs/GuidebookPageMob.java
index e823a6423..a9dcc739f 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/mobs/GuidebookPageMob.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/mobs/GuidebookPageMob.java
@@ -231,7 +231,7 @@ public class GuidebookPageMob
                 if (livingSound != null) {
                     Minecraft mc = Minecraft.getMinecraft(this);
                     Random random = new Random();
-                    mc.theWorld.playSoundAtEntity(null, mc.thePlayer, livingSound, 0.25f, (random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F);
+                    mc.currentWorld.playSoundAtEntity(null, mc.thePlayer, livingSound, 0.25f, (random.nextFloat() - random.nextFloat()) * 0.2F + 1.0F);
                 }
             }
         }
diff --git a/src/main/java/net/minecraft/client/gui/hud/HudIngame.java b/src/main/java/net/minecraft/client/gui/hud/HudIngame.java
index bb33b137b..77c914c5e 100644
--- a/src/main/java/net/minecraft/client/gui/hud/HudIngame.java
+++ b/src/main/java/net/minecraft/client/gui/hud/HudIngame.java
@@ -106,7 +106,7 @@ public class HudIngame extends Gui
 
         // Render pumpkin overlay
         ItemStack headSlotItem = mc.thePlayer.inventory.armorItemInSlot(IArmorItem.PIECE_HEAD);
-        if (mc.gameSettings.thirdPersonView.value == 0 && headSlotItem != null && headSlotItem.itemID == Blocks.PUMPKIN_CARVED_IDLE.id)
+        if (mc.gameSettings.thirdPersonView.value == 0 && headSlotItem != null && (headSlotItem.itemID == Blocks.PUMPKIN_CARVED_IDLE.id || headSlotItem.itemID == Blocks.PUMPKIN_REDSTONE.id))
         {
             renderPumpkinBlur(width, height);
         }
@@ -299,19 +299,19 @@ public class HudIngame extends Gui
                     int playerX = MathHelper.floor(mc.thePlayer.x);
                     int playerY = MathHelper.floor(mc.thePlayer.y);
                     int playerZ = MathHelper.floor(mc.thePlayer.z);
-                    drawDebugScreenLine("Light: Sky: " + mc.theWorld.getSavedLightValue(LightLayer.Sky, playerX, playerY, playerZ) + " Block: " + mc.theWorld.getSavedLightValue(LightLayer.Block, playerX, playerY, playerZ));
+                    drawDebugScreenLine("Light: Sky: " + mc.currentWorld.getSavedLightValue(LightLayer.Sky, playerX, playerY, playerZ) + " Block: " + mc.currentWorld.getSavedLightValue(LightLayer.Block, playerX, playerY, playerZ));
                 }
 
                 debugOffset += space;
 
-                drawDebugScreenLine("Entities: " + mc.theWorld.getLoadedEntityList().size());
-                drawDebugScreenLine("Block Entities: " + mc.theWorld.getLoadedBlockEntityList().size());
+                drawDebugScreenLine("Entities: " + mc.currentWorld.getLoadedEntityList().size());
+                drawDebugScreenLine("Block Entities: " + mc.currentWorld.getLoadedBlockEntityList().size());
 
                 debugOffset += space;
 
                 if (clock)
                 {
-                    drawDebugScreenLine("Time: " + getTimeString() + " (Day " + (mc.theWorld.getWorldTime() / Global.DAY_LENGTH_TICKS) + ")");
+                    drawDebugScreenLine("Time: " + getTimeString() + " (Day " + (mc.currentWorld.getWorldTime() / Global.DAY_LENGTH_TICKS) + ")");
                 }
                 else
                 {
@@ -322,9 +322,9 @@ public class HudIngame extends Gui
 
                 if (rotaryCalendar)
                 {
-                    Season season = mc.theWorld.getSeasonManager().getCurrentSeason();
+                    Season season = mc.currentWorld.getSeasonManager().getCurrentSeason();
                     String seasonString = season != null ? season.getTranslatedName() : "None";
-                    Weather weather = mc.theWorld.getCurrentWeather();
+                    Weather weather = mc.currentWorld.getCurrentWeather();
                     String weatherString = weather != null ? weather.getTranslatedName() : "None";
                     
                     int blockX = MathHelper.floor(mc.thePlayer.x);
@@ -332,18 +332,18 @@ public class HudIngame extends Gui
 					int blockZ = MathHelper.floor(mc.thePlayer.z);
                     
                     drawDebugScreenLine("Season: " + seasonString);
-                    drawDebugScreenLine("Weather: " + weatherString + " (" + (mc.theWorld.weatherManager.getWeatherDuration() / 20) + "s I: " + percentRound(mc.theWorld.weatherManager.getWeatherIntensity()) + "% P: " + percentRound(mc.theWorld.weatherManager.getWeatherPower()) + "%)");
-                    drawDebugScreenLine("Biome: " + Registries.BIOMES.getKey(mc.theWorld.getBlockBiome(blockX, blockY, blockZ)));
+                    drawDebugScreenLine("Weather: " + weatherString + " (" + (mc.currentWorld.weatherManager.getWeatherDuration() / 20) + "s I: " + percentRound(mc.currentWorld.weatherManager.getWeatherIntensity()) + "% P: " + percentRound(mc.currentWorld.weatherManager.getWeatherPower()) + "%)");
+                    drawDebugScreenLine("Biome: " + Registries.BIOMES.getKey(mc.currentWorld.getBlockBiome(blockX, blockY, blockZ)));
                     
-                    float temperature = (float) floor100(mc.theWorld.getBlockTemperature(blockX, blockZ));
-                    float humidity = (float) floor100(mc.theWorld.getBlockHumidity(blockX, blockZ));
+                    float temperature = (float) floor100(mc.currentWorld.getBlockTemperature(blockX, blockZ));
+                    float humidity = (float) floor100(mc.currentWorld.getBlockHumidity(blockX, blockZ));
                     
                     drawDebugScreenLine("Temperature: " + temperature + " Humidity: " + humidity);
                     
-                    WindProvider windProvider = mc.theWorld.worldType.getWindManager();
+                    WindProvider windProvider = mc.currentWorld.worldType.getWindManager();
                     if(windProvider != null) {
-                    	float direction = (float) floor100(windProvider.getWindDirection(mc.theWorld, 0.0f, 500.0f, 0.0f));
-                    	float intensity = (float) floor100(windProvider.getWindIntensity(mc.theWorld, 0.0f, 500.0f, 0.0f));
+                    	float direction = (float) floor100(windProvider.getWindDirection(mc.currentWorld, 0.0f, 500.0f, 0.0f));
+                    	float intensity = (float) floor100(windProvider.getWindIntensity(mc.currentWorld, 0.0f, 500.0f, 0.0f));
 
                         int yaw = DynamicTexture.pmod(java.lang.Math.round((direction * 360.0f) + 270.0f), 360);
                     	drawDebugScreenLine("Wind: " + yaw + "°, " + java.lang.Math.round(intensity * 100.0f) + "%");
@@ -356,7 +356,7 @@ public class HudIngame extends Gui
 
                 debugOffset += space;
 
-                drawDebugScreenLine("Seed: " + mc.theWorld.getRandomSeed());
+                drawDebugScreenLine("Seed: " + mc.currentWorld.getRandomSeed());
 
                 debugOffset += space;
 
@@ -367,13 +367,13 @@ public class HudIngame extends Gui
                 {
                     debugOffset += space;
 
-                    Block block = Block.blocksList[mc.theWorld.getBlockId(mc.objectMouseOver.x, mc.objectMouseOver.y, mc.objectMouseOver.z)];
+                    Block block = Block.blocksList[mc.currentWorld.getBlockId(mc.objectMouseOver.x, mc.objectMouseOver.y, mc.objectMouseOver.z)];
                     if (block.id > 0 && block.id < Block.blocksList.length)
                     {
                         drawDebugScreenLineRight("Looking at:");
 
                         String name;
-                        int meta = mc.theWorld.getBlockMetadata(mc.objectMouseOver.x, mc.objectMouseOver.y, mc.objectMouseOver.z);
+                        int meta = mc.currentWorld.getBlockMetadata(mc.objectMouseOver.x, mc.objectMouseOver.y, mc.objectMouseOver.z);
                         try
                         {
                             name = block.asItem().getTranslatedName(new ItemStack(block, 1, meta));
@@ -406,11 +406,11 @@ public class HudIngame extends Gui
                             lightY += side.getOffsetY();
                             lightZ += side.getOffsetZ();
 
-                            drawDebugScreenLineRight("Light: Sky: " + mc.theWorld.getSavedLightValue(LightLayer.Sky, lightX, lightY, lightZ) + " Block: " + mc.theWorld.getSavedLightValue(LightLayer.Block, lightX, lightY, lightZ));
+                            drawDebugScreenLineRight("Light: Sky: " + mc.currentWorld.getSavedLightValue(LightLayer.Sky, lightX, lightY, lightZ) + " Block: " + mc.currentWorld.getSavedLightValue(LightLayer.Block, lightX, lightY, lightZ));
                         }
 
-                        drawDebugScreenLineRight("Signal: " + mc.theWorld.getSignal(mc.objectMouseOver.x, mc.objectMouseOver.y, mc.objectMouseOver.z, mc.objectMouseOver.side));
-                        drawDebugScreenLineRight("Direct signal: " + mc.theWorld.getDirectSignal(mc.objectMouseOver.x, mc.objectMouseOver.y, mc.objectMouseOver.z, mc.objectMouseOver.side));
+                        drawDebugScreenLineRight("Signal: " + mc.currentWorld.getSignal(mc.objectMouseOver.x, mc.objectMouseOver.y, mc.objectMouseOver.z, mc.objectMouseOver.side));
+                        drawDebugScreenLineRight("Direct signal: " + mc.currentWorld.getDirectSignal(mc.objectMouseOver.x, mc.objectMouseOver.y, mc.objectMouseOver.z, mc.objectMouseOver.side));
 
                         for (Tag<Block> tag : BlockTags.TAG_LIST)
                         {
@@ -472,12 +472,12 @@ public class HudIngame extends Gui
                     {
                         if (mc.gameSettings.overlayMode.value == 0)
                         {
-                            this.drawString(font, String.format("%s %s %d", getTimeString(), I18n.getInstance().translateKey("unit.day"),mc.theWorld.getWorldTime() / Global.DAY_LENGTH_TICKS), tsp, tsp + lineHeight * line++, mc.gameSettings.overlayMode.value == 2 ? 0xffff80 : 0xffffff);
+                            this.drawString(font, String.format("%s %s %d", getTimeString(), I18n.getInstance().translateKey("unit.day"),mc.currentWorld.getWorldTime() / Global.DAY_LENGTH_TICKS), tsp, tsp + lineHeight * line++, mc.gameSettings.overlayMode.value == 2 ? 0xffff80 : 0xffffff);
                         }
                         if (mc.gameSettings.overlayMode.value > 0)
                         {
                             this.drawString(font, getTimeString(), tsp, tsp + lineHeight * line++, mc.gameSettings.overlayMode.value == 2 ? 0xffff80 : 0xffffff);
-                            this.drawString(font, String.format("%s %d", I18n.getInstance().translateKey("unit.day"),mc.theWorld.getWorldTime() / Global.DAY_LENGTH_TICKS), tsp, tsp + lineHeight * line++, mc.gameSettings.overlayMode.value == 2 ? 0xffff80 : 0xffffff);
+                            this.drawString(font, String.format("%s %d", I18n.getInstance().translateKey("unit.day"),mc.currentWorld.getWorldTime() / Global.DAY_LENGTH_TICKS), tsp, tsp + lineHeight * line++, mc.gameSettings.overlayMode.value == 2 ? 0xffff80 : 0xffffff);
                         }
                     }
                 }
@@ -485,7 +485,7 @@ public class HudIngame extends Gui
                 {
                     if (mc.gameSettings.overlayShowSeason.value)
                     {
-                        Season season = mc.theWorld.getSeasonManager().getCurrentSeason();
+                        Season season = mc.currentWorld.getSeasonManager().getCurrentSeason();
                         if (season != null)
                         {
                             this.drawString(font, season.getTranslatedName(), tsp, tsp + lineHeight * line++, mc.gameSettings.overlayMode.value == 2 ? 0x80ffff : 0xffffff);
@@ -493,8 +493,8 @@ public class HudIngame extends Gui
                     }
                     if (mc.gameSettings.overlayShowWeather.value)
                     {
-                        Weather weather = mc.theWorld.getCurrentWeather();
-                        if (weather != null && weather != mc.theWorld.worldType.getDefaultWeather())
+                        Weather weather = mc.currentWorld.getCurrentWeather();
+                        if (weather != null && weather != mc.currentWorld.worldType.getDefaultWeather())
                         {
                             this.drawString(font, weather.getTranslatedName(), tsp, tsp + lineHeight * line++, mc.gameSettings.overlayMode.value == 2 ? 0xff80ff : 0xffffff);
                         }
@@ -504,7 +504,7 @@ public class HudIngame extends Gui
 						int blockX = MathHelper.floor(mc.thePlayer.x);
 						int blockY = MathHelper.floor(mc.thePlayer.y);
 						int blockZ = MathHelper.floor(mc.thePlayer.z);
-						String key = mc.theWorld.getBlockBiome(blockX, blockY, blockZ).translationKey;
+						String key = mc.currentWorld.getBlockBiome(blockX, blockY, blockZ).translationKey;
 						drawString(font, stringtranslate.translateKey(key), tsp, tsp + lineHeight * line++, 0xffffff);
 					}
                 }
@@ -864,7 +864,7 @@ public class HudIngame extends Gui
 
     public String getTimeString()
     {
-        long worldTime = mc.theWorld.getWorldTime();
+        long worldTime = mc.currentWorld.getWorldTime();
         int dayLength = Global.DAY_LENGTH_TICKS;
         int dayTime = (int) (worldTime % dayLength);
 
diff --git a/src/main/java/net/minecraft/client/gui/hud/HudIngameDoom.java b/src/main/java/net/minecraft/client/gui/hud/HudIngameDoom.java
index 38b191ee7..933ebb698 100644
--- a/src/main/java/net/minecraft/client/gui/hud/HudIngameDoom.java
+++ b/src/main/java/net/minecraft/client/gui/hud/HudIngameDoom.java
@@ -47,7 +47,7 @@ public class HudIngameDoom
 
         // Render pumpkin overlay
         ItemStack headSlotItem = mc.thePlayer.inventory.armorItemInSlot(IArmorItem.PIECE_HEAD);
-        if (mc.gameSettings.thirdPersonView.value == 0 && headSlotItem != null && headSlotItem.itemID == Blocks.PUMPKIN_CARVED_IDLE.id)
+        if (mc.gameSettings.thirdPersonView.value == 0 && headSlotItem != null && (headSlotItem.itemID == Blocks.PUMPKIN_CARVED_IDLE.id || headSlotItem.itemID == Blocks.PUMPKIN_REDSTONE.id))
         {
             renderPumpkinBlur(width, height);
         }
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryBlock.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryBlock.java
index e25a8e13a..1a3b3dd61 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryBlock.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryBlock.java
@@ -50,7 +50,7 @@ public class ViewerCategoryBlock extends ModelViewerCategory {
         String name = "None";
         if (displayBlock != null){
             name = I18n.getInstance().translateNameKey(displayBlock.getKey());
-            ItemStack[] nameStack = displayBlock.getBreakResult(mc.theWorld, EnumDropCause.PICK_BLOCK, DisplayChunk.displayBlockPosX, DisplayChunk.displayBlockPosY, DisplayChunk.displayBlockPosZ, DisplayChunk.displayBlockMeta, DisplayChunk.displayTileEntity);
+            ItemStack[] nameStack = displayBlock.getBreakResult(mc.currentWorld, EnumDropCause.PICK_BLOCK, DisplayChunk.displayBlockPosX, DisplayChunk.displayBlockPosY, DisplayChunk.displayBlockPosZ, DisplayChunk.displayBlockMeta, DisplayChunk.displayTileEntity);
             if (nameStack != null && nameStack.length > 0){
                 name = nameStack[0].getDisplayName();
             }
@@ -134,7 +134,7 @@ public class ViewerCategoryBlock extends ModelViewerCategory {
         BlockEntry entry = entryHashMap.get(Block.getBlock(DisplayChunk.displayBlockId));
 
         if (entry != null){
-            List<ButtonElement> list = entry.getEntryButtons(mc, modelViewer, mc.theWorld, DisplayChunk.displayBlockMeta);
+            List<ButtonElement> list = entry.getEntryButtons(mc, modelViewer, mc.currentWorld, DisplayChunk.displayBlockMeta);
             if (list != null){
                 for (ButtonElement button : list) {
                     button.setX(button.getX() + xPos);
@@ -164,10 +164,10 @@ public class ViewerCategoryBlock extends ModelViewerCategory {
     public void onTick() {
         BlockEntry entry = entryHashMap.get(Block.getBlock(DisplayChunk.displayBlockId));
         if (entry != null){
-            entry.onTick(mc.theWorld, DisplayChunk.displayBlockMeta);
+            entry.onTick(mc.currentWorld, DisplayChunk.displayBlockMeta);
         }
         // Delete any items blocks create when added/removed
-        mc.theWorld.loadedEntityList.removeIf(entity -> entity instanceof EntityItem);
+        mc.currentWorld.loadedEntityList.removeIf(entity -> entity instanceof EntityItem);
     }
     public void setDisplayBlock(int id, int meta){
         Block displayBlock = Block.blocksList[DisplayChunk.displayBlockId];
@@ -176,10 +176,10 @@ public class ViewerCategoryBlock extends ModelViewerCategory {
         int _meta = DisplayChunk.displayBlockMeta;
 
         if (displayBlock != null && _id != id){
-            displayBlock.onBlockRemoved(mc.theWorld, (int) mc.thePlayer.x, (int) mc.thePlayer.y, (int) mc.thePlayer.z, _meta);
+            displayBlock.onBlockRemoved(mc.currentWorld, (int) mc.thePlayer.x, (int) mc.thePlayer.y, (int) mc.thePlayer.z, _meta);
         }
         if (entry != null){
-            entry.onClose(mc.theWorld, DisplayChunk.displayBlockMeta);
+            entry.onClose(mc.currentWorld, DisplayChunk.displayBlockMeta);
         }
         DisplayChunk.displayBlockPosX = (int) mc.thePlayer.x;
         DisplayChunk.displayBlockPosY = (int) mc.thePlayer.y;
@@ -189,13 +189,13 @@ public class ViewerCategoryBlock extends ModelViewerCategory {
         displayBlock = Block.blocksList[id];
         if (displayBlock != null && _id != id){
             entry = entryHashMap.get(Block.getBlock(DisplayChunk.displayBlockId));
-            displayBlock.onBlockPlacedByWorld(mc.theWorld, (int) mc.thePlayer.x, (int) mc.thePlayer.y, (int) mc.thePlayer.z);
-            if (entry != null) entry.onOpen(mc.theWorld, DisplayChunk.displayBlockMeta);
+            displayBlock.onBlockPlacedByWorld(mc.currentWorld, (int) mc.thePlayer.x, (int) mc.thePlayer.y, (int) mc.thePlayer.z);
+            if (entry != null) entry.onOpen(mc.currentWorld, DisplayChunk.displayBlockMeta);
         }
         if (_id != id){
             modelViewer.init();
         }
-        mc.particleEngine.setWorld(mc.theWorld);
+        mc.particleEngine.setWorld(mc.currentWorld);
         mc.renderGlobal.loadRenderers();
     }
 }
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryEntity.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryEntity.java
index 14b7f768d..3f18f69c2 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryEntity.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryEntity.java
@@ -61,7 +61,7 @@ public class ViewerCategoryEntity extends ModelViewerCategory{
         addEntry(new EntityEntryPainting());
     }
     public void addEntry(EntityEntry<?> entry){
-        Entity entity = entry.getEntityInstance(mc, mc.theWorld);
+        Entity entity = entry.getEntityInstance(mc, mc.currentWorld);
         if (entity == null) return;
         EntityEntry<?> oldEntry = entryMap.put(entity.getClass(), entry);
         entryList.remove(oldEntry);
@@ -146,14 +146,14 @@ public class ViewerCategoryEntity extends ModelViewerCategory{
         currentEntry = _val.get((id + _val.size() + offset) % _val.size());
         currentEntry.onOpen();
 
-        setDisplayEntity(currentEntry.getEntityInstance(mc, mc.theWorld));
+        setDisplayEntity(currentEntry.getEntityInstance(mc, mc.currentWorld));
     }
 
     @Override
     public void onOpen() {
         currentEntry = entryMap.get(MobZombie.class);
         currentEntry.onOpen();
-        setDisplayEntity(currentEntry.getEntityInstance(mc, mc.theWorld));
+        setDisplayEntity(currentEntry.getEntityInstance(mc, mc.currentWorld));
     }
 
     @Override
@@ -185,19 +185,19 @@ public class ViewerCategoryEntity extends ModelViewerCategory{
 
             displayEntity.absMoveTo(mc.thePlayer.x, mc.thePlayer.y - displayEntity.bbHeight/2, mc.thePlayer.z, displayEntity.yRot, displayEntity.xRot);
             displayEntity.lerpMotion(0, 0, 0);
-            mc.theWorld.entityJoinedWorld(displayEntity);
+            mc.currentWorld.entityJoinedWorld(displayEntity);
             if (displayEntity instanceof Mob){
                 ((Mob) displayEntity).setSkinVariant(0);
             }
         }
-        mc.particleEngine.setWorld(mc.theWorld);
+        mc.particleEngine.setWorld(mc.currentWorld);
         modelViewer.init();
     }
     public void removeDisplayEntity(){
         if (displayEntity != null){
             displayEntity.remove();
-            mc.theWorld.loadedEntityList.remove(displayEntity);
+            mc.currentWorld.loadedEntityList.remove(displayEntity);
         }
-        mc.particleEngine.setWorld(mc.theWorld);
+        mc.particleEngine.setWorld(mc.currentWorld);
     }
 }
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryParticle.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryParticle.java
index 88b969c67..5aa870746 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryParticle.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/ViewerCategoryParticle.java
@@ -89,7 +89,7 @@ public class ViewerCategoryParticle extends ModelViewerCategory{
     @Override
     public void cycleCategoryEntry(int offset) {
         setCurrentEntry(entriesList.get((entriesList.indexOf(currentEntry) + entriesList.size() + offset) % entriesList.size()));
-        mc.particleEngine.setWorld(mc.theWorld);
+        mc.particleEngine.setWorld(mc.currentWorld);
         modelViewer.init();
     }
 
@@ -101,7 +101,7 @@ public class ViewerCategoryParticle extends ModelViewerCategory{
 
     @Override
     public void onClose() {
-        mc.particleEngine.setWorld(mc.theWorld);
+        mc.particleEngine.setWorld(mc.currentWorld);
         currentEntry.onClose();
     }
 
@@ -111,13 +111,13 @@ public class ViewerCategoryParticle extends ModelViewerCategory{
         double offY = 0;
         double offZ = 0;
         if (spawnRadius > 0){
-            offX = mc.theWorld.rand.nextDouble() - mc.theWorld.rand.nextDouble();
-            offY = mc.theWorld.rand.nextDouble() - mc.theWorld.rand.nextDouble();
-            offZ = mc.theWorld.rand.nextDouble() - mc.theWorld.rand.nextDouble();
+            offX = mc.currentWorld.rand.nextDouble() - mc.currentWorld.rand.nextDouble();
+            offY = mc.currentWorld.rand.nextDouble() - mc.currentWorld.rand.nextDouble();
+            offZ = mc.currentWorld.rand.nextDouble() - mc.currentWorld.rand.nextDouble();
         }
         offX *= spawnRadius;
         offY *= spawnRadius;
         offZ *= spawnRadius;
-        currentEntry.spawnParticle(mc, mc.theWorld, mc.thePlayer.x + offX, mc.thePlayer.y + offY, mc.thePlayer.z + offZ);
+        currentEntry.spawnParticle(mc, mc.currentWorld, mc.thePlayer.x + offX, mc.thePlayer.y + offY, mc.thePlayer.z + offZ);
     }
 }
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityEntryBoat.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityEntryBoat.java
index 8f6299068..662441755 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityEntryBoat.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityEntryBoat.java
@@ -5,21 +5,21 @@ import net.minecraft.client.gui.ButtonElement;
 import net.minecraft.client.gui.Screen;
 import net.minecraft.client.gui.modelviewer.elements.ListenerButtonElement;
 import net.minecraft.core.block.entity.TileEntityFlag;
-import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.entity.vehicle.EntityBoat;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.world.World;
 
 import java.util.ArrayList;
 import java.util.List;
 
-public class EntityEntryBoat extends EntityEntry<BoatEntity>{
+public class EntityEntryBoat extends EntityEntry<EntityBoat>{
     @Override
-    public void onTick(BoatEntity entity) {
+    public void onTick(EntityBoat entity) {
 
     }
 
     @Override
-    public List<ButtonElement> getEntryButtons(Minecraft mc, Screen parentScreen, BoatEntity entity) {
+    public List<ButtonElement> getEntryButtons(Minecraft mc, Screen parentScreen, EntityBoat entity) {
         ListenerButtonElement flagButton = new ListenerButtonElement(-1, - 120, 0, 120, 20, I18n.getInstance().translateKeyAndFormat("model.category.entity.boat.button.flag", false));
         flagButton.setActionListener(() -> {
             boolean flag;
@@ -36,8 +36,8 @@ public class EntityEntryBoat extends EntityEntry<BoatEntity>{
     }
 
     @Override
-    public BoatEntity getEntityInstance(Minecraft mc, World world) {
-        BoatEntity boat = new BoatEntity(world);
+    public EntityBoat getEntityInstance(Minecraft mc, World world) {
+        EntityBoat boat = new EntityBoat(world);
         boat.yRot = 270f;
         boat.zd = 100; // Causes the flag to rotate when enabled
         return boat;
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityEntryDispatcher.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityEntryDispatcher.java
index fcb9ba12f..1e2815803 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityEntryDispatcher.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/EntityEntryDispatcher.java
@@ -26,7 +26,7 @@ public class EntityEntryDispatcher extends EntityEntry<Entity> {
 
     @Override
     public Entity getEntityInstance(Minecraft mc, World world) {
-        return EntityDispatcher.createEntityInWorld(id, mc.theWorld);
+        return EntityDispatcher.createEntityInWorld(id, mc.currentWorld);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/ParticleEntryRedstone.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/ParticleEntryRedstone.java
index 68177a69a..e7b66dc25 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/ParticleEntryRedstone.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/particle/ParticleEntryRedstone.java
@@ -1,7 +1,7 @@
 package net.minecraft.client.gui.modelviewer.categories.entries.particle;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.entity.particle.ParticleRedstoneDust;
+import net.minecraft.client.entity.particle.ParticlePuffRGB;
 import net.minecraft.client.gui.ButtonElement;
 import net.minecraft.client.gui.Screen;
 import net.minecraft.client.gui.modelviewer.elements.ListenerTextFieldElement;
@@ -71,7 +71,7 @@ public class ParticleEntryRedstone extends ParticleEntry{
 
     @Override
     public void spawnParticle(Minecraft mc, World world, double x, double y, double z) {
-        mc.particleEngine.add(new ParticleRedstoneDust(world, x, y, z, red/255f, green/255f, blue/255f, 15));
+        mc.particleEngine.add(new ParticlePuffRGB(world, x, y, z, red/255f, green/255f, blue/255f, 15));
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/options/OptionsScreen.java b/src/main/java/net/minecraft/client/gui/options/OptionsScreen.java
index 329332f54..fd518d2ea 100644
--- a/src/main/java/net/minecraft/client/gui/options/OptionsScreen.java
+++ b/src/main/java/net/minecraft/client/gui/options/OptionsScreen.java
@@ -250,7 +250,7 @@ public class OptionsScreen
         Scissor.disable();
 
         // Draw shadows
-        if (mc.theWorld == null)
+        if (mc.currentWorld == null)
         {
             Tessellator tessellator = Tessellator.instance;
             GL11.glDisable(GL_DEPTH_TEST);
@@ -469,7 +469,7 @@ public class OptionsScreen
     public void renderBackground() {
         super.renderBackground();
 
-        if (mc.theWorld == null)
+        if (mc.currentWorld == null)
         {
             Tessellator tessellator = Tessellator.instance;
             mc.textureManager.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
@@ -500,7 +500,7 @@ public class OptionsScreen
 
     private void overlayBackground(int minX, int maxX, int minY, int maxY)
     {
-        if (mc.theWorld == null)
+        if (mc.currentWorld == null)
         {
             Tessellator tessellator = Tessellator.instance;
             mc.textureManager.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
diff --git a/src/main/java/net/minecraft/client/gui/options/components/DifficultyOptionComponent.java b/src/main/java/net/minecraft/client/gui/options/components/DifficultyOptionComponent.java
index eb61a2982..62ced22b3 100644
--- a/src/main/java/net/minecraft/client/gui/options/components/DifficultyOptionComponent.java
+++ b/src/main/java/net/minecraft/client/gui/options/components/DifficultyOptionComponent.java
@@ -59,7 +59,7 @@ public class DifficultyOptionComponent extends ButtonComponent {
             return;
         }
         slider.enabled = true;
-        option.set(mc.theWorld.getDifficulty());
+        option.set(mc.currentWorld.getDifficulty());
         slider.sliderValue = option.value.id();
         this.slider.displayString = getDisplayString();
     }
@@ -67,14 +67,14 @@ public class DifficultyOptionComponent extends ButtonComponent {
     @Override
     public void resetValue() {
         if (canSetDifficulty()) {
-            mc.theWorld.setDifficulty(Difficulty.NORMAL, false);
+            mc.currentWorld.setDifficulty(Difficulty.NORMAL, false);
         }
     }
 
     @Override
     public boolean isDefault() {
         boolean canSet = canSetDifficulty();
-        return !canSet || mc.theWorld.getDifficulty() == Difficulty.NORMAL;
+        return !canSet || mc.currentWorld.getDifficulty() == Difficulty.NORMAL;
     }
     protected String getDisplayString() {
         if (!canSetDifficulty()) {
@@ -84,6 +84,6 @@ public class DifficultyOptionComponent extends ButtonComponent {
     }
 
     protected boolean canSetDifficulty() {
-        return mc.theWorld != null && !mc.theWorld.getLevelData().getDifficultyLocked() && !mc.theWorld.isClientSide;
+        return mc.currentWorld != null && !mc.currentWorld.getLevelData().getDifficultyLocked() && !mc.currentWorld.isClientSide;
     }
 }
diff --git a/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java b/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
index 9c6b6bc4f..c3cb902a2 100644
--- a/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
+++ b/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
@@ -24,6 +24,7 @@ import net.minecraft.client.gui.options.components.ToggleableOptionComponent;
 import net.minecraft.client.gui.options.components.TooltipPickerComponent;
 import net.minecraft.client.player.controller.PlayerControllerSP;
 import net.minecraft.client.sound.SoundEngine;
+import net.minecraft.client.world.WorldClient;
 import net.minecraft.core.Global;
 import net.minecraft.core.achievement.stat.Stat;
 import net.minecraft.core.achievement.stat.StatList;
@@ -285,11 +286,11 @@ public abstract class OptionsPages
         .withComponent(new OptionsCategory("gui.options.page.debug.category.utility")
             .withComponent(new ShortcutComponent("gui.options.page.debug.button.open.model_viewer", () -> {
                                mc.playerController = new PlayerControllerSP(mc);
-                               mc.changeWorld(new World(), "Loading Model Viewer");
+                               mc.changeWorld(new WorldClient(), "Loading Model Viewer");
                                mc.displayScreen(new ScreenModelViewer());}) {
                                @Override
                                public void render(int x, int y, int width, int relativeMouseX, int relativeMouseY) {
-                                   button.enabled = mc.theWorld == null;
+                                   button.enabled = mc.currentWorld == null;
                                    super.render(x, y, width, relativeMouseX, relativeMouseY);
                                }
                            }
@@ -317,11 +318,11 @@ public abstract class OptionsPages
                 mc.sndManager.tick();
             }))
             .withComponent(new ShortcutComponent("gui.options.page.debug.button.cheat", () -> {
-                mc.theWorld.getLevelData().setCheatsEnabled(true);
+                mc.currentWorld.getLevelData().setCheatsEnabled(true);
             }) {
                 @Override
                 public void render(int x, int y, int width, int relativeMouseX, int relativeMouseY) {
-                    button.enabled = (mc.theWorld != null && !mc.theWorld.isClientSide);
+                    button.enabled = (mc.currentWorld != null && !mc.currentWorld.isClientSide);
                     super.render(x, y, width, relativeMouseX, relativeMouseY);
                 }
             })
diff --git a/src/main/java/net/minecraft/client/gui/paged/ScreenPaged.java b/src/main/java/net/minecraft/client/gui/paged/ScreenPaged.java
index cf5170875..06cc0f60f 100644
--- a/src/main/java/net/minecraft/client/gui/paged/ScreenPaged.java
+++ b/src/main/java/net/minecraft/client/gui/paged/ScreenPaged.java
@@ -221,7 +221,7 @@ public class ScreenPaged
         Scissor.disable();
 
         // Draw shadows
-        if (mc.theWorld == null)
+        if (mc.currentWorld == null)
         {
             Tessellator tessellator = Tessellator.instance;
             GL11.glDisable(GL_DEPTH_TEST);
@@ -424,7 +424,7 @@ public class ScreenPaged
     public void renderBackground() {
         super.renderBackground();
 
-        if (mc.theWorld == null)
+        if (mc.currentWorld == null)
         {
             Tessellator tessellator = Tessellator.instance;
             mc.textureManager.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
@@ -455,7 +455,7 @@ public class ScreenPaged
 
     private void overlayBackground(int minX, int maxX, int minY, int maxY)
     {
-        if (mc.theWorld == null)
+        if (mc.currentWorld == null)
         {
             Tessellator tessellator = Tessellator.instance;
             mc.textureManager.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
diff --git a/src/main/java/net/minecraft/client/net/command/ClientCommandSource.java b/src/main/java/net/minecraft/client/net/command/ClientCommandSource.java
index 1e7bd56a2..424218f0e 100644
--- a/src/main/java/net/minecraft/client/net/command/ClientCommandSource.java
+++ b/src/main/java/net/minecraft/client/net/command/ClientCommandSource.java
@@ -1,6 +1,7 @@
 package net.minecraft.client.net.command;
 
 import net.minecraft.client.Minecraft;
+import net.minecraft.client.world.WorldClient;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.CommandSource;
 import net.minecraft.core.net.command.helpers.EntitySelector;
@@ -24,7 +25,7 @@ public class ClientCommandSource implements CommandSource {
     @Override
     public Collection<String> getPlayerNames() {
         List<String> list = new ArrayList<>();
-        for (Player player : this.mc.theWorld.players) {
+        for (Player player : this.mc.currentWorld.players) {
             list.add(player.username);
         }
         return list;
@@ -94,12 +95,12 @@ public class ClientCommandSource implements CommandSource {
 
     @Override
     public World getWorld() {
-        return this.mc.theWorld;
+        return this.mc.currentWorld;
     }
 
     @Override
     public World getWorld(int dimension) {
-        return this.mc.theWorld.dimension.id == dimension ? this.mc.theWorld : new World(this.mc.theWorld, Dimension.getDimensionList().get(dimension));
+        return this.mc.currentWorld.dimension.id == dimension ? this.mc.currentWorld : new World(this.mc.currentWorld, Dimension.getDimensionList().get(dimension));
     }
 
     public void movePlayerToDimension(Player player, int dimension) {
@@ -107,25 +108,25 @@ public class ClientCommandSource implements CommandSource {
         Dimension newDim = Dimension.getDimensionList().get(dimension);
         System.out.println("Switching to dimension \"" + newDim.getTranslatedName() + "\"!!");
         player.dimension = dimension;
-        this.mc.theWorld.setEntityDead(player);
+        this.mc.currentWorld.setEntityDead(player);
         this.mc.thePlayer.removed = false;
         double x = player.x;
         double y = player.y + 64;
         double z = player.z;
         player.moveTo(x *= Dimension.getCoordScale(lastDim, newDim), y, z *= Dimension.getCoordScale(lastDim, newDim), player.yRot, player.xRot);
         if (player.isAlive()) {
-            this.mc.theWorld.updateEntityWithOptionalForce(player, false);
+            this.mc.currentWorld.updateEntityWithOptionalForce(player, false);
         }
-        World world = new World(this.mc.theWorld, newDim);
+        WorldClient world = new WorldClient(this.mc.currentWorld, newDim);
         if (newDim == lastDim.homeDim) {
             this.mc.changeWorld(world, "Leaving " + lastDim.getTranslatedName(), player);
         } else {
             this.mc.changeWorld(world, "Entering " + newDim.getTranslatedName(), player);
         }
-        player.world = this.mc.theWorld;
+        player.world = this.mc.currentWorld;
         if (player.isAlive()) {
             player.moveTo(x, y, z, player.yRot, player.xRot);
-            this.mc.theWorld.updateEntityWithOptionalForce(player, false);
+            this.mc.currentWorld.updateEntityWithOptionalForce(player, false);
         }
     }
 
diff --git a/src/main/java/net/minecraft/client/net/handler/PacketHandlerClient.java b/src/main/java/net/minecraft/client/net/handler/PacketHandlerClient.java
index af75de9de..7e51a4f22 100644
--- a/src/main/java/net/minecraft/client/net/handler/PacketHandlerClient.java
+++ b/src/main/java/net/minecraft/client/net/handler/PacketHandlerClient.java
@@ -14,7 +14,7 @@ import net.minecraft.client.gui.guidebook.GuidebookPageManager;
 import net.minecraft.client.gui.guidebook.ScreenGuidebook;
 import net.minecraft.client.gui.guidebook.search.GuidebookPageSearch;
 import net.minecraft.client.player.controller.PlayerControllerMP;
-import net.minecraft.client.world.WorldClient;
+import net.minecraft.client.world.WorldClientMP;
 import net.minecraft.core.Global;
 import net.minecraft.core.achievement.stat.StatList;
 import net.minecraft.core.block.entity.TileEntityActivator;
@@ -85,7 +85,7 @@ public class PacketHandlerClient extends PacketHandler
     private final NetworkManager netManager;
     public String message; // Name from b1.2 leak
     private final Minecraft mc;
-    private WorldClient worldClient;
+    private WorldClientMP worldClientMP;
     private boolean started; // Name from b1.2 leak
     public SavedDataStorage savedDataStorage;
     public List<PlayerProfile> players;
@@ -155,9 +155,9 @@ public class PacketHandlerClient extends PacketHandler
     {
         mc.playerController = new PlayerControllerMP(mc, this);
         mc.statsCounter.add(StatList.joinMultiplayerStat, 1);
-        worldClient = new WorldClient(mc, this, loginPacket.worldSeed, loginPacket.dimensionId, loginPacket.worldTypeId);
-        worldClient.isClientSide = true;
-        mc.changeWorld(worldClient);
+        worldClientMP = new WorldClientMP(this, loginPacket.worldSeed, loginPacket.dimensionId, loginPacket.worldTypeId);
+        worldClientMP.isClientSide = true;
+        mc.changeWorld(worldClientMP);
         mc.thePlayer.dimension = loginPacket.dimensionId;
         mc.displayScreen(new ScreenDownloadTerrain(this));
         mc.thePlayer.id = loginPacket.playerEntityIdAndProtocolVersion;
@@ -171,14 +171,14 @@ public class PacketHandlerClient extends PacketHandler
         double x = addItemEntityPacket.xPosition / 32D;
         double y = addItemEntityPacket.yPosition / 32D;
         double z = addItemEntityPacket.zPosition / 32D;
-        EntityItem entityItem = new EntityItem(worldClient, x, y, z, new ItemStack(addItemEntityPacket.itemID, addItemEntityPacket.count, addItemEntityPacket.itemDamage, addItemEntityPacket.tag));
+        EntityItem entityItem = new EntityItem(worldClientMP, x, y, z, new ItemStack(addItemEntityPacket.itemID, addItemEntityPacket.count, addItemEntityPacket.itemDamage, addItemEntityPacket.tag));
         entityItem.xd = (double) addItemEntityPacket.xd / 128D;
         entityItem.yd = (double) addItemEntityPacket.yd / 128D;
         entityItem.zd = (double) addItemEntityPacket.zd / 128D;
         entityItem.serverPosX = addItemEntityPacket.xPosition;
         entityItem.serverPosY = addItemEntityPacket.yPosition;
         entityItem.serverPosZ = addItemEntityPacket.zPosition;
-        worldClient.addEntityToWorld(addItemEntityPacket.entityId, entityItem);
+        worldClientMP.addEntityToWorld(addItemEntityPacket.entityId, entityItem);
     }
 
 
@@ -194,7 +194,7 @@ public class PacketHandlerClient extends PacketHandler
         } else {
             owner = null;
         }
-        Entity newEntity = NetEntityHandler.getTypeEntry(addEntityPacket.type).getEntity(worldClient, xPosition, yPosition, zPosition, addEntityPacket.metaData, addEntityPacket.hasVelocity, addEntityPacket.xVelocity / 8000D, addEntityPacket.yVelocity / 8000D, addEntityPacket.zVelocity / 8000D, owner);
+        Entity newEntity = NetEntityHandler.getTypeEntry(addEntityPacket.type).getEntity(worldClientMP, xPosition, yPosition, zPosition, addEntityPacket.metaData, addEntityPacket.hasVelocity, addEntityPacket.xVelocity / 8000D, addEntityPacket.yVelocity / 8000D, addEntityPacket.zVelocity / 8000D, owner);
         if (newEntity != null) {
             newEntity.serverPosX = addEntityPacket.xPosition;
             newEntity.serverPosY = addEntityPacket.yPosition;
@@ -202,7 +202,7 @@ public class PacketHandlerClient extends PacketHandler
             newEntity.yRot = addEntityPacket.yaw;
             newEntity.xRot = addEntityPacket.pitch;
             newEntity.id = addEntityPacket.entityId;
-            worldClient.addEntityToWorld(addEntityPacket.entityId, newEntity);
+            worldClientMP.addEntityToWorld(addEntityPacket.entityId, newEntity);
             if (owner instanceof Mob && newEntity instanceof Projectile){
                 ((Projectile) newEntity).owner = (Mob) owner;
             }
@@ -220,7 +220,7 @@ public class PacketHandlerClient extends PacketHandler
         double z = (double) weatherEffectPacket.z / 32D;
         Entity weatherEntity = null;
         if (weatherEffectPacket.effectId == WeatherEffectPacket.EFFECT_LIGHTNING) {
-            weatherEntity = new EntityLightning(worldClient, x, y, z);
+            weatherEntity = new EntityLightning(worldClientMP, x, y, z);
         }
         if (weatherEntity != null)
         {
@@ -230,23 +230,23 @@ public class PacketHandlerClient extends PacketHandler
             weatherEntity.yRot = 0.0F;
             weatherEntity.xRot = 0.0F;
             weatherEntity.id = weatherEffectPacket.id;
-            worldClient.addWeatherEffect(weatherEntity);
+            worldClientMP.addWeatherEffect(weatherEntity);
         }
     }
 
     @Override
     public void handleWeatherStatus(WeatherStatusPacket packet)
     {
-        if (worldClient.dimension.id != packet.dimId) return;
+        if (worldClientMP.dimension.id != packet.dimId) return;
         Weather currentWeather = packet.id == -1 ? null : Weathers.WEATHERS[packet.id];
         Weather newWeather = packet.newId == -1 ? null : Weathers.WEATHERS[packet.newId];
-        worldClient.weatherManager.overrideWeather(currentWeather, newWeather, packet.duration, packet.intensity, packet.power);
+        worldClientMP.weatherManager.overrideWeather(currentWeather, newWeather, packet.duration, packet.intensity, packet.power);
     }
 
     @Override
     public void handleEntityPainting(AddPaintingPacket addPaintingPacket)
     {
-        Entity entity = worldClient.getEntityFromId(addPaintingPacket.entityId);
+        Entity entity = worldClientMP.getEntityFromId(addPaintingPacket.entityId);
         if (entity instanceof EntityPainting){
             EntityPainting painting = (EntityPainting) entity;
             painting.blockX = addPaintingPacket.xPosition;
@@ -260,8 +260,8 @@ public class PacketHandlerClient extends PacketHandler
                 painting.setStack(new ItemStack(addPaintingPacket.itemID, 1, addPaintingPacket.meta));
             }
         } else {
-            EntityPainting entitypainting = new EntityPainting(worldClient, addPaintingPacket.xPosition, addPaintingPacket.yPosition, addPaintingPacket.zPosition, addPaintingPacket.direction, addPaintingPacket.key);
-            worldClient.addEntityToWorld(addPaintingPacket.entityId, entitypainting);
+            EntityPainting entitypainting = new EntityPainting(worldClientMP, addPaintingPacket.xPosition, addPaintingPacket.yPosition, addPaintingPacket.zPosition, addPaintingPacket.direction, addPaintingPacket.key);
+            worldClientMP.addEntityToWorld(addPaintingPacket.entityId, entitypainting);
             if (addPaintingPacket.itemID > 0){
                 entitypainting.setStack(new ItemStack(addPaintingPacket.itemID, 1, addPaintingPacket.meta));
             }
@@ -273,14 +273,8 @@ public class PacketHandlerClient extends PacketHandler
     public void handleEntityVelocity(SetEntityMotionPacket setEntityMotionPacket)
     {
         Entity entity = getEntityByID(setEntityMotionPacket.entityId);
-        if (entity == null)
-        {
-            return;
-        }
-        else
-        {
+        if (entity != null) {
             entity.lerpMotion((double) setEntityMotionPacket.motionX / 8000D, (double) setEntityMotionPacket.motionY / 8000D, (double) setEntityMotionPacket.motionZ / 8000D);
-            return;
         }
     }
 
@@ -302,7 +296,7 @@ public class PacketHandlerClient extends PacketHandler
         double d2 = (double) addPlayerPacket.zPosition / 32D;
         float f = (float) (addPlayerPacket.rotation * 360) / 256F;
         float f1 = (float) (addPlayerPacket.pitch * 360) / 256F;
-        PlayerRemote playerRemote = new PlayerRemote(mc.theWorld, addPlayerPacket.name, addPlayerPacket.uuid);
+        PlayerRemote playerRemote = new PlayerRemote(mc.currentWorld, addPlayerPacket.name, addPlayerPacket.uuid);
         playerRemote.xo = playerRemote.serverPosX = addPlayerPacket.xPosition;
         playerRemote.yo = playerRemote.serverPosY = addPlayerPacket.yPosition;
         playerRemote.zo = playerRemote.serverPosZ = addPlayerPacket.zPosition;
@@ -316,7 +310,7 @@ public class PacketHandlerClient extends PacketHandler
             playerRemote.inventory.mainInventory[playerRemote.inventory.getCurrentItemIndex()] = new ItemStack(i, 1, 0);
         }
         playerRemote.absMoveTo(d, d1, d2, f, f1);
-        worldClient.addEntityToWorld(addPlayerPacket.entityId, playerRemote);
+        worldClientMP.addEntityToWorld(addPlayerPacket.entityId, playerRemote);
         playerRemote.nickname = StringUtils.substring(addPlayerPacket.nickname, 0, 32);
         playerRemote.chatColor = addPlayerPacket.chatColor;
 
@@ -327,12 +321,7 @@ public class PacketHandlerClient extends PacketHandler
     public void handleEntityTeleport(TeleportEntityPacket teleportEntityPacket)
     {
         Entity entity = getEntityByID(teleportEntityPacket.id);
-        if (entity == null)
-        {
-            return;
-        }
-        else
-        {
+        if (entity != null) {
             entity.serverPosX = teleportEntityPacket.x;
             entity.serverPosY = teleportEntityPacket.y;
             entity.serverPosZ = teleportEntityPacket.z;
@@ -342,7 +331,6 @@ public class PacketHandlerClient extends PacketHandler
             float f = (float) (teleportEntityPacket.yaw * 360) / 256F;
             float f1 = (float) (teleportEntityPacket.pitch * 360) / 256F;
             entity.lerpTo(d, d1, d2, f, f1, 3);
-            return;
         }
     }
 
@@ -350,12 +338,7 @@ public class PacketHandlerClient extends PacketHandler
     public void handleEntity(MoveEntityPacket moveEntityPacket)
     {
         Entity entity = getEntityByID(moveEntityPacket.id);
-        if (entity == null)
-        {
-            return;
-        }
-        else
-        {
+        if (entity != null) {
             entity.serverPosX += moveEntityPacket.x;
             entity.serverPosY += moveEntityPacket.y;
             entity.serverPosZ += moveEntityPacket.z;
@@ -365,7 +348,6 @@ public class PacketHandlerClient extends PacketHandler
             float f = moveEntityPacket.rotating ? (float) (moveEntityPacket.yaw * 360) / 256F : entity.yRot;
             float f1 = moveEntityPacket.rotating ? (float) (moveEntityPacket.pitch * 360) / 256F : entity.xRot;
             entity.lerpTo(d, d1, d2, f, f1, 3);
-            return;
         }
     }
 
@@ -380,9 +362,9 @@ public class PacketHandlerClient extends PacketHandler
     @Override
     public void handleSetMobSpawner(SetMobSpawnerPacket setMobSpawnerPacket)
     {
-        if (mc.theWorld.isBlockLoaded(setMobSpawnerPacket.xPosition, setMobSpawnerPacket.yPosition, setMobSpawnerPacket.zPosition))
+        if (mc.currentWorld.isBlockLoaded(setMobSpawnerPacket.xPosition, setMobSpawnerPacket.yPosition, setMobSpawnerPacket.zPosition))
         {
-            TileEntity tileentity = mc.theWorld.getBlockEntity(setMobSpawnerPacket.xPosition, setMobSpawnerPacket.yPosition, setMobSpawnerPacket.zPosition);
+            TileEntity tileentity = mc.currentWorld.getBlockEntity(setMobSpawnerPacket.xPosition, setMobSpawnerPacket.yPosition, setMobSpawnerPacket.zPosition);
             if (tileentity instanceof TileEntityMobSpawner)
             {
                 TileEntityMobSpawner tileEntityMobSpawner = (TileEntityMobSpawner) tileentity;
@@ -401,7 +383,7 @@ public class PacketHandlerClient extends PacketHandler
     @Override
     public void handleDestroyEntity(RemoveEntityPacket removeEntityPacket)
     {
-        worldClient.removeEntityFromWorld(removeEntityPacket.entityId);
+        worldClientMP.removeEntityFromWorld(removeEntityPacket.entityId);
     }
 
     @Override
@@ -444,7 +426,7 @@ public class PacketHandlerClient extends PacketHandler
     @Override
     public void handlePreChunk(ChunkVisibilityPacket chunkVisibilityPacket)
     {
-        worldClient.doPreChunk(chunkVisibilityPacket.chunkX, chunkVisibilityPacket.chunkZ, chunkVisibilityPacket.playerAdded);
+        worldClientMP.doPreChunk(chunkVisibilityPacket.chunkX, chunkVisibilityPacket.chunkZ, chunkVisibilityPacket.playerAdded);
     }
 
     @Override
@@ -460,9 +442,9 @@ public class PacketHandlerClient extends PacketHandler
             int x = coord >> 0 & 0xf;
             int y = coord >> 8 & 0xff;
             int z = coord >> 4 & 0xf;
-            worldClient.setBlockAndMetadataWithNotify(x + xBase, y, z + zBase, type, data);
-            worldClient.removePositionTypesInBounds(x + xBase, y, z + zBase, x + xBase, y, z + zBase);
-            worldClient.markBlocksDirty(x + xBase, y, z + zBase, x + xBase, y, z + zBase);
+            worldClientMP.setBlockAndMetadataWithNotify(x + xBase, y, z + zBase, type, data);
+            worldClientMP.removePositionTypesInBounds(x + xBase, y, z + zBase, x + xBase, y, z + zBase);
+            worldClientMP.markBlocksDirty(x + xBase, y, z + zBase, x + xBase, y, z + zBase);
         }
 
     }
@@ -470,14 +452,14 @@ public class PacketHandlerClient extends PacketHandler
     @Override
     public void handleMapChunk(BlockRegionUpdatePacket blockRegionUpdatePacket)
     {
-        worldClient.removePositionTypesInBounds(blockRegionUpdatePacket.xPosition, blockRegionUpdatePacket.yPosition, blockRegionUpdatePacket.zPosition, (blockRegionUpdatePacket.xPosition + blockRegionUpdatePacket.xSize) - 1, (blockRegionUpdatePacket.yPosition + blockRegionUpdatePacket.ySize) - 1, (blockRegionUpdatePacket.zPosition + blockRegionUpdatePacket.zSize) - 1);
-        worldClient.setChunkData(blockRegionUpdatePacket.xPosition, blockRegionUpdatePacket.yPosition, blockRegionUpdatePacket.zPosition, blockRegionUpdatePacket.xSize, blockRegionUpdatePacket.ySize, blockRegionUpdatePacket.zSize, blockRegionUpdatePacket.chunk);
+        worldClientMP.removePositionTypesInBounds(blockRegionUpdatePacket.xPosition, blockRegionUpdatePacket.yPosition, blockRegionUpdatePacket.zPosition, (blockRegionUpdatePacket.xPosition + blockRegionUpdatePacket.xSize) - 1, (blockRegionUpdatePacket.yPosition + blockRegionUpdatePacket.ySize) - 1, (blockRegionUpdatePacket.zPosition + blockRegionUpdatePacket.zSize) - 1);
+        worldClientMP.setChunkData(blockRegionUpdatePacket.xPosition, blockRegionUpdatePacket.yPosition, blockRegionUpdatePacket.zPosition, blockRegionUpdatePacket.xSize, blockRegionUpdatePacket.ySize, blockRegionUpdatePacket.zSize, blockRegionUpdatePacket.chunk);
     }
 
     @Override
     public void handleBlockUpdate(BlockUpdatePacket blockUpdatePacket)
     {
-        worldClient.blockChange(blockUpdatePacket.xPosition, blockUpdatePacket.yPosition, blockUpdatePacket.zPosition, blockUpdatePacket.blockId, blockUpdatePacket.metadata);
+        worldClientMP.blockChange(blockUpdatePacket.xPosition, blockUpdatePacket.yPosition, blockUpdatePacket.zPosition, blockUpdatePacket.blockId, blockUpdatePacket.metadata);
     }
 
     @Override
@@ -539,9 +521,9 @@ public class PacketHandlerClient extends PacketHandler
         {
             // this class does not seem to handle pick up from server dropped items. find where it is.
             // something about that isn't working on servers if the player changed their gamemode.
-            worldClient.playSoundAtEntity(null, item, "item.pickup", 1F, ((rand.nextFloat() - rand.nextFloat()) * 0.7F + 1.0F) * 4.0F);
-            mc.particleEngine.add(new ParticlePickupAnimation(mc.theWorld, item, collector, -0.5F));
-            worldClient.removeEntityFromWorld(takeItemEntityPacket.collectedEntityId);
+            worldClientMP.playSoundAtEntity(null, item, "item.pickup", 1F, ((rand.nextFloat() - rand.nextFloat()) * 0.7F + 1.0F) * 4.0F);
+            mc.particleEngine.add(new ParticlePickupAnimation(mc.currentWorld, item, collector, -0.5F));
+            worldClientMP.removeEntityFromWorld(takeItemEntityPacket.collectedEntityId);
         }
     }
 
@@ -712,14 +694,14 @@ public class PacketHandlerClient extends PacketHandler
         double d2 = (double) addMobPacket.z / 32D;
         float f = (float) (addMobPacket.yaw * 360) / 256F;
         float f1 = (float) (addMobPacket.pitch * 360) / 256F;
-        Mob mob = (Mob) EntityDispatcher.createEntity(addMobPacket.type, mc.theWorld);
+        Mob mob = (Mob) EntityDispatcher.createEntity(addMobPacket.type, mc.currentWorld);
         mob.serverPosX = addMobPacket.x;
         mob.serverPosY = addMobPacket.y;
         mob.serverPosZ = addMobPacket.z;
         mob.id = addMobPacket.id;
         mob.absMoveTo(d, d1, d2, f, f1);
         mob.isMultiplayerEntity = true;
-        worldClient.addEntityToWorld(addMobPacket.id, mob);
+        worldClientMP.addEntityToWorld(addMobPacket.id, mob);
         List<SynchedEntityData.DataItem<?>> list = addMobPacket.getUnpackedData();
         if (list != null)
         {
@@ -732,14 +714,14 @@ public class PacketHandlerClient extends PacketHandler
     @Override
     public void handleUpdateTime(SetTimePacket setTimePacket)
     {
-        mc.theWorld.setWorldTime(setTimePacket.time);
+        mc.currentWorld.setWorldTime(setTimePacket.time);
     }
 
     @Override
     public void handleSpawnPosition(SetSpawnPositionPacket setSpawnPositionPacket)
     {
         mc.thePlayer.setPlayerSpawnCoordinate(new ChunkCoordinates(setSpawnPositionPacket.x, setSpawnPositionPacket.y, setSpawnPositionPacket.z));
-        mc.theWorld.getLevelData().setSpawn(setSpawnPositionPacket.x, setSpawnPositionPacket.y, setSpawnPositionPacket.z);
+        mc.currentWorld.getLevelData().setSpawn(setSpawnPositionPacket.x, setSpawnPositionPacket.y, setSpawnPositionPacket.z);
     }
 
     @Override
@@ -752,7 +734,7 @@ public class PacketHandlerClient extends PacketHandler
             passenger = mc.thePlayer;
         }
         if (setRidingPacket.isTileEntity) {
-            vehicle = (IVehicle) worldClient.getBlockEntity(setRidingPacket.x, setRidingPacket.y, setRidingPacket.z);
+            vehicle = (IVehicle) worldClientMP.getBlockEntity(setRidingPacket.x, setRidingPacket.y, setRidingPacket.z);
         } else {
             vehicle = getEntityByID(setRidingPacket.vehicleId);
         }
@@ -779,7 +761,7 @@ public class PacketHandlerClient extends PacketHandler
         }
         else
         {
-            return worldClient.getEntityFromId(i);
+            return worldClientMP.getEntityFromId(i);
         }
     }
 
@@ -821,9 +803,9 @@ public class PacketHandlerClient extends PacketHandler
         if (respawnPacket.respawnDimensionId != mc.thePlayer.dimension)
         {
             started = false;
-            worldClient = new WorldClient(mc, this, worldClient.getLevelData().getRandomSeed(), respawnPacket.respawnDimensionId, respawnPacket.respawnWorldTypeId);
-            worldClient.isClientSide = true;
-            mc.changeWorld(worldClient);
+            worldClientMP = new WorldClientMP(this, worldClientMP.getLevelData().getRandomSeed(), respawnPacket.respawnDimensionId, respawnPacket.respawnWorldTypeId);
+            worldClientMP.isClientSide = true;
+            mc.changeWorld(worldClientMP);
             mc.thePlayer.dimension = respawnPacket.respawnDimensionId;
             mc.displayScreen(new ScreenDownloadTerrain(this));
         }
@@ -836,11 +818,11 @@ public class PacketHandlerClient extends PacketHandler
         Explosion explosion;
         if (explosionPacket.isCannonball)
         {
-            explosion = new ExplosionCannonball(mc.theWorld, null, explosionPacket.explosionX, explosionPacket.explosionY, explosionPacket.explosionZ, explosionPacket.explosionSize);
+            explosion = new ExplosionCannonball(mc.currentWorld, null, explosionPacket.explosionX, explosionPacket.explosionY, explosionPacket.explosionZ, explosionPacket.explosionSize);
         }
         else
         {
-            explosion = new Explosion(mc.theWorld, null, explosionPacket.explosionX, explosionPacket.explosionY, explosionPacket.explosionZ, explosionPacket.explosionSize);
+            explosion = new Explosion(mc.currentWorld, null, explosionPacket.explosionX, explosionPacket.explosionY, explosionPacket.explosionZ, explosionPacket.explosionSize);
         }
         explosion.destroyedBlockPositions = explosionPacket.destroyedBlockPositions;
         //explosion.doExplosionA();
@@ -906,7 +888,7 @@ public class PacketHandlerClient extends PacketHandler
     @Override
     public void handleOpenFlagWindow(FlagOpenPacket flagOpenPacket)
     {
-        TileEntity tileEntity = worldClient.getBlockEntity(flagOpenPacket.x, flagOpenPacket.y, flagOpenPacket.z);
+        TileEntity tileEntity = worldClientMP.getBlockEntity(flagOpenPacket.x, flagOpenPacket.y, flagOpenPacket.z);
         if (tileEntity instanceof TileEntityFlag)
         {
             TileEntityFlag tileEntityFlag = (TileEntityFlag) tileEntity;
@@ -1019,7 +1001,7 @@ public class PacketHandlerClient extends PacketHandler
     @Override
     public void handleBlockEvent(BlockEventPacket blockEventPacket)
     {
-        mc.theWorld.triggerEvent(blockEventPacket.xLocation, blockEventPacket.yLocation, blockEventPacket.zLocation, blockEventPacket.index, blockEventPacket.data);
+        mc.currentWorld.triggerEvent(blockEventPacket.xLocation, blockEventPacket.yLocation, blockEventPacket.zLocation, blockEventPacket.index, blockEventPacket.data);
     }
 
     @Override
@@ -1037,7 +1019,7 @@ public class PacketHandlerClient extends PacketHandler
     {
         if (mapdataPacket.itemId == Items.MAP.id)
         {
-            ItemMap.getOrCreateSavedData(mapdataPacket.meta, mapdataPacket.scale, mc.theWorld).setColors(mapdataPacket.mapData);
+            ItemMap.getOrCreateSavedData(mapdataPacket.meta, mapdataPacket.scale, mc.currentWorld).setColors(mapdataPacket.mapData);
         }
         else
         {
@@ -1048,7 +1030,7 @@ public class PacketHandlerClient extends PacketHandler
     @Override
     public void handlePlaySoundEffect(PlaySoundEffectPacket playSoundEffectPacket)
     {
-        mc.theWorld.playBlockEvent(playSoundEffectPacket.soundID, playSoundEffectPacket.x, playSoundEffectPacket.y, playSoundEffectPacket.z, playSoundEffectPacket.data);
+        mc.currentWorld.playBlockEvent(playSoundEffectPacket.soundID, playSoundEffectPacket.x, playSoundEffectPacket.y, playSoundEffectPacket.z, playSoundEffectPacket.data);
     }
 
 	@Override
@@ -1131,25 +1113,25 @@ public class PacketHandlerClient extends PacketHandler
     {
         Class<?> clazz = TileEntityDispatcher.getClassFromID(blockEntityDataPacket.tag.getString("id"));
         if (clazz == null) return;
-        TileEntity existingTileEntity = worldClient.getBlockEntity(blockEntityDataPacket.tag.getInteger("x"), blockEntityDataPacket.tag.getInteger("y"), blockEntityDataPacket.tag.getInteger("z"));
+        TileEntity existingTileEntity = worldClientMP.getBlockEntity(blockEntityDataPacket.tag.getInteger("x"), blockEntityDataPacket.tag.getInteger("y"), blockEntityDataPacket.tag.getInteger("z"));
         if (existingTileEntity == null || existingTileEntity.getClass() != clazz)
         {
             TileEntity tileEntity = TileEntityDispatcher.createAndLoadEntity(blockEntityDataPacket.tag);
             if (tileEntity != null)
             {
-                mc.theWorld.setBlockTileEntity(tileEntity.x, tileEntity.y, tileEntity.z, tileEntity);
+                mc.currentWorld.setBlockTileEntity(tileEntity.x, tileEntity.y, tileEntity.z, tileEntity);
             }
         }
         else
         {
             existingTileEntity.readFromNBT(blockEntityDataPacket.tag);
         }
-        worldClient.markBlockDirty(blockEntityDataPacket.tag.getInteger("x"), blockEntityDataPacket.tag.getInteger("y"), blockEntityDataPacket.tag.getInteger("z"));
+        worldClientMP.markBlockDirty(blockEntityDataPacket.tag.getInteger("x"), blockEntityDataPacket.tag.getInteger("y"), blockEntityDataPacket.tag.getInteger("z"));
     }
 
     @Override
     public void handleGameRule(GameRulePacket packet) {
-        LevelData levelData = mc.theWorld.getLevelData();
+        LevelData levelData = mc.currentWorld.getLevelData();
         if (packet.getGameRules() != null) {
             levelData.getGameRules().setValues(packet.getGameRules());
         }
@@ -1184,7 +1166,7 @@ public class PacketHandlerClient extends PacketHandler
 //            System.out.printf("b0:%s b1:%s b2:%s b3:%s\n", packet.data[0], packet.data[1], packet.data[2], packet.data[3]);
             int rainbowTicks = Byte.toUnsignedInt(customPayloadPacket.data[0]) << 24 | Byte.toUnsignedInt(customPayloadPacket.data[1]) << 16 | Byte.toUnsignedInt(customPayloadPacket.data[2]) << 8 | Byte.toUnsignedInt(customPayloadPacket.data[3]);
 //            System.out.println("Added rainbow with " + rainbowTicks + " ticks");
-            worldClient.addRainbow(rainbowTicks);
+            worldClientMP.addRainbow(rainbowTicks);
         }
     }
 
diff --git a/src/main/java/net/minecraft/client/net/handler/PingPacketHandler.java b/src/main/java/net/minecraft/client/net/handler/PingPacketHandler.java
index 012e6b0e0..203c3464d 100644
--- a/src/main/java/net/minecraft/client/net/handler/PingPacketHandler.java
+++ b/src/main/java/net/minecraft/client/net/handler/PingPacketHandler.java
@@ -7,6 +7,7 @@ import net.minecraft.core.net.ServerData;
 import net.minecraft.core.net.handler.PacketHandler;
 import net.minecraft.core.net.packet.DisconnectPacket;
 import net.minecraft.core.net.packet.Packet;
+import net.minecraft.core.net.packet.PingHandshakePacket;
 
 import java.io.IOException;
 import java.net.InetAddress;
@@ -19,7 +20,6 @@ public class PingPacketHandler
     private final ScreenSelectServer screen;
     private final NetworkManager netManager;
     private final ServerData server;
-    public static long startTime = 0;
 
     public PingPacketHandler(ScreenSelectServer screen, ServerData server)
         throws IOException {
@@ -62,7 +62,7 @@ public class PingPacketHandler
             server.motd = serverInfo[3];
             server.currentPlayers = parseIntWithDefault(serverInfo[4], -1);
             server.maxPlayers = parseIntWithDefault(serverInfo[5], -1);
-            server.latency = System.currentTimeMillis() - startTime;
+            server.latency = System.currentTimeMillis() - PingHandshakePacket.startTime;
 
             screen.handleIncomingServerInfo(server);
 
diff --git a/src/main/java/net/minecraft/client/option/GameSettings.java b/src/main/java/net/minecraft/client/option/GameSettings.java
index 7ad459b83..8d4576d7c 100644
--- a/src/main/java/net/minecraft/client/option/GameSettings.java
+++ b/src/main/java/net/minecraft/client/option/GameSettings.java
@@ -414,8 +414,8 @@ public class GameSettings {
 	public void optionChanged(Option<?> option) {
 		if (option == null) return;
 		if (option == difficulty) {
-			if (mc.theWorld != null) {
-				mc.theWorld.setDifficulty(difficulty.value, false);
+			if (mc.currentWorld != null) {
+				mc.currentWorld.setDifficulty(difficulty.value, false);
 			}
 		}
 		if(option == enableVsync) mc.gameWindow.setVsync(enableVsync.value);
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 9ccb98a30..59036f09f 100644
--- a/src/main/java/net/minecraft/client/player/controller/PlayerController.java
+++ b/src/main/java/net/minecraft/client/player/controller/PlayerController.java
@@ -50,9 +50,9 @@ public abstract class PlayerController {
 			return;
 		}
 
-		Block mineBlock = Block.getBlock(mc.theWorld.getBlockId(x, y, z));
+		Block mineBlock = Block.getBlock(mc.currentWorld.getBlockId(x, y, z));
 		if(mineBlock != null) {
-			float mineStrength = mineBlock.blockStrength(mc.theWorld, x, y, z, side, mc.thePlayer);
+			float mineStrength = mineBlock.blockStrength(mc.currentWorld, x, y, z, side, mc.thePlayer);
 			
 			if(mineStrength < 1.0f) {
 				if(!repeat) {
@@ -76,11 +76,11 @@ public abstract class PlayerController {
 			return;
 		}
 		
-		Block mineBlock = Block.getBlock(mc.theWorld.getBlockId(x, y, z));
+		Block mineBlock = Block.getBlock(mc.currentWorld.getBlockId(x, y, z));
 		if(mineBlock != null) {	
 			syncCurrentPlayItem();
 			
-			float mineStrength = mineBlock.blockStrength(mc.theWorld, x, y, z, side, mc.thePlayer);
+			float mineStrength = mineBlock.blockStrength(mc.currentWorld, x, y, z, side, mc.thePlayer);
 			if(mineStrength >= 1.0f) {
 				//Instant Mining
 				
@@ -148,7 +148,7 @@ public abstract class PlayerController {
 	public boolean destroyBlock(int x, int y, int z, Side side, Player player) {
 		if (!player.getGamemode().canInteract() || mc.thePlayer.getHeldObject() != null) return false;
 		setMineBlock(null, null, null);
-		World world = mc.theWorld;
+		World world = mc.currentWorld;
 		Block block = Block.getBlock(world.getBlockId(x, y, z));
 		if(block == null) return false;
 		
@@ -182,11 +182,11 @@ public abstract class PlayerController {
 	
 	protected void hitBlock(int x, int y, int z, Side side, double xHit, double yHit) {
 		if (!mc.thePlayer.getGamemode().canInteract() || mc.thePlayer.getHeldObject() != null) return;
-		mc.theWorld.onBlockHit(mc.thePlayer, x, y, z, side);
+		mc.currentWorld.onBlockHit(mc.thePlayer, x, y, z, side);
 		
-		Block block = Block.getBlock(mc.theWorld.getBlockId(x, y, z));
+		Block block = Block.getBlock(mc.currentWorld.getBlockId(x, y, z));
 		if(block != null) {
-			block.onBlockLeftClicked(mc.theWorld, x, y, z, mc.thePlayer, side, xHit, yHit);
+			block.onBlockLeftClicked(mc.currentWorld, x, y, z, mc.thePlayer, side, xHit, yHit);
 		}
 	}
 	
@@ -314,7 +314,7 @@ public abstract class PlayerController {
 	
 	public void playDigSound(Block block, int x, int y, int z) {
 		if(soundDelay <= 0) {
-			mc.theWorld.playBlockSoundEffect(null, x + 0.5f, y + 0.5f, z + 0.5f, block, EnumBlockSoundEffectType.DIG);
+			mc.currentWorld.playBlockSoundEffect(null, x + 0.5f, y + 0.5f, z + 0.5f, block, EnumBlockSoundEffectType.DIG);
 			soundDelay = 3;
 		}else {
 			soundDelay--;
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 3c7ced0d4..77314de29 100644
--- a/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java
+++ b/src/main/java/net/minecraft/client/player/controller/PlayerControllerMP.java
@@ -26,11 +26,11 @@ public class PlayerControllerMP extends PlayerController {
 
 	@Override
 	public boolean destroyBlock(int x, int y, int z, Side side, Player player) {
-		int id = mc.theWorld.getBlockId(x, y, z);
+		int id = mc.currentWorld.getBlockId(x, y, z);
 		boolean removed = super.destroyBlock(x, y, z, side, player);
 		ItemStack item = mc.thePlayer.getCurrentEquippedItem();
 		if (item != null) {
-			item.onDestroyBlock(mc.theWorld, id, x, y, z, side, mc.thePlayer);
+			item.onDestroyBlock(mc.currentWorld, id, x, y, z, side, mc.thePlayer);
 			if (item.stackSize <= 0) {
 				mc.thePlayer.destroyCurrentEquippedItem();
 			}
diff --git a/src/main/java/net/minecraft/client/player/controller/PlayerControllerSP.java b/src/main/java/net/minecraft/client/player/controller/PlayerControllerSP.java
index 916f30673..8633176a8 100644
--- a/src/main/java/net/minecraft/client/player/controller/PlayerControllerSP.java
+++ b/src/main/java/net/minecraft/client/player/controller/PlayerControllerSP.java
@@ -16,17 +16,17 @@ public class PlayerControllerSP extends PlayerController {
 	@Override
 	public boolean destroyBlock(int x, int y, int z, Side side, Player player) {
 		if (!player.getGamemode().canInteract() || mc.thePlayer.getHeldObject() != null) return false;
-		int id = mc.theWorld.getBlockId(x, y, z);
-		int meta = mc.theWorld.getBlockMetadata(x, y, z);
-		TileEntity tileEntity = mc.theWorld.getBlockEntity(x, y, z);
+		int id = mc.currentWorld.getBlockId(x, y, z);
+		int meta = mc.currentWorld.getBlockMetadata(x, y, z);
+		TileEntity tileEntity = mc.currentWorld.getBlockEntity(x, y, z);
 		boolean removed = super.destroyBlock(x, y, z, side, player);
 		ItemStack item = mc.thePlayer.getCurrentEquippedItem();
 
 		if (item != null) {
-			item.onDestroyBlock(mc.theWorld, id, x, y, z, side, mc.thePlayer);
+			item.onDestroyBlock(mc.currentWorld, id, x, y, z, side, mc.thePlayer);
 		}
 		if (removed && mc.thePlayer.getGamemode().dropBlockOnBreak()) {
-			Block.blocksList[id].harvestBlock(mc.theWorld, mc.thePlayer, x, y, z, meta, tileEntity);
+			Block.blocksList[id].harvestBlock(mc.currentWorld, mc.thePlayer, x, y, z, meta, tileEntity);
 		}
 
 		if (item != null && item.stackSize <= 0)
diff --git a/src/main/java/net/minecraft/client/render/EntityRenderDispatcher.java b/src/main/java/net/minecraft/client/render/EntityRenderDispatcher.java
index bffcb24ef..6b807c251 100644
--- a/src/main/java/net/minecraft/client/render/EntityRenderDispatcher.java
+++ b/src/main/java/net/minecraft/client/render/EntityRenderDispatcher.java
@@ -27,7 +27,7 @@ import net.minecraft.core.entity.projectile.ProjectileCannonball;
 import net.minecraft.core.entity.projectile.ProjectileEgg;
 import net.minecraft.core.entity.projectile.ProjectileFireball;
 import net.minecraft.core.entity.projectile.ProjectileSnowball;
-import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.entity.vehicle.EntityBoat;
 import net.minecraft.core.item.Items;
 import org.lwjgl.opengl.GL11;
 import net.minecraft.client.option.GameSettings;
@@ -123,7 +123,7 @@ public class EntityRenderDispatcher
         renderers.put(EntityPrimedTNT.class, new EntityRendererTNT());
         renderers.put(EntityFallingBlock.class, new EntityRendererFallingBlock());
         renderers.put(MinecartEntity.class, new EntityRendererMinecart());
-        renderers.put(BoatEntity.class, new EntityRendererBoat());
+        renderers.put(EntityBoat.class, new EntityRendererBoat());
         renderers.put(EntityFishingBobber.class, new EntityRendererFishingBobber());
         renderers.put(MobFireflyCluster.class, new MobRendererFireflyCluster());
         renderers.put(EntityLightning.class, new EntityRendererLightningBolt());
diff --git a/src/main/java/net/minecraft/client/render/FogManager.java b/src/main/java/net/minecraft/client/render/FogManager.java
index b0d8db120..df504172f 100644
--- a/src/main/java/net/minecraft/client/render/FogManager.java
+++ b/src/main/java/net/minecraft/client/render/FogManager.java
@@ -4,6 +4,7 @@ import static org.lwjgl.opengl.GL11.*;
 
 import java.nio.FloatBuffer;
 
+import net.minecraft.client.world.WorldClient;
 import net.minecraft.core.util.phys.Vec3;
 import org.lwjgl.opengl.NVFogDistance;
 
@@ -41,10 +42,10 @@ public class FogManager {
     public void updateBrightness() {
         fogBrightnessOld = fogBrightness;
 
-        float fogModifier = mc.theWorld.getCurrentWeather() != null ? mc.theWorld.getCurrentWeather().fogDistance : 1.0f;
-        fogModifier = (1.0f - ((1.0f - fogModifier) * mc.theWorld.weatherManager.getWeatherIntensity() * mc.theWorld.weatherManager.getWeatherPower()));
+        float fogModifier = mc.currentWorld.getCurrentWeather() != null ? mc.currentWorld.getCurrentWeather().fogDistance : 1.0f;
+        fogModifier = (1.0f - ((1.0f - fogModifier) * mc.currentWorld.weatherManager.getWeatherIntensity() * mc.currentWorld.weatherManager.getWeatherPower()));
 
-        float brightnessAtCamera = mc.theWorld.getLightBrightness(MathHelper.floor(mc.activeCamera.getX(1f)), MathHelper.floor(mc.activeCamera.getY(1f)), MathHelper.floor(mc.activeCamera.getZ(1f)));
+        float brightnessAtCamera = mc.currentWorld.getLightBrightness(MathHelper.floor(mc.activeCamera.getX(1f)), MathHelper.floor(mc.activeCamera.getY(1f)), MathHelper.floor(mc.activeCamera.getZ(1f)));
         if (mc.fullbright) brightnessAtCamera = 1.0f;
         float renderDistanceModifier = (((mc.gameSettings.renderDistance.highest - mc.gameSettings.renderDistance.value) * fogModifier) / (float) mc.gameSettings.renderDistance.highest);
 
@@ -58,12 +59,12 @@ public class FogManager {
         glFogfv(GL_FOG_COLOR, buffer(fogRed, fogGreen, fogBlue, 0.5F));
         glNormal3f(0.0F, -1F, 0.0F);
         glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-        if(CameraUtil.isUnderLiquid(mc.activeCamera, mc.theWorld, Material.water, partialTick))
+        if(CameraUtil.isUnderLiquid(mc.activeCamera, mc.currentWorld, Material.water, partialTick))
         {
             glFogi(GL_FOG_MODE, GL_EXP);
             glFogf(GL_FOG_DENSITY, 0.1F);
         }
-        else if(CameraUtil.isUnderLiquid(mc.activeCamera, mc.theWorld, Material.lava, partialTick))
+        else if(CameraUtil.isUnderLiquid(mc.activeCamera, mc.currentWorld, Material.lava, partialTick))
         {
             glFogi(GL_FOG_MODE, GL_EXP);
             glFogf(GL_FOG_DENSITY, 2.0F);
@@ -73,8 +74,8 @@ public class FogManager {
             float maxFogDistance = RenderDistance.EXTREME.chunks * 16;
             float fogDistance = farPlaneDistance;
 
-            float fogModifier = mc.theWorld.getCurrentWeather() != null ? mc.theWorld.getCurrentWeather().fogDistance : 1.0f;
-            fogModifier = (1.0f - ((1.0f - fogModifier) * mc.theWorld.weatherManager.getWeatherIntensity() * mc.theWorld.weatherManager.getWeatherPower()));
+            float fogModifier = mc.currentWorld.getCurrentWeather() != null ? mc.currentWorld.getCurrentWeather().fogDistance : 1.0f;
+            fogModifier = (1.0f - ((1.0f - fogModifier) * mc.currentWorld.weatherManager.getWeatherIntensity() * mc.currentWorld.weatherManager.getWeatherPower()));
 
             if (fogDistance > maxFogDistance * fogModifier) fogDistance = maxFogDistance * fogModifier;
 
@@ -96,7 +97,7 @@ public class FogManager {
             {
                 glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV);
             }
-            if(mc.theWorld.dimension == Dimension.NETHER)
+            if(mc.currentWorld.dimension == Dimension.NETHER)
             {
                 glFogf(GL_FOG_START, 0.0F);
             }
@@ -107,7 +108,7 @@ public class FogManager {
 
     public void updateFogColor(float partialTick)
     {
-        World world = mc.theWorld;
+        WorldClient world = mc.currentWorld;
 
         float renderDistanceScale = 1.0F / (float)((mc.gameSettings.renderDistance.highest + 1) - mc.gameSettings.renderDistance.value);
         renderDistanceScale = 1.0F - (float) Math.pow(renderDistanceScale, 0.25D);
diff --git a/src/main/java/net/minecraft/client/render/Font.java b/src/main/java/net/minecraft/client/render/Font.java
index 9e8c28c82..22dd70342 100644
--- a/src/main/java/net/minecraft/client/render/Font.java
+++ b/src/main/java/net/minecraft/client/render/Font.java
@@ -1,7 +1,7 @@
 package net.minecraft.client.render;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.lang.text.Text;
+import net.minecraft.core.lang.text.Text;
 import net.minecraft.client.option.GameSettings;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.texture.Texture;
diff --git a/src/main/java/net/minecraft/client/render/ItemRenderer.java b/src/main/java/net/minecraft/client/render/ItemRenderer.java
index bc65e5e3b..b67cbc085 100644
--- a/src/main/java/net/minecraft/client/render/ItemRenderer.java
+++ b/src/main/java/net/minecraft/client/render/ItemRenderer.java
@@ -86,7 +86,7 @@ public class ItemRenderer
         	}else if(mc.fullbright) {
         		
         	}else {
-        		brightness = mc.theWorld.getLightBrightness(MathHelper.floor(player.x), MathHelper.floor(player.y), MathHelper.floor(player.z));
+        		brightness = mc.currentWorld.getLightBrightness(MathHelper.floor(player.x), MathHelper.floor(player.y), MathHelper.floor(player.z));
         	}
             GL11.glColor4f(brightness, brightness, brightness, 1.0f);
             EntityRenderer<? extends Entity> render = EntityRenderDispatcher.instance.getRenderer(mc.thePlayer);
@@ -143,11 +143,11 @@ public class ItemRenderer
 
             TextureRegistry.blockAtlas.bind();
 			
-			int id = mc.theWorld.getBlockId(blockX, blockY, blockZ);
-            int meta = mc.theWorld.getBlockMetadata(blockX, blockY, blockZ);
+			int id = mc.currentWorld.getBlockId(blockX, blockY, blockZ);
+            int meta = mc.currentWorld.getBlockMetadata(blockX, blockY, blockZ);
             Block block = Block.blocksList[id];
             BlockModel<Block> model = BlockModelDispatcher.getInstance().getDispatch(block);
-			if(mc.theWorld.isBlockNormalCube(blockX, blockY, blockZ)) {
+			if(mc.currentWorld.isBlockNormalCube(blockX, blockY, blockZ)) {
 				renderInsideOfBlock(partialTicks, model.getBlockTextureFromSideAndMetadata(Side.NORTH, meta));
 			} else {
                 id = 0;
@@ -160,9 +160,9 @@ public class ItemRenderer
 					int y1 = MathHelper.floor_float(blockY + y0);
 					int z1 = MathHelper.floor_float(blockZ + z0);
 					
-					if(mc.theWorld.isBlockNormalCube(x1, y1, z1)) {
-						id = mc.theWorld.getBlockId(x1, y1, z1);
-                        meta = mc.theWorld.getBlockMetadata(x1, y1, z1);
+					if(mc.currentWorld.isBlockNormalCube(x1, y1, z1)) {
+						id = mc.currentWorld.getBlockId(x1, y1, z1);
+                        meta = mc.currentWorld.getBlockMetadata(x1, y1, z1);
                         break;
 					}
 				}
diff --git a/src/main/java/net/minecraft/client/render/LightmapHelper.java b/src/main/java/net/minecraft/client/render/LightmapHelper.java
index 2b529a91b..620ce591d 100644
--- a/src/main/java/net/minecraft/client/render/LightmapHelper.java
+++ b/src/main/java/net/minecraft/client/render/LightmapHelper.java
@@ -43,7 +43,7 @@ public class LightmapHelper {
 	}
 	
 	public void setup() {
-		World world = mc.theWorld;
+		World world = mc.currentWorld;
 		if(mc.gameSettings.customLightmap.value && world != null) {
 			int dimension = world.dimension.id;
 			
@@ -71,7 +71,7 @@ public class LightmapHelper {
 	}
 	
 	public void tick() {
-		World world = mc.theWorld;
+		World world = mc.currentWorld;
 		if(world == null) {
 			return;
 		}
@@ -88,7 +88,7 @@ public class LightmapHelper {
 	}
 
 	public void update(float partialTicks) {
-		World world = mc.theWorld;
+		World world = mc.currentWorld;
 
 		if(!isEnabled() || world == null) {
 			return;
diff --git a/src/main/java/net/minecraft/client/render/PostProcessingManager.java b/src/main/java/net/minecraft/client/render/PostProcessingManager.java
index 0cf87c0b1..4a464eb55 100644
--- a/src/main/java/net/minecraft/client/render/PostProcessingManager.java
+++ b/src/main/java/net/minecraft/client/render/PostProcessingManager.java
@@ -46,15 +46,15 @@ public class PostProcessingManager
 
     public void update()
     {
-        if (mc.theWorld == null || mc.thePlayer == null) return;
+        if (mc.currentWorld == null || mc.thePlayer == null) return;
 
         reset();
         if (mc.gameSettings.colorCorrection.value == 0) return;
 
         float surfaceness = 1.0f;
         float y = (float)mc.thePlayer.y;
-        int maxY = mc.theWorld.getWorldType().getMaxY();
-        int minY = mc.theWorld.getWorldType().getMinY();
+        int maxY = mc.currentWorld.getWorldType().getMaxY();
+        int minY = mc.currentWorld.getWorldType().getMinY();
         int rangeY = maxY - minY;
         int halfY = minY + rangeY / 2;
         int quarterY = minY + rangeY / 4;
@@ -64,15 +64,15 @@ public class PostProcessingManager
         surfaceness = adjustedY / hToQRange;
         surfaceness = MathHelper.clamp(surfaceness, 0.0f, 1.0f);
 
-        double temperature = mc.theWorld.getBlockTemperature((int)mc.thePlayer.x, (int)mc.thePlayer.z); // Ranges from 0.0 to 1.0
+        double temperature = mc.currentWorld.getBlockTemperature((int)mc.thePlayer.x, (int)mc.thePlayer.z); // Ranges from 0.0 to 1.0
         if (temperature == Double.NEGATIVE_INFINITY) temperature = lastTemperature;
         lastTemperature = temperature;
-        double humidity = mc.theWorld.getBlockHumidity((int)mc.thePlayer.x, (int)mc.thePlayer.z); // Ranges from 0.0 to 1.0
+        double humidity = mc.currentWorld.getBlockHumidity((int)mc.thePlayer.x, (int)mc.thePlayer.z); // Ranges from 0.0 to 1.0
         if (humidity == Double.NEGATIVE_INFINITY) humidity = lastHumidity;
         lastHumidity = humidity;
 
         // Perform base temperature change
-        if (mc.theWorld.dimension == Dimension.OVERWORLD)
+        if (mc.currentWorld.dimension == Dimension.OVERWORLD)
         {
             lastTemperature = temperature;
             temperature = (temperature * 2) - 1.0; // Ranges from -1.0 to 1.0
@@ -81,35 +81,35 @@ public class PostProcessingManager
         }
 
         // Perform season effects
-        float seasonProgress = mc.theWorld.getSeasonManager().getSeasonProgress(); // Ranges from 0.0 to 1.0
+        float seasonProgress = mc.currentWorld.getSeasonManager().getSeasonProgress(); // Ranges from 0.0 to 1.0
         seasonProgress = (seasonProgress * 2) - 1f; // Ranges from -1.0 to 1.0
         seasonProgress = Math.abs(seasonProgress); // Ranges from 1.0 to 0.0 to 1.0
         seasonProgress = -seasonProgress + 1.0f; // Ranges from 0.0 to 1.0 to 0.0
-        if (mc.theWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_SPRING)
+        if (mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_SPRING)
         {
             saturation += 0.1f * seasonProgress * surfaceness;
         }
-        else if (mc.theWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_SUMMER)
+        else if (mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_SUMMER)
         {
             rMod += 0.1f * seasonProgress * surfaceness;
             gMod += 0.1f * seasonProgress * surfaceness;
         }
-        else if (mc.theWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_FALL)
+        else if (mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_FALL)
         {
             contrast -= 0.1f * seasonProgress * surfaceness;
             rMod += 0.1f * seasonProgress * surfaceness;
         }
-        else if (mc.theWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_WINTER)
+        else if (mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_WINTER)
         {
             contrast -= 0.1f * seasonProgress * surfaceness;
             bMod += 0.1f * seasonProgress * surfaceness;
         }
 
         // Perform weather effects
-        Weather activeWeather = mc.theWorld.getCurrentWeather();
+        Weather activeWeather = mc.currentWorld.getCurrentWeather();
         if (activeWeather != null)
         {
-            float intensity = mc.theWorld.weatherManager.getWeatherIntensity() * mc.theWorld.weatherManager.getWeatherIntensity();
+            float intensity = mc.currentWorld.weatherManager.getWeatherIntensity() * mc.currentWorld.weatherManager.getWeatherIntensity();
             if (activeWeather == Weathers.OVERWORLD_SNOW || activeWeather == Weathers.OVERWORLD_WINTER_SNOW)
             {
                 contrast += -0.125f * intensity * surfaceness;
@@ -143,7 +143,7 @@ public class PostProcessingManager
         }
 
         // Perform dimension effects
-        if (mc.theWorld.getWorldType() == WorldTypes.NETHER_DEFAULT || mc.theWorld.getWorldType() == WorldTypes.OVERWORLD_HELL)
+        if (mc.currentWorld.getWorldType() == WorldTypes.NETHER_DEFAULT || mc.currentWorld.getWorldType() == WorldTypes.OVERWORLD_HELL)
         {
             rMod += 1.2f;
             gMod += 0.3f;
@@ -155,7 +155,7 @@ public class PostProcessingManager
         }
 
         // Perform heatwave effects
-        if (mc.theWorld.dimension == Dimension.OVERWORLD && (mc.theWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_SUMMER || mc.theWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_FALL))
+        if (mc.currentWorld.dimension == Dimension.OVERWORLD && (mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_SUMMER || mc.currentWorld.getSeasonManager().getCurrentSeason() == Seasons.OVERWORLD_FALL))
         {
             if (temperature >= 0.85 && humidity <= 0.15)
             {
diff --git a/src/main/java/net/minecraft/client/render/RenderGlobal.java b/src/main/java/net/minecraft/client/render/RenderGlobal.java
index c4904019e..0f623c0a3 100644
--- a/src/main/java/net/minecraft/client/render/RenderGlobal.java
+++ b/src/main/java/net/minecraft/client/render/RenderGlobal.java
@@ -17,11 +17,13 @@ import net.minecraft.client.render.terrain.ChunkRenderer;
 import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.client.render.worldtype.WorldTypeFX;
+import net.minecraft.client.render.worldtype.WorldTypeFXDispatcher;
+import net.minecraft.client.world.WorldClient;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemDiscMusic;
 import net.minecraft.core.lang.I18n;
-import net.minecraft.core.util.helper.Color;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.block.Block;
@@ -53,21 +55,6 @@ import java.util.Random;
 
 import static org.lwjgl.opengl.GL11.*;
 
-// Referenced classes of package net.minecraft.src:
-//            IWorldAccess, GLAllocation, RenderList, OpenGlCapsChecker, 
-//            Tessellator, World, RenderManager, RenderBlocks,
-//            Block, GameSettings, BlockLeaves, WorldRenderer, 
-//            Entity, MathHelper, EntitySorter, TileEntityRenderer,
-//            ICamera, Mob, TileEntity, RenderHelper,
-//            EntityRenderer, WorldProvider, Vec3D, RenderEngine, 
-//            RenderSorter, MovingObjectPosition, Player, EnumMovingObjectType,
-//            AxisAlignedBB, GuiIngame, SoundEngine, EntityBubbleFX,
-//            EffectRenderer, EntitySmokeFX, EntityNoteFX, EntityPortalFX, 
-//            EntityExplodeFX, EntityFlameFX, EntityLavaFX, EntityFootStepFX, 
-//            EntitySplashFX, EntityReddustFX, EntityItemFX, Item,
-//            EntitySnowShovelFX, EntityHeartFX, ImageBufferDownload, StepSound, 
-//            ItemDiscMusic, ItemStack
-
 public class RenderGlobal
     implements LevelListener
 {
@@ -199,7 +186,7 @@ public class RenderGlobal
         tessellator.draw();
     }
 
-    public void changeWorld(World world)
+    public void changeWorld(WorldClient world)
     {
         if(worldObj != null)
         {
@@ -826,7 +813,8 @@ public class RenderGlobal
 
     public void drawSky(float partialTick)
     {
-        if(!mc.theWorld.getWorldType().hasSky() || mc.currentScreen instanceof ScreenModelViewer)
+        WorldTypeFX worldTypeFX = WorldTypeFXDispatcher.getInstance().getDispatch(mc.currentWorld.getWorldType());
+        if(!worldTypeFX.hasSky() || mc.currentScreen instanceof ScreenModelViewer)
         {
             return;
         }
@@ -847,7 +835,7 @@ public class RenderGlobal
         GL11.glEnable(GL_BLEND);
         GL11.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
         Lighting.disable();
-        float[] sunriseColor = worldObj.worldType.getSunriseColor(celestialAngle, partialTick);
+        float[] sunriseColor = worldTypeFX.getSunriseColor(celestialAngle, partialTick);
         if(sunriseColor != null)
         {
             GL11.glDisable(GL_TEXTURE_2D);
@@ -974,8 +962,6 @@ public class RenderGlobal
             targetRainbowBrightness = 0;
         }
 
-
-
         // Render moon
         size = 20F;
         textureManager.loadTexture("/terrain/moon.png").bind();
@@ -1000,7 +986,7 @@ public class RenderGlobal
         GL11.glEnable(GL11.GL_ALPHA_TEST);
         GL11.glEnable(GL11.GL_FOG);
         GL11.glPopMatrix();
-        if(worldObj.worldType.hasGround())
+        if(worldTypeFX.hasGround())
         {
             GL11.glColor3f(r * 0.2F + 0.04F, g * 0.2F + 0.04F, b * 0.6F + 0.1F);
         } else
@@ -1017,7 +1003,8 @@ public class RenderGlobal
 
     public void renderClouds(float partialTick)
     {
-        if(!mc.theWorld.getWorldType().hasClouds())
+        WorldTypeFX worldTypeFX = WorldTypeFXDispatcher.getInstance().getDispatch(mc.currentWorld.getWorldType());
+        if(!worldTypeFX.hasClouds())
         {
             return;
         }
@@ -1049,7 +1036,7 @@ public class RenderGlobal
         int k = MathHelper.floor(posZ / 2048D);
         posX -= j * 2048;
         posZ -= k * 2048;
-        float cloudHeight = (worldObj.worldType.getCloudHeight() - cameraY) + 0.33F + getCloudHeightModifier();
+        float cloudHeight = (worldTypeFX.getCloudHeight() - cameraY) + 0.33F + getCloudHeightModifier();
         float f10 = (float)(posX * (double)f6);
         float f11 = (float)(posZ * (double)f6);
         tessellator.startDrawingQuads();
@@ -1074,10 +1061,11 @@ public class RenderGlobal
 
     public void renderCloudsFancy(float partialTick)
     {
+        WorldTypeFX worldTypeFX = WorldTypeFXDispatcher.getInstance().getDispatch(mc.currentWorld.getWorldType());
     	mc.renderer.beginRenderClouds(partialTick);
     	
         float celestialAngle = worldObj.getCelestialAngle(partialTick);
-        float[] sunriseColor = worldObj.worldType.getSunriseColor(celestialAngle, partialTick);
+        float[] sunriseColor = worldTypeFX.getSunriseColor(celestialAngle, partialTick);
         float rSun = 0.0f, gSun = 0.0f, bSun = 0.0f, aSun = 0.0f;
         if (sunriseColor != null) {
             rSun = sunriseColor[0];
@@ -1098,7 +1086,7 @@ public class RenderGlobal
         float cloudThickness = 4F;
         double dx = (mc.activeCamera.getX(partialTick) + (double)((lastCloudOffsetX + (cloudOffsetX - lastCloudOffsetX) * partialTick) * 0.03F)) / (double)cloudWidth;
         double dz = (mc.activeCamera.getZ(partialTick) + (double)((lastCloudOffsetZ + (cloudOffsetZ - lastCloudOffsetZ) * partialTick) * 0.03F)) / (double)cloudWidth + 0.33D;
-        float dy = (worldObj.worldType.getCloudHeight() - cameraY) + 0.33F + getCloudHeightModifier();
+        float dy = (worldTypeFX.getCloudHeight() - cameraY) + 0.33F + getCloudHeightModifier();
         int i = MathHelper.floor(dx / 2048D);
         int j = MathHelper.floor(dz / 2048D);
         dx -= i * 2048;
@@ -1457,7 +1445,7 @@ public class RenderGlobal
 		int x1 = x0 + 16;
 		int z1 = z0 + 16;
 		
-		int worldHeight = mc.theWorld.getHeightBlocks();
+		int worldHeight = mc.currentWorld.getHeightBlocks();
 
 		glLineWidth(2.0f);
         glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
@@ -1793,7 +1781,7 @@ public class RenderGlobal
 	}
 
     public List<TileEntity> tileEntities;
-    private World worldObj;
+    private WorldClient worldObj;
     private final TextureManager textureManager;
     private final List<ChunkRenderer> chunkRenderersToUpdate;
     private ChunkRenderer[] sortedChunkRenderers;
diff --git a/src/main/java/net/minecraft/client/render/WorldRenderer.java b/src/main/java/net/minecraft/client/render/WorldRenderer.java
index 323896785..4e3219d1e 100644
--- a/src/main/java/net/minecraft/client/render/WorldRenderer.java
+++ b/src/main/java/net/minecraft/client/render/WorldRenderer.java
@@ -6,6 +6,7 @@ import java.util.List;
 import java.util.Random;
 
 import com.mojang.logging.LogUtils;
+import net.minecraft.client.render.worldtype.WorldTypeFXDispatcher;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.util.phys.Vec3;
 import org.lwjgl.input.Mouse;
@@ -32,7 +33,7 @@ import net.minecraft.client.render.colorizer.Colorizers;
 import net.minecraft.client.render.culling.Frustum;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.client.util.debug.Debug;
+import net.minecraft.core.util.debug.Debug;
 import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.material.Material;
@@ -120,7 +121,7 @@ public class WorldRenderer
 		if(mc.activeCamera == null) {
 			return;
 		}
-		if(mc.theWorld == null) {
+		if(mc.currentWorld == null) {
 			return;
 		}
 		
@@ -132,7 +133,7 @@ public class WorldRenderer
 		Vec3 pos2 = pos1.add(look.x * blockReach, look.y * blockReach, look.z * blockReach);
 		
 		// Raytrace blocks
-		mc.objectMouseOver = mc.theWorld.checkBlockCollisionBetweenPoints(pos1, pos2);
+		mc.objectMouseOver = mc.currentWorld.checkBlockCollisionBetweenPoints(pos1, pos2);
 		
 		// Calculate again because block raytrace changes the values
 		pos1 = mc.thePlayer.getPosition(partialTicks, false);
@@ -148,7 +149,7 @@ public class WorldRenderer
 		float expand = 1.0f;
 		AABB entitySearchBox = mc.thePlayer.bb.expand(look.x * entityReach, look.y * entityReach, look.z * entityReach).grow(expand, expand, expand);
 		
-		List<Entity> entities = mc.theWorld.getEntitiesWithinAABBExcludingEntity(mc.thePlayer, entitySearchBox);
+		List<Entity> entities = mc.currentWorld.getEntitiesWithinAABBExcludingEntity(mc.thePlayer, entitySearchBox);
 		
 		// Search for the closest hit entity
 		double pointedEntityDistance = 0.0;
@@ -203,7 +204,7 @@ public class WorldRenderer
             f1 = (int)(mc.activeCamera.getFov() * 100 + 30);
             f1 *= a + (b - a) * partialTick;
         }
-        if(CameraUtil.isUnderLiquid(mc.activeCamera, mc.theWorld, Material.water, partialTick))
+        if(CameraUtil.isUnderLiquid(mc.activeCamera, mc.currentWorld, Material.water, partialTick))
         {
             f1 = f1 - 10;
         }
@@ -503,7 +504,7 @@ public class WorldRenderer
         }
         if (c <= 0) c = 1;
         glViewport(0, 0, mc.gameWindow.getWidthPixels(), mc.gameWindow.getHeightPixels());
-        if(mc.theWorld != null)
+        if(mc.currentWorld != null)
         {
             Debug.change("world");
             if(!mc.gameSettings.enableVsync.value && mc.gameSettings.customFpsLimit.value == 0) // Max FPS
@@ -608,7 +609,7 @@ public class WorldRenderer
         {
             double viewEntityX = activeEntity.xo + (activeEntity.x - activeEntity.xo) * (double)partialTicks;
             double viewEntityZ = activeEntity.zo + (activeEntity.z - activeEntity.zo) * (double)partialTicks;
-            IChunkProvider iChunkProvider = mc.theWorld.getChunkProvider();
+            IChunkProvider iChunkProvider = mc.currentWorld.getChunkProvider();
             int chunkX = MathHelper.floor_float((int)viewEntityX) >> 4;
             int chunkZ = MathHelper.floor_float((int)viewEntityZ) >> 4;
             iChunkProvider.setCurrentChunkOver(chunkX, chunkZ);
@@ -642,7 +643,7 @@ public class WorldRenderer
         mc.renderGlobal.clipRenderersByFrustum(mc.activeCamera.getFrustum(), partialTicks);
 
         Debug.change("aurora");
-        if (mc.gameSettings.aurora.value && mc.theWorld.getWorldType().hasAurora())
+        if (mc.gameSettings.aurora.value && WorldTypeFXDispatcher.getInstance().getDispatch(mc.currentWorld.getWorldType()).hasAurora())
         {
             renderGlobal.renderAurora(mc.activeCamera, partialTicks);
         }
@@ -758,10 +759,10 @@ public class WorldRenderer
 
     private void addRainParticles()
     {
-        Weather weather = mc.theWorld.getCurrentWeather();
+        Weather weather = mc.currentWorld.getCurrentWeather();
         if (weather == null || !weather.spawnRainParticles) return;
         
-        float f = mc.theWorld.weatherManager.getWeatherIntensity() * mc.theWorld.weatherManager.getWeatherPower();
+        float f = mc.currentWorld.weatherManager.getWeatherIntensity() * mc.currentWorld.weatherManager.getWeatherPower();
         
         if(mc.gameSettings.fancyGraphics.value != 1)
         {
@@ -772,7 +773,7 @@ public class WorldRenderer
             return;
         }
         random.setSeed((long)rendererUpdateCount * 0x12a7ce5fL);
-        World world = mc.theWorld;
+        World world = mc.currentWorld;
         int cameraX = MathHelper.floor(mc.activeCamera.getX());
         int cameraY = MathHelper.floor(mc.activeCamera.getY());
         int cameraZ = MathHelper.floor(mc.activeCamera.getZ());
@@ -824,20 +825,20 @@ public class WorldRenderer
             rainSoundCounter = 0;
             if(d1 > mc.activeCamera.getY() + 1.0D && world.getHeightValue(MathHelper.floor(mc.activeCamera.getX()), MathHelper.floor(mc.activeCamera.getZ())) > MathHelper.floor(mc.activeCamera.getY()))
             {
-                mc.theWorld.playSoundEffect(null, SoundCategory.WEATHER_SOUNDS, d, d1, d2, "ambient.weather.rain", 0.1F * mc.theWorld.weatherManager.getWeatherIntensity() * mc.theWorld.weatherManager.getWeatherPower() * 0.5f, 0.5F);
+                mc.currentWorld.playSoundEffect(null, SoundCategory.WEATHER_SOUNDS, d, d1, d2, "ambient.weather.rain", 0.1F * mc.currentWorld.weatherManager.getWeatherIntensity() * mc.currentWorld.weatherManager.getWeatherPower() * 0.5f, 0.5F);
             } else
             {
-                mc.theWorld.playSoundEffect(null, SoundCategory.WEATHER_SOUNDS, d, d1, d2, "ambient.weather.rain", 0.2F * mc.theWorld.weatherManager.getWeatherIntensity() * mc.theWorld.weatherManager.getWeatherPower() * 0.5f, 1.0F);
+                mc.currentWorld.playSoundEffect(null, SoundCategory.WEATHER_SOUNDS, d, d1, d2, "ambient.weather.rain", 0.2F * mc.currentWorld.weatherManager.getWeatherIntensity() * mc.currentWorld.weatherManager.getWeatherPower() * 0.5f, 1.0F);
             }
         }
     }
 
     protected void renderRainSnow(float partialTick)
     {
-        Weather weather = mc.theWorld.getCurrentWeather();
+        Weather weather = mc.currentWorld.getCurrentWeather();
         if (weather == null || !weather.isPrecipitation) return;
         
-        World world = mc.theWorld;
+        World world = mc.currentWorld;
         int posX = MathHelper.floor(mc.activeCamera.getX());
         int posY = MathHelper.floor(mc.activeCamera.getY());
         int posZ = MathHelper.floor(mc.activeCamera.getZ());
diff --git a/src/main/java/net/minecraft/client/render/blockentity/TileEntityRendererFlag.java b/src/main/java/net/minecraft/client/render/blockentity/TileEntityRendererFlag.java
index c1503f067..479940caa 100644
--- a/src/main/java/net/minecraft/client/render/blockentity/TileEntityRendererFlag.java
+++ b/src/main/java/net/minecraft/client/render/blockentity/TileEntityRendererFlag.java
@@ -27,14 +27,14 @@ public class TileEntityRendererFlag extends TileEntityRenderer<TileEntityFlag>
 
     @Override
     public void doRender(Tessellator tessellator, TileEntityFlag tileEntity, double x, double y, double z, float partialTick) {
-        World theWorld = Minecraft.getMinecraft(this).theWorld;
+        World theWorld = Minecraft.getMinecraft(this).currentWorld;
         int blockUnder = theWorld.getBlockId(tileEntity.x, tileEntity.y - 1, tileEntity.z);
         boolean shortPole = blockUnder == Blocks.FLAG.id;
 
-        WindProvider theWind = mc.theWorld.getWorldType().getWindManager();
+        WindProvider theWind = mc.currentWorld.getWorldType().getWindManager();
 
-        float windDirection = theWind.getWindDirection(mc.theWorld, 0.0f, 500.0f, 0.0f) * 360f;
-        float windIntensity = theWind.getWindIntensity(mc.theWorld, 0.0f, 500.0f, 0.0f);
+        float windDirection = theWind.getWindDirection(mc.currentWorld, 0.0f, 500.0f, 0.0f) * 360f;
+        float windIntensity = theWind.getWindIntensity(mc.currentWorld, 0.0f, 500.0f, 0.0f);
         
         doRender(tileEntity, x, y, z, partialTick, shortPole, windDirection, windIntensity);
     }
@@ -42,7 +42,7 @@ public class TileEntityRendererFlag extends TileEntityRenderer<TileEntityFlag>
     private long lastTick = 0;
     public void doRender(TileEntityFlag tileEntityFlag, double x, double y, double z, float partialTick, boolean shortPole, float windDirection, float windIntensity)
     {
-        World theWorld = Minecraft.getMinecraft(this).theWorld;
+        World theWorld = Minecraft.getMinecraft(this).currentWorld;
         if (flagRenderer == null)
         {
             flagRenderer = new FlagRenderer(renderDispatcher.textureManager);
diff --git a/src/main/java/net/minecraft/client/render/blockentity/TileEntityRendererMeshGold.java b/src/main/java/net/minecraft/client/render/blockentity/TileEntityRendererMeshGold.java
index 2c417b1a9..6abb59749 100644
--- a/src/main/java/net/minecraft/client/render/blockentity/TileEntityRendererMeshGold.java
+++ b/src/main/java/net/minecraft/client/render/blockentity/TileEntityRendererMeshGold.java
@@ -35,7 +35,7 @@ public class TileEntityRendererMeshGold extends TileEntityRenderer<TileEntityMes
         renderEntity.y = renderEntity.yo = tileEntity.y + 0.5;
         renderEntity.z = renderEntity.zo = tileEntity.z + 0.5;
         
-        float lightLevel = Minecraft.getMinecraft(this).theWorld.getLightBrightness(tileEntity.x, tileEntity.y, tileEntity.z);
+        float lightLevel = Minecraft.getMinecraft(this).currentWorld.getLightBrightness(tileEntity.x, tileEntity.y, tileEntity.z);
         if (Global.accessor.isFullbrightEnabled()) lightLevel = 1.0f;
         BlockModel.setRenderBlocks(EntityRenderDispatcher.instance.itemRenderer.renderBlocksInstance);
         GL11.glEnable(GL12.GL_RESCALE_NORMAL);
diff --git a/src/main/java/net/minecraft/client/render/blockentity/TileEntityRendererSign.java b/src/main/java/net/minecraft/client/render/blockentity/TileEntityRendererSign.java
index 16a60890f..6804b71ea 100644
--- a/src/main/java/net/minecraft/client/render/blockentity/TileEntityRendererSign.java
+++ b/src/main/java/net/minecraft/client/render/blockentity/TileEntityRendererSign.java
@@ -85,7 +85,7 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
         GL11.glPopMatrix();
         
         // Render text
-        float lightLevel = mc.theWorld.getLightBrightness(tileEntity.x, tileEntity.y, tileEntity.z);
+        float lightLevel = mc.currentWorld.getLightBrightness(tileEntity.x, tileEntity.y, tileEntity.z);
         float lightOffset = 0f;
         if (tileEntity.isGlowing()) {
             lightLevel = 1f;
diff --git a/src/main/java/net/minecraft/client/render/camera/EntityCameraSleeping.java b/src/main/java/net/minecraft/client/render/camera/EntityCameraSleeping.java
index bd201d098..0fcada15e 100644
--- a/src/main/java/net/minecraft/client/render/camera/EntityCameraSleeping.java
+++ b/src/main/java/net/minecraft/client/render/camera/EntityCameraSleeping.java
@@ -33,7 +33,7 @@ public class EntityCameraSleeping
     public EntityCameraSleeping(Minecraft mc, Mob entity, int xb, int yb, int zb, double xs, double ys, double zs, double yRotS, double xRotS)
     {
         super(mc, entity);
-        int metadata = mc.theWorld.getBlockMetadata(xb, yb, zb) & 3;
+        int metadata = mc.currentWorld.getBlockMetadata(xb, yb, zb) & 3;
 
         while (yRotS < 0)
         {
diff --git a/src/main/java/net/minecraft/client/render/camera/EntityCameraThirdPersonRear.java b/src/main/java/net/minecraft/client/render/camera/EntityCameraThirdPersonRear.java
index bb648f71e..43e2cbf51 100644
--- a/src/main/java/net/minecraft/client/render/camera/EntityCameraThirdPersonRear.java
+++ b/src/main/java/net/minecraft/client/render/camera/EntityCameraThirdPersonRear.java
@@ -48,7 +48,7 @@ public class EntityCameraThirdPersonRear
 
         for(int i = 0; i <= numSteps; i++)
         {
-            HitResult hitResult = mc.theWorld.checkBlockCollisionBetweenPoints(
+            HitResult hitResult = mc.currentWorld.checkBlockCollisionBetweenPoints(
                     Vec3.getTempVec3(x, y, z),
                     Vec3.getTempVec3(x - i * dx, y - i * dy, z - i * dz),
                     false,
diff --git a/src/main/java/net/minecraft/client/render/colorizer/Colorizer.java b/src/main/java/net/minecraft/client/render/colorizer/Colorizer.java
index f5c469ca0..374119450 100644
--- a/src/main/java/net/minecraft/client/render/colorizer/Colorizer.java
+++ b/src/main/java/net/minecraft/client/render/colorizer/Colorizer.java
@@ -26,14 +26,14 @@ public class Colorizer {
 	
 	public void setup(Minecraft minecraft, List<Season> seasons) {
 		texturePack = null;
-		if(minecraft.theWorld == null) {
+		if(minecraft.currentWorld == null) {
 			return;
 		}
 		
 		String path = null;
 
 		// First, check for worldtype overrides
-		WorldType worldType = minecraft.theWorld.worldType;
+		WorldType worldType = minecraft.currentWorld.worldType;
 		if(worldType == WorldTypes.OVERWORLD_HELL) {
 			path = "/assets/minecraft/textures/colormap/" + this.name + "/hell.png";
 			texturePack = Colorizers.findTexturePackWithFile(minecraft, path);
@@ -45,7 +45,7 @@ public class Colorizer {
 		
 		if(texturePack == null) {
 			// Check if there is a colormap for the current dimension
-			Dimension dimension = minecraft.theWorld.dimension;
+			Dimension dimension = minecraft.currentWorld.dimension;
 			String dimensionName = dimension.languageKey.replace('.', '_').toLowerCase();
 			path = "/assets/minecraft/textures/colormap/" + this.name + "/" + dimensionName + ".png";
 			texturePack = Colorizers.findTexturePackWithFile(minecraft, path);	
diff --git a/src/main/java/net/minecraft/client/render/colorizer/Colorizers.java b/src/main/java/net/minecraft/client/render/colorizer/Colorizers.java
index b0b69bfdd..8ee4b034c 100644
--- a/src/main/java/net/minecraft/client/render/colorizer/Colorizers.java
+++ b/src/main/java/net/minecraft/client/render/colorizer/Colorizers.java
@@ -86,7 +86,7 @@ public class Colorizers {
 	}
 	
 	public static void update(boolean force) {
-		World world = mc.theWorld;
+		World world = mc.currentWorld;
 		if(world == null) {
 			lastDimension = null;
 			return;
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCalendar.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCalendar.java
index 415522e9a..d700b8fcd 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCalendar.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCalendar.java
@@ -13,11 +13,11 @@ public class DynamicTextureCalendar extends DynamicTextureAbstractClock {
 	@Override
 	public double getAngle() {
 		double d = 0.0;
-		if (mc.theWorld != null && mc.thePlayer != null)
+		if (mc.currentWorld != null && mc.thePlayer != null)
 		{
-			if (mc.theWorld.getSeasonManager() instanceof SeasonManagerCycle)
+			if (mc.currentWorld.getSeasonManager() instanceof SeasonManagerCycle)
 			{
-				SeasonManagerCycle cycleManager = (SeasonManagerCycle) mc.theWorld.getSeasonManager();
+				SeasonManagerCycle cycleManager = (SeasonManagerCycle) mc.currentWorld.getSeasonManager();
 				float f = cycleManager.getYearProgress() - 0.25f;
 				d = f * Math.PI * 2;
 			}
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureClock.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureClock.java
index b130ffe5b..90b8e3f2d 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureClock.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureClock.java
@@ -13,10 +13,10 @@ public class DynamicTextureClock extends DynamicTextureAbstractClock{
 	@Override
 	public double getAngle() {
 		double d = 0.0;
-		if(mc.theWorld != null && mc.thePlayer != null) {
-			float f = mc.theWorld.getCelestialAngle(1.0f);
+		if(mc.currentWorld != null && mc.thePlayer != null) {
+			float f = mc.currentWorld.getCelestialAngle(1.0f);
 			d = -f * Math.PI * 2;
-			if(mc.theWorld.dimension == Dimension.NETHER) {
+			if(mc.currentWorld.dimension == Dimension.NETHER) {
 				d = Math.random() * Math.PI * 2;
 			}
 		}
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCompass.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCompass.java
index 81fd413d3..ee9948a9a 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCompass.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureCompass.java
@@ -65,12 +65,12 @@ public class DynamicTextureCompass extends DynamicTexture {
 		}
 		
 		double angle = 0.0D;
-		if(this.mc.theWorld != null && this.mc.thePlayer != null) {
-			ChunkCoordinates var21 = this.mc.theWorld.getSpawnPoint();
+		if(this.mc.currentWorld != null && this.mc.thePlayer != null) {
+			ChunkCoordinates var21 = this.mc.currentWorld.getSpawnPoint();
 			double var23 = (double)var21.x - this.mc.thePlayer.x;
 			double var25 = (double)var21.z - this.mc.thePlayer.z;
 			angle = (double)(this.mc.thePlayer.yRot - 90.0F) * PI / 180.0D - Math.atan2(var25, var23);
-			if(this.mc.theWorld.dimension == Dimension.NETHER) {
+			if(this.mc.currentWorld.dimension == Dimension.NETHER) {
 				angle = Math.random() * PI * 2;
 			}
 		}
diff --git a/src/main/java/net/minecraft/client/render/entity/EntityRendererBoat.java b/src/main/java/net/minecraft/client/render/entity/EntityRendererBoat.java
index cf80aed37..fce2fb450 100644
--- a/src/main/java/net/minecraft/client/render/entity/EntityRendererBoat.java
+++ b/src/main/java/net/minecraft/client/render/entity/EntityRendererBoat.java
@@ -7,17 +7,17 @@ import net.minecraft.client.render.model.ModelBoat;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.client.render.blockentity.TileEntityRendererFlag;
-import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.entity.vehicle.EntityBoat;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.wind.WindProvider;
 import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
-//            Render, ModelBoat, BoatEntity, MathHelper,
+//            Render, ModelBoat, EntityBoat, MathHelper,
 //            ModelBase, Entity
 
-public class EntityRendererBoat extends EntityRenderer<BoatEntity>
+public class EntityRendererBoat extends EntityRenderer<EntityBoat>
 {
 	
 	private final Minecraft mc = Minecraft.getMinecraft(this);
@@ -30,7 +30,7 @@ public class EntityRendererBoat extends EntityRenderer<BoatEntity>
     }
 
     @Override
-    public void render(Tessellator tessellator, BoatEntity entity, double x, double y, double z,
+    public void render(Tessellator tessellator, EntityBoat entity, double x, double y, double z,
                        float yaw, float partialTick)
     {
         GL11.glPushMatrix();
@@ -48,7 +48,7 @@ public class EntityRendererBoat extends EntityRenderer<BoatEntity>
         }
         if (entity.tileEntityFlag != null)
         {
-            World theWorld = mc.theWorld;
+            World theWorld = mc.currentWorld;
             WindProvider theWind = theWorld.getWorldType().getWindManager();
 
             float windAngle = theWind.getWindDirection(theWorld, (float) x, (float) y, (float) z) * 360f + (180 - yaw);
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelMap.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelMap.java
index 726e3ac41..170c5336f 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelMap.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelMap.java
@@ -41,11 +41,11 @@ public class ItemModelMap extends ItemModelStandard {
         // Apply appropriate brightness
         float brightness = 1.0f;
         if(LightmapHelper.isLightmapEnabled()) {
-        	LightmapHelper.setLightmapCoord(mc.theWorld.getLightmapCoord(blockX, blockY, blockZ, 0));
+        	LightmapHelper.setLightmapCoord(mc.currentWorld.getLightmapCoord(blockX, blockY, blockZ, 0));
         }else if(mc.fullbright) {
         	
         }else {
-        	brightness = mc.theWorld.getLightBrightness(blockX, blockY, blockZ);
+        	brightness = mc.currentWorld.getLightBrightness(blockX, blockY, blockZ);
         }
         GL11.glColor4f(brightness, brightness, brightness, 1.0f);
 
@@ -111,7 +111,7 @@ public class ItemModelMap extends ItemModelStandard {
         tessellator.addVertexWithUV(-expansion,     -expansion,      0.0D, 0.0D, 0.0D);
         tessellator.draw();
 
-        ItemMapSavedData mapData = Items.MAP.getOrCreateSavedData(stack, mc.theWorld);
+        ItemMapSavedData mapData = Items.MAP.getOrCreateSavedData(stack, mc.currentWorld);
         if (mapData == null) return;
         renderMapInstance.renderMap(mc.textureManager, mapData, brightness);
     }
diff --git a/src/main/java/net/minecraft/client/render/shader/Shaders.java b/src/main/java/net/minecraft/client/render/shader/Shaders.java
index 0c0a42649..fd05ffae4 100644
--- a/src/main/java/net/minecraft/client/render/shader/Shaders.java
+++ b/src/main/java/net/minecraft/client/render/shader/Shaders.java
@@ -6,7 +6,10 @@ import static org.lwjgl.opengl.GL11.*;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.ScreenPhotoMode;
 import net.minecraft.client.render.camera.CameraUtil;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.material.Material;
+import net.minecraft.core.item.IArmorItem;
+import net.minecraft.core.item.ItemStack;
 
 public abstract class Shaders {
 	
@@ -70,18 +73,21 @@ public abstract class Shaders {
 		shader.uniformFloat("fxaa", minecraft.gameSettings.fxaa.value);
 		shader.uniformFloat("heatHaze", minecraft.gameSettings.heatHaze.value ? minecraft.ppm.heatHaze : 0.0f);
 		shader.uniformInt("bloom", minecraft.gameSettings.bloom.value);
-		shader.uniformInt("dimension", minecraft.theWorld != null && minecraft.theWorld.dimension != null ? minecraft.theWorld.dimension.id : 0);
+		shader.uniformInt("dimension", minecraft.currentWorld != null && minecraft.currentWorld.dimension != null ? minecraft.currentWorld.dimension.id : 0);
 		shader.uniformInt("cbCorrectionMode", minecraft.gameSettings.colorblindnessFix.value.ordinal());
 
+		ItemStack helmet = minecraft.thePlayer == null ? null : minecraft.thePlayer.inventory.armorItemInSlot(IArmorItem.PIECE_HEAD);
+		shader.uniformInt("shaderEffect", helmet != null && helmet.itemID == Blocks.PUMPKIN_REDSTONE.id ? 1 : 0);
+
 		int isEyeInLiquid = 0;
 		float celestialAngle = 0.0f;
-		if(minecraft.thePlayer != null && minecraft.theWorld != null && minecraft.activeCamera != null) {
-			if(CameraUtil.isUnderLiquid(minecraft.activeCamera, minecraft.theWorld, Material.lava, partialTicks)) {
+		if(minecraft.thePlayer != null && minecraft.currentWorld != null && minecraft.activeCamera != null) {
+			if(CameraUtil.isUnderLiquid(minecraft.activeCamera, minecraft.currentWorld, Material.lava, partialTicks)) {
 				isEyeInLiquid = 2;
-			}else if(CameraUtil.isUnderLiquid(minecraft.activeCamera, minecraft.theWorld, Material.water, partialTicks)) {
+			}else if(CameraUtil.isUnderLiquid(minecraft.activeCamera, minecraft.currentWorld, Material.water, partialTicks)) {
 				isEyeInLiquid = 1;
 			}
-			celestialAngle = minecraft.theWorld.getCelestialAngle(partialTicks);
+			celestialAngle = minecraft.currentWorld.getCelestialAngle(partialTicks);
 		}
 		shader.uniformInt("isEyeInLiquid", isEyeInLiquid);
 		shader.uniformFloat("celestialAngle", celestialAngle);
diff --git a/src/main/java/net/minecraft/client/render/shader/ShadersRenderer.java b/src/main/java/net/minecraft/client/render/shader/ShadersRenderer.java
index 554a7f010..3d5b29762 100644
--- a/src/main/java/net/minecraft/client/render/shader/ShadersRenderer.java
+++ b/src/main/java/net/minecraft/client/render/shader/ShadersRenderer.java
@@ -136,9 +136,9 @@ public class ShadersRenderer implements Renderer {
 			glUniformMatrix4fv(cloudsShader.getUniform("gbufferProjectionInverse"), false, matrixBuffer);
 			
 			int isEyeInLiquid;
-			if(CameraUtil.isUnderLiquid(mc.activeCamera, mc.theWorld, Material.lava, partialTicks)) {
+			if(CameraUtil.isUnderLiquid(mc.activeCamera, mc.currentWorld, Material.lava, partialTicks)) {
 				isEyeInLiquid = 2;
-			}else if(CameraUtil.isUnderLiquid(mc.activeCamera, mc.theWorld, Material.water, partialTicks)) {
+			}else if(CameraUtil.isUnderLiquid(mc.activeCamera, mc.currentWorld, Material.water, partialTicks)) {
 				isEyeInLiquid = 1;
 			}else {
 				isEyeInLiquid = 0;
diff --git a/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFX.java b/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFX.java
new file mode 100644
index 000000000..ae91f7a3d
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFX.java
@@ -0,0 +1,76 @@
+package net.minecraft.client.render.worldtype;
+
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.phys.Vec3;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.type.WorldType;
+
+public class WorldTypeFX {
+    public final WorldType worldType;
+
+    private boolean hasClouds = true;
+    private boolean hasSky = true;
+    private boolean hasGround = true;
+    private boolean hasAurora = false;
+    private Float cloudHeight = null;
+
+    public WorldTypeFX(WorldType worldType) {
+        this.worldType = worldType;
+    }
+
+    public WorldTypeFX setHasClouds(boolean flag) {
+        this.hasClouds = flag;
+        return this;
+    }
+
+    public WorldTypeFX setHasSky(boolean flag) {
+        this.hasSky = flag;
+        return this;
+    }
+
+    public WorldTypeFX setHasGround(boolean flag) {
+        this.hasGround = flag;
+        return this;
+    }
+
+    public WorldTypeFX setHasAurora(boolean flag) {
+        this.hasAurora = flag;
+        return this;
+    }
+
+    public WorldTypeFX setCloudHeight(float cloudHeight) {
+        this.cloudHeight = cloudHeight;
+        return this;
+    }
+
+    public boolean hasClouds() {
+        return hasClouds;
+    }
+
+    public boolean hasSky() {
+        return hasSky;
+    }
+
+    public float getCloudHeight() {
+        if (cloudHeight == null) {
+            return (worldType.getMaxY() + 1) - 20;
+        }
+        return cloudHeight;
+    }
+
+    public boolean hasGround() {
+        return hasGround;
+    }
+
+    public boolean hasAurora() {
+        return hasAurora;
+    }
+
+    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
+        return Vec3.getTempVec3(1.0, 1.0, 1.0);
+    }
+
+    public float[] getSunriseColor(float timeOfDay, float partialTick) {
+        return new float[4];
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXDispatcher.java b/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXDispatcher.java
new file mode 100644
index 000000000..d4fd88b6e
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXDispatcher.java
@@ -0,0 +1,87 @@
+package net.minecraft.client.render.worldtype;
+
+import net.minecraft.client.util.dispatch.Dispatcher;
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.world.type.WorldType;
+import net.minecraft.core.world.type.WorldTypes;
+
+public class WorldTypeFXDispatcher extends Dispatcher<WorldType, WorldTypeFX> {
+    private static WorldTypeFXDispatcher instance = new WorldTypeFXDispatcher();
+
+    public static WorldTypeFXDispatcher getInstance() {
+        return instance;
+    }
+
+    private WorldTypeFXDispatcher() {
+        instance = this;
+        addDispatch(new WorldTypeFX(WorldTypes.DEBUG)
+            .setCloudHeight(128f - 20f)
+            .setHasGround(false));
+        addDispatch(new WorldTypeFXEmpty(WorldTypes.EMPTY)
+            .setCloudHeight(128f - 20f)
+            .setHasGround(false));
+
+        addDispatch(new WorldTypeFXOverworld(WorldTypes.OVERWORLD_EXTENDED)
+            .setHasAurora(true));
+        addDispatch(new WorldTypeFXOverworld(WorldTypes.OVERWORLD_DEFAULT)
+            .setHasAurora(true));
+        addDispatch(new WorldTypeFXOverworld(WorldTypes.OVERWORLD_FLOATING)
+            .setHasAurora(true)
+            .setCloudHeight(32f));
+        addDispatch(new WorldTypeFXOverworld(WorldTypes.OVERWORLD_AMPLIFIED)
+            .setHasAurora(true)
+            .setCloudHeight(128f - 20f));
+        addDispatch(new WorldTypeFXOverworld(WorldTypes.OVERWORLD_RETRO)
+            .setHasAurora(true));
+        addDispatch(new WorldTypeFXOverworld(WorldTypes.OVERWORLD_ISLANDS)
+            .setHasAurora(true));
+        addDispatch(new WorldTypeFXOverworld(WorldTypes.OVERWORLD_WINTER)
+            .setHasAurora(true));
+        addDispatch(new WorldTypeFXOverworld(WorldTypes.OVERWORLD_WOODS)
+            .setHasAurora(true));
+        addDispatch(new WorldTypeFXOverworld(WorldTypes.OVERWORLD_PARADISE)
+            .setHasAurora(true));
+        addDispatch(new WorldTypeFXOverworld(WorldTypes.OVERWORLD_INLAND)
+            .setHasAurora(true));
+        addDispatch(new WorldTypeFXOverworld(WorldTypes.OVERWORLD_CLASSIC)
+            .setHasAurora(true));
+        addDispatch(new WorldTypeFXOverworld(WorldTypes.OVERWORLD_INDEV)
+            .setHasAurora(true));
+        addDispatch(new WorldTypeFXOverworld(WorldTypes.OVERWORLD_SKYBLOCK)
+            .setHasAurora(true));
+        addDispatch(new WorldTypeFX(WorldTypes.OVERWORLD_HELL));
+
+        addDispatch(new WorldTypeFX(WorldTypes.FLAT)
+            .setCloudHeight(256f - 20f));
+
+        addDispatch(new WorldTypeFXNether(WorldTypes.NETHER_DEFAULT)
+            .setHasClouds(false)
+            .setHasSky(false));
+        addDispatch(new WorldTypeFXNether(WorldTypes.NETHER_SKYBLOCK)
+            .setHasClouds(false)
+            .setHasSky(false));
+
+        addDispatch(new WorldTypeFXParadise(WorldTypes.PARADISE_DEFAULT)
+            .setCloudHeight(8f)
+            .setHasGround(false));
+
+        for (WorldType worldType : Registries.WORLD_TYPES) {
+            assert dispatches.containsKey(worldType) : "WorldType " + worldType.getLanguageKey() + " is missing a WorldTypeFX!";
+        }
+    }
+
+    public void addDispatch(WorldTypeFX worldTypeFX) {
+        addDispatch(worldTypeFX.worldType, worldTypeFX);
+    }
+
+    @Override
+    public void addDispatch(WorldType key, WorldTypeFX value) {
+        assert !dispatches.containsKey(key) : "WorldType " + key.getLanguageKey() + " is already assigned a WorldTypeFX! " + value.getClass();
+        super.addDispatch(key, value);
+    }
+
+    @Override
+    protected WorldTypeFX getDefault() {
+        return dispatches.get(WorldTypes.EMPTY);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXEmpty.java b/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXEmpty.java
new file mode 100644
index 000000000..00c54f298
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXEmpty.java
@@ -0,0 +1,50 @@
+package net.minecraft.client.render.worldtype;
+
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.phys.Vec3;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.type.WorldType;
+
+public class WorldTypeFXEmpty extends WorldTypeFX{
+    public WorldTypeFXEmpty(WorldType worldType) {
+        super(worldType);
+    }
+
+    @Override
+    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
+        float f2 = MathHelper.cos(celestialAngle * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
+        if (f2 < 0.0F) {
+            f2 = 0.0F;
+        }
+        if (f2 > 1.0F) {
+            f2 = 1.0F;
+        }
+        float r = 0.7529412F;
+        float g = 0.8470588F;
+        float b = 1.0F;
+        r *= f2 * 0.94F + 0.06F;
+        g *= f2 * 0.94F + 0.06F;
+        b *= f2 * 0.91F + 0.09F;
+        return Vec3.getTempVec3(r, g, b);
+    }
+
+    @Override
+    public float[] getSunriseColor(float timeOfDay, float partialTick) {
+        float[] sunriseCol = new float[4];
+        float f2 = 0.4F;
+        float f3 = MathHelper.cos(timeOfDay * MathHelper.PI * 2.0F) - 0.0F;
+        float f4 = -0F;
+        if (f3 >= f4 - f2 && f3 <= f4 + f2) {
+            float c = ((f3 - f4) / f2) * 0.5F + 0.5F;
+            float a = 1.0F - (1.0F - MathHelper.sin(c * MathHelper.PI)) * 0.99F;
+            a *= a;
+            sunriseCol[0] = c * 0.3F + 0.7F;
+            sunriseCol[1] = c * c * 0.7F + 0.2F;
+            sunriseCol[2] = c * c * 0.0F + 0.2F;
+            sunriseCol[3] = a;
+            return sunriseCol;
+        } else {
+            return null;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXNether.java b/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXNether.java
new file mode 100644
index 000000000..9c7e606a1
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXNether.java
@@ -0,0 +1,35 @@
+package net.minecraft.client.render.worldtype;
+
+import net.minecraft.client.render.colorizer.Colorizers;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.phys.Vec3;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.type.WorldType;
+
+public class WorldTypeFXNether extends WorldTypeFX{
+    public WorldTypeFXNether(WorldType worldType) {
+        super(worldType);
+    }
+
+    @Override
+    public float[] getSunriseColor(float timeOfDay, float partialTick) {
+        return new float[4];
+    }
+
+    @Override
+    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
+        if (Colorizers.fog.isEnabled()) {
+            int x1 = MathHelper.floor(x);
+            int y1 = MathHelper.floor(y);
+            int z1 = MathHelper.floor(z);
+
+            int color = Colorizers.fog.getColor(world, x1, y1, z1);
+
+            float r = ((color >> 16) & 0xFF) / 255.0f;
+            float g = ((color >> 8) & 0xFF) / 255.0f;
+            float b = (color & 0xFF) / 255.0f;
+            return Vec3.getTempVec3(r, g, b);
+        }
+        return Vec3.getTempVec3(0.0, 0.0, 0.0);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXOverworld.java b/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXOverworld.java
new file mode 100644
index 000000000..039a25abb
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXOverworld.java
@@ -0,0 +1,62 @@
+package net.minecraft.client.render.worldtype;
+
+import net.minecraft.client.render.colorizer.Colorizers;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.phys.Vec3;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.type.WorldType;
+
+public class WorldTypeFXOverworld extends WorldTypeFX{
+    public WorldTypeFXOverworld(WorldType worldType) {
+        super(worldType);
+    }
+
+    @Override
+    public float[] getSunriseColor(float timeOfDay, float partialTick) {
+        float[] sunriseCol = new float[4];
+        float sunriseMinimum = 0.4F;
+
+        // Gives a value that goes from 1 to -1 to 1 over the course of a day
+        float sunrisePresence = MathHelper.cos(timeOfDay * MathHelper.PI * 2.0F);
+        float middle = 0F;
+        if (sunrisePresence >= middle - sunriseMinimum && sunrisePresence <= middle + sunriseMinimum) {
+            float c = ((sunrisePresence - middle) / sunriseMinimum) * 0.5F + 0.5F;
+            float a = 1.0F - (1.0F - MathHelper.sin(c * MathHelper.PI)) * 0.99F;
+            a *= a;
+            sunriseCol[0] = c * 0.3F + 0.7F;
+            sunriseCol[1] = c * c * 0.7F + 0.2F;
+            sunriseCol[2] = c * c * 0.0F + 0.2F;
+            sunriseCol[3] = a;
+            return sunriseCol;
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
+        float dayProgress = MathHelper.cos(celestialAngle * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
+        dayProgress = MathHelper.clamp(dayProgress, 0.0f, 1.0f);
+        float r, g, b;
+
+        if (Colorizers.fog.isEnabled()) {
+            int x1 = MathHelper.floor(x);
+            int y1 = MathHelper.floor(y);
+            int z1 = MathHelper.floor(z);
+
+            int color = Colorizers.fog.getColor(world, x1, y1, z1);
+
+            r = ((color >> 16) & 0xFF) / 255.0f;
+            g = ((color >> 8) & 0xFF) / 255.0f;
+            b = (color & 0xFF) / 255.0f;
+        } else {
+            r = 0.7529412f;
+            g = 0.8470588f;
+            b = 1.0f;
+        }
+        r *= dayProgress * 0.94f + 0.06f;
+        g *= dayProgress * 0.94f + 0.06f;
+        b *= dayProgress * 0.91f + 0.09f;
+        return Vec3.getTempVec3(r, g, b);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXParadise.java b/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXParadise.java
new file mode 100644
index 000000000..d43b8b23d
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/worldtype/WorldTypeFXParadise.java
@@ -0,0 +1,61 @@
+package net.minecraft.client.render.worldtype;
+
+import net.minecraft.client.render.colorizer.Colorizers;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.phys.Vec3;
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.type.WorldType;
+
+public class WorldTypeFXParadise extends WorldTypeFX{
+    public WorldTypeFXParadise(WorldType worldType) {
+        super(worldType);
+    }
+
+    @Override
+    public float[] getSunriseColor(float timeOfDay, float partialTick) {
+        float[] sunriseCol = new float[4];
+        float f2 = 0.4F;
+        float f3 = MathHelper.cos(timeOfDay * MathHelper.PI * 2.0F) - 0.0F;
+        float f4 = -0F;
+        if (f3 >= f4 - f2 && f3 <= f4 + f2) {
+            float c = ((f3 - f4) / f2) * 0.5F + 0.5F;
+            float a = 1.0F - (1.0F - MathHelper.sin(c * MathHelper.PI)) * 0.99F;
+            a *= a;
+            sunriseCol[0] = c * 0.3F + 0.7F;
+            sunriseCol[1] = c * c * 0.7F + 0.2F;
+            sunriseCol[2] = c * c * 0.0F + 0.2F;
+            sunriseCol[3] = a;
+            return sunriseCol;
+        } else {
+            return null;
+        }
+    }
+
+    @Override
+    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
+        float f2 = MathHelper.cos(celestialAngle * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
+        f2 = MathHelper.clamp(f2, 0.0f, 1.0f);
+        float r, g, b;
+
+        if (Colorizers.fog.isEnabled()) {
+            int x1 = MathHelper.floor(x);
+            int y1 = MathHelper.floor(y);
+            int z1 = MathHelper.floor(z);
+
+            int color = Colorizers.fog.getColor(world, x1, y1, z1);
+
+            r = ((color >> 16) & 0xFF) / 255.0f;
+            g = ((color >> 8) & 0xFF) / 255.0f;
+            b = (color & 0xFF) / 255.0f;
+        } else {
+            int i = 0x8080a0;
+            r = (float) (i >> 16 & 0xff) / 255.0f;
+            g = (float) (i >> 8 & 0xff) / 255.0f;
+            b = (float) (i & 0xff) / 255.0f;
+        }
+        r *= f2 * 0.94F + 0.06F;
+        g *= f2 * 0.94F + 0.06F;
+        b *= f2 * 0.91F + 0.09F;
+        return Vec3.getTempVec3(r, g, b);
+    }
+}
diff --git a/src/main/java/net/minecraft/client/sound/NamedSoundRepository.java b/src/main/java/net/minecraft/client/sound/NamedSoundRepository.java
index 3e72839e8..2f04494d5 100644
--- a/src/main/java/net/minecraft/client/sound/NamedSoundRepository.java
+++ b/src/main/java/net/minecraft/client/sound/NamedSoundRepository.java
@@ -48,6 +48,13 @@ public class NamedSoundRepository extends Registry<SoundEvent> {
         File outRoot = new File(SoundRepository.mc.getMinecraftDir(), String.format(TEXTURE_PACK_FOLDER_SOUNDS_LOCATION_FORMAT, namespace));
         outRoot.mkdirs();
         for (Map.Entry<String, SoundEvent> e : eventMap.entrySet()) {
+
+            if (namespace.equals("minecraft")) {
+                SoundRepository.allKeys.add(e.getKey());
+            } else {
+                SoundRepository.allKeys.add(namespace + ":" + e.getKey());
+            }
+
             register(e.getKey(), e.getValue());
             for (SoundEntry entry : e.getValue().getEntryBag().getEntries()) {
                 if (entry.type == SoundEntry.Type.FILE && entry.file != null && !entry.file.exists()) {
diff --git a/src/main/java/net/minecraft/client/sound/SoundRepository.java b/src/main/java/net/minecraft/client/sound/SoundRepository.java
index 31061d450..0b78e845b 100644
--- a/src/main/java/net/minecraft/client/sound/SoundRepository.java
+++ b/src/main/java/net/minecraft/client/sound/SoundRepository.java
@@ -11,8 +11,12 @@ import java.util.*;
 public class SoundRepository extends Registry<NamedSoundRepository> {
     protected static Minecraft mc = null;
     public static SoundRepository SOUNDS = null;
+
+    public static final Set<String> allKeys = new HashSet<>();
+
     public Set<String> cachedRepositoryErrors = new HashSet<>();
     public Set<NamespaceID> cachedEntryErrors = new HashSet<>();
+
     public SoundRepository() {
         registerNamespace("minecraft");
     }
@@ -80,6 +84,10 @@ public class SoundRepository extends Registry<NamedSoundRepository> {
         return eventList;
     }
 
+    public Collection<String> getAllKeys() {
+        return allKeys;
+    }
+
     private NamespaceID makeNamespaceFromKey(@NotNull String key) {
         String namespace;
         String value;
@@ -104,6 +112,7 @@ public class SoundRepository extends Registry<NamedSoundRepository> {
     }
 
     public static void reload() {
+        allKeys.clear();
         SOUNDS = new SoundRepository();
     }
 
diff --git a/src/main/java/net/minecraft/client/util/debug/DebugRender.java b/src/main/java/net/minecraft/client/util/debug/DebugRender.java
index 05bdbb1ba..8d30c2b04 100644
--- a/src/main/java/net/minecraft/client/util/debug/DebugRender.java
+++ b/src/main/java/net/minecraft/client/util/debug/DebugRender.java
@@ -2,13 +2,14 @@ package net.minecraft.client.util.debug;
 
 import static org.lwjgl.opengl.GL11.*;
 
+import net.minecraft.core.util.debug.Debug;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.opengl.Display;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.Font;
 import net.minecraft.client.render.tessellator.Tessellator;
-import net.minecraft.client.util.debug.Debug.Profiler;
+import net.minecraft.core.util.debug.Debug.Profiler;
 import net.minecraft.core.util.helper.MathHelper;
 
 public class DebugRender {
diff --git a/src/main/java/net/minecraft/client/world/WorldClient.java b/src/main/java/net/minecraft/client/world/WorldClient.java
index 6ebf4e6f4..39037d115 100644
--- a/src/main/java/net/minecraft/client/world/WorldClient.java
+++ b/src/main/java/net/minecraft/client/world/WorldClient.java
@@ -1,299 +1,154 @@
 package net.minecraft.client.world;
 
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.net.handler.PacketHandlerClient;
-import net.minecraft.client.world.chunk.provider.ChunkProviderClient;
-import net.minecraft.core.data.gamerule.GameRules;
-import net.minecraft.core.data.registry.Registries;
-import net.minecraft.core.entity.Entity;
-import net.minecraft.core.net.packet.DisconnectPacket;
-import net.minecraft.core.util.collection.IntHashMap;
+import net.minecraft.client.render.LightmapHelper;
+import net.minecraft.client.render.camera.ICamera;
+import net.minecraft.client.render.colorizer.Colorizers;
+import net.minecraft.client.render.worldtype.WorldTypeFX;
+import net.minecraft.client.render.worldtype.WorldTypeFXDispatcher;
+import net.minecraft.client.world.chunk.provider.ChunkProviderViewer;
+import net.minecraft.core.enums.LightLayer;
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.util.phys.Vec3;
+import net.minecraft.core.world.AuroraProvider;
 import net.minecraft.core.world.Dimension;
 import net.minecraft.core.world.World;
-import net.minecraft.core.world.chunk.ChunkCoordinates;
-import net.minecraft.core.world.chunk.provider.IChunkProvider;
-import net.minecraft.core.world.save.SaveHandlerClientMP;
-
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Set;
-
-// Referenced classes of package net.minecraft.src:
-//            World, SaveHandlerMP, WorldProvider, MCHash, 
-//            ChunkCoordinates, PacketHandlerClient, IWorldAccess, Entity,
-//            WorldBlockPositionType, ChunkProviderClient, DisconnectPacket, WorldInfo,
-//            IChunkProvider
+import net.minecraft.core.world.save.LevelData;
+import net.minecraft.core.world.save.LevelStorage;
+import net.minecraft.core.world.season.SeasonManager;
+import net.minecraft.core.world.season.Seasons;
+import net.minecraft.core.world.type.WorldType;
+import net.minecraft.core.world.type.WorldTypes;
+import net.minecraft.core.world.weather.WeatherManager;
 
 public class WorldClient extends World {
-    private final Minecraft mc;
-    private final LinkedList<WorldBlockPositionType> positionTypesList;
-    private final PacketHandlerClient sendQueue;
-    private ChunkProviderClient chunkCache;
-    private final IntHashMap<Entity> entitiesById;
-    private final Set<Entity> forced;
-    private final Set<Entity> reEntries;
-
-    public WorldClient(Minecraft minecraft, PacketHandlerClient netclienthandler, long seed, int dimensionId, int worldTypeId)
-    {
-        super(new SaveHandlerClientMP(), "MpServer", Dimension.getDimensionList().get(dimensionId), Registries.WORLD_TYPES.getItemByNumericId(worldTypeId), seed);
-        this.mc = minecraft;
-        positionTypesList = new LinkedList<>();
-        entitiesById = new IntHashMap<>();
-        forced = new HashSet<>();
-        reEntries = new HashSet<>();
-        sendQueue = netclienthandler;
-        setSpawnPoint(new ChunkCoordinates(8, 64, 8));
-        savedDataStorage = netclienthandler.savedDataStorage;
-    }
-
-    @Override
-	public void tick()
-    {
-        for(int k = 0; k < 10 && !reEntries.isEmpty(); k++)
-        {
-            Entity entity = reEntries.iterator().next();
-            if(!loadedEntityList.contains(entity))
-            {
-                entityJoinedWorld(entity);
-            }
-        }
 
-        processPackets();
-        for(int l = 0; l < positionTypesList.size(); l++)
-        {
-            WorldBlockPositionType worldblockpositiontype = positionTypesList.get(l);
-            if(--worldblockpositiontype.delayTicks == 0)
-            {
-                super.setBlockAndMetadata(worldblockpositiontype.x, worldblockpositiontype.y, worldblockpositiontype.z, worldblockpositiontype.blockId, worldblockpositiontype.metadata);
-                super.markBlockNeedsUpdate(worldblockpositiontype.x, worldblockpositiontype.y, worldblockpositiontype.z);
-                positionTypesList.remove(l--);
-            }
-        }
-        if(getGameRuleValue(GameRules.DO_DAY_CYCLE)) {
-            levelData.setWorldTime(levelData.getWorldTime() + 1L);
-        }
-		updateSeasonAndLight();
-        if(rainbowTicks > 0)
-        {
-            rainbowTicks--;
-        }
-    }
-
-    public void processPackets() {
-        sendQueue.tick();
+    public WorldClient(LevelStorage saveHandler, String name, long seed, Dimension dimension, WorldType worldType) {
+        super(saveHandler, name, seed, dimension, worldType);
     }
 
-    public void removePositionTypesInBounds(int minX, int minY, int minZ, int maxX, int maxY, int maxZ)
-    {
-        for(int i = 0; i < positionTypesList.size(); i++)
-        {
-            WorldBlockPositionType worldblockpositiontype = positionTypesList.get(i);
-            if(worldblockpositiontype.x >= minX && worldblockpositiontype.y >= minY && worldblockpositiontype.z >= minZ && worldblockpositiontype.x <= maxX && worldblockpositiontype.y <= maxY && worldblockpositiontype.z <= maxZ)
-            {
-                positionTypesList.remove(i--);
-            }
-        }
-
+    public WorldClient(World world, Dimension dimension) {
+        super(world, dimension);
     }
 
-    @Override
-	protected IChunkProvider createChunkProvider()
-    {
-        chunkCache = new ChunkProviderClient(this);
-        return chunkCache;
+    public WorldClient(LevelStorage saveHandler, String name, Dimension dimension, WorldType worldType, long seed) {
+        super(saveHandler, name, dimension, worldType, seed);
     }
 
-    @Override
-	public void getRespawnLocation()
-    {
-        setSpawnPoint(new ChunkCoordinates(8, 64, 8));
-    }
+    public WorldClient() {
+        this.dimension = Dimension.OVERWORLD;
+        this.saveHandler = null;
+        levelData = new LevelData(0, "modelviewer");
+        this.worldType = WorldTypes.DEBUG;
+        chunkProvider = new ChunkProviderViewer(this);
+        seasonManager = SeasonManager.fromConfig(this, this.worldType.getSeasonConfig());
+        updateSkyBrightness();
 
-    @Override
-	protected void updateBlocksAndPlayCaveSounds()
-    {
-    }
+        this.weatherManager = new WeatherManager(this);
 
-    @Override
-	public void scheduleBlockUpdate(int x, int y, int z, int id, int delay)
-    {
-    }
+        auroraProvider = new AuroraProvider(this, 0);
 
-    @Override
-	public boolean tickUpdates(boolean all)
-    {
-        return false;
+        biomeProvider = this.worldType.createBiomeProvider(this);
     }
 
-    public void doPreChunk(int chunkX, int chunkZ, boolean playerAdded)
+    public Vec3 getDimensionColor(ICamera camera, float partialTick)
     {
-        if(playerAdded)
-        {
-            chunkCache.prepareChunk(chunkX, chunkZ);
-        } else
+        float f1 = getCelestialAngle(partialTick);
+        float f2 = MathHelper.cos(f1 * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
+        if(f2 < 0.0F)
         {
-            chunkCache.dropChunk(chunkX, chunkZ);
+            f2 = 0.0F;
         }
-        if(!playerAdded)
+        if(f2 > 1.0F)
         {
-            markBlocksDirty(chunkX * 16, 0, chunkZ * 16, chunkX * 16 + 15, getHeightBlocks(), chunkZ * 16 + 15);
+            f2 = 1.0F;
         }
-    }
-
-    @Override
-	public boolean entityJoinedWorld(Entity entity)
-    {
-        boolean flag = super.entityJoinedWorld(entity);
-        forced.add(entity);
-        if(!flag)
+        int color = 0xffffff;
+        float r = (float)(color >> 16 & 255) / 255F;
+        float g = (float)(color >> 8 & 255) / 255F;
+        float b = (float)(color & 255) / 255F;
+        float f6 = getCurrentWeather() != null && getCurrentWeather().isPrecipitation ? weatherManager.getWeatherIntensity() * weatherManager.getWeatherPower() : 0.0f;
+        if(f6 > 0.0F)
         {
-            reEntries.add(entity);
+            float f7 = (r * 0.3F + g * 0.59F + b * 0.11F) * 0.6F;
+            float f9 = 1.0F - f6 * 0.95F;
+            r = r * f9 + f7 * (1.0F - f9);
+            g = g * f9 + f7 * (1.0F - f9);
+            b = b * f9 + f7 * (1.0F - f9);
         }
-        return flag;
+        r *= f2 * 0.9F + 0.1F;
+        g *= f2 * 0.9F + 0.1F;
+        b *= f2 * 0.85F + 0.15F;
+        return Vec3.getTempVec3(r, g, b);
     }
 
-    @Override
-	public void setEntityDead(Entity entity)
+    public Vec3 getFogColor(ICamera camera, float partialTick)
     {
-        super.setEntityDead(entity);
-        forced.remove(entity);
-        reEntries.remove(entity);
+        double x = camera.getX(partialTick);
+        double y = camera.getY(partialTick);
+        double z = camera.getZ(partialTick);
+        float celestialAngle = getCelestialAngle(partialTick);
+        return WorldTypeFXDispatcher.getInstance().getDispatch(worldType).getFogColor(this, x, y, z, celestialAngle, partialTick);
     }
 
-    @Override
-	protected void obtainEntitySkin(Entity entity)
+    public Vec3 getSkyColor(ICamera camera, float partialTick)
     {
-        super.obtainEntitySkin(entity);
-        reEntries.remove(entity);
-    }
-
-    @Override
-	protected void releaseEntitySkin(Entity entity)
-    {
-        super.releaseEntitySkin(entity);
-        if(forced.contains(entity))
-        {
-            reEntries.add(entity);
-        }
-    }
-
-    public void addEntityToWorld(int i, Entity entity)
-    {
-        Entity entity1 = getEntityFromId(i);
-        if(entity1 != null)
+        float f1 = getCelestialAngle(partialTick);
+        float f2 = MathHelper.cos(f1 * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
+        if(f2 < 0.0F)
         {
-            setEntityDead(entity1);
+            f2 = 0.0F;
         }
-        forced.add(entity);
-        entity.id = i;
-        if(!entityJoinedWorld(entity))
+        if(f2 > 1.0F)
         {
-            reEntries.add(entity);
+            f2 = 1.0F;
         }
-        entitiesById.put(i, entity);
-    }
-
-    public Entity getEntityFromId(int i)
-    {
-        return entitiesById.get(i);
-    }
+        int x = MathHelper.floor(camera.getX(partialTick));
+        int y = MathHelper.floor(camera.getY(partialTick));
+        int z = MathHelper.floor(camera.getZ(partialTick));
+        float blockTemperature = (float) getBlockTemperature(x, z);
 
-    public Entity removeEntityFromWorld(int i)
-    {
-        Entity entity = entitiesById.remove(i);
-        if(entity != null)
+        if (seasonManager.getCurrentSeason() != null && (seasonManager.getCurrentSeason() == Seasons.OVERWORLD_WINTER || seasonManager.getCurrentSeason() == Seasons.OVERWORLD_FALL))
         {
-            forced.remove(entity);
-            setEntityDead(entity);
+            blockTemperature = blockTemperature - (1.25f);
         }
-        return entity;
-    }
-
-    @Override
-	public boolean setBlockMetadata(int x, int y, int z, int meta)
-    {
-        int blockID = getBlockId(x, y, z);
-        int currentMeta = getBlockMetadata(x, y, z);
-        if(super.setBlockMetadata(x, y, z, meta))
-        {
-            positionTypesList.add(new WorldBlockPositionType(x, y, z, blockID, currentMeta));
-            return true;
-        } else
-        {
-            return false;
+        int skyColor;
+        if(Colorizers.sky.isEnabled()) {
+            skyColor = Colorizers.sky.getColor(this, x, y, z);
+        }else {
+            skyColor = getBiomeProvider().getBiome(x, y, z).getSkyColor(blockTemperature);
         }
-    }
-
-    @Override
-	public boolean setBlockAndMetadata(int x, int y, int z, int id, int meta)
-    {
-        int blockId = getBlockId(x, y, z);
-        int blockMeta = getBlockMetadata(x, y, z);
-        if(super.setBlockAndMetadata(x, y, z, id, meta))
-        {
-            positionTypesList.add(new WorldBlockPositionType(x, y, z, blockId, blockMeta));
-            return true;
-        } else
+        float r = (float)(skyColor >> 16 & 0xff) / 255F;
+        float g = (float)(skyColor >> 8 & 0xff) / 255F;
+        float b = (float)(skyColor & 0xff) / 255F;
+        r *= f2;
+        g *= f2;
+        b *= f2;
+        float f7 = getCurrentWeather() != null && getCurrentWeather().isPrecipitation ? weatherManager.getWeatherIntensity() * weatherManager.getWeatherPower() : 0.0f;
+        if(f7 > 0.0F)
         {
-            return false;
+            float f8 = (r * 0.3F + g * 0.59F + b * 0.11F) * 0.6F;
+            float f10 = 1.0F - f7 * 0.75F;
+            r = r * f10 + f8 * (1.0F - f10);
+            g = g * f10 + f8 * (1.0F - f10);
+            b = b * f10 + f8 * (1.0F - f10);
         }
-    }
-
-    @Override
-	public boolean setBlock(int x, int y, int z, int id)
-    {
-        int blockId = getBlockId(x, y, z);
-        int meta = getBlockMetadata(x, y, z);
-        if(super.setBlock(x, y, z, id))
-        {
-            positionTypesList.add(new WorldBlockPositionType(x, y, z, blockId, meta));
-            return true;
-        } else
-        {
-            return false;
-        }
-    }
-
-    public boolean blockChange(int x, int y, int z, int id, int meta)
-    {
-        removePositionTypesInBounds(x, y, z, x, y, z);
-        if(super.setBlockAndMetadata(x, y, z, id, meta))
-        {
-            notifyBlockChange(x, y, z, id);
-            return true;
-        } else
+        if(lightningFlicker > 0)
         {
-            return false;
+            float f12 = (float)lightningFlicker - partialTick;
+            if(f12 > 1.0F)
+            {
+                f12 = 1.0F;
+            }
+            f12 *= 0.45F;
+            r = r * (1.0F - f12) + 0.8F * f12;
+            g = g * (1.0F - f12) + 0.8F * f12;
+            b = b * (1.0F - f12) + f12;
         }
+        return Vec3.getTempVec3(r, g, b);
     }
 
     @Override
-	public void sendQuittingDisconnectingPacket()
-    {
-        sendQueue.sendFinalPacket(new DisconnectPacket("Quitting"));
-    }
-
-    @Override
-    public void sendGlobalMessage(String message){
-
-    }
-
-    static class WorldBlockPositionType
-    {
-        int x;
-        int y;
-        int z;
-        int delayTicks;
-        int blockId;
-        int metadata;
-
-        public WorldBlockPositionType(int x, int y, int z, int blockId, int metadata) {
-            this.x = x;
-            this.y = y;
-            this.z = z;
-            this.delayTicks = 80;
-            this.blockId = blockId;
-            this.metadata = metadata;
-        }
+    public int getLightmapCoord(int skylight, int blocklight) {
+        return LightmapHelper.getLightmapCoord(skylight, blocklight);
     }
 }
diff --git a/src/main/java/net/minecraft/client/world/WorldClientMP.java b/src/main/java/net/minecraft/client/world/WorldClientMP.java
new file mode 100644
index 000000000..98c03d6e3
--- /dev/null
+++ b/src/main/java/net/minecraft/client/world/WorldClientMP.java
@@ -0,0 +1,289 @@
+package net.minecraft.client.world;
+
+import net.minecraft.client.net.handler.PacketHandlerClient;
+import net.minecraft.client.world.chunk.provider.ChunkProviderClient;
+import net.minecraft.core.data.gamerule.GameRules;
+import net.minecraft.core.data.registry.Registries;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.net.packet.DisconnectPacket;
+import net.minecraft.core.util.collection.IntHashMap;
+import net.minecraft.core.world.Dimension;
+import net.minecraft.core.world.chunk.ChunkCoordinates;
+import net.minecraft.core.world.chunk.provider.IChunkProvider;
+import net.minecraft.client.world.save.SaveHandlerClientMP;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Set;
+
+public class WorldClientMP extends WorldClient {
+    private final LinkedList<WorldBlockPositionType> positionTypesList;
+    private final PacketHandlerClient sendQueue;
+    private ChunkProviderClient chunkCache;
+    private final IntHashMap<Entity> entitiesById;
+    private final Set<Entity> forced;
+    private final Set<Entity> reEntries;
+
+    public WorldClientMP(PacketHandlerClient packetHandlerClient, long seed, int dimensionId, int worldTypeId)
+    {
+        super(new SaveHandlerClientMP(), "MpServer", Dimension.getDimensionList().get(dimensionId), Registries.WORLD_TYPES.getItemByNumericId(worldTypeId), seed);
+        positionTypesList = new LinkedList<>();
+        entitiesById = new IntHashMap<>();
+        forced = new HashSet<>();
+        reEntries = new HashSet<>();
+        sendQueue = packetHandlerClient;
+        setSpawnPoint(new ChunkCoordinates(8, 64, 8));
+        savedDataStorage = packetHandlerClient.savedDataStorage;
+    }
+
+    @Override
+	public void tick()
+    {
+        for(int k = 0; k < 10 && !reEntries.isEmpty(); k++)
+        {
+            Entity entity = reEntries.iterator().next();
+            if(!loadedEntityList.contains(entity))
+            {
+                entityJoinedWorld(entity);
+            }
+        }
+
+        processPackets();
+        for(int l = 0; l < positionTypesList.size(); l++)
+        {
+            WorldBlockPositionType worldblockpositiontype = positionTypesList.get(l);
+            if(--worldblockpositiontype.delayTicks == 0)
+            {
+                super.setBlockAndMetadata(worldblockpositiontype.x, worldblockpositiontype.y, worldblockpositiontype.z, worldblockpositiontype.blockId, worldblockpositiontype.metadata);
+                super.markBlockNeedsUpdate(worldblockpositiontype.x, worldblockpositiontype.y, worldblockpositiontype.z);
+                positionTypesList.remove(l--);
+            }
+        }
+        if(getGameRuleValue(GameRules.DO_DAY_CYCLE)) {
+            levelData.setWorldTime(levelData.getWorldTime() + 1L);
+        }
+		updateSeasonAndLight();
+        if(rainbowTicks > 0)
+        {
+            rainbowTicks--;
+        }
+    }
+
+    public void processPackets() {
+        sendQueue.tick();
+    }
+
+    public void removePositionTypesInBounds(int minX, int minY, int minZ, int maxX, int maxY, int maxZ)
+    {
+        for(int i = 0; i < positionTypesList.size(); i++)
+        {
+            WorldBlockPositionType worldblockpositiontype = positionTypesList.get(i);
+            if(worldblockpositiontype.x >= minX && worldblockpositiontype.y >= minY && worldblockpositiontype.z >= minZ && worldblockpositiontype.x <= maxX && worldblockpositiontype.y <= maxY && worldblockpositiontype.z <= maxZ)
+            {
+                positionTypesList.remove(i--);
+            }
+        }
+
+    }
+
+    @Override
+	protected IChunkProvider createChunkProvider()
+    {
+        chunkCache = new ChunkProviderClient(this);
+        return chunkCache;
+    }
+
+    @Override
+	public void getRespawnLocation()
+    {
+        setSpawnPoint(new ChunkCoordinates(8, 64, 8));
+    }
+
+    @Override
+	protected void updateBlocksAndPlayCaveSounds()
+    {
+    }
+
+    @Override
+	public void scheduleBlockUpdate(int x, int y, int z, int id, int delay)
+    {
+    }
+
+    @Override
+	public boolean tickUpdates(boolean all)
+    {
+        return false;
+    }
+
+    public void doPreChunk(int chunkX, int chunkZ, boolean playerAdded)
+    {
+        if(playerAdded)
+        {
+            chunkCache.prepareChunk(chunkX, chunkZ);
+        } else
+        {
+            chunkCache.dropChunk(chunkX, chunkZ);
+        }
+        if(!playerAdded)
+        {
+            markBlocksDirty(chunkX * 16, 0, chunkZ * 16, chunkX * 16 + 15, getHeightBlocks(), chunkZ * 16 + 15);
+        }
+    }
+
+    @Override
+	public boolean entityJoinedWorld(Entity entity)
+    {
+        boolean flag = super.entityJoinedWorld(entity);
+        forced.add(entity);
+        if(!flag)
+        {
+            reEntries.add(entity);
+        }
+        return flag;
+    }
+
+    @Override
+	public void setEntityDead(Entity entity)
+    {
+        super.setEntityDead(entity);
+        forced.remove(entity);
+        reEntries.remove(entity);
+    }
+
+    @Override
+	protected void obtainEntitySkin(Entity entity)
+    {
+        super.obtainEntitySkin(entity);
+        reEntries.remove(entity);
+    }
+
+    @Override
+	protected void releaseEntitySkin(Entity entity)
+    {
+        super.releaseEntitySkin(entity);
+        if(forced.contains(entity))
+        {
+            reEntries.add(entity);
+        }
+    }
+
+    public void addEntityToWorld(int i, Entity entity)
+    {
+        Entity entity1 = getEntityFromId(i);
+        if(entity1 != null)
+        {
+            setEntityDead(entity1);
+        }
+        forced.add(entity);
+        entity.id = i;
+        if(!entityJoinedWorld(entity))
+        {
+            reEntries.add(entity);
+        }
+        entitiesById.put(i, entity);
+    }
+
+    public Entity getEntityFromId(int i)
+    {
+        return entitiesById.get(i);
+    }
+
+    public Entity removeEntityFromWorld(int i)
+    {
+        Entity entity = entitiesById.remove(i);
+        if(entity != null)
+        {
+            forced.remove(entity);
+            setEntityDead(entity);
+        }
+        return entity;
+    }
+
+    @Override
+	public boolean setBlockMetadata(int x, int y, int z, int meta)
+    {
+        int blockID = getBlockId(x, y, z);
+        int currentMeta = getBlockMetadata(x, y, z);
+        if(super.setBlockMetadata(x, y, z, meta))
+        {
+            positionTypesList.add(new WorldBlockPositionType(x, y, z, blockID, currentMeta));
+            return true;
+        } else
+        {
+            return false;
+        }
+    }
+
+    @Override
+	public boolean setBlockAndMetadata(int x, int y, int z, int id, int meta)
+    {
+        int blockId = getBlockId(x, y, z);
+        int blockMeta = getBlockMetadata(x, y, z);
+        if(super.setBlockAndMetadata(x, y, z, id, meta))
+        {
+            positionTypesList.add(new WorldBlockPositionType(x, y, z, blockId, blockMeta));
+            return true;
+        } else
+        {
+            return false;
+        }
+    }
+
+    @Override
+	public boolean setBlock(int x, int y, int z, int id)
+    {
+        int blockId = getBlockId(x, y, z);
+        int meta = getBlockMetadata(x, y, z);
+        if(super.setBlock(x, y, z, id))
+        {
+            positionTypesList.add(new WorldBlockPositionType(x, y, z, blockId, meta));
+            return true;
+        } else
+        {
+            return false;
+        }
+    }
+
+    public boolean blockChange(int x, int y, int z, int id, int meta)
+    {
+        removePositionTypesInBounds(x, y, z, x, y, z);
+        if(super.setBlockAndMetadata(x, y, z, id, meta))
+        {
+            notifyBlockChange(x, y, z, id);
+            return true;
+        } else
+        {
+            return false;
+        }
+    }
+
+    @Override
+	public void sendQuittingDisconnectingPacket()
+    {
+        sendQueue.sendFinalPacket(new DisconnectPacket("Quitting"));
+    }
+
+    @Override
+    public void sendGlobalMessage(String message){
+
+    }
+
+    static class WorldBlockPositionType
+    {
+        int x;
+        int y;
+        int z;
+        int delayTicks;
+        int blockId;
+        int metadata;
+
+        public WorldBlockPositionType(int x, int y, int z, int blockId, int metadata) {
+            this.x = x;
+            this.y = y;
+            this.z = z;
+            this.delayTicks = 80;
+            this.blockId = blockId;
+            this.metadata = metadata;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/save/SaveHandlerClientMP.java b/src/main/java/net/minecraft/client/world/save/SaveHandlerClientMP.java
similarity index 85%
rename from src/main/java/net/minecraft/core/world/save/SaveHandlerClientMP.java
rename to src/main/java/net/minecraft/client/world/save/SaveHandlerClientMP.java
index cc5a3778c..38a3d9e87 100644
--- a/src/main/java/net/minecraft/core/world/save/SaveHandlerClientMP.java
+++ b/src/main/java/net/minecraft/client/world/save/SaveHandlerClientMP.java
@@ -1,9 +1,13 @@
-package net.minecraft.core.world.save;
+package net.minecraft.client.world.save;
 
 import net.minecraft.core.entity.player.Player;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.chunk.IChunkLoader;
 import net.minecraft.core.world.Dimension;
+import net.minecraft.core.world.save.DimensionData;
+import net.minecraft.core.world.save.LevelData;
+import net.minecraft.core.world.save.LevelStorage;
+import net.minecraft.core.world.save.PlayerIO;
 
 import java.io.File;
 import java.util.List;
diff --git a/src/main/java/net/minecraft/core/world/save/SaveHandlerClientSP.java b/src/main/java/net/minecraft/client/world/save/SaveHandlerClientSP.java
similarity index 83%
rename from src/main/java/net/minecraft/core/world/save/SaveHandlerClientSP.java
rename to src/main/java/net/minecraft/client/world/save/SaveHandlerClientSP.java
index b345ef62e..05a1d79ab 100644
--- a/src/main/java/net/minecraft/core/world/save/SaveHandlerClientSP.java
+++ b/src/main/java/net/minecraft/client/world/save/SaveHandlerClientSP.java
@@ -1,9 +1,12 @@
-package net.minecraft.core.world.save;
+package net.minecraft.client.world.save;
 
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.world.chunk.ChunkLoaderRegionAsync;
 import net.minecraft.core.world.chunk.IChunkLoader;
 import net.minecraft.core.world.Dimension;
+import net.minecraft.core.world.save.ISaveFormat;
+import net.minecraft.core.world.save.LevelData;
+import net.minecraft.core.world.save.SaveHandlerBase;
 
 import java.io.File;
 import java.util.List;
diff --git a/src/main/java/net/minecraft/core/Global.java b/src/main/java/net/minecraft/core/Global.java
index 2dd5c42b9..c229ed68f 100644
--- a/src/main/java/net/minecraft/core/Global.java
+++ b/src/main/java/net/minecraft/core/Global.java
@@ -13,6 +13,16 @@ public class Global
 	public static final boolean DISABLE_OLD_WORLDS = false;
 	public static final int TEXTURE_PACK_FORMAT = Version.TEXTURE_PACK_VERSION;
 	public static final boolean NET_DEBUG = false;
+	public static final boolean ASSERTIONS_ENABLED;
+	static {
+		// Apparently the best way to check if assertions are enabled
+
+		boolean assertions = false;
+        //noinspection AssertWithSideEffects
+        assert assertions = true;
+		ASSERTIONS_ENABLED = assertions;
+	}
+
 	public static MinecraftAccessor accessor;
 
 	// Protocol version scheme:
diff --git a/src/main/java/net/minecraft/core/MinecraftAccessor.java b/src/main/java/net/minecraft/core/MinecraftAccessor.java
index d2b5e8084..90024fd58 100644
--- a/src/main/java/net/minecraft/core/MinecraftAccessor.java
+++ b/src/main/java/net/minecraft/core/MinecraftAccessor.java
@@ -1,11 +1,13 @@
 package net.minecraft.core;
 
 import net.minecraft.core.entity.SkinVariantList;
+import net.minecraft.core.sound.SoundTypes;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.chunk.IChunkLoader;
 import net.minecraft.core.world.chunk.provider.IChunkProvider;
 
 import java.io.File;
+import java.util.Collection;
 
 public interface MinecraftAccessor
 {
@@ -23,4 +25,7 @@ public interface MinecraftAccessor
     	return false;
     }
 
+    default Collection<String> getAvailableSoundKeys() {
+        return SoundTypes.getSoundIds().keySet();
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/achievement/Achievement.java b/src/main/java/net/minecraft/core/achievement/Achievement.java
index c91467efe..6c6afcc1f 100644
--- a/src/main/java/net/minecraft/core/achievement/Achievement.java
+++ b/src/main/java/net/minecraft/core/achievement/Achievement.java
@@ -1,6 +1,5 @@
 package net.minecraft.core.achievement;
 
-import net.minecraft.client.gui.achievements.data.AchievementPage;
 import net.minecraft.core.achievement.stat.StatDescFormatter;
 import net.minecraft.core.achievement.stat.Stat;
 import net.minecraft.core.item.IItemConvertible;
@@ -13,26 +12,22 @@ public class Achievement extends Stat
     public static final Type TYPE_SPECIAL = new Type("minecraft:gui/screen/achievement/achievement_special", 0xffffff80, 0xff808040, false);
     public static final Type TYPE_SECRET = new Type("minecraft:gui/screen/achievement/achievement_secret", 0xff8080ff, 0xff404080, true);
 
-    public final int x;
-    public final int y;
     public final Achievement parent;
     private final String description;
     private StatDescFormatter statStringFormatter;
     public final int iconItemId;
     private Type type = TYPE_NORMAL;
 
-    public Achievement(NamespaceID id, String name, int x, int y, IItemConvertible icon, Achievement parent)
+    public Achievement(NamespaceID id, String name, IItemConvertible icon, Achievement parent)
     {
-        this(id, name, x, y, icon.asItem().id, parent);
+        this(id, name, icon.asItem().id, parent);
     }
 
-    public Achievement(NamespaceID id, String name, int x, int y, int iconItemId, Achievement parent)
+    public Achievement(NamespaceID id, String name, int iconItemId, Achievement parent)
     {
         super(new NamespaceID(id.namespace, "achievement/" + id.value), "achievement." + name);
         this.iconItemId = iconItemId;
         this.description = "achievement." + name;
-        this.x = x;
-        this.y = y;
 
         this.parent = parent;
     }
@@ -52,12 +47,6 @@ public class Achievement extends Stat
         Achievements.achievementList.add(this);
         return this;
     }
-    public Achievement addToPage(AchievementPage ... pages){
-        for (AchievementPage page : pages){
-            page.addAchievement(this);
-        }
-        return this;
-    }
 
     @Override
 	public boolean isAchievement()
diff --git a/src/main/java/net/minecraft/core/achievement/Achievements.java b/src/main/java/net/minecraft/core/achievement/Achievements.java
index 244e95ecc..fe01435f7 100644
--- a/src/main/java/net/minecraft/core/achievement/Achievements.java
+++ b/src/main/java/net/minecraft/core/achievement/Achievements.java
@@ -1,210 +1,158 @@
 package net.minecraft.core.achievement;
 
-import com.mojang.logging.LogUtils;
-import net.minecraft.client.gui.achievements.data.AchievementPages;
-import net.minecraft.core.Global;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.util.collection.NamespaceID;
-import org.slf4j.Logger;
 
 import java.util.ArrayList;
 import java.util.List;
 
 public abstract class Achievements
 {
-    private static final Logger LOGGER = LogUtils.getLogger();
     public static List<Achievement> achievementList = new ArrayList<>();
     public static Achievement OPEN_INVENTORY =
-        new Achievement(new NamespaceID("minecraft", "open_inventory"), "openInventory", 0, 0, Items.BOOK, null)
-        .setClientsideAchievement().registerAchievement()
-        .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "open_inventory"), "openInventory", Items.BOOK, null)
+        .setClientsideAchievement().registerAchievement();
     public static Achievement MINE_WOOD =
-        new Achievement(new NamespaceID("minecraft", "mine_wood"), "mineWood", 2, 1, Blocks.LOG_OAK, OPEN_INVENTORY)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "mine_wood"), "mineWood", Blocks.LOG_OAK, OPEN_INVENTORY)
+            .registerAchievement();
     public static Achievement BUILD_WORKBENCH =
-        new Achievement(new NamespaceID("minecraft", "build_workbench"), "buildWorkBench", 4, -1, Blocks.WORKBENCH, MINE_WOOD)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "build_workbench"), "buildWorkBench", Blocks.WORKBENCH, MINE_WOOD)
+            .registerAchievement();
     public static Achievement BUILD_PICKAXE =
-        new Achievement(new NamespaceID("minecraft", "build_pickaxe"), "buildPickaxe", 4, 2, Items.TOOL_PICKAXE_WOOD, BUILD_WORKBENCH)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "build_pickaxe"), "buildPickaxe", Items.TOOL_PICKAXE_WOOD, BUILD_WORKBENCH)
+            .registerAchievement();
     public static Achievement BUILD_FURNACE =
-        new Achievement(new NamespaceID("minecraft", "build_furnace"), "buildFurnace", 3, 4, Blocks.FURNACE_STONE_ACTIVE, BUILD_PICKAXE)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "build_furnace"), "buildFurnace", Blocks.FURNACE_STONE_ACTIVE, BUILD_PICKAXE)
+            .registerAchievement();
     public static Achievement ACQUIRE_IRON =
-        new Achievement(new NamespaceID("minecraft", "acquire_iron"), "acquireIron", 1, 4, Items.INGOT_IRON, BUILD_FURNACE)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "acquire_iron"), "acquireIron", Items.INGOT_IRON, BUILD_FURNACE)
+            .registerAchievement();
     public static Achievement GET_DIAMONDS =
-        new Achievement(new NamespaceID("minecraft", "get_diamonds"), "getDiamonds", -1, 4, Items.DIAMOND, ACQUIRE_IRON)
+        new Achievement(new NamespaceID("minecraft", "get_diamonds"), "getDiamonds", Items.DIAMOND, ACQUIRE_IRON)
             .setType(Achievement.TYPE_SPECIAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+            .registerAchievement();
     public static Achievement BUILD_HOE =
-        new Achievement(new NamespaceID("minecraft", "build_hoe"), "buildHoe", 1, -3, Items.TOOL_HOE_WOOD, BUILD_WORKBENCH)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "build_hoe"), "buildHoe", Items.TOOL_HOE_WOOD, BUILD_WORKBENCH)
+            .registerAchievement();
     public static Achievement MAKE_BREAD =
-        new Achievement(new NamespaceID("minecraft", "make_bread"), "makeBread", -2, -3, Items.FOOD_BREAD, BUILD_HOE)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "make_bread"), "makeBread", Items.FOOD_BREAD, BUILD_HOE)
+            .registerAchievement();
     public static Achievement BAKE_CAKE =
-        new Achievement(new NamespaceID("minecraft", "bake_cake"), "bakeCake", -1, -5, Items.FOOD_CAKE, BUILD_HOE)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "bake_cake"), "bakeCake", Items.FOOD_CAKE, BUILD_HOE)
+            .registerAchievement();
     public static Achievement CRAFT_ICECREAM =
-        new Achievement(new NamespaceID("minecraft", "craft_icecream"), "craftIcecream", 1, -6, Items.BUCKET_ICECREAM, BUILD_HOE)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "craft_icecream"), "craftIcecream", Items.BUCKET_ICECREAM, BUILD_HOE)
+            .registerAchievement();
     public static Achievement CRAFT_PUMPKIN_PIE =
-        new Achievement(new NamespaceID("minecraft", "craft_pumpkin_pie"), "craftPumpkinPie", -1, -1, Items.FOOD_PUMPKIN_PIE, BUILD_HOE)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "craft_pumpkin_pie"), "craftPumpkinPie", Items.FOOD_PUMPKIN_PIE, BUILD_HOE)
+            .registerAchievement();
     public static Achievement BUILD_BETTER_PICKAXE =
-        new Achievement(new NamespaceID("minecraft", "build_better_pickaxe"), "buildBetterPickaxe", 6, 2, Items.TOOL_PICKAXE_STONE, BUILD_PICKAXE)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "build_better_pickaxe"), "buildBetterPickaxe", Items.TOOL_PICKAXE_STONE, BUILD_PICKAXE)
+            .registerAchievement();
     public static Achievement COOK_FISH =
-        new Achievement(new NamespaceID("minecraft", "cook_fish"), "cookFish", 2, 6, Items.FOOD_FISH_COOKED, BUILD_FURNACE)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "cook_fish"), "cookFish", Items.FOOD_FISH_COOKED, BUILD_FURNACE)
+            .registerAchievement();
     public static Achievement ON_A_RAIL =
-        new Achievement(new NamespaceID("minecraft", "on_a_rail"), "onARail", 2, 3, Blocks.RAIL, ACQUIRE_IRON)
+        new Achievement(new NamespaceID("minecraft", "on_a_rail"), "onARail", Blocks.RAIL, ACQUIRE_IRON)
             .setType(Achievement.TYPE_SPECIAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+            .registerAchievement();
     public static Achievement BUILD_SWORD =
-        new Achievement(new NamespaceID("minecraft", "build_sword"), "buildSword", 6, -1, Items.TOOL_SWORD_WOOD, BUILD_WORKBENCH)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "build_sword"), "buildSword", Items.TOOL_SWORD_WOOD, BUILD_WORKBENCH)
+            .registerAchievement();
     public static Achievement ALL_ARMOR_TYPES =
-        new Achievement(new NamespaceID("minecraft", "all_armor_types"), "allArmorTypes", 13, 1, Items.ARMOR_CHESTPLATE_STEEL, null)
+        new Achievement(new NamespaceID("minecraft", "all_armor_types"), "allArmorTypes", Items.ARMOR_CHESTPLATE_STEEL, null)
             .setType(Achievement.TYPE_SPECIAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+            .registerAchievement();
     public static Achievement KILL_ENEMY =
-        new Achievement(new NamespaceID("minecraft", "kill_enemy"), "killEnemy", 8, -1, Items.BONE, BUILD_SWORD)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "kill_enemy"), "killEnemy", Items.BONE, BUILD_SWORD)
+            .registerAchievement();
     public static Achievement KILL_COW =
-        new Achievement(new NamespaceID("minecraft", "kill_cow"), "killCow", 7, -3, Items.LEATHER, BUILD_SWORD)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "kill_cow"), "killCow", Items.LEATHER, BUILD_SWORD)
+            .registerAchievement();
     public static Achievement FLY_PIG =
-        new Achievement(new NamespaceID("minecraft", "fly_pig"), "flyPig", 8, -4, Items.SADDLE, KILL_COW)
+        new Achievement(new NamespaceID("minecraft", "fly_pig"), "flyPig", Items.SADDLE, KILL_COW)
             .setType(Achievement.TYPE_SPECIAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+            .registerAchievement();
     public static Achievement GET_SENSED =
-        new Achievement(new NamespaceID("minecraft", "get_sensed"), "getSensed", 9, -3, Blocks.MOTION_SENSOR_ACTIVE, KILL_ENEMY)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "get_sensed"), "getSensed", Blocks.MOTION_SENSOR_ACTIVE, KILL_ENEMY)
+            .registerAchievement();
     public static Achievement CRAFT_HANDCANNON =
-        new Achievement(new NamespaceID("minecraft", "craft_hand_cannon"), "craftHandCannon", 8, 2, Items.HANDCANNON_UNLOADED, BUILD_BETTER_PICKAXE)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "craft_hand_cannon"), "craftHandCannon", Items.HANDCANNON_UNLOADED, BUILD_BETTER_PICKAXE)
+            .registerAchievement();
     public static Achievement COLLECT_STONE =
-        new Achievement(new NamespaceID("minecraft", "collect_stone"), "collectStone", 5, 4, Blocks.COBBLE_LIMESTONE, BUILD_PICKAXE)
+        new Achievement(new NamespaceID("minecraft", "collect_stone"), "collectStone", Blocks.COBBLE_LIMESTONE, BUILD_PICKAXE)
             .setType(Achievement.TYPE_SPECIAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+            .registerAchievement();
     public static Achievement CRUSH_BLOCKS =
-        new Achievement(new NamespaceID("minecraft", "crush_blocks"), "crushBlocks", 7, 4, Blocks.ICE, BUILD_BETTER_PICKAXE)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "crush_blocks"), "crushBlocks", Blocks.ICE, BUILD_BETTER_PICKAXE)
+            .registerAchievement();
     public static Achievement REPAIR_ARMOR =
-        new Achievement(new NamespaceID("minecraft", "repair_armor"), "repairArmor", 9, 0, Items.CHAINLINK, KILL_ENEMY)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+        new Achievement(new NamespaceID("minecraft", "repair_armor"), "repairArmor", Items.CHAINLINK, KILL_ENEMY)
+            .registerAchievement();
     public static Achievement GET_CHAINMAIL =
-        new Achievement(new NamespaceID("minecraft", "get_chainmail"), "getChainmail", 11, 0, Items.ARMOR_HELMET_CHAINMAIL, REPAIR_ARMOR)
+        new Achievement(new NamespaceID("minecraft", "get_chainmail"), "getChainmail", Items.ARMOR_HELMET_CHAINMAIL, REPAIR_ARMOR)
             .setType(Achievement.TYPE_SPECIAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+            .registerAchievement();
     public static Achievement OPEN_GUIDEBOOK =
-        new Achievement(new NamespaceID("minecraft", "open_guidebook"), "openGuidebook", 0, 2, Blocks.BOOKSHELF_PLANKS_OAK, OPEN_INVENTORY)
+        new Achievement(new NamespaceID("minecraft", "open_guidebook"), "openGuidebook", Blocks.BOOKSHELF_PLANKS_OAK, OPEN_INVENTORY)
             .setClientsideAchievement()
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+            .registerAchievement();
     public static Achievement CAUGHT_EM_ALL =
-        new Achievement(new NamespaceID("minecraft", "caught_em_all"), "caughtEmAll", 4, -4, Items.LANTERN_FIREFLY_GREEN, BUILD_WORKBENCH)
+        new Achievement(new NamespaceID("minecraft", "caught_em_all"), "caughtEmAll", Items.LANTERN_FIREFLY_GREEN, BUILD_WORKBENCH)
             .setType(Achievement.TYPE_SPECIAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+            .registerAchievement();
     public static Achievement ALL_MUSIC_DISCS =
-        new Achievement(new NamespaceID("minecraft", "all_music_discs"), "allMusicDiscs", -3, 4, Items.RECORD_STAL, null)
+        new Achievement(new NamespaceID("minecraft", "all_music_discs"), "allMusicDiscs", Items.RECORD_STAL, null)
             .setType(Achievement.TYPE_SPECIAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+            .registerAchievement();
     public static Achievement TRIPLE_HIT =
-        new Achievement(new NamespaceID("minecraft", "triple_hit"), "tripleHit", 11, -2, Items.AMMO_ARROW_GOLD, KILL_ENEMY)
+        new Achievement(new NamespaceID("minecraft", "triple_hit"), "tripleHit", Items.AMMO_ARROW_GOLD, KILL_ENEMY)
             .setType(Achievement.TYPE_SPECIAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.overworldPage);
+            .registerAchievement();
 
 
     // Nether achievements
     public static Achievement ENTER_NETHER =
-        new Achievement(new NamespaceID("minecraft", "enter_nether"), "enterNether", 2, 0, Blocks.OBSIDIAN, null)
+        new Achievement(new NamespaceID("minecraft", "enter_nether"), "enterNether", Blocks.OBSIDIAN, null)
             .setType(Achievement.TYPE_SPECIAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.netherPage);
+            .registerAchievement();
     public static Achievement GET_NETHERCOAL =
-        new Achievement(new NamespaceID("minecraft", "get_nethercoal"), "getNethercoal", 1, 2, Items.NETHERCOAL, ENTER_NETHER)
+        new Achievement(new NamespaceID("minecraft", "get_nethercoal"), "getNethercoal", Items.NETHERCOAL, ENTER_NETHER)
             .setType(Achievement.TYPE_NORMAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.netherPage);
+            .registerAchievement();
     public static Achievement LIGHT_SIGN =
-        new Achievement(new NamespaceID("minecraft", "light_sign"), "lightSign", 4, 0, Items.DUST_GLOWSTONE, ENTER_NETHER)
+        new Achievement(new NamespaceID("minecraft", "light_sign"), "lightSign", Items.DUST_GLOWSTONE, ENTER_NETHER)
             .setType(Achievement.TYPE_NORMAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.netherPage);
+            .registerAchievement();
     public static Achievement SWIM_NETHER =
-        new Achievement(new NamespaceID("minecraft", "swim_nether"), "swimNether", 3, 2, Blocks.ICE, ENTER_NETHER)
+        new Achievement(new NamespaceID("minecraft", "swim_nether"), "swimNether", Blocks.ICE, ENTER_NETHER)
             .setType(Achievement.TYPE_SPECIAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.netherPage);
+            .registerAchievement();
     public static Achievement HIT_FIREBALL =
-        new Achievement(new NamespaceID("minecraft", "hit_fireball"), "hitFireball", 3, -2, Items.AMMO_FIREBALL, ENTER_NETHER)
+        new Achievement(new NamespaceID("minecraft", "hit_fireball"), "hitFireball", Items.AMMO_FIREBALL, ENTER_NETHER)
             .setType(Achievement.TYPE_SPECIAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.netherPage);
+            .registerAchievement();
     public static Achievement SLEEP_NETHER =
-        new Achievement(new NamespaceID("minecraft", "sleep_nether"), "sleepNether", 1, -2, Items.BED, ENTER_NETHER)
+        new Achievement(new NamespaceID("minecraft", "sleep_nether"), "sleepNether", Items.BED, ENTER_NETHER)
             .setType(Achievement.TYPE_SPECIAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.netherPage);
+            .registerAchievement();
     public static Achievement ENTER_OLDWORLD =
-        new Achievement(new NamespaceID("minecraft", "enter_oldworld"), "enterOldworld", 0, -5, Blocks.BEDROCK, ENTER_NETHER)
+        new Achievement(new NamespaceID("minecraft", "enter_oldworld"), "enterOldworld", Blocks.BEDROCK, ENTER_NETHER)
             .setType(Achievement.TYPE_NORMAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.netherPage);
+            .registerAchievement();
     public static Achievement ENTER_WARRENS =
-        new Achievement(new NamespaceID("minecraft", "enter_warrens"), "enterWarrens", 0, 5, Blocks.BEDROCK, ENTER_NETHER)
+        new Achievement(new NamespaceID("minecraft", "enter_warrens"), "enterWarrens", Blocks.BEDROCK, ENTER_NETHER)
             .setType(Achievement.TYPE_NORMAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.netherPage);
+            .registerAchievement();
     public static Achievement MOST_WANTED =
-        new Achievement(new NamespaceID("minecraft", "most_wanted"), "mostWanted", -0, -1, Items.TOOL_SWORD_GOLD, ENTER_NETHER)
+        new Achievement(new NamespaceID("minecraft", "most_wanted"), "mostWanted", Items.TOOL_SWORD_GOLD, ENTER_NETHER)
             .setType(Achievement.TYPE_NORMAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.netherPage);
+            .registerAchievement();
     public static Achievement FAST_TRAVEL = // TODO
-        new Achievement(new NamespaceID("minecraft", "fast_travel"), "fastTravel", -0, 1, Blocks.GRASS, ENTER_NETHER)
+        new Achievement(new NamespaceID("minecraft", "fast_travel"), "fastTravel", Blocks.GRASS, ENTER_NETHER)
             .setType(Achievement.TYPE_NORMAL)
-            .registerAchievement()
-            .addToPage(AchievementPages.netherPage);
+            .registerAchievement();
 
-
-    private static boolean hasInit = false;
-    public static void init() {
-        if (hasInit) return;
-        hasInit = true;
-        AchievementPages.init();
-        LOGGER.info("{} Achievements", achievementList.size());
-    }
+    public static void init(){};
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockAlgae.java b/src/main/java/net/minecraft/core/block/BlockAlgae.java
index 6b2d71208..75924dfd1 100644
--- a/src/main/java/net/minecraft/core/block/BlockAlgae.java
+++ b/src/main/java/net/minecraft/core/block/BlockAlgae.java
@@ -3,7 +3,7 @@ package net.minecraft.core.block;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.entity.vehicle.EntityBoat;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.LevelListener;
@@ -29,7 +29,7 @@ public class BlockAlgae extends Block
     @Override
     public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity)
     {
-        if(entity instanceof BoatEntity) {
+        if(entity instanceof EntityBoat) {
             int data = world.getBlockMetadata(x, y, z);
             world.playBlockEvent(null, LevelListener.EVENT_BLOCK_BREAK, x, y, z, id);
             world.setBlockWithNotify(x, y, z, 0);
diff --git a/src/main/java/net/minecraft/core/block/BlockCactus.java b/src/main/java/net/minecraft/core/block/BlockCactus.java
index 2f882f821..3f3a2deb7 100644
--- a/src/main/java/net/minecraft/core/block/BlockCactus.java
+++ b/src/main/java/net/minecraft/core/block/BlockCactus.java
@@ -4,7 +4,7 @@ import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.entity.player.Player;
-import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.entity.vehicle.EntityBoat;
 import net.minecraft.core.entity.vehicle.MinecartEntity;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.IBonemealable;
@@ -145,7 +145,7 @@ public class BlockCactus extends Block implements IBonemealable
     @Override
     public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity)
     {
-        if(entity instanceof Mob || entity instanceof MinecartEntity || entity instanceof BoatEntity) {
+        if(entity instanceof Mob || entity instanceof MinecartEntity || entity instanceof EntityBoat) {
         	entity.hurt(null, 1, DamageType.COMBAT);
         }
     }
diff --git a/src/main/java/net/minecraft/core/block/BlockMotionSensor.java b/src/main/java/net/minecraft/core/block/BlockMotionSensor.java
index 3912fc138..8e46f86b9 100644
--- a/src/main/java/net/minecraft/core/block/BlockMotionSensor.java
+++ b/src/main/java/net/minecraft/core/block/BlockMotionSensor.java
@@ -3,13 +3,11 @@ package net.minecraft.core.block;
 
 import java.util.Random;
 
-import net.minecraft.client.util.helper.Colors;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.entity.TileEntitySensor;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.util.helper.Color;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
@@ -36,39 +34,28 @@ public class BlockMotionSensor extends BlockTileEntityVeryRotatable
         {
             return;
         }
-        spawnParticles(world, x, y, z);
-    }
-
-	private void spawnParticles(World world, int x, int y, int z) {
-		Random random = world.rand;
+        Random random = world.rand;
 
         final int redstoneBrightness = 10;
-		Color color = Colors.allRedstoneColors[redstoneBrightness];
-		if(color == null) {
-			return;
-		}
-		float red = color.getRed() / 255.0f;
-		float green = color.getGreen() / 255.0f;
-		float blue = color.getBlue() / 255.0f;
-		
-		double d = 0.0625;
-		for (int i = 0; i < 3; i++) {
-			double px = (double) x + random.nextFloat();
-			double py = (double) y + random.nextFloat();
-			double pz = (double) z + random.nextFloat();
-			
-			if (i == 0 && !world.isBlockOpaqueCube(x, y + 1, z)) py = (y + 1) + d;
-			if (i == 1 && !world.isBlockOpaqueCube(x, y - 1, z)) py = (y + 0) - d;
-			if (i == 2 && !world.isBlockOpaqueCube(x, y, z + 1)) pz = (z + 1) + d;
-			if (i == 3 && !world.isBlockOpaqueCube(x, y, z - 1)) pz = (z + 0) - d;
-			if (i == 4 && !world.isBlockOpaqueCube(x + 1, y, z)) px = (x + 1) + d;
-			if (i == 5 && !world.isBlockOpaqueCube(x - 1, y, z)) px = (x + 0) - d;
-			
-			if (px < x || px > (x + 1) || py < 0.0D || py > (y + 1) || pz < z || pz > (z + 1)) {
-				world.spawnParticle("reddust", px, py, pz, red, green, blue, redstoneBrightness);
-			}
-		}
-	}
+
+        double d = 0.0625;
+        for (int i = 0; i < 6; i++) {
+            double px = (double) x + random.nextFloat();
+            double py = (double) y + random.nextFloat();
+            double pz = (double) z + random.nextFloat();
+
+            if (i == 0 && !world.isBlockOpaqueCube(x, y + 1, z)) py = (y + 1) + d;
+            if (i == 1 && !world.isBlockOpaqueCube(x, y - 1, z)) py = (y + 0) - d;
+            if (i == 2 && !world.isBlockOpaqueCube(x, y, z + 1)) pz = (z + 1) + d;
+            if (i == 3 && !world.isBlockOpaqueCube(x, y, z - 1)) pz = (z + 0) - d;
+            if (i == 4 && !world.isBlockOpaqueCube(x + 1, y, z)) px = (x + 1) + d;
+            if (i == 5 && !world.isBlockOpaqueCube(x - 1, y, z)) px = (x + 0) - d;
+
+            if (px < x || px > (x + 1) || py < 0.0D || py > (y + 1) || pz < z || pz > (z + 1)) {
+                world.spawnParticle("reddust", px, py, pz, 0, 0, 0, redstoneBrightness);
+            }
+        }
+    }
 
     @Override
     public boolean isSignalSource()
diff --git a/src/main/java/net/minecraft/core/block/BlockOreRedstone.java b/src/main/java/net/minecraft/core/block/BlockOreRedstone.java
index 656673259..92ea40c37 100644
--- a/src/main/java/net/minecraft/core/block/BlockOreRedstone.java
+++ b/src/main/java/net/minecraft/core/block/BlockOreRedstone.java
@@ -6,9 +6,7 @@ import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Items;
 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;
 
@@ -111,18 +109,9 @@ public class BlockOreRedstone extends Block
 		Random random = world.rand;
 
         final int redstoneBrightness = 10;
-		Color color = Colors.allRedstoneColors[redstoneBrightness];
-		if(color == null) {
-			return;
-		}
-		
-		float red = color.getRed() / 255.0f;
-		float green = color.getGreen() / 255.0f;
-		float blue = color.getBlue() / 255.0f;
-		
 		
 		double d = 0.0625;
-		for (int i = 0; i < 3; i++) {
+		for (int i = 0; i < 6; i++) {
 			double px = (double) x + random.nextFloat();
 			double py = (double) y + random.nextFloat();
 			double pz = (double) z + random.nextFloat();
@@ -135,7 +124,7 @@ public class BlockOreRedstone extends Block
 			if (i == 5 && !world.isBlockOpaqueCube(x - 1, y, z)) px = (x) - d;
 			
 			if (px < x || px > (x + 1) || py < 0.0D || py > (y + 1) || pz < z || pz > (z + 1)) {
-				world.spawnParticle("reddust", px, py, pz, red, green, blue, redstoneBrightness);
+				world.spawnParticle("reddust", px, py, pz, 0, 0, 0, redstoneBrightness);
 			}
 		}
     }
diff --git a/src/main/java/net/minecraft/core/block/BlockRedstone.java b/src/main/java/net/minecraft/core/block/BlockRedstone.java
index 00325b3f1..4736796e4 100644
--- a/src/main/java/net/minecraft/core/block/BlockRedstone.java
+++ b/src/main/java/net/minecraft/core/block/BlockRedstone.java
@@ -1,8 +1,6 @@
 package net.minecraft.core.block;
 
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.util.helper.Color;
-import net.minecraft.client.util.helper.Colors;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
@@ -61,14 +59,7 @@ public class BlockRedstone extends Block
 		Random random = world.rand;
 
         final int redstoneBrightness = 10;
-		Color color = Colors.allRedstoneColors[redstoneBrightness];
-		if(color == null) {
-			return;
-		}
-		float red = color.getRed() / 255.0f;
-		float green = color.getGreen() / 255.0f;
-		float blue = color.getBlue() / 255.0f;
-		
+
 		final double d = 0.0625;
         for (Side s : Side.sides){
             double px = (double) x + random.nextFloat();
@@ -107,7 +98,7 @@ public class BlockRedstone extends Block
                     break;
             }
             if (px < x || px > (x + 1) || py < 0.0D || py > (y + 1) || pz < z || pz > (z + 1)) {
-                world.spawnParticle("reddust", px, py, pz, red, green, blue, redstoneBrightness);
+                world.spawnParticle("reddust", px, py, pz, 0, 0, 0, redstoneBrightness);
             }
         }
 	}
diff --git a/src/main/java/net/minecraft/core/block/BlockRepeater.java b/src/main/java/net/minecraft/core/block/BlockRepeater.java
index e2c8cebda..ce3e7cb36 100644
--- a/src/main/java/net/minecraft/core/block/BlockRepeater.java
+++ b/src/main/java/net/minecraft/core/block/BlockRepeater.java
@@ -1,6 +1,5 @@
 package net.minecraft.core.block;
 
-import net.minecraft.client.util.helper.Colors;
 import net.minecraft.core.block.entity.TileEntityActivator;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.material.Material;
@@ -9,7 +8,6 @@ import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.Items;
-import net.minecraft.core.util.helper.Color;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
@@ -218,13 +216,6 @@ public class BlockRepeater extends Block
 		double zOffset = 0.0;
 
         final int redstoneBrightness = 15;
-		Color color = Colors.allRedstoneColors[redstoneBrightness];
-		if(color == null) {
-			return;
-		}
-		float red = color.getRed() / 255.0f;
-		float green = color.getGreen() / 255.0f;
-		float blue = color.getBlue() / 255.0f;
 		
 		if (rand.nextInt(2) == 0) {
 			switch (meta & MASK_DIRECTION) {
@@ -258,7 +249,7 @@ public class BlockRepeater extends Block
 				break;
 			}
 		}
-		world.spawnParticle("reddust", px + xOffset, py, pz + zOffset, red, green, blue, redstoneBrightness);
+		world.spawnParticle("reddust", px + xOffset, py, pz + zOffset, 0, 0, 0, redstoneBrightness);
 	}
 
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockTorchRedstone.java b/src/main/java/net/minecraft/core/block/BlockTorchRedstone.java
index 78cd8c9ac..f151e3d1e 100644
--- a/src/main/java/net/minecraft/core/block/BlockTorchRedstone.java
+++ b/src/main/java/net/minecraft/core/block/BlockTorchRedstone.java
@@ -1,10 +1,8 @@
 package net.minecraft.core.block;
 
-import net.minecraft.client.util.helper.Colors;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
-import net.minecraft.core.util.helper.Color;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
@@ -143,29 +141,22 @@ public class BlockTorchRedstone extends BlockTorch {
         double horizontalOffset = 0.27D;
 
         final int redstoneBrightness = 10;
-        Color color = Colors.allRedstoneColors[redstoneBrightness];
-        if (color == null) {
-            return;
-        }
-        float red = color.getRed() / 255.0f;
-        float green = color.getGreen() / 255.0f;
-        float blue = color.getBlue() / 255.0f;
 
         switch (direction) {
             case SIDE_WEST:
-                world.spawnParticle("reddust", px - horizontalOffset, py + verticalOffset, pz, red, green, blue, redstoneBrightness);
+                world.spawnParticle("reddust", px - horizontalOffset, py + verticalOffset, pz, 0, 0, 0, redstoneBrightness);
                 break;
             case SIDE_EAST:
-                world.spawnParticle("reddust", px + horizontalOffset, py + verticalOffset, pz, red, green, blue, redstoneBrightness);
+                world.spawnParticle("reddust", px + horizontalOffset, py + verticalOffset, pz, 0, 0, 0, redstoneBrightness);
                 break;
             case SIDE_NORTH:
-                world.spawnParticle("reddust", px, py + verticalOffset, pz - horizontalOffset, red, green, blue, redstoneBrightness);
+                world.spawnParticle("reddust", px, py + verticalOffset, pz - horizontalOffset, 0, 0, 0, redstoneBrightness);
                 break;
             case SIDE_SOUTH:
-                world.spawnParticle("reddust", px, py + verticalOffset, pz + horizontalOffset, red, green, blue, redstoneBrightness);
+                world.spawnParticle("reddust", px, py + verticalOffset, pz + horizontalOffset, 0, 0, 0, redstoneBrightness);
                 break;
             case SIDE_BOTTOM:
-                world.spawnParticle("reddust", px, py, pz, red, green, blue, redstoneBrightness);
+                world.spawnParticle("reddust", px, py, pz, 0, 0, 0, redstoneBrightness);
                 break;
         }
     }
diff --git a/src/main/java/net/minecraft/core/block/BlockWireRedstone.java b/src/main/java/net/minecraft/core/block/BlockWireRedstone.java
index 330017d43..b219e694c 100644
--- a/src/main/java/net/minecraft/core/block/BlockWireRedstone.java
+++ b/src/main/java/net/minecraft/core/block/BlockWireRedstone.java
@@ -1,13 +1,11 @@
 package net.minecraft.core.block;
 
-import net.minecraft.client.util.helper.Colors;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.util.helper.Axis;
-import net.minecraft.core.util.helper.Color;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
@@ -341,15 +339,8 @@ public class BlockWireRedstone extends Block {
         double pz = (double) z + 0.5D + (rand.nextFloat() - 0.5D) * 0.2D;
 
         final int redstoneBrightness = meta & 0xF;
-        Color color = Colors.allRedstoneColors[redstoneBrightness];
-        if (color == null) {
-            return;
-        }
-        float red = color.getRed() / 255.0f;
-        float green = color.getGreen() / 255.0f;
-        float blue = color.getBlue() / 255.0f;
 
-        world.spawnParticle("reddust", px, py, pz, red, green, blue, redstoneBrightness);
+        world.spawnParticle("reddust", px, py, pz, 0, 0, 0, redstoneBrightness);
     }
 
     public static boolean shouldConnectTo(WorldSource worldSource, int x, int y, int z, int data) {
diff --git a/src/main/java/net/minecraft/core/block/tag/BlockTags.java b/src/main/java/net/minecraft/core/block/tag/BlockTags.java
index 6d9b30d1c..1ff5af05f 100644
--- a/src/main/java/net/minecraft/core/block/tag/BlockTags.java
+++ b/src/main/java/net/minecraft/core/block/tag/BlockTags.java
@@ -15,7 +15,7 @@ import net.minecraft.core.block.BlockTallGrass;
 import net.minecraft.core.data.tag.Tag;
 import net.minecraft.core.entity.animal.MobFireflyCluster;
 import net.minecraft.core.entity.monster.MobZombiePig;
-import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.entity.vehicle.EntityBoat;
 import net.minecraft.core.item.tool.ItemToolPickaxe;
 import net.minecraft.core.item.tool.ItemToolShears;
 import net.minecraft.core.item.tool.ItemToolAxe;
@@ -149,7 +149,7 @@ public abstract class BlockTags
      */
     public static Tag<Block> INFINITE_BURN = Tag.of("infinite_burn");
     /**
-     * Block is broken on contact with an {@link BoatEntity BoatEntity}
+     * Block is broken on contact with an {@link EntityBoat EntityBoat}
      */
     public static Tag<Block> BOAT_BREAKS = Tag.of("boat_breaks");
     /**
diff --git a/src/main/java/net/minecraft/core/entity/Entity.java b/src/main/java/net/minecraft/core/entity/Entity.java
index 383456ce8..920554ffc 100644
--- a/src/main/java/net/minecraft/core/entity/Entity.java
+++ b/src/main/java/net/minecraft/core/entity/Entity.java
@@ -14,7 +14,6 @@ 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;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.material.Material;
@@ -843,7 +842,8 @@ public abstract class Entity
     public int getLightmapCoord(float partialTick) {
     	if(world == null) {
     		// Happens when the guidebook is rendered
-    		return LightmapHelper.getLightmapCoord(15, 15);
+//    		return LightmapHelper.getLightmapCoord(15, 15);
+            return 0xFFFFFFFF; // TODO make this work properly when world is null
     	}
     	
     	int blockX = MathHelper.floor(x);
@@ -854,7 +854,7 @@ public abstract class Entity
     	int skylight = world.getSavedLightValue(LightLayer.Sky, blockX, blockY, blockZ);
     	int blocklight = world.getSavedLightValue(LightLayer.Block, blockX, blockY, blockZ);
     	
-    	return LightmapHelper.getLightmapCoord(skylight, blocklight);
+    	return world.getLightmapCoord(skylight, blocklight);
     }
 
     public void setWorld(World world)
diff --git a/src/main/java/net/minecraft/core/entity/EntityDispatcher.java b/src/main/java/net/minecraft/core/entity/EntityDispatcher.java
index eca67a8d4..e04c60072 100644
--- a/src/main/java/net/minecraft/core/entity/EntityDispatcher.java
+++ b/src/main/java/net/minecraft/core/entity/EntityDispatcher.java
@@ -4,7 +4,7 @@ import com.mojang.logging.LogUtils;
 import net.minecraft.core.entity.animal.*;
 import net.minecraft.core.entity.monster.*;
 import net.minecraft.core.entity.projectile.*;
-import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.entity.vehicle.EntityBoat;
 import net.minecraft.core.entity.vehicle.MinecartEntity;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.world.World;
@@ -146,7 +146,7 @@ public class EntityDispatcher
         addMapping(EntityPrimedTNT.class, "PrimedTnt", 20);
         addMapping(EntityFallingBlock.class, "FallingSand", 21);
         addMapping(MinecartEntity.class, "Minecart", 40);
-        addMapping(BoatEntity.class, "Boat", 41);
+        addMapping(EntityBoat.class, "Boat", 41);
         addMapping(MobZombieArmored.class, "ArmouredZombie", 42);
         addMapping(ProjectileArrowGolden.class, "ArrowGolden", 43);
         addMapping(ProjectileCannonball.class, "Cannonball", 44);
diff --git a/src/main/java/net/minecraft/core/entity/player/Player.java b/src/main/java/net/minecraft/core/entity/player/Player.java
index 666ef8a20..2d5308caa 100644
--- a/src/main/java/net/minecraft/core/entity/player/Player.java
+++ b/src/main/java/net/minecraft/core/entity/player/Player.java
@@ -41,7 +41,7 @@ import net.minecraft.core.entity.monster.MobZombie;
 import net.minecraft.core.entity.projectile.ProjectileCannonball;
 import net.minecraft.core.entity.projectile.ProjectileFireball;
 import net.minecraft.core.entity.projectile.ProjectileArrowGolden;
-import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.entity.vehicle.EntityBoat;
 import net.minecraft.core.entity.vehicle.MinecartEntity;
 import net.minecraft.core.enums.ArtType;
 import net.minecraft.core.enums.EnumDropCause;
@@ -1447,7 +1447,7 @@ public abstract class Player extends Mob
                         addStat(Achievements.ON_A_RAIL, 1);
                     }
                 } else
-                if(vehicle instanceof BoatEntity)
+                if(vehicle instanceof EntityBoat)
                 {
                     addStat(StatList.distanceByBoatStat, i);
                 } else
diff --git a/src/main/java/net/minecraft/core/entity/vehicle/BoatEntity.java b/src/main/java/net/minecraft/core/entity/vehicle/EntityBoat.java
similarity index 97%
rename from src/main/java/net/minecraft/core/entity/vehicle/BoatEntity.java
rename to src/main/java/net/minecraft/core/entity/vehicle/EntityBoat.java
index b374d8362..041ef1fde 100644
--- a/src/main/java/net/minecraft/core/entity/vehicle/BoatEntity.java
+++ b/src/main/java/net/minecraft/core/entity/vehicle/EntityBoat.java
@@ -24,12 +24,7 @@ import net.minecraft.server.entity.player.PlayerServer;
 
 import java.util.List;
 
-// Referenced classes of package net.minecraft.src:
-//            Entity, World, Block, Item, 
-//            AxisAlignedBB, Material, MathHelper, Player,
-//            NBTTagCompound
-
-public class BoatEntity extends Entity
+public class EntityBoat extends Entity
 {
     private static final double MAX_BOAT_SPEED = 0.8D;
     private static final double ACCELERATION = 0.0065D;
@@ -56,7 +51,7 @@ public class BoatEntity extends Entity
     public TileEntityFlag tileEntityFlag = null;
 
 
-    public BoatEntity(World world)
+    public EntityBoat(World world)
     {
         super(world);
         boatCurrentDamage = 0;
@@ -102,7 +97,7 @@ public class BoatEntity extends Entity
         return true;
     }
 
-    public BoatEntity(World world, double d, double d1, double d2)
+    public EntityBoat(World world, double d, double d1, double d2)
     {
         this(world);
         setPos(d, d1 + (double) heightOffset, d2);
@@ -346,7 +341,7 @@ public class BoatEntity extends Entity
         if(list != null && !list.isEmpty())
         {
             for (Entity entity : list) {
-                if (entity != passenger && entity.isPushable() && (entity instanceof BoatEntity)) {
+                if (entity != passenger && entity.isPushable() && (entity instanceof EntityBoat)) {
                     entity.push(this);
                 }
             }
diff --git a/src/main/java/net/minecraft/core/item/ItemBoat.java b/src/main/java/net/minecraft/core/item/ItemBoat.java
index 3e07eeeb2..82334b741 100644
--- a/src/main/java/net/minecraft/core/item/ItemBoat.java
+++ b/src/main/java/net/minecraft/core/item/ItemBoat.java
@@ -4,10 +4,10 @@ package net.minecraft.core.item;
 // Referenced classes of package net.minecraft.src:
 //            Item, Player, Vec3D, MathHelper,
 //            World, MovingObjectPosition, EnumMovingObjectType, Block, 
-//            BoatEntity, ItemStack
+//            EntityBoat, ItemStack
 
 import net.minecraft.core.block.entity.TileEntityActivator;
-import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.entity.vehicle.EntityBoat;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.util.helper.Direction;
@@ -61,7 +61,7 @@ public class ItemBoat extends Item
                 {
                     j--;
                 }
-                BoatEntity boat = new BoatEntity(world, i + 0.5F, j + 1.0F, k + 0.5F);
+                EntityBoat boat = new EntityBoat(world, i + 0.5F, j + 1.0F, k + 0.5F);
                 boat.setRot(entityplayer.yRot - 90, 0);
                 world.entityJoinedWorld(boat);
             }
@@ -76,7 +76,7 @@ public class ItemBoat extends Item
         double y = blockY + offY + direction.getOffsetY();
         double z = blockZ + offZ + direction.getOffsetZ();
         itemStack.consumeItem(null);
-        BoatEntity boat = new BoatEntity(world, x, y, z);
+        EntityBoat boat = new EntityBoat(world, x, y, z);
         world.entityJoinedWorld(boat);
     }
 }
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 886c102e7..3b31b0af8 100644
--- a/src/main/java/net/minecraft/core/item/block/ItemBlockAlgae.java
+++ b/src/main/java/net/minecraft/core/item/block/ItemBlockAlgae.java
@@ -2,7 +2,7 @@ package net.minecraft.core.item.block;
 // Referenced classes of package net.minecraft.src:
 //            Item, Player, Vec3D, MathHelper,
 //            World, MovingObjectPosition, EnumMovingObjectType, Block, 
-//            BoatEntity, ItemStack
+//            EntityBoat, ItemStack
 
 import net.minecraft.core.block.entity.TileEntityActivator;
 import net.minecraft.core.block.tag.BlockTags;
diff --git a/src/main/java/net/minecraft/client/lang/text/ChainText.java b/src/main/java/net/minecraft/core/lang/text/ChainText.java
similarity index 96%
rename from src/main/java/net/minecraft/client/lang/text/ChainText.java
rename to src/main/java/net/minecraft/core/lang/text/ChainText.java
index b52367f8c..ea357434f 100644
--- a/src/main/java/net/minecraft/client/lang/text/ChainText.java
+++ b/src/main/java/net/minecraft/core/lang/text/ChainText.java
@@ -1,4 +1,4 @@
-package net.minecraft.client.lang.text;
+package net.minecraft.core.lang.text;
 
 import net.minecraft.core.net.command.TextFormatting;
 
diff --git a/src/main/java/net/minecraft/client/lang/text/FormattedText.java b/src/main/java/net/minecraft/core/lang/text/FormattedText.java
similarity index 92%
rename from src/main/java/net/minecraft/client/lang/text/FormattedText.java
rename to src/main/java/net/minecraft/core/lang/text/FormattedText.java
index 5544794a0..50e3dbc2c 100644
--- a/src/main/java/net/minecraft/client/lang/text/FormattedText.java
+++ b/src/main/java/net/minecraft/core/lang/text/FormattedText.java
@@ -1,4 +1,4 @@
-package net.minecraft.client.lang.text;
+package net.minecraft.core.lang.text;
 
 import net.minecraft.core.net.command.TextFormatting;
 
diff --git a/src/main/java/net/minecraft/client/lang/text/FunctionText.java b/src/main/java/net/minecraft/core/lang/text/FunctionText.java
similarity index 89%
rename from src/main/java/net/minecraft/client/lang/text/FunctionText.java
rename to src/main/java/net/minecraft/core/lang/text/FunctionText.java
index 3d1da2a2b..3454a98ff 100644
--- a/src/main/java/net/minecraft/client/lang/text/FunctionText.java
+++ b/src/main/java/net/minecraft/core/lang/text/FunctionText.java
@@ -1,4 +1,4 @@
-package net.minecraft.client.lang.text;
+package net.minecraft.core.lang.text;
 
 public class FunctionText
     extends Text {
diff --git a/src/main/java/net/minecraft/client/lang/text/LiteralText.java b/src/main/java/net/minecraft/core/lang/text/LiteralText.java
similarity index 85%
rename from src/main/java/net/minecraft/client/lang/text/LiteralText.java
rename to src/main/java/net/minecraft/core/lang/text/LiteralText.java
index df534916e..bba248fa7 100644
--- a/src/main/java/net/minecraft/client/lang/text/LiteralText.java
+++ b/src/main/java/net/minecraft/core/lang/text/LiteralText.java
@@ -1,4 +1,4 @@
-package net.minecraft.client.lang.text;
+package net.minecraft.core.lang.text;
 
 public class LiteralText
     extends Text {
diff --git a/src/main/java/net/minecraft/client/lang/text/Text.java b/src/main/java/net/minecraft/core/lang/text/Text.java
similarity index 80%
rename from src/main/java/net/minecraft/client/lang/text/Text.java
rename to src/main/java/net/minecraft/core/lang/text/Text.java
index 4d1f98374..d5dfcc64e 100644
--- a/src/main/java/net/minecraft/client/lang/text/Text.java
+++ b/src/main/java/net/minecraft/core/lang/text/Text.java
@@ -1,6 +1,5 @@
-package net.minecraft.client.lang.text;
+package net.minecraft.core.lang.text;
 
-import net.minecraft.client.render.Font;
 import net.minecraft.core.net.command.TextFormatting;
 
 public abstract class Text {
@@ -17,9 +16,9 @@ public abstract class Text {
 
     abstract void toString(StringBuilder sb);
 
-    public int width(Font font) {
-        return font.getStringWidth(this.toString());
-    }
+//    public int width(Font font) { // Commented out due to being unused and referencing the client package
+//        return font.getStringWidth(this.toString());
+//    }
 
     public Text trans(String languageKey) {
         return new ChainText(this, new TranslatableText(languageKey));
diff --git a/src/main/java/net/minecraft/client/lang/text/TranslatableText.java b/src/main/java/net/minecraft/core/lang/text/TranslatableText.java
similarity index 89%
rename from src/main/java/net/minecraft/client/lang/text/TranslatableText.java
rename to src/main/java/net/minecraft/core/lang/text/TranslatableText.java
index 7398825ca..a9ad41fd6 100644
--- a/src/main/java/net/minecraft/client/lang/text/TranslatableText.java
+++ b/src/main/java/net/minecraft/core/lang/text/TranslatableText.java
@@ -1,4 +1,4 @@
-package net.minecraft.client.lang.text;
+package net.minecraft.core.lang.text;
 
 import net.minecraft.core.lang.I18n;
 
diff --git a/src/main/java/net/minecraft/core/net/command/arguments/ArgumentTypeParticleId.java b/src/main/java/net/minecraft/core/net/command/arguments/ArgumentTypeParticleId.java
index cfe3900e6..2b21364c5 100644
--- a/src/main/java/net/minecraft/core/net/command/arguments/ArgumentTypeParticleId.java
+++ b/src/main/java/net/minecraft/core/net/command/arguments/ArgumentTypeParticleId.java
@@ -6,16 +6,49 @@ import com.mojang.brigadier.context.CommandContext;
 import com.mojang.brigadier.exceptions.CommandSyntaxException;
 import com.mojang.brigadier.suggestion.Suggestions;
 import com.mojang.brigadier.suggestion.SuggestionsBuilder;
-import net.minecraft.client.entity.particle.ParticleDispatcher;
 import net.minecraft.core.lang.I18n;
 
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
+import java.util.Set;
 import java.util.concurrent.CompletableFuture;
 
 public class ArgumentTypeParticleId implements ArgumentType<String> {
+    public static final Set<String> particleIds = new HashSet<>();
+
+    static {
+        particleIds.add("note");
+        particleIds.add("dripLava");
+        particleIds.add("puffrgb");
+        particleIds.add("blueflame");
+        particleIds.add("lava");
+        particleIds.add("arrowtrail");
+        particleIds.add("reddust");
+        particleIds.add("soulflame");
+        particleIds.add("bubble");
+        particleIds.add("explode");
+        particleIds.add("slimechunk");
+        particleIds.add("block");
+        particleIds.add("portal");
+        particleIds.add("snowshovel");
+        particleIds.add("item");
+        particleIds.add("dripWater");
+        particleIds.add("largesmoke");
+        particleIds.add("smoke");
+        particleIds.add("fireflyBlue");
+        particleIds.add("heart");
+        particleIds.add("fireflyOrange");
+        particleIds.add("footstep");
+        particleIds.add("fallingleaf");
+        particleIds.add("flame");
+        particleIds.add("fireflyGreen");
+        particleIds.add("fireflyRed");
+        particleIds.add("splash");
+    }
+
     private static final List<String> EXAMPLES = Arrays.asList("fireflyGreen", "explode", "soulflame");
 
     public static ArgumentType<String> particleId() {
@@ -26,7 +59,7 @@ public class ArgumentTypeParticleId implements ArgumentType<String> {
     public String parse(StringReader reader) throws CommandSyntaxException {
         final String string = reader.readString();
 
-        for (String particleId : ParticleDispatcher.getInstance().getParticleIds()) {
+        for (String particleId : particleIds) {
             if (particleId.equalsIgnoreCase(string)) {
                 return string;
             }
@@ -36,7 +69,7 @@ public class ArgumentTypeParticleId implements ArgumentType<String> {
 
     @Override
     public <S> CompletableFuture<Suggestions> listSuggestions(CommandContext<S> context, SuggestionsBuilder builder) {
-        for (String particleId : ParticleDispatcher.getInstance().getParticleIds()) {
+        for (String particleId : particleIds) {
             if (particleId.toLowerCase(Locale.ROOT).startsWith(builder.getRemainingLowerCase())) {
                 builder.suggest(particleId);
             }
diff --git a/src/main/java/net/minecraft/core/net/command/arguments/ArgumentTypeSoundId.java b/src/main/java/net/minecraft/core/net/command/arguments/ArgumentTypeSoundId.java
index 925aeb8b2..2592714e9 100644
--- a/src/main/java/net/minecraft/core/net/command/arguments/ArgumentTypeSoundId.java
+++ b/src/main/java/net/minecraft/core/net/command/arguments/ArgumentTypeSoundId.java
@@ -6,13 +6,9 @@ import com.mojang.brigadier.context.CommandContext;
 import com.mojang.brigadier.exceptions.CommandSyntaxException;
 import com.mojang.brigadier.suggestion.Suggestions;
 import com.mojang.brigadier.suggestion.SuggestionsBuilder;
-import net.minecraft.client.sound.SoundEvent;
-import net.minecraft.client.sound.SoundRepository;
 import net.minecraft.core.Global;
 import net.minecraft.core.lang.I18n;
-import net.minecraft.core.sound.SoundTypes;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
@@ -48,15 +44,7 @@ public class ArgumentTypeSoundId implements ArgumentType<String> {
     }
 
     public Collection<String> soundIds() {
-        if (Global.isServer) {
-            return SoundTypes.getSoundIds().keySet();
-        } else {
-            List<String> ids = new ArrayList<>();
-            for (SoundEvent e : SoundRepository.SOUNDS.getAllEvents()) {
-                ids.add(e.getEventID());
-            }
-            return ids;
-        }
+        return Global.accessor.getAvailableSoundKeys();
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/net/command/helpers/EntitySelectorOptions.java b/src/main/java/net/minecraft/core/net/command/helpers/EntitySelectorOptions.java
index 0b7af5318..3f03c2565 100644
--- a/src/main/java/net/minecraft/core/net/command/helpers/EntitySelectorOptions.java
+++ b/src/main/java/net/minecraft/core/net/command/helpers/EntitySelectorOptions.java
@@ -7,8 +7,8 @@ import com.mojang.brigadier.exceptions.SimpleCommandExceptionType;
 import com.mojang.brigadier.suggestion.SuggestionsBuilder;
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.Tag;
-import net.minecraft.client.lang.text.ChainText;
-import net.minecraft.client.lang.text.Text;
+import net.minecraft.core.lang.text.ChainText;
+import net.minecraft.core.lang.text.Text;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityDispatcher;
 import net.minecraft.core.entity.EntityItem;
diff --git a/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBoat.java b/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBoat.java
index 7ca1d23a1..a26eb2cab 100644
--- a/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBoat.java
+++ b/src/main/java/net/minecraft/core/net/entity/entries/NetEntryBoat.java
@@ -1,7 +1,7 @@
 package net.minecraft.core.net.entity.entries;
 
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.vehicle.BoatEntity;
+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.AddEntityPacket;
@@ -10,10 +10,10 @@ import net.minecraft.server.entity.EntityTracker;
 import net.minecraft.server.entity.EntityTrackerEntry;
 import org.jetbrains.annotations.NotNull;
 
-public class NetEntryBoat implements IVehicleEntry<BoatEntity>, ITrackedEntry<BoatEntity> {
+public class NetEntryBoat implements IVehicleEntry<EntityBoat>, ITrackedEntry<EntityBoat> {
     @Override
-    public @NotNull Class<BoatEntity> getAppliedClass() {
-        return BoatEntity.class;
+    public @NotNull Class<EntityBoat> getAppliedClass() {
+        return EntityBoat.class;
     }
 
     @Override
@@ -32,17 +32,17 @@ public class NetEntryBoat implements IVehicleEntry<BoatEntity>, ITrackedEntry<Bo
     }
 
     @Override
-    public void onEntityTracked(EntityTracker tracker, EntityTrackerEntry trackerEntry, BoatEntity trackedObject) {
+    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 BoatEntity(world, x, y, z);
+        return new EntityBoat(world, x, y, z);
     }
 
     @Override
-    public AddEntityPacket getSpawnPacket(EntityTrackerEntry tracker, BoatEntity trackedObject) {
+    public AddEntityPacket getSpawnPacket(EntityTrackerEntry tracker, EntityBoat trackedObject) {
         return new AddEntityPacket(trackedObject);
     }
 }
diff --git a/src/main/java/net/minecraft/core/net/packet/PingHandshakePacket.java b/src/main/java/net/minecraft/core/net/packet/PingHandshakePacket.java
index 08c7ac107..cbe51ed24 100644
--- a/src/main/java/net/minecraft/core/net/packet/PingHandshakePacket.java
+++ b/src/main/java/net/minecraft/core/net/packet/PingHandshakePacket.java
@@ -1,6 +1,5 @@
 package net.minecraft.core.net.packet;
 
-import net.minecraft.client.net.handler.PingPacketHandler;
 import net.minecraft.core.net.handler.PacketHandler;
 
 import java.io.DataInputStream;
@@ -10,6 +9,8 @@ import java.nio.charset.StandardCharsets;
 
 public class PingHandshakePacket
     extends Packet {
+    public static long startTime = 0;
+
     public int payload;
     public int identifier;
     public String pingHostString;
@@ -49,7 +50,7 @@ public class PingHandshakePacket
         dos.writeByte(protocolVersion);
         writeUTF16BEString(hostname, dos);
         dos.writeInt(port);
-        PingPacketHandler.startTime = System.currentTimeMillis();
+        startTime = System.currentTimeMillis();
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/util/debug/Debug.java b/src/main/java/net/minecraft/core/util/debug/Debug.java
similarity index 84%
rename from src/main/java/net/minecraft/client/util/debug/Debug.java
rename to src/main/java/net/minecraft/core/util/debug/Debug.java
index 7afeeaf8f..eccfb43ec 100644
--- a/src/main/java/net/minecraft/client/util/debug/Debug.java
+++ b/src/main/java/net/minecraft/core/util/debug/Debug.java
@@ -1,4 +1,4 @@
-package net.minecraft.client.util.debug;
+package net.minecraft.core.util.debug;
 
 import com.mojang.logging.LogUtils;
 import org.slf4j.Logger;
@@ -12,8 +12,8 @@ public class Debug {
 	private static final Logger LOGGER = LogUtils.getLogger();
 	public static boolean enable = true;
 	
-	static final Profiler baseProfiler = new Profiler("base", null);
-	static Profiler currentProfiler = baseProfiler;
+	public static final Profiler baseProfiler = new Profiler("base", null);
+	public static Profiler currentProfiler = baseProfiler;
 	
 	private static int fpsCount = 0;
 	private static long lastSec = -1;
@@ -86,14 +86,14 @@ public class Debug {
 		return System.nanoTime();
 	}
 	
-	static class Profiler {
+	public static class Profiler {
 		
-		protected final String name;
-		protected Profiler parent;
-		protected Map<String, Profiler> profilers = new HashMap<>();
-		protected List<Profiler> allProfilers = new ArrayList<>();
-		protected long startTime = -1;
-		protected long time = 0;
+		public final String name;
+		public Profiler parent;
+		public Map<String, Profiler> profilers = new HashMap<>();
+		public List<Profiler> allProfilers = new ArrayList<>();
+		public long startTime = -1;
+		public long time = 0;
 		
 		public Profiler(String name, Profiler parent) {
 			this.name = name;
diff --git a/src/main/java/net/minecraft/core/world/BlocksContainer.java b/src/main/java/net/minecraft/core/world/BlocksContainer.java
index 1ac98faea..397297255 100644
--- a/src/main/java/net/minecraft/core/world/BlocksContainer.java
+++ b/src/main/java/net/minecraft/core/world/BlocksContainer.java
@@ -79,6 +79,11 @@ public class BlocksContainer implements WorldSource {
         return world.getLightmapCoord(x, y, z, blockLightValue);
     }
 
+    @Override
+    public int getLightmapCoord(int skylight, int blocklight) {
+        return world.getLightmapCoord(skylight, blocklight);
+    }
+
     @Override
     public float getLightBrightness(int x, int y, int z) {
         return world.getLightBrightness(x, y, z);
diff --git a/src/main/java/net/minecraft/core/world/LevelListener.java b/src/main/java/net/minecraft/core/world/LevelListener.java
index 4ce7f728a..768a152ef 100644
--- a/src/main/java/net/minecraft/core/world/LevelListener.java
+++ b/src/main/java/net/minecraft/core/world/LevelListener.java
@@ -3,7 +3,6 @@ package net.minecraft.core.world;
 // Referenced classes of package net.minecraft.src:
 //            Entity, TileEntity, Player
 
-import net.minecraft.client.render.RenderGlobal;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.Player;
@@ -60,7 +59,7 @@ public interface LevelListener
 
 	/**
 	 * Redraw blocks in singleplayer. <br>
-	 * Implemented in {@link RenderGlobal}
+	 * Implemented in {@link net.minecraft.client.render.RenderGlobal}
 	 */
     void setBlocksDirty(int x0, int y0, int z0, int x1, int y1, int z1);
 
diff --git a/src/main/java/net/minecraft/core/world/World.java b/src/main/java/net/minecraft/core/world/World.java
index 663922eb5..87461f1dd 100644
--- a/src/main/java/net/minecraft/core/world/World.java
+++ b/src/main/java/net/minecraft/core/world/World.java
@@ -19,11 +19,7 @@ import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.entity.EntityItem;
 import net.minecraft.core.entity.animal.MobFireflyCluster;
 import net.minecraft.core.enums.Difficulty;
-import net.minecraft.client.render.LightmapHelper;
-import net.minecraft.client.render.camera.ICamera;
-import net.minecraft.client.render.colorizer.Colorizers;
-import net.minecraft.client.util.debug.Debug;
-import net.minecraft.client.world.chunk.provider.ChunkProviderViewer;
+import net.minecraft.core.util.debug.Debug;
 import net.minecraft.core.Global;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.player.Player;
@@ -66,9 +62,7 @@ import net.minecraft.core.world.save.LevelStorage;
 import net.minecraft.core.world.saveddata.SavedData;
 import net.minecraft.core.world.saveddata.SavedDataStorage;
 import net.minecraft.core.world.season.SeasonManager;
-import net.minecraft.core.world.season.Seasons;
 import net.minecraft.core.world.type.WorldType;
-import net.minecraft.core.world.type.WorldTypes;
 import net.minecraft.core.world.weather.Weather;
 import net.minecraft.core.world.weather.WeatherManager;
 import net.minecraft.core.world.weather.Weathers;
@@ -106,7 +100,6 @@ public class World implements WorldSource {
     private final Set<NextTickListEntry> immediatelyUpdatedPositions = new HashSet<>();
     
     public boolean scheduledUpdatesAreImmediate = false;
-    private final int dimensionColor = 0xffffff;
     public int skyDarken = 0;
     protected int updateLCG = new Random().nextInt();
     public int lightningFlicker = 0;
@@ -118,10 +111,10 @@ public class World implements WorldSource {
     //protected int autosavePeriod = 40;
     public Random rand = new Random();
     public boolean isNewWorld = false;
-    public final Dimension dimension;
-    public final WorldType worldType;
+    public Dimension dimension;
+    public WorldType worldType;
     protected IChunkProvider chunkProvider;
-    public final LevelStorage saveHandler;
+    public LevelStorage saveHandler;
     protected LevelData levelData;
     public DimensionData dimensionData;
     public boolean findingSpawnPoint;
@@ -136,13 +129,13 @@ public class World implements WorldSource {
     private long runtime = 0;
     public int dayCountLastTick;
     
-    private final BiomeProvider biomeProvider;
+    public BiomeProvider biomeProvider;
 
     public AuroraProvider auroraProvider;
 
-    public final SeasonManager seasonManager;
+    public SeasonManager seasonManager;
 
-    public final WeatherManager weatherManager;
+    public WeatherManager weatherManager;
 
     private CommandManager commandManager;
 
@@ -303,22 +296,7 @@ public class World implements WorldSource {
         this.commandManager.init();
     }
 
-    // Used for the model viewer
-    public World(){
-        this.dimension = Dimension.OVERWORLD;
-        this.saveHandler = null;
-        levelData = new LevelData(0, "modelviewer");
-        this.worldType = WorldTypes.DEBUG;
-        chunkProvider = new ChunkProviderViewer(this);
-        seasonManager = SeasonManager.fromConfig(this, this.worldType.getSeasonConfig());
-        updateSkyBrightness();
-
-        this.weatherManager = new WeatherManager(this);
-
-        auroraProvider = new AuroraProvider(this, 0);
-
-        biomeProvider = this.worldType.createBiomeProvider(this);
-    }
+    public World(){}
 
     public <T> T getGameRuleValue(GameRule<T> gameRule)
     {
@@ -1122,26 +1100,31 @@ public class World implements WorldSource {
     
     @Override
     public int getLightmapCoord(int x, int y, int z, int blockLightValue) {
-		int skyLight = getSavedLightValue(LightLayer.Sky, x, y, z);
-		int blockLight = Math.max(getSavedLightValue(LightLayer.Block, x, y, z), blockLightValue);
-		
-		if(getBlockLitInteriorSurface(x, y, z)) {
-			skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x, y + 1, z));
-			skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x, y - 1, z));
-			skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x + 1, y, z));
-			skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x - 1, y, z));
-			skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x, y, z + 1));
-			skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x, y, z - 1));
-			
-			blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x, y + 1, z));
-			blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x, y - 1, z));
-			blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x + 1, y, z));
-			blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x - 1, y, z));
-			blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x, y, z + 1));
-			blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x, y, z - 1));
-		}
-		
-		return LightmapHelper.getLightmapCoord(skyLight, blockLight);
+        int skyLight = getSavedLightValue(LightLayer.Sky, x, y, z);
+        int blockLight = Math.max(getSavedLightValue(LightLayer.Block, x, y, z), blockLightValue);
+
+        if(getBlockLitInteriorSurface(x, y, z)) {
+            skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x, y + 1, z));
+            skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x, y - 1, z));
+            skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x + 1, y, z));
+            skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x - 1, y, z));
+            skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x, y, z + 1));
+            skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x, y, z - 1));
+
+            blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x, y + 1, z));
+            blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x, y - 1, z));
+            blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x + 1, y, z));
+            blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x - 1, y, z));
+            blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x, y, z + 1));
+            blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x, y, z - 1));
+        }
+
+        return getLightmapCoord(skyLight, blockLight);
+    }
+
+    @Override
+    public int getLightmapCoord(int skylight, int blocklight) {
+        return 0; // TODO figure out if/how we would get this working in core
     }
 
     @Override
@@ -1615,63 +1598,6 @@ public class World implements WorldSource {
 		return bright * 0.8f + 0.2f;
 	}
 
-    public Vec3 getSkyColor(ICamera camera, float partialTick)
-    {
-        float f1 = getCelestialAngle(partialTick);
-        float f2 = MathHelper.cos(f1 * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
-        if(f2 < 0.0F)
-        {
-            f2 = 0.0F;
-        }
-        if(f2 > 1.0F)
-        {
-            f2 = 1.0F;
-        }
-        int x = MathHelper.floor(camera.getX(partialTick));
-        int y = MathHelper.floor(camera.getY(partialTick));
-        int z = MathHelper.floor(camera.getZ(partialTick));
-        float blockTemperature = (float) getBlockTemperature(x, z);
-
-        if (seasonManager.getCurrentSeason() != null && (seasonManager.getCurrentSeason() == Seasons.OVERWORLD_WINTER || seasonManager.getCurrentSeason() == Seasons.OVERWORLD_FALL))
-        {
-            blockTemperature = blockTemperature - (1.25f);
-        }
-        int skyColor;
-        if(Colorizers.sky.isEnabled()) {
-        	skyColor = Colorizers.sky.getColor(this, x, y, z);
-        }else {
-        	skyColor = getBiomeProvider().getBiome(x, y, z).getSkyColor(blockTemperature);	
-        }
-        float r = (float)(skyColor >> 16 & 0xff) / 255F;
-        float g = (float)(skyColor >> 8 & 0xff) / 255F;
-        float b = (float)(skyColor & 0xff) / 255F;
-        r *= f2;
-        g *= f2;
-        b *= f2;
-        float f7 = getCurrentWeather() != null && getCurrentWeather().isPrecipitation ? weatherManager.getWeatherIntensity() * weatherManager.getWeatherPower() : 0.0f;
-        if(f7 > 0.0F)
-        {
-            float f8 = (r * 0.3F + g * 0.59F + b * 0.11F) * 0.6F;
-            float f10 = 1.0F - f7 * 0.75F;
-            r = r * f10 + f8 * (1.0F - f10);
-            g = g * f10 + f8 * (1.0F - f10);
-            b = b * f10 + f8 * (1.0F - f10);
-        }
-        if(lightningFlicker > 0)
-        {
-            float f12 = (float)lightningFlicker - partialTick;
-            if(f12 > 1.0F)
-            {
-                f12 = 1.0F;
-            }
-            f12 *= 0.45F;
-            r = r * (1.0F - f12) + 0.8F * f12;
-            g = g * (1.0F - f12) + 0.8F * f12;
-            b = b * (1.0F - f12) + f12;
-        }
-        return Vec3.getTempVec3(r, g, b);
-    }
-
     public float getCelestialAngle(float partialTick)
     {
     	if(!getGameRuleValue(GameRules.DO_DAY_CYCLE)) {
@@ -1680,45 +1606,6 @@ public class World implements WorldSource {
         return worldType.getCelestialAngle(this, levelData.getWorldTime(), partialTick);
     }
 
-    public Vec3 getDimensionColor(ICamera camera, float partialTick)
-    {
-        float f1 = getCelestialAngle(partialTick);
-        float f2 = MathHelper.cos(f1 * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
-        if(f2 < 0.0F)
-        {
-            f2 = 0.0F;
-        }
-        if(f2 > 1.0F)
-        {
-            f2 = 1.0F;
-        }
-        int color = dimensionColor;
-        float r = (float)(color >> 16 & 255) / 255F;
-        float g = (float)(color >> 8 & 255) / 255F;
-        float b = (float)(color & 255) / 255F;
-        float f6 = getCurrentWeather() != null && getCurrentWeather().isPrecipitation ? weatherManager.getWeatherIntensity() * weatherManager.getWeatherPower() : 0.0f;
-        if(f6 > 0.0F)
-        {
-            float f7 = (r * 0.3F + g * 0.59F + b * 0.11F) * 0.6F;
-            float f9 = 1.0F - f6 * 0.95F;
-            r = r * f9 + f7 * (1.0F - f9);
-            g = g * f9 + f7 * (1.0F - f9);
-            b = b * f9 + f7 * (1.0F - f9);
-        }
-        r *= f2 * 0.9F + 0.1F;
-        g *= f2 * 0.9F + 0.1F;
-        b *= f2 * 0.85F + 0.15F;
-        return Vec3.getTempVec3(r, g, b);
-    }
-
-    public Vec3 getFogColor(ICamera camera, float partialTick)
-    {
-    	double x = camera.getX(partialTick);
-    	double y = camera.getY(partialTick);
-    	double z = camera.getZ(partialTick);
-        float celestialAngle = getCelestialAngle(partialTick);
-        return worldType.getFogColor(this, x, y, z, celestialAngle, partialTick);
-    }
 
     public int findTopSolidBlock(int x, int z)
     {
diff --git a/src/main/java/net/minecraft/core/world/WorldSource.java b/src/main/java/net/minecraft/core/world/WorldSource.java
index 533c45d99..7f5d4a380 100644
--- a/src/main/java/net/minecraft/core/world/WorldSource.java
+++ b/src/main/java/net/minecraft/core/world/WorldSource.java
@@ -20,6 +20,8 @@ public interface WorldSource
     
     int getLightmapCoord(int x, int y, int z, int blockLightValue);
 
+    int getLightmapCoord(int skylight, int blocklight);
+
     float getLightBrightness(int x, int y, int z);
 
     int getBlockMetadata(int x, int y, int z);
diff --git a/src/main/java/net/minecraft/core/world/chunk/ChunkCache.java b/src/main/java/net/minecraft/core/world/chunk/ChunkCache.java
index 49a1ea7b2..0b1da4705 100644
--- a/src/main/java/net/minecraft/core/world/chunk/ChunkCache.java
+++ b/src/main/java/net/minecraft/core/world/chunk/ChunkCache.java
@@ -1,16 +1,10 @@
 package net.minecraft.core.world.chunk;
 
-import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.world.World;
-
-// Referenced classes of package net.minecraft.src:
-//            IBlockAccess, World, Chunk, WorldProvider, 
-//            Block, Material, TileEntity, WorldChunkManager
-
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.biome.Biome;
 import net.minecraft.core.world.season.SeasonManager;
@@ -131,9 +125,14 @@ public class ChunkCache
 			blockLight = Math.max(blockLight, worldObj.getSavedLightValue(LightLayer.Block, x, y, z - 1));
 		}
 		
-		return LightmapHelper.getLightmapCoord(skyLight, blockLight);
+		return getLightmapCoord(skyLight, blockLight);
 	}
 
+    @Override
+    public int getLightmapCoord(int skylight, int blocklight) {
+        return worldObj.getLightmapCoord(skylight, blocklight);
+    }
+
     @Override
 	public float getLightBrightness(int x, int y, int z)
     {
diff --git a/src/main/java/net/minecraft/core/world/save/SaveFormatBase.java b/src/main/java/net/minecraft/core/world/save/SaveFormatBase.java
index b5039285a..c4d85e1b8 100644
--- a/src/main/java/net/minecraft/core/world/save/SaveFormatBase.java
+++ b/src/main/java/net/minecraft/core/world/save/SaveFormatBase.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.world.save;
 
 import com.mojang.logging.LogUtils;
+import net.minecraft.client.world.save.SaveHandlerClientSP;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.util.helper.MathHelper;
 import com.mojang.nbt.CompoundTag;
@@ -217,7 +218,7 @@ public abstract class SaveFormatBase
     @Override
     public LevelStorage getSaveHandler(String worldDirName, boolean isMultiplayer)
     {
-        return new SaveHandlerClientSP(this, savesDir, worldDirName, isMultiplayer);
+        return new SaveHandlerCore(this, savesDir, worldDirName, isMultiplayer);
     }
 
     protected static void deleteFilesRecursively(File[] dirFiles)
diff --git a/src/main/java/net/minecraft/core/world/save/SaveHandlerBase.java b/src/main/java/net/minecraft/core/world/save/SaveHandlerBase.java
index 3f8b1fb82..f9686ecb6 100644
--- a/src/main/java/net/minecraft/core/world/save/SaveHandlerBase.java
+++ b/src/main/java/net/minecraft/core/world/save/SaveHandlerBase.java
@@ -20,12 +20,12 @@ import java.util.List;
 public abstract class SaveHandlerBase implements LevelStorage
 {
 	private static final Logger LOGGER = LogUtils.getLogger();
-	final String worldDirName;
-	final File saveDirectory;
-	final File playersDirectory;
-	final File dataDirectory;
-	final long now = System.currentTimeMillis();
-	final ISaveFormat saveFormat;
+	protected final String worldDirName;
+	protected final File saveDirectory;
+	protected final File playersDirectory;
+	protected final File dataDirectory;
+	protected final long now = System.currentTimeMillis();
+	protected final ISaveFormat saveFormat;
 
 	public SaveHandlerBase(ISaveFormat saveFormat, File savesDir, String worldDirName, boolean isMultiplayer)
 	{
diff --git a/src/main/java/net/minecraft/core/world/save/SaveHandlerCore.java b/src/main/java/net/minecraft/core/world/save/SaveHandlerCore.java
new file mode 100644
index 000000000..6e3300bd7
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/save/SaveHandlerCore.java
@@ -0,0 +1,35 @@
+package net.minecraft.core.world.save;
+
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.world.Dimension;
+import net.minecraft.core.world.chunk.ChunkLoaderRegionAsync;
+import net.minecraft.core.world.chunk.IChunkLoader;
+
+import java.io.File;
+import java.util.List;
+
+public class SaveHandlerCore
+        extends SaveHandlerBase
+{
+
+    public SaveHandlerCore(ISaveFormat saveFormat, File savesDir, String worldDirName, boolean isMultiplayer)
+    {
+        super(saveFormat, savesDir, worldDirName, isMultiplayer);
+    }
+    
+    @Override
+    public IChunkLoader getChunkLoader(Dimension dimension)
+    {
+        File dimDir = saveFormat.getDimensionRootDir(worldDirName, dimension);
+        dimDir.mkdirs();
+
+        return new ChunkLoaderRegionAsync(dimDir);
+    }
+
+    @Override
+    public void saveLevelDataAndPlayerData(LevelData levelData, List<Player> playerList)
+    {
+        levelData.setSaveVersion(saveFormat.getSaveVersion());
+        super.saveLevelDataAndPlayerData(levelData, playerList);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/type/WorldType.java b/src/main/java/net/minecraft/core/world/type/WorldType.java
index 332206fdb..34013e664 100644
--- a/src/main/java/net/minecraft/core/world/type/WorldType.java
+++ b/src/main/java/net/minecraft/core/world/type/WorldType.java
@@ -2,7 +2,6 @@ package net.minecraft.core.world.type;
 
 import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.provider.BiomeProvider;
 import net.minecraft.core.world.config.season.SeasonConfig;
@@ -21,8 +20,6 @@ public abstract class WorldType {
     private final boolean hasCeiling;
     private final float[] brightnessRamp;
     private final SeasonConfig seasonConfig;
-    private final boolean hasClouds;
-    private final boolean hasSky;
     private final int minY;
     private final int minPortalY;
     private final int maxY;
@@ -32,9 +29,6 @@ public abstract class WorldType {
     private final int fillerBlockId;
     private final int dayNightCycleTicks;
     private final boolean mayRespawn;
-    private final float cloudHeight;
-    private final boolean hasGround;
-    private final boolean hasAurora;
 
     public WorldType(Properties properties) {
         this.languageKey = properties.languageKey;
@@ -43,8 +37,6 @@ public abstract class WorldType {
         this.hasCeiling = properties.hasCeiling;
         this.brightnessRamp = properties.brightnessRamp;
         this.seasonConfig = properties.seasonConfig == null ? SeasonConfig.builder().withSingleSeason(Seasons.NULL).build() : properties.seasonConfig;
-        this.hasClouds = properties.hasClouds;
-        this.hasSky = properties.hasSky;
         this.minY = properties.minY;
         if (properties.minPortalY != null) {
             this.minPortalY = properties.minPortalY;
@@ -62,9 +54,6 @@ public abstract class WorldType {
         this.fillerBlockId = properties.fillerBlock == null ? 0 : properties.fillerBlock.id;
         this.dayNightCycleTicks = properties.dayNightCycleTicks;
         this.mayRespawn = properties.mayRespawn;
-        this.cloudHeight = properties.cloudHeight == null ? (properties.maxY + 1) - 20 : properties.cloudHeight;
-        this.hasGround = properties.hasGround;
-        this.hasAurora = properties.hasAurora;
     }
 
     public String getLanguageKey() {
@@ -91,14 +80,6 @@ public abstract class WorldType {
         return seasonConfig;
     }
 
-    public boolean hasClouds() {
-        return hasClouds;
-    }
-
-    public boolean hasSky() {
-        return hasSky;
-    }
-
     public int getMinY() {
         return minY;
     }
@@ -135,18 +116,6 @@ public abstract class WorldType {
         return mayRespawn;
     }
 
-    public float getCloudHeight() {
-        return cloudHeight;
-    }
-
-    public boolean hasGround() {
-        return hasGround;
-    }
-
-    public boolean hasAurora() {
-        return hasAurora;
-    }
-
     public void onWorldCreation(World world) { }
 
     public final int getYRange() {
@@ -258,12 +227,8 @@ public abstract class WorldType {
 
     public abstract float getCelestialAngle(World world, long tick, float partialTick);
 
-    public abstract float[] getSunriseColor(float timeOfDay, float partialTick);
-
     public abstract int getSkyDarken(World world, long tick, float partialTick);
 
-    public abstract Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick);
-
     public static class Properties {
         private final String languageKey;
         private Weather defaultWeather = null;
@@ -271,8 +236,6 @@ public abstract class WorldType {
         private boolean hasCeiling = false;
         private float[] brightnessRamp = null;
         private SeasonConfig seasonConfig = null;
-        private boolean hasClouds = true;
-        private boolean hasSky = true;
         private int minY = 0;
         private Integer minPortalY = null;
         private int maxY = 255;
@@ -282,9 +245,6 @@ public abstract class WorldType {
         private Block fillerBlock = null;
         private int dayNightCycleTicks = Global.DAY_LENGTH_TICKS;
         private boolean mayRespawn = false;
-        private Float cloudHeight = null;
-        private boolean hasGround = true;
-        private boolean hasAurora = false;
 
         private Properties(String languageKey) {
             this.languageKey = languageKey;
@@ -319,16 +279,6 @@ public abstract class WorldType {
             return this;
         }
 
-        public Properties noClouds() {
-            this.hasClouds = false;
-            return this;
-        }
-
-        public Properties noSky() {
-            this.hasSky = false;
-            return this;
-        }
-
         public Properties bounds(int minY, int maxY, int oceanY) {
             if (minY < 0) {
                 throw new IllegalArgumentException("minY cannot be negative");
@@ -384,20 +334,5 @@ public abstract class WorldType {
             this.mayRespawn = true;
             return this;
         }
-
-        public Properties cloudHeight(float cloudHeight) {
-            this.cloudHeight = cloudHeight;
-            return this;
-        }
-
-        public Properties noGround() {
-            this.hasGround = false;
-            return this;
-        }
-
-        public Properties withAurora() {
-            this.hasAurora = true;
-            return this;
-        }
     }
 }
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeDebug.java b/src/main/java/net/minecraft/core/world/type/WorldTypeDebug.java
index 8fd2f3edb..5d4ba3099 100644
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeDebug.java
+++ b/src/main/java/net/minecraft/core/world/type/WorldTypeDebug.java
@@ -51,18 +51,8 @@ public class WorldTypeDebug
         return 0;
     }
 
-    @Override
-    public float[] getSunriseColor(float timeOfDay, float partialTick) {
-        return new float[4];
-    }
-
     @Override
     public int getSkyDarken(World world, long tick, float partialTick) {
         return 0;
     }
-
-    @Override
-    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
-        return Vec3.getTempVec3(1.0, 1.0, 1.0);
-    }
 }
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypeEmpty.java b/src/main/java/net/minecraft/core/world/type/WorldTypeEmpty.java
index b18d77fc4..1506c5a9b 100644
--- a/src/main/java/net/minecraft/core/world/type/WorldTypeEmpty.java
+++ b/src/main/java/net/minecraft/core/world/type/WorldTypeEmpty.java
@@ -56,26 +56,6 @@ public class WorldTypeEmpty
         return getTimeOfDay(world, tick, partialTick);
     }
 
-    @Override
-    public float[] getSunriseColor(float timeOfDay, float partialTick) {
-        float[] sunriseCol = new float[4];
-        float f2 = 0.4F;
-        float f3 = MathHelper.cos(timeOfDay * MathHelper.PI * 2.0F) - 0.0F;
-        float f4 = -0F;
-        if (f3 >= f4 - f2 && f3 <= f4 + f2) {
-            float c = ((f3 - f4) / f2) * 0.5F + 0.5F;
-            float a = 1.0F - (1.0F - MathHelper.sin(c * MathHelper.PI)) * 0.99F;
-            a *= a;
-            sunriseCol[0] = c * 0.3F + 0.7F;
-            sunriseCol[1] = c * c * 0.7F + 0.2F;
-            sunriseCol[2] = c * c * 0.0F + 0.2F;
-            sunriseCol[3] = a;
-            return sunriseCol;
-        } else {
-            return null;
-        }
-    }
-
     @Override
     public int getSkyDarken(World world, long tick, float partialTick) {
         float f1 = getCelestialAngle(world, tick, partialTick);
@@ -92,22 +72,4 @@ public class WorldTypeEmpty
             weatherOffset = currentWeather.subtractLightLevel * world.weatherManager.getWeatherIntensity() * world.weatherManager.getWeatherPower();
         return (int) (f2 * (11F - weatherOffset) + weatherOffset);
     }
-
-    @Override
-    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
-        float f2 = MathHelper.cos(celestialAngle * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
-        if (f2 < 0.0F) {
-            f2 = 0.0F;
-        }
-        if (f2 > 1.0F) {
-            f2 = 1.0F;
-        }
-        float r = 0.7529412F;
-        float g = 0.8470588F;
-        float b = 1.0F;
-        r *= f2 * 0.94F + 0.06F;
-        g *= f2 * 0.94F + 0.06F;
-        b *= f2 * 0.91F + 0.09F;
-        return Vec3.getTempVec3(r, g, b);
-    }
 }
diff --git a/src/main/java/net/minecraft/core/world/type/WorldTypes.java b/src/main/java/net/minecraft/core/world/type/WorldTypes.java
index 9e70a39a6..1dadb8f1b 100644
--- a/src/main/java/net/minecraft/core/world/type/WorldTypes.java
+++ b/src/main/java/net/minecraft/core/world/type/WorldTypes.java
@@ -52,7 +52,6 @@ public abstract class WorldTypes {
                             .fillerBlock(Blocks.STONE)
                             .allowRespawn()
                             .bounds(0, 31, 0)
-                            .cloudHeight(256f - 20f)
                             .seasonConfig(SeasonConfig.builder()
                                     .withSingleSeason(Seasons.OVERWORLD_SUMMER)
                                     .build()
@@ -65,7 +64,6 @@ public abstract class WorldTypes {
                     WorldTypeOverworld.defaultProperties("worldType.overworld.floating")
                             .bounds(0, 255, 0)
                             .oceanBlock(null)
-                            .cloudHeight(32f)
             )
     );
     public static final WorldType OVERWORLD_AMPLIFIED = register(
@@ -73,7 +71,6 @@ public abstract class WorldTypes {
             new WorldTypeOverworld(
                     WorldTypeOverworld.defaultProperties("worldType.overworld.amplified")
                             .bounds(0, 255, 64)
-                            .cloudHeight(128f - 20f)
             )
     );
     public static final WorldType OVERWORLD_RETRO = register(
@@ -174,8 +171,6 @@ public abstract class WorldTypes {
                             .brightnessRamp(WorldTypeEmpty.createLightRamp())
                             .bounds(0, 255, 0)
                             .allowRespawn()
-                            .cloudHeight(128f - 20f)
-                            .noGround()
             )
     );
     public static final WorldType DEBUG = register(
@@ -185,8 +180,6 @@ public abstract class WorldTypes {
                             .brightnessRamp(WorldTypeDebug.createLightRamp())
                             .bounds(0, 255, 0)
                             .allowRespawn()
-                            .cloudHeight(128f - 20f)
-                            .noGround()
             )
     );
 
diff --git a/src/main/java/net/minecraft/core/world/type/nether/WorldTypeNether.java b/src/main/java/net/minecraft/core/world/type/nether/WorldTypeNether.java
index bd3849c11..3d9c5dec3 100644
--- a/src/main/java/net/minecraft/core/world/type/nether/WorldTypeNether.java
+++ b/src/main/java/net/minecraft/core/world/type/nether/WorldTypeNether.java
@@ -1,9 +1,6 @@
 package net.minecraft.core.world.type.nether;
 
-import net.minecraft.client.render.colorizer.Colorizers;
 import net.minecraft.core.block.Blocks;
-import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.biome.provider.BiomeProvider;
@@ -23,8 +20,6 @@ public class WorldTypeNether
                 .brightnessRamp(getLightRamp())
                 .oceanBlock(Blocks.FLUID_LAVA_STILL)
                 .fillerBlock(Blocks.COBBLE_NETHERRACK)
-                .noClouds()
-                .noSky()
                 .withCeiling()
                 .bounds(0, 255, 128 + 32);
     }
@@ -66,30 +61,8 @@ public class WorldTypeNether
         return 0.5f;
     }
 
-    @Override
-    public float[] getSunriseColor(float timeOfDay, float partialTick) {
-        return new float[4];
-    }
-
     @Override
     public int getSkyDarken(World world, long tick, float partialTick) {
         return 0;
     }
-
-    @Override
-    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
-        if (Colorizers.fog.isEnabled()) {
-            int x1 = MathHelper.floor(x);
-            int y1 = MathHelper.floor(y);
-            int z1 = MathHelper.floor(z);
-
-            int color = Colorizers.fog.getColor(world, x1, y1, z1);
-
-            float r = ((color >> 16) & 0xFF) / 255.0f;
-            float g = ((color >> 8) & 0xFF) / 255.0f;
-            float b = (color & 0xFF) / 255.0f;
-            return Vec3.getTempVec3(r, g, b);
-        }
-        return Vec3.getTempVec3(0.0, 0.0, 0.0);
-    }
 }
diff --git a/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworld.java b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworld.java
index a252deae4..97e93d52a 100644
--- a/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworld.java
+++ b/src/main/java/net/minecraft/core/world/type/overworld/WorldTypeOverworld.java
@@ -1,9 +1,7 @@
 package net.minecraft.core.world.type.overworld;
 
-import net.minecraft.client.render.colorizer.Colorizers;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.provider.BiomeProvider;
 import net.minecraft.core.world.biome.provider.BiomeProviderOverworld;
@@ -39,8 +37,7 @@ public class WorldTypeOverworld
                 )
                 .oceanBlock(Blocks.FLUID_WATER_STILL)
                 .fillerBlock(Blocks.STONE)
-                .allowRespawn()
-                .withAurora();
+                .allowRespawn();
     }
 
     public static float[] createLightRamp() {
@@ -74,28 +71,6 @@ public class WorldTypeOverworld
         return getTimeOfDay(world, tick, partialTick);
     }
 
-    @Override
-    public float[] getSunriseColor(float timeOfDay, float partialTick) {
-        float[] sunriseCol = new float[4];
-        float sunriseMinimum = 0.4F;
-
-        // Gives a value that goes from 1 to -1 to 1 over the course of a day
-        float sunrisePresence = MathHelper.cos(timeOfDay * MathHelper.PI * 2.0F);
-        float middle = 0F;
-        if (sunrisePresence >= middle - sunriseMinimum && sunrisePresence <= middle + sunriseMinimum) {
-            float c = ((sunrisePresence - middle) / sunriseMinimum) * 0.5F + 0.5F;
-            float a = 1.0F - (1.0F - MathHelper.sin(c * MathHelper.PI)) * 0.99F;
-            a *= a;
-            sunriseCol[0] = c * 0.3F + 0.7F;
-            sunriseCol[1] = c * c * 0.7F + 0.2F;
-            sunriseCol[2] = c * c * 0.0F + 0.2F;
-            sunriseCol[3] = a;
-            return sunriseCol;
-        } else {
-            return null;
-        }
-    }
-
     @Override
     public int getSkyDarken(World world, long tick, float partialTick) {
         float f1 = getCelestialAngle(world, tick, partialTick);
@@ -112,31 +87,4 @@ public class WorldTypeOverworld
             weatherOffset = currentWeather.subtractLightLevel * world.weatherManager.getWeatherIntensity() * world.weatherManager.getWeatherPower();
         return (int) (f2 * (11F - weatherOffset) + weatherOffset);
     }
-
-    @Override
-    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
-        float dayProgress = MathHelper.cos(celestialAngle * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
-        dayProgress = MathHelper.clamp(dayProgress, 0.0f, 1.0f);
-        float r, g, b;
-
-        if (Colorizers.fog.isEnabled()) {
-            int x1 = MathHelper.floor(x);
-            int y1 = MathHelper.floor(y);
-            int z1 = MathHelper.floor(z);
-
-            int color = Colorizers.fog.getColor(world, x1, y1, z1);
-
-            r = ((color >> 16) & 0xFF) / 255.0f;
-            g = ((color >> 8) & 0xFF) / 255.0f;
-            b = (color & 0xFF) / 255.0f;
-        } else {
-            r = 0.7529412f;
-            g = 0.8470588f;
-            b = 1.0f;
-        }
-        r *= dayProgress * 0.94f + 0.06f;
-        g *= dayProgress * 0.94f + 0.06f;
-        b *= dayProgress * 0.91f + 0.09f;
-        return Vec3.getTempVec3(r, g, b);
-    }
 }
diff --git a/src/main/java/net/minecraft/core/world/type/paradise/WorldTypeParadise.java b/src/main/java/net/minecraft/core/world/type/paradise/WorldTypeParadise.java
index 1149d1c9d..d966edec0 100644
--- a/src/main/java/net/minecraft/core/world/type/paradise/WorldTypeParadise.java
+++ b/src/main/java/net/minecraft/core/world/type/paradise/WorldTypeParadise.java
@@ -1,10 +1,8 @@
 package net.minecraft.core.world.type.paradise;
 
-import net.minecraft.client.render.colorizer.Colorizers;
 import net.minecraft.core.Global;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.util.helper.MathHelper;
-import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.biome.provider.BiomeProvider;
@@ -31,8 +29,6 @@ public class WorldTypeParadise
                 )
                 .fillerBlock(Blocks.MARBLE)
                 .dayNightCycleTicks(Global.DAY_LENGTH_TICKS * 28 * 2)
-                .cloudHeight(8f)
-                .noGround()
                 .bounds(0, 255, 0);
     }
 
@@ -79,26 +75,6 @@ public class WorldTypeParadise
         return dayProgress;
     }
 
-    @Override
-    public float[] getSunriseColor(float timeOfDay, float partialTick) {
-        float[] sunriseCol = new float[4];
-        float f2 = 0.4F;
-        float f3 = MathHelper.cos(timeOfDay * MathHelper.PI * 2.0F) - 0.0F;
-        float f4 = -0F;
-        if (f3 >= f4 - f2 && f3 <= f4 + f2) {
-            float c = ((f3 - f4) / f2) * 0.5F + 0.5F;
-            float a = 1.0F - (1.0F - MathHelper.sin(c * MathHelper.PI)) * 0.99F;
-            a *= a;
-            sunriseCol[0] = c * 0.3F + 0.7F;
-            sunriseCol[1] = c * c * 0.7F + 0.2F;
-            sunriseCol[2] = c * c * 0.0F + 0.2F;
-            sunriseCol[3] = a;
-            return sunriseCol;
-        } else {
-            return null;
-        }
-    }
-
     @Override
     public int getSkyDarken(World world, long tick, float partialTick) {
         float f1 = getCelestialAngle(world, tick, partialTick);
@@ -116,32 +92,4 @@ public class WorldTypeParadise
         if (subtracted > 8) subtracted = 8;
         return subtracted;
     }
-
-    @Override
-    public Vec3 getFogColor(World world, double x, double y, double z, float celestialAngle, float partialTick) {
-        float f2 = MathHelper.cos(celestialAngle * MathHelper.PI * 2.0F) * 2.0F + 0.5F;
-        f2 = MathHelper.clamp(f2, 0.0f, 1.0f);
-        float r, g, b;
-
-        if (Colorizers.fog.isEnabled()) {
-            int x1 = MathHelper.floor(x);
-            int y1 = MathHelper.floor(y);
-            int z1 = MathHelper.floor(z);
-
-            int color = Colorizers.fog.getColor(world, x1, y1, z1);
-
-            r = ((color >> 16) & 0xFF) / 255.0f;
-            g = ((color >> 8) & 0xFF) / 255.0f;
-            b = (color & 0xFF) / 255.0f;
-        } else {
-            int i = 0x8080a0;
-            r = (float) (i >> 16 & 0xff) / 255.0f;
-            g = (float) (i >> 8 & 0xff) / 255.0f;
-            b = (float) (i & 0xff) / 255.0f;
-        }
-        r *= f2 * 0.94F + 0.06F;
-        g *= f2 * 0.94F + 0.06F;
-        b *= f2 * 0.91F + 0.09F;
-        return Vec3.getTempVec3(r, g, b);
-    }
 }
diff --git a/src/main/java/net/minecraft/server/net/handler/PacketHandlerServer.java b/src/main/java/net/minecraft/server/net/handler/PacketHandlerServer.java
index 22a799429..51f1dd569 100644
--- a/src/main/java/net/minecraft/server/net/handler/PacketHandlerServer.java
+++ b/src/main/java/net/minecraft/server/net/handler/PacketHandlerServer.java
@@ -7,7 +7,7 @@ import net.minecraft.core.block.entity.TileEntityFlag;
 import net.minecraft.core.block.entity.TileEntityMobSpawner;
 import net.minecraft.core.block.entity.TileEntitySign;
 import net.minecraft.core.entity.Entity;
-import net.minecraft.core.entity.vehicle.BoatEntity;
+import net.minecraft.core.entity.vehicle.EntityBoat;
 import net.minecraft.core.enums.ArtType;
 import net.minecraft.core.enums.EnumSignPicture;
 import net.minecraft.core.enums.PlacementMode;
@@ -549,8 +549,8 @@ public class PacketHandlerServer extends PacketHandler
     public void handleBoatControl(BoatControlPacket boatControlPacket)
     {
         if (!canInteract()) return;
-        if (playerEntity.vehicle != null && playerEntity.vehicle instanceof BoatEntity && !Double.isNaN(boatControlPacket.targetXD) && !Double.isNaN(boatControlPacket.targetZD)) {
-            BoatEntity boat = (BoatEntity) playerEntity.vehicle;
+        if (playerEntity.vehicle != null && playerEntity.vehicle instanceof EntityBoat && !Double.isNaN(boatControlPacket.targetXD) && !Double.isNaN(boatControlPacket.targetZD)) {
+            EntityBoat boat = (EntityBoat) playerEntity.vehicle;
             boat.handleControlDirect(boatControlPacket.targetXD, boatControlPacket.targetZD, boatControlPacket.targetYRot);
             boatControlPacket.entityId = boat.id;
             mcServer.playerList.sendPacketToOtherPlayersAroundPoint(playerEntity,boat.x, boat.y, boat.z, 128, boat.world.dimension.id, boatControlPacket);
diff --git a/src/main/resources/shaders/post.fsh b/src/main/resources/shaders/post.fsh
index ef41f4dda..30de78080 100644
--- a/src/main/resources/shaders/post.fsh
+++ b/src/main/resources/shaders/post.fsh
@@ -17,6 +17,7 @@ uniform float heatHaze;
 uniform int bloom;
 
 uniform int dimension;
+uniform int shaderEffect;
 
 uniform float width;
 uniform float height;
@@ -141,6 +142,15 @@ void HeatHaze(inout vec2 coord, float amount) {
 	coord += wave * strength * 0.0001f;
 }
 
+
+vec3 colorEffects(vec3 tex) {
+    if (shaderEffect == 1) {
+        return vec3(tex.r, 0, 0);
+    }
+    return tex;
+}
+
+
 void main() {
     vec3 color = vec3(0.0);
 	vec2 coord = texcoord;
@@ -165,6 +175,7 @@ void main() {
     color = adjustExposure(color, exposure);
     color = adjustSaturation(color, saturation);
     color = adjustColor(color, rMod, gMod, bMod);
+    color = colorEffects(color);
 	
     gl_FragColor = vec4(color, 1.0);
 }
\ No newline at end of file
