diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java b/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
index 21f188e8b..ca2d2fdf6 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
@@ -161,6 +161,7 @@ public abstract class OptionsPages {
                     .withComponent(new BooleanOptionComponent(GameSettings.BIOME_WATER))
                     .withComponent(new BooleanOptionComponent(GameSettings.CLOUDS))
                     .withComponent(new FloatOptionComponent(GameSettings.CLOUD_HEIGHT, -0.5f, 1f))
+                    .withComponent(new FloatOptionComponent(GameSettings.CLOUD_RENDER_DISTANCE, 0.25f, 3f))
                     .withComponent(new BooleanOptionComponent(GameSettings.TREE_SHADOWS))
                     .withComponent(new BooleanOptionComponent(GameSettings.VIGNETTE))
                     .withComponent(new BooleanOptionComponent(GameSettings.ITEMS_3D))
diff --git a/game/client/src/main/java/net/minecraft/client/option/GameSettings.java b/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
index f4e5af88c..5c89f61b9 100644
--- a/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
+++ b/game/client/src/main/java/net/minecraft/client/option/GameSettings.java
@@ -236,6 +236,15 @@ public final class GameSettings {
                 return percent + "%";
             }
         }));
+    public static final @NotNull OptionFloat CLOUD_RENDER_DISTANCE = register(new OptionFloat("cloudRenderDistance", 1f)
+        .withDisplayStringProvider((mc, i18n, option) -> {
+            int percent = MathHelper.round(option.value * 100.0f);
+            if (percent == 100) {
+                return i18n.translateKey("options.cloudRenderDistance.default");
+            } else {
+                return percent + "%";
+            }
+        }));
     public static final @NotNull OptionFloat ENTITY_RENDER_DISTANCE = register(new OptionFloat("entityRenderDistance", 1f)
         .withDisplayStringProvider((mc, i18n, option) -> {
             int percent = MathHelper.round(option.value * 100.0f);
diff --git a/game/client/src/main/java/net/minecraft/client/render/RenderGlobal.java b/game/client/src/main/java/net/minecraft/client/render/RenderGlobal.java
index 30cdf2415..b7562be1d 100644
--- a/game/client/src/main/java/net/minecraft/client/render/RenderGlobal.java
+++ b/game/client/src/main/java/net/minecraft/client/render/RenderGlobal.java
@@ -709,6 +709,7 @@ public class RenderGlobal
 
         GLRenderer.pushFrame();
         GLRenderer.getFogState().disable();
+        GLRenderer.setAlphaTest(0f);
         GLRenderer.enableState(State.BLEND);
         GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
         Lighting.disable();
@@ -896,7 +897,7 @@ public class RenderGlobal
         float f11 = (float) (posZ * (double) f6);
         tessellator.startDrawingQuads();
         tessellator.setColor4f(r, g, b, 0.8F);
-        int dist = (cloudRadius * i * 2);
+        int dist = (int) (cloudRadius * i * 2 * GameSettings.CLOUD_RENDER_DISTANCE.value);
         int cloudZ = -cloudRadius * i;
         int cloudX = -cloudRadius * i;
         tessellator.addVertexWithUV(
@@ -958,8 +959,8 @@ public class RenderGlobal
         float f11 = (float) MathHelper.floor(dz) * f13;
         float f14 = (float) (dx - (double) MathHelper.floor(dx));
         float f15 = (float) (dz - (double) MathHelper.floor(dz));
-        int cloudWidthScale = 8;
-        byte radius = 3;
+        final int cloudWidthScale = 8;
+        final byte radius = (byte) Math.max(1, 3 * GameSettings.CLOUD_RENDER_DISTANCE.value);
         float f16 = 1F / 1024F;
         GLRenderer.modelM4f().scale(cloudWidth, 1.0F, cloudWidth);
 
diff --git a/game/client/src/main/java/net/minecraft/client/render/WorldRenderer.java b/game/client/src/main/java/net/minecraft/client/render/WorldRenderer.java
index 61f3bbb40..76522382f 100644
--- a/game/client/src/main/java/net/minecraft/client/render/WorldRenderer.java
+++ b/game/client/src/main/java/net/minecraft/client/render/WorldRenderer.java
@@ -718,8 +718,15 @@ public class WorldRenderer {
         renderRainSnow(partialTicks);
         if (GameSettings.CLOUDS.value) {
             Debug.change("clouds");
-            this.fogManager.setupFog(FogManager.FOG_MODE_SKY, this.farPlaneDistance, partialTicks, GLRenderer.getFogState());
+            GLRenderer.pushFrame();
+            float fov = getFOVModifier(pt, true);
+            if (this.zooming) {
+                fov = getZoomedFOV(fov, pt);
+            }
+            GLRenderer.projectionM4f().identity().perspective(org.joml.Math.toRadians(fov), (float) this.mc.gameWindow.getWidthPixels() / (float) this.mc.gameWindow.getHeightPixels(), 0.05F, this.farPlaneDistance * 2.0F * GameSettings.CLOUD_RENDER_DISTANCE.value);
+            this.fogManager.setupFog(FogManager.FOG_MODE_SKY, this.farPlaneDistance * GameSettings.CLOUD_RENDER_DISTANCE.value, partialTicks, GLRenderer.getFogState());
             renderGlobal.renderClouds(partialTicks);
+            GLRenderer.popFrame();
         }
 
         Debug.change("misc");
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererPlayer.java b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererPlayer.java
index 8c931876f..8e781275c 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererPlayer.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererPlayer.java
@@ -299,7 +299,6 @@ public class MobRendererPlayer extends MobRendererBipedArmored<Player> {
 
     public enum Specials {
         SHIGN(UUID.fromString("49f6ea39-30b2-4441-b07c-7bfe0beeb61e"), "ShignBright", "main.shign", null),
-        COOKIE(UUID.fromString("2c3bfa2c-95b0-48a8-baa2-9f3802190d86"), "DaCookieCakes", "main.cookie", null),
         THA_BOAR(UUID.fromString("f73086f5-d583-408b-a65c-d2dbdd9afaae"), "thaboar", "main.boar", null),
         MELON(UUID.fromString("9af822f9-ed7c-4afc-be28-2bd5b8c40b50"), "MelonMojito", "main.melon", "arms.melon"),
         WATERMELON(UUID.fromString("f9b18145-2be6-4817-8afb-a36e91369d2a"), "WatermelonMojito", "main.melon", "arms.melon");
@@ -321,7 +320,6 @@ public class MobRendererPlayer extends MobRendererBipedArmored<Player> {
             if (!GameSettings.DEV_MODELS.value || !player.playerConfig.devModelEnabled())
                 return null;
             if (player.uuid.equals(SHIGN.uuid) || player.username.equals(SHIGN.username)) return SHIGN;
-            if (player.uuid.equals(COOKIE.uuid) || player.username.equals(COOKIE.username)) return COOKIE;
             if (player.uuid.equals(THA_BOAR.uuid) || player.username.equals(THA_BOAR.username)) return THA_BOAR;
             if (player.uuid.equals(MELON.uuid) || player.username.equals(MELON.username)) return MELON;
             if (player.uuid.equals(WATERMELON.uuid) || player.username.equals(WATERMELON.username)) return WATERMELON;
@@ -331,7 +329,6 @@ public class MobRendererPlayer extends MobRendererBipedArmored<Player> {
         public static @Nullable Specials getSpecialsForMob(final @NotNull Mob mob) {
             if (!GameSettings.DEV_MODELS.value) return null;
             if (mob.nickname.equals(SHIGN.username)) return SHIGN;
-            if (mob.nickname.equals(COOKIE.username)) return COOKIE;
             if (mob.nickname.equals(THA_BOAR.username)) return THA_BOAR;
             if (mob.nickname.equals(MELON.username)) return MELON;
             if (mob.nickname.equals(WATERMELON.username)) return WATERMELON;
diff --git a/game/client/src/main/java/net/minecraft/client/render/font/FontFile.java b/game/client/src/main/java/net/minecraft/client/render/font/FontFile.java
index 88ff595ac..49aa6d5b8 100644
--- a/game/client/src/main/java/net/minecraft/client/render/font/FontFile.java
+++ b/game/client/src/main/java/net/minecraft/client/render/font/FontFile.java
@@ -44,14 +44,14 @@ public class FontFile implements Font {
     protected final @NotNull String glyphSizesPath;
 
     protected final @NotNull String key;
-    protected final @NotNull String @NotNull [] textureLocationTable = new String[Character.MAX_VALUE / GLYPHS_PER_TEXTURE];
+    protected final @NotNull String @NotNull [] textureLocationTable = new String[(Character.MAX_VALUE + 1)/GLYPHS_PER_TEXTURE];
 
     public FontFile(@NotNull final String key, @NotNull final String texturesFormat, @NotNull final String glyphSizesPath) {
         this.key = key;
         this.textureFormat = texturesFormat;
         this.glyphSizesPath = glyphSizesPath;
         this.charWidth = new byte[Character.MAX_VALUE + 1];
-        this.texHandleCache = new int[256];
+        this.texHandleCache = new int[(Character.MAX_VALUE + 1)/GLYPHS_PER_TEXTURE];
 
         for (int i = 0; i < this.textureLocationTable.length; i++) {
             this.textureLocationTable[i] = String.format(this.textureFormat, i);
diff --git a/game/client/src/main/resources/assets/minecraft/models/entity/models.json b/game/client/src/main/resources/assets/minecraft/models/entity/models.json
index 8a53475e6..74a55e415 100644
--- a/game/client/src/main/resources/assets/minecraft/models/entity/models.json
+++ b/game/client/src/main/resources/assets/minecraft/models/entity/models.json
@@ -95,7 +95,6 @@
             "main":"geometry.player.base.steve",
             "main.slim":"geometry.player.base.alex",
             "main.shign":"geometry.player.base.shign",
-            "main.cookie":"geometry.player.base.cookie",
             "main.boar":"geometry.player.base.boar",
             "main.melon":"geometry.player.base.melon",
             "arms.melon":"geometry.player.base.melon.arms",
@@ -111,7 +110,6 @@
             "main":"geometry.player.base.steve",
             "main.slim":"geometry.player.base.alex",
             "main.shign":"geometry.player.base.shign",
-            "main.cookie":"geometry.player.base.cookie",
             "main.boar":"geometry.player.base.boar",
             "main.melon":"geometry.player.base.melon",
             "arms":"geometry.player.base.steve.arms",
diff --git a/game/client/src/main/resources/assets/minecraft/models/entity/secret.geo.json b/game/client/src/main/resources/assets/minecraft/models/entity/secret.geo.json
index 28b10f977..bfa4a3fe4 100644
--- a/game/client/src/main/resources/assets/minecraft/models/entity/secret.geo.json
+++ b/game/client/src/main/resources/assets/minecraft/models/entity/secret.geo.json
@@ -257,239 +257,6 @@
 				}
 			]
 		},
-		{
-			"description": {
-				"identifier": "geometry.player.base.cookie",
-				"texture_width": 64,
-				"texture_height": 64,
-				"visible_bounds_width": 3,
-				"visible_bounds_height": 3,
-				"visible_bounds_offset": [0, 1.5, 0]
-			},
-			"bones": [
-				{
-					"name": "waist",
-					"pivot": [0, 12, 0]
-				},
-				{
-					"name": "body",
-					"parent": "waist",
-					"pivot": [0, 24, 0]
-				},
-				{
-					"name": "torso",
-					"parent": "body",
-					"pivot": [0, 24, 0],
-					"cubes": [
-						{"origin": [-4, 12, -2], "size": [8, 12, 4], "uv": [16, 16]},
-						{
-							"origin": [-4, 11.5, 2],
-							"size": [8, 0, 6],
-							"pivot": [0, 11.5, 3],
-							"rotation": [-45, 0, 0],
-							"uv": {
-								"north": {
-									"uv": [48, 31],
-									"uv_size": [8, 0]
-								},
-								"east": {
-									"uv": [33, 31],
-									"uv_size": [15, 0]
-								},
-								"south": {
-									"uv": [71, 31],
-									"uv_size": [8, 0]
-								},
-								"west": {
-									"uv": [56, 31],
-									"uv_size": [15, 0]
-								},
-								"up": {
-									"uv": [56, 16],
-									"uv_size": [8, 6],
-									"uv_rotation": 180
-								},
-								"down": {
-									"uv": [56, 22],
-									"uv_size": [8, -6],
-									"uv_rotation": 180
-								}
-							}
-						},
-						{
-							"origin": [-4, 9.5, 7.5],
-							"size": [8, 0, 6],
-							"pivot": [0, 11.5, 3],
-							"rotation": [-22.5, 0, 0],
-							"uv": {
-								"north": {
-									"uv": [48, 31],
-									"uv_size": [8, 0]
-								},
-								"east": {
-									"uv": [33, 31],
-									"uv_size": [15, 0]
-								},
-								"south": {
-									"uv": [71, 31],
-									"uv_size": [8, 0]
-								},
-								"west": {
-									"uv": [56, 31],
-									"uv_size": [15, 0]
-								},
-								"up": {
-									"uv": [56, 22],
-									"uv_size": [8, 6],
-									"uv_rotation": 180
-								},
-								"down": {
-									"uv": [56, 28],
-									"uv_size": [8, -6],
-									"uv_rotation": 180
-								}
-							}
-						}
-					]
-				},
-				{
-					"name": "jacket",
-					"parent": "torso",
-					"pivot": [0, 18, 0],
-					"cubes": [
-						{"origin": [-4, 12, -2], "size": [8, 12, 4], "inflate": 0.25, "uv": [16, 32]}
-					]
-				},
-				{
-					"name": "rightArm",
-					"parent": "torso",
-					"pivot": [-5, 22, 0],
-					"cubes": [
-						{"origin": [-8, 12, -2], "size": [4, 12, 4], "uv": [40, 16]}
-					]
-				},
-				{
-					"name": "rightSleeve",
-					"parent": "rightArm",
-					"pivot": [-6, 18, 0],
-					"cubes": [
-						{"origin": [-8, 12, -2], "size": [4, 12, 4], "inflate": 0.25, "uv": [40, 32]}
-					]
-				},
-				{
-					"name": "rightItem",
-					"parent": "rightArm",
-					"pivot": [-6, 12, -2],
-					"rotation": [90, 0, 0]
-				},
-				{
-					"name": "leftArm",
-					"parent": "torso",
-					"pivot": [5, 22, 0],
-					"cubes": [
-						{"origin": [4, 12, -2], "size": [4, 12, 4], "uv": [32, 48]}
-					]
-				},
-				{
-					"name": "leftSleeve",
-					"parent": "leftArm",
-					"pivot": [6, 18, 0],
-					"cubes": [
-						{"origin": [4, 12, -2], "size": [4, 12, 4], "inflate": 0.25, "uv": [48, 48]}
-					]
-				},
-				{
-					"name": "leftItem",
-					"parent": "leftArm",
-					"pivot": [6, 12, -2],
-					"rotation": [-90, 180, 0]
-				},
-				{
-					"name": "cape",
-					"parent": "torso",
-					"pivot": [0, 24, 2.5]
-				},
-				{
-					"name": "head",
-					"parent": "body",
-					"pivot": [0, 24, 0],
-					"cubes": [
-						{"origin": [-4, 24, -4], "size": [8, 8, 8], "uv": [0, 0]},
-						{
-							"origin": [-5, 32, 0],
-							"size": [10, 8, 0],
-							"uv": {
-								"north": {
-									"uv": [27, 0],
-									"uv_size": [10, 8]
-								},
-								"east": {
-									"uv": [27, 0],
-									"uv_size": [0, 8]
-								},
-								"south": {
-									"uv": [56, 31],
-									"uv_size": [8, 10],
-									"uv_rotation": 270
-								},
-								"west": {
-									"uv": [37, 0],
-									"uv_size": [0, 8]
-								},
-								"up": {
-									"uv": [27, 0],
-									"uv_size": [10, 0]
-								},
-								"down": {
-									"uv": [37, 0],
-									"uv_size": [10, 0]
-								}
-							}
-						}
-					]
-				},
-				{
-					"name": "hat",
-					"parent": "head",
-					"pivot": [0, 28, 0],
-					"cubes": [
-						{"origin": [-4, 24, -4], "size": [8, 8, 8], "inflate": 0.25, "uv": [32, 0]}
-					]
-				},
-				{
-					"name": "rightLeg",
-					"parent": "body",
-					"pivot": [-1.9, 12, 0],
-					"cubes": [
-						{"origin": [-4, 0, -2], "size": [4, 12, 4], "uv": [0, 16]}
-					]
-				},
-				{
-					"name": "rightPant",
-					"parent": "rightLeg",
-					"pivot": [-2, 6, 0],
-					"cubes": [
-						{"origin": [-4, 0, -2], "size": [4, 12, 4], "inflate": 0.25, "uv": [0, 32]}
-					]
-				},
-				{
-					"name": "leftLeg",
-					"parent": "body",
-					"pivot": [1.9, 12, 0],
-					"cubes": [
-						{"origin": [0, 0, -2], "size": [4, 12, 4], "uv": [16, 48]}
-					]
-				},
-				{
-					"name": "leftPant",
-					"parent": "leftLeg",
-					"pivot": [2, 6, 0],
-					"cubes": [
-						{"origin": [0, 0, -2], "size": [4, 12, 4], "inflate": 0.25, "uv": [0, 48]}
-					]
-				}
-			]
-		},
 		{
 			"description": {
 				"identifier": "geometry.player.base.boar",
diff --git a/game/client/src/main/resources/credits.txt b/game/client/src/main/resources/credits.txt
index b90eefa5a..9caf055fd 100644
--- a/game/client/src/main/resources/credits.txt
+++ b/game/client/src/main/resources/credits.txt
@@ -17,7 +17,6 @@ Shign (@shign.bright)
 thaboar
 
 *Community Moderators
-Cookie Cakes
 Jej Chainstar
 Orknarok_666 (@derperu)
 
diff --git a/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityFurnace.java b/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityFurnace.java
index 974385c5e..167b9015d 100644
--- a/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityFurnace.java
+++ b/game/core/src/main/java/net/minecraft/core/block/entity/TileEntityFurnace.java
@@ -38,8 +38,8 @@ public class TileEntityFurnace extends TileEntity
     protected ItemStack[] furnaceItemStacks = new ItemStack[3];
     public int maxBurnTime = 0;
     public int currentCookTime = 0;
-    public int maxCookTime = 0;
-    public int currentBurnTime = 200;
+    public int maxCookTime = 200;
+    public int currentBurnTime = 0;
 
     public TileEntityFurnace()
     {
diff --git a/game/core/src/main/java/net/minecraft/core/entity/player/Player.java b/game/core/src/main/java/net/minecraft/core/entity/player/Player.java
index 758e8f824..ebcec584e 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/player/Player.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/player/Player.java
@@ -1585,13 +1585,13 @@ public abstract class Player
 
     @Override
     public @Nullable ItemStack getItemInArmorSlot(final @NotNull HumanArmorShape slot) {
-        return this.inventory.armorInventory[slot.getSlotIndex()];
+        return this.inventory.armorInventory[this.inventory.armorInventory.length - 1 - slot.getSlotIndex()];
     }
 
     @Override
     public void setItemInArmorSlot(final @NotNull HumanArmorShape slot, final @Nullable ItemStack item) {
         if (slot == HumanArmorShape.HEAD || canItemGoInArmorSlot(slot, item)) {
-            this.inventory.armorInventory[slot.getSlotIndex()] = item;
+            this.inventory.armorInventory[this.inventory.armorInventory.length - 1 - slot.getSlotIndex()] = item;
         }
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/DensityGeneratorOverworld.java b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/DensityGeneratorOverworld.java
index 87df20399..47df79b8c 100644
--- a/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/DensityGeneratorOverworld.java
+++ b/game/core/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/DensityGeneratorOverworld.java
@@ -135,7 +135,8 @@ public class DensityGeneratorOverworld
 
                 if (finalSample <= 0.0) continue;
 
-                for (int dy = ySize / 2 - maxUndergroundRiverHeight; dy < ySize / 2 + maxUndergroundRiverHeight; dy++) {
+                for (int dy = (ySize / 2) - maxUndergroundRiverHeight; dy < ((ySize / 2) + maxUndergroundRiverHeight); dy++) {
+                    if (dy < 0) continue; // With world gen options, its possible under some silly configs for this to be negative
                     double heightFactor = dy;                   // Range = ySize / 2 - maxUndergroundRiverHeight to ySize / 2 + maxUndergroundRiverHeight
                     heightFactor = heightFactor - (ySize / 2);  // Range = -maxUndergroundRiverHeight to maxUndergroundRiverHeight
                     heightFactor /= maxUndergroundRiverHeight;
diff --git a/game/core/src/main/java/net/minecraft/core/world/type/WorldType.java b/game/core/src/main/java/net/minecraft/core/world/type/WorldType.java
index aa5cf8f09..af0ab3fdf 100644
--- a/game/core/src/main/java/net/minecraft/core/world/type/WorldType.java
+++ b/game/core/src/main/java/net/minecraft/core/world/type/WorldType.java
@@ -196,14 +196,19 @@ public abstract class WorldType {
                 spawnPos.x = 0;
                 spawnPos.z = 0;
                 spawnPos.y = world.getHeightValue(spawnPos.x, spawnPos.z) - 1;
-                break spawnLoop;
+                break;
             }
             spawnPos.x += random.nextInt(64) - random.nextInt(64);
             spawnPos.z += random.nextInt(64) - random.nextInt(64);
-            for (spawnPos.y = maxY; spawnPos.y >= minY; spawnPos.y--) {
+            for (spawnPos.y = maxY + 1; spawnPos.y >= minY; spawnPos.y--) {
                 Block<?> b = world.getBlockType(spawnPos.up(queryPos));
-                if (b.getCollisionAABB(world, queryPos) == null && !b.getMaterial().isLiquid() && isValidSpawn(world, spawnPos.x, spawnPos.y, spawnPos.z)) {
-                    break spawnLoop;
+                if (b.getCollisionAABB(world, queryPos) == null && !b.getMaterial().isLiquid()) {
+                    if (attemptsRemaining < 2500 && world.isBlockOpaqueCube(spawnPos)) {
+                        break spawnLoop;
+                    }
+                    else if (isValidSpawn(world, spawnPos.x, spawnPos.y, spawnPos.z)) {
+                        break spawnLoop;
+                    }
                 }
             }
             attemptsRemaining--;
diff --git a/game/core/src/main/resources/lang/en_US/options.lang b/game/core/src/main/resources/lang/en_US/options.lang
index 845578e3b..c5ea2a274 100644
--- a/game/core/src/main/resources/lang/en_US/options.lang
+++ b/game/core/src/main/resources/lang/en_US/options.lang
@@ -57,6 +57,8 @@ options.particleQuality.none=None
 options.particleCap=Max Particles
 options.particleRenderDistance=Particle Render Distance
 options.particleRenderDistance.default=Default
+options.cloudRenderDistance=Cloud Render Distance
+options.cloudRenderDistance.default=Default
 options.chunkRebuilds=Chunk Rebuilds Per Frame
 options.frustumCulling=Frustum Culling
 options.entityShadows=Entity Shadows
