diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/mob/player/fem_hurt.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/mob/player/fem_hurt.ogg
new file mode 100644
index 000000000..53408820b
Binary files /dev/null and b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/mob/player/fem_hurt.ogg differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/mob/player/masc_hurt.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/mob/player/masc_hurt.ogg
new file mode 100644
index 000000000..b4cbc12e5
Binary files /dev/null and b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/mob/player/masc_hurt.ogg differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/celesta.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/celesta.ogg
deleted file mode 100644
index 3b6b03650..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/celesta.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/chant.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/chant.ogg
deleted file mode 100644
index b7647650b..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/chant.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/chip_triangle.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/chip_triangle.ogg
deleted file mode 100644
index 941c3dc3e..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/chip_triangle.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/drum_steel.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/drum_steel.ogg
deleted file mode 100644
index 5a5b4b632..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/drum_steel.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/guitar_electric.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/guitar_electric.ogg
deleted file mode 100644
index cfd9c2889..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/guitar_electric.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/wood_block.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/wood_block.ogg
deleted file mode 100644
index a412a0634..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/note/wood_block.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/achievement1.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/achievement1.ogg
deleted file mode 100644
index a69eb5122..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/achievement1.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/achievement2.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/achievement2.ogg
deleted file mode 100644
index b96e64694..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/achievement2.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/bite.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/bite.ogg
deleted file mode 100644
index f3fa04400..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/bite.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/bite_extended.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/bite_extended.ogg
deleted file mode 100644
index ca573484d..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/bite_extended.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/equip.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/equip.ogg
deleted file mode 100644
index 714b7d31b..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/equip.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/page.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/page.ogg
deleted file mode 100644
index 482fe51c4..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/page.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/scrape.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/scrape.ogg
deleted file mode 100644
index 152af219c..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/scrape.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/whoosh_in.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/whoosh_in.ogg
deleted file mode 100644
index 3df3f3ee9..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/whoosh_in.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/whoosh_out.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/whoosh_out.ogg
deleted file mode 100644
index fb9ac1c6b..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/random/whoosh_out.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/sounds.json b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/sounds.json
index 687f3140a..1fcd6f301 100644
--- a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/sounds.json
+++ b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/sounds.json
@@ -1,97 +1,23 @@
 {
-    "step.permafrost": {
+    "mob.player.masculine.hurt": {
+        "replace": true,
+        "subtitle": "subtitles.mob.player.hurt",
         "sounds": [
-            "step/permafrost1.ogg",
-            "step/permafrost2.ogg",
-            "step/permafrost3.ogg",
-            "step/permafrost4.ogg"
+            "mob/player/masc_hurt.ogg"
         ]
     },
-    "random.achievement": {
+    "mob.player.feminine.hurt": {
+        "replace": true,
+        "subtitle": "subtitles.mob.player.hurt",
         "sounds": [
-            "random/achievement1.ogg",
-            "random/achievement2.ogg"
+            "mob/player/fem_hurt.ogg"
         ]
     },
-    "random.bite": {
-        "subtitle": "subtitles.random.bite",
+    "mob.player.neutral.hurt": {
+        "replace": true,
+        "subtitle": "subtitles.mob.player.hurt",
         "sounds": [
-            "random/bite.ogg"
-        ]
-    },
-    "random.bite_extended": {
-        "subtitle": "subtitles.random.bite",
-        "sounds": [
-            "random/bite.ogg"
-        ]
-    },
-    "random.equip": {
-        "subtitle": "subtitles.random.equip",
-        "sounds": [
-            "random/equip.ogg"
-        ]
-    },
-    "random.page": {
-        "sounds": [
-            "random/page.ogg"
-        ]
-    },
-    "random.whoosh_in": {
-        "sounds": [
-            "random/whoosh_in.ogg"
-        ]
-    },
-    "random.whoosh_out": {
-        "sounds": [
-            "random/whoosh_out.ogg"
-        ]
-    },
-    "random.scrape": {
-        "subtitle": "subtitles.random.stone_scrape",
-        "sounds": [
-            "random/scrape.ogg"
-        ]
-    },
-    "note.chant": {
-        "subtitle": "subtitles.note.chant",
-        "sounds": [
-            "note/chant.ogg"
-        ]
-    },
-    "note.drum_steel": {
-        "subtitle": "subtitles.note.drum_steel",
-        "sounds": [
-            "note/drum_steel.ogg"
-        ]
-    },
-    "note.chip_triangle": {
-        "subtitle": "subtitles.note.chip_triangle",
-        "sounds": [
-            {
-                "name": "note/chip_triangle.ogg",
-                "volume": 2
-            }
-        ]
-    },
-    "note.guitar_electric": {
-        "subtitle": "subtitles.note.guitar_electric",
-        "sounds": [
-            {
-                "name": "note/guitar_electric.ogg",
-                "volume": 0.75
-            }
-        ]
-    },
-    "note.celesta": {
-        "subtitle": "subtitles.note.celesta",
-        "sounds": [
-            "note/celesta.ogg"
-        ]
-    },
-    "note.wood_block": {
-        "subtitle": "subtitles.note.wood_block",
-        "sounds": [
-            "note/wood_block.ogg"
+            "mob/player/neutral_hurt.ogg"
         ]
     }
 }
\ No newline at end of file
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/step/permafrost1.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/step/permafrost1.ogg
deleted file mode 100644
index fdf340bc1..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/step/permafrost1.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/step/permafrost2.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/step/permafrost2.ogg
deleted file mode 100644
index e867b6099..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/step/permafrost2.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/step/permafrost3.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/step/permafrost3.ogg
deleted file mode 100644
index 7d4b9b376..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/step/permafrost3.ogg and /dev/null differ
diff --git a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/step/permafrost4.ogg b/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/step/permafrost4.ogg
deleted file mode 100644
index 0b35d05f7..000000000
Binary files a/game/client/devPacks/inTestingSoundsPack/assets/minecraft/sounds/step/permafrost4.ogg and /dev/null differ
diff --git a/game/client/src/main/java/net/minecraft/client/Minecraft.java b/game/client/src/main/java/net/minecraft/client/Minecraft.java
index 3bdbb0558..ef2411cfe 100644
--- a/game/client/src/main/java/net/minecraft/client/Minecraft.java
+++ b/game/client/src/main/java/net/minecraft/client/Minecraft.java
@@ -87,10 +87,8 @@ import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.LoggedPrintStream;
 import net.minecraft.core.util.helper.UUIDHelper;
 import net.minecraft.core.world.save.SaveFormatBase;
-import net.minecraft.core.world.save.SaveHandlerBase;
 import net.minecraft.core.world.settings.WorldConfiguration;
 import net.minecraft.core.world.type.WorldType;
-import net.minecraft.core.world.type.WorldTypeGroups;
 
 import javax.imageio.ImageIO;
 import javax.swing.JLabel;
@@ -202,6 +200,8 @@ import net.minecraft.core.world.save.LevelStorage;
 import net.minecraft.core.world.save.SaveConverters;
 import net.minecraft.core.world.save.SaveFormats;
 import net.minecraft.core.world.save.mcregion.SaveFormat19134;
+import org.lwjgl.system.Configuration;
+import org.lwjgl.system.MemoryUtil;
 import org.slf4j.Logger;
 import org.useless.dragonfly.data.entity.mojang.EntityGeometryMojangData;
 
@@ -263,8 +263,8 @@ public class Minecraft
     private String serverName;
     private int serverPort;
     public volatile boolean running;
-    public String debug;
-    public String debugFPS;
+    public String lineDebug;
+    public String lingDebugFPS;
     boolean isTakingScreenshot;
     public boolean inGameHasFocus;
     private int mouseTicksRan;
@@ -317,7 +317,7 @@ public class Minecraft
         skipRenderWorld = false;
         objectMouseOver = null;
         running = true;
-        debug = "";
+        lineDebug = "";
         isTakingScreenshot = false;
         inGameHasFocus = false;
         mouseTicksRan = 0;
@@ -992,6 +992,9 @@ public class Minecraft
         if(sndManager != null) {
             sndManager.destroy();
         }
+        if (gameWindow != null) {
+            gameWindow.free();
+        }
         System.gc();
 		if(!hasCrashed) {
 			System.exit(0);
@@ -1174,8 +1177,8 @@ public class Minecraft
                     fpsCounter++;
                     isGamePaused = !isMultiplayerWorld() && currentScreen != null && currentScreen.isPauseScreen();
                     while (System.currentTimeMillis() >= currentTime + 1000L) {
-                        debug = fpsCounter + " fps, " + ChunkRenderer.updates + " chunk updates";
-                        debugFPS = fpsCounter + " fps";
+                        lineDebug = fpsCounter + " fps, " + ChunkRenderer.updates + " chunk updates";
+                        lingDebugFPS = fpsCounter + " fps";
                         ChunkRenderer.updates = 0;
                         currentTime += 1000L;
                         fpsCounter = 0;
@@ -2765,6 +2768,10 @@ public class Minecraft
         int pointer = 0;
         while (pointer < args.length) {
             switch (args[pointer]) {
+                case "--debug": {
+                    Global.DEBUG_MODE = true;
+                    break;
+                }
                 case "--username": {
                     try {
                         playerName = args[pointer + 1];
@@ -2849,6 +2856,21 @@ public class Minecraft
                     pointer++;
             }
         }
+
+        if (Global.DEBUG_MODE) {
+            LOGGER.info("Enabling LWJGL debug stack");
+            Configuration.DEBUG.set(true);
+            Configuration.DEBUG_LOADER.set(true);
+            Configuration.DEBUG_STACK.set(true);
+            Configuration.DEBUG_MEMORY_ALLOCATOR.set(true);
+            Configuration.DEBUG_FUNCTIONS.set(true);
+//            Configuration.DEBUG_STREAM.set(
+//                IoBuilder
+//                    .forLogger("LWJGL")
+//                    .setLevel(Level.DEBUG)
+//                    .buildPrintStream())
+        }
+
         startMainThread(playerName, sessionId, uuid, server, port, width, height, gameDirectory);
     }
     
diff --git a/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngame.java b/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngame.java
index 8edf01461..0247b7971 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngame.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngame.java
@@ -16,7 +16,6 @@ import net.minecraft.client.gui.Gui;
 import net.minecraft.client.gui.HeldItemTooltipElement;
 import net.minecraft.client.gui.ScreenPhotoMode;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
-import net.minecraft.client.render.entity.EntityRendererItem;
 import net.minecraft.client.render.font.FontRenderer;
 import net.minecraft.core.block.BlockLogicPortal;
 import net.minecraft.core.enums.ChatVisibility;
@@ -30,7 +29,6 @@ import net.minecraft.client.gui.hud.component.HudComponent;
 import net.minecraft.client.gui.hud.component.HudComponents;
 import net.minecraft.client.render.Lighting;
 import net.minecraft.client.render.dynamictexture.DynamicTexture;
-import net.minecraft.client.render.item.model.ItemModelDispatcher;
 import net.minecraft.client.render.terrain.RenderList;
 import net.minecraft.client.render.terrain.RenderRegion;
 import net.minecraft.client.render.terrain.TerrainRendererMultiDraw;
@@ -208,7 +206,7 @@ public class HudIngame extends Gui
                 drawDebugScreenLineRight("Render Resolution: " + mc.renderer.getRenderWidth() + "x" + mc.renderer.getRenderHeight());
 
                 drawDebugScreenLine("Better than Adventure! " + Minecraft.VERSION);
-                drawDebugScreenLine(mc.debug);
+                drawDebugScreenLine(mc.lineDebug);
                 if (mc.terrainRenderer instanceof TerrainRendererMultiDraw) {
                     TerrainRendererMultiDraw terrainRenderer = (TerrainRendererMultiDraw) mc.terrainRenderer;
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentArmorDurability.java b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentArmorDurability.java
index 701149499..ac445def4 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentArmorDurability.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentArmorDurability.java
@@ -16,10 +16,10 @@ public class HudComponentArmorDurability
     extends HudComponentMovable
 {
     private static final ItemStack[] PREVIEW_STACKS = new ItemStack[] {
-            Items.ARMOR_HELMET_DIAMOND.getDefaultStack(),
-            Items.ARMOR_CHESTPLATE_DIAMOND.getDefaultStack(),
-            Items.ARMOR_LEGGINGS_DIAMOND.getDefaultStack(),
-            Items.ARMOR_BOOTS_DIAMOND.getDefaultStack(),
+        Items.ARMOR_BOOTS_DIAMOND.getDefaultStack(),
+        Items.ARMOR_LEGGINGS_DIAMOND.getDefaultStack(),
+        Items.ARMOR_CHESTPLATE_DIAMOND.getDefaultStack(),
+        Items.ARMOR_HELMET_DIAMOND.getDefaultStack(),
     };
 
     public HudComponentArmorDurability(String key, Layout layout) {
@@ -41,14 +41,14 @@ public class HudComponentArmorDurability
         int x = this.getLayout().getComponentX(this, xSizeScreen);
         int y = this.getLayout().getComponentY(this, ySizeScreen);
 
-        for (int i = mc.thePlayer.getNumArmorSlots() - 1; i >= 0; i--)
+        for (int i = 0; i < mc.thePlayer.getNumArmorSlots(); i++)
         {
             ItemStack stack = mc.thePlayer.getItemInArmorSlot(HumanArmorShape.values()[i]);
 
             if (stack != null)
             {
                 int xx = x + 2;
-                int yy = y + i * 16;
+                int yy = y + 48 - i * 16;
                 ItemModelDispatcher.getInstance().getDispatch(stack).renderGui(Tessellator.instance, null, stack, xx, yy, 1f, 1.0f, partialTick);
                 glDisable(GL_LIGHTING);
 
@@ -70,12 +70,12 @@ public class HudComponentArmorDurability
         int x = this.getLayout().getComponentX(this, xSizeScreen);
         int y = this.getLayout().getComponentY(this, ySizeScreen);
 
-        for (int i = PREVIEW_STACKS.length - 1; i >= 0; i--)
+        for (int i = 0; i < PREVIEW_STACKS.length; i++)
         {
             ItemStack stack = PREVIEW_STACKS[i];
 
             int xx = x + 2;
-            int yy = y + i * 16;
+            int yy = y + 48 - i * 16;
             ItemModelDispatcher.getInstance().getDispatch(stack).renderGui(Tessellator.instance, null, stack, xx, yy, 1f, 1.0f, 0.0f);
             glDisable(GL_LIGHTING);
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentInfoOverlay.java b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentInfoOverlay.java
index df83b1868..eaad85361 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentInfoOverlay.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentInfoOverlay.java
@@ -1,6 +1,5 @@
 package net.minecraft.client.gui.hud.component;
 
-import net.minecraft.client.Minecraft;
 import net.minecraft.client.gui.Gui;
 import net.minecraft.client.gui.hud.HudIngame;
 import net.minecraft.client.gui.hud.component.layout.Layout;
@@ -113,7 +112,7 @@ public class HudComponentInfoOverlay
         }
         if (mc.gameSettings.fpsInOverlay.value)
         {
-            drawString(mc.debugFPS, x, y + tsp + lineHeight * line++, 0xFFFFFFFF, rightAligned);
+            drawString(mc.lingDebugFPS, x, y + tsp + lineHeight * line++, 0xFFFFFFFF, rightAligned);
         }
         if (compass)
         {
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 1e020bf29..fe00d2656 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
@@ -113,6 +113,7 @@ public abstract class OptionsPages
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.playerSleeveRight))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.playerPantLeft))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.playerPantRight))
+                .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.playerHurtSound))
             )
         );
 
@@ -176,6 +177,7 @@ public abstract class OptionsPages
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.items3D))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.clouds))
                 .withComponent(new FloatOptionComponent(mc.gameSettings.cloudHeight, -0.5f, 1f))
+                .withComponent(new FloatOptionComponent(mc.gameSettings.entityRenderDistance, 0.1f, 3f))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.aurora))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.slimeParticles))
                 .withComponent(new FloatOptionComponent(mc.gameSettings.blockOutlineWidth))
@@ -337,6 +339,7 @@ public abstract class OptionsPages
             )
             .withComponent(new OptionsCategory("gui.options.page.debug.category.settings")
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.developerMode))
+                .withComponent(new BooleanOptionComponent(mc.gameSettings.playerDevModel))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.viewSupportMode))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.alphaMenu))
                 .withComponent(new BooleanOptionComponent(mc.gameSettings.lockCamera))
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 5cb6b3174..29c2ff1e9 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
@@ -23,6 +23,7 @@ import net.minecraft.client.input.InputDevice;
 import net.minecraft.client.option.enums.Colorblindness;
 import net.minecraft.client.render.font.Fonts;
 import net.minecraft.client.option.enums.DescriptionPromptEnum;
+import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.ChatVisibility;
 import net.minecraft.core.enums.Difficulty;
 import net.minecraft.client.option.enums.LightmapStyle;
@@ -34,6 +35,7 @@ import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.Color;
 import net.minecraft.core.util.helper.ITranslatable;
 
+import net.minecraft.core.util.helper.MathHelper;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 
@@ -98,6 +100,7 @@ public class GameSettings {
 	public @NotNull OptionBoolean controllerSwapXY = new OptionBoolean(this, "controllerSwapXY", false);
 	public @NotNull OptionBoolean clouds = new OptionBoolean(this, "clouds", true);
 	public @NotNull OptionFloat cloudHeight = new OptionFloat(this, "cloudHeight", 0f);
+	public @NotNull OptionFloat entityRenderDistance = new OptionFloat(this, "entityRenderDistance", 1f);
 	public @NotNull OptionBoolean armorDurabilityOverlay = new OptionBoolean(this, "armorDurabilityOverlay", false);
 	public @NotNull OptionBoolean armorProtectionOverlay = new OptionBoolean(this, "armorProtectionOverlay", true);
 	public @NotNull OptionBoolean heldItemCountOverlay = new OptionBoolean(this, "heldItemCountOverlay", false);
@@ -195,6 +198,8 @@ public class GameSettings {
 	public @NotNull OptionBoolean playerSleeveRight = new OptionBoolean(this, "player.sleeve.right", true);
 	public @NotNull OptionBoolean playerPantLeft = new OptionBoolean(this, "player.pant.left", true);
 	public @NotNull OptionBoolean playerPantRight = new OptionBoolean(this, "player.pant.right", true);
+	public @NotNull OptionBoolean playerDevModel = new OptionBoolean(this, "player.devmodel", true);
+	public @NotNull OptionEnum<Player.PlayerConfig.HurtSound> playerHurtSound = new OptionEnum<>(this, "player.hurtsound", Player.PlayerConfig.HurtSound.class, Player.PlayerConfig.HurtSound.MASCULINE);
 	public @NotNull OptionBoolean doJCECheck = new OptionBoolean(this, "doJCECheck", true);
 	public @NotNull OptionString uuidServer = new OptionString(this, "uuidServer", "https://api.minecraftservices.com/minecraft/profile/lookup/name/%s");
 
@@ -374,6 +379,14 @@ public class GameSettings {
 					return percent + "%";
 				}
 			}
+			if (option == entityRenderDistance) {
+				int percent = MathHelper.round(value * 100.0f);
+				if (percent == 100) {
+					return trans.translateKey("options.entityRenderDistance.default");
+				} else {
+					return percent + "%";
+				}
+			}
 			if (value == 0.0F) {
 				return trans.translateKey("options.off");
 			} else {
@@ -482,6 +495,8 @@ public class GameSettings {
 		if(option == playerSleeveRight && mc.thePlayer != null) {mc.thePlayer.playerConfig.setSleeveRight(playerSleeveRight.value);}
 		if(option == playerPantLeft && mc.thePlayer != null) {mc.thePlayer.playerConfig.setPantLeft(playerPantLeft.value);}
 		if(option == playerPantRight && mc.thePlayer != null) {mc.thePlayer.playerConfig.setPantRight(playerPantRight.value);}
+		if(option == playerDevModel && mc.thePlayer != null) {mc.thePlayer.playerConfig.setDevModelEnabled(playerDevModel.value);}
+		if(option == playerHurtSound && mc.thePlayer != null) {mc.thePlayer.playerConfig.setHurtSound(playerHurtSound.value);}
 
 		if(option == enableVsync) mc.gameWindow.setVsync(enableVsync.value);
 		if(option == fancyGraphics) mc.renderGlobal.allChanged();
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 f09a5eb67..64e3ddd39 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
@@ -496,7 +496,7 @@ public class RenderGlobal
                     continue;
                 }
             }
-            if (mc.thePlayer.vehicle != entity && (!entity.shouldRender(camera.getPosition(partialTick), 1) || !entity.ignoreFrustumCheck && !camera.getFrustum().isVisible(EntityRenderDispatcher.instance.getRenderer(entity).entityViewBox(entity), partialTick)))
+            if (mc.thePlayer.vehicle != entity && (!entity.shouldRender(camera.getPosition(partialTick), mc.gameSettings.entityRenderDistance.value) || !entity.ignoreFrustumCheck && !camera.getFrustum().isVisible(EntityRenderDispatcher.instance.getRenderer(entity).entityViewBox(entity), partialTick)))
             {
                 continue;
             }
diff --git a/game/client/src/main/java/net/minecraft/client/render/TileEntityRenderDispatcher.java b/game/client/src/main/java/net/minecraft/client/render/TileEntityRenderDispatcher.java
index afaff32da..d810299ae 100644
--- a/game/client/src/main/java/net/minecraft/client/render/TileEntityRenderDispatcher.java
+++ b/game/client/src/main/java/net/minecraft/client/render/TileEntityRenderDispatcher.java
@@ -118,7 +118,7 @@ public final class TileEntityRenderDispatcher
         final TileEntityRenderer<T> renderer = TileEntityRenderDispatcher.instance.getRenderer(tileEntity);
 
         if (renderer == null) return;
-        if(tileEntity.getDistanceFrom(this.viewLerpPosX, this.viewLerpPosY, this.viewLerpPosZ) > 4096D) return;
+        if(tileEntity.getDistanceFrom(this.viewLerpPosX, this.viewLerpPosY, this.viewLerpPosZ) > 4096D * settings.entityRenderDistance.value) return;
         if (!renderer.isVisible(tileEntity, camera, partialTick)) return;
 
         assert this.world != null;
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 3a85d5ad7..bb8fe099c 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
@@ -343,7 +343,7 @@ public class MobRendererPlayer extends MobRendererBipedArmored<Player>
         }
 
         public static @Nullable Specials getSpecialsForPlayer(final @NotNull Player player) {
-            if (!Minecraft.getMinecraft().gameSettings.devModels.value) return null;
+            if (!Minecraft.getMinecraft().gameSettings.devModels.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;
diff --git a/game/client/src/main/java/net/minecraft/client/render/window/GameWindow.java b/game/client/src/main/java/net/minecraft/client/render/window/GameWindow.java
index 7d2eb583c..ade0cb6e0 100644
--- a/game/client/src/main/java/net/minecraft/client/render/window/GameWindow.java
+++ b/game/client/src/main/java/net/minecraft/client/render/window/GameWindow.java
@@ -40,4 +40,6 @@ public interface GameWindow {
 	CursorShape getCursorShape();
 
 	public long getHandle();
+
+	void free();
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/window/GameWindowGLFW.java b/game/client/src/main/java/net/minecraft/client/render/window/GameWindowGLFW.java
index a090dbae0..89de17782 100644
--- a/game/client/src/main/java/net/minecraft/client/render/window/GameWindowGLFW.java
+++ b/game/client/src/main/java/net/minecraft/client/render/window/GameWindowGLFW.java
@@ -1,37 +1,34 @@
 package net.minecraft.client.render.window;
 
-import static org.lwjgl.BufferUtils.createByteBuffer;
 import static org.lwjgl.glfw.GLFW.*;
 import static org.lwjgl.system.MemoryUtil.NULL;
 
 import java.awt.*;
-import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.nio.IntBuffer;
 import java.util.Objects;
 
-import javax.imageio.ImageIO;
 import javax.swing.JFrame;
 
 import com.mojang.logging.CategorizedLogger;
 import com.mojang.logging.LogUtils;
-import com.mojang.logging.LogUtils;
-import net.minecraft.client.render.OpenGLHelper;
 import net.minecraft.client.util.debug.GLFWLoggerCallback;
 import net.minecraft.client.util.debug.OpenGLLoggerCallback;
 import net.minecraft.core.BuildChannel;
 import net.minecraft.core.Global;
 import net.minecraft.core.Version;
-import net.minecraft.core.util.helper.Color;
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import org.lwjgl.BufferUtils;
 import org.lwjgl.PointerBuffer;
+import org.lwjgl.glfw.Callbacks;
 import org.lwjgl.glfw.GLFW;
 import org.lwjgl.glfw.GLFWErrorCallback;
 import org.lwjgl.glfw.GLFWImage;
@@ -52,8 +49,10 @@ import net.minecraft.core.UnexpectedThrowable;
 import org.lwjgl.opengl.GL11;
 import org.lwjgl.opengl.GL43;
 import org.lwjgl.opengl.GLCapabilities;
+import org.lwjgl.opengl.GLDebugMessageCallback;
 import org.lwjgl.stb.STBImage;
-import org.slf4j.Logger;
+import org.lwjgl.system.MemoryStack;
+import org.lwjgl.system.MemoryUtil;
 
 public class GameWindowGLFW implements GameWindow {
     public static final CategorizedLogger LOGGER = LogUtils.getLogger();
@@ -80,15 +79,20 @@ public class GameWindowGLFW implements GameWindow {
     private final Map<CursorShape, Long> cursors = new HashMap<>();
     private CursorShape currentCursor = CursorShape.ARROW;
 
+    // Native resources
+    private final @NotNull List<@NotNull ByteBuffer> stbiIconImages = new ArrayList<>();
+    private @Nullable GLFWErrorCallback glfwErrorCallback;
+    private @Nullable GLDebugMessageCallback glDebugMessageCallback;
+
     @Override
     public void init(Minecraft minecraft, int width, int height) {
         mc = minecraft;
 
-        boolean debug = (mc.gameSettings.developerMode.value || Version.BUILD_CHANNEL == BuildChannel.DEVELOPMENT);
+        boolean debug = (mc.gameSettings.developerMode.value || Version.BUILD_CHANNEL == BuildChannel.DEVELOPMENT || Global.DEBUG_MODE);
 
         LOGGER.info("Initializing GLFW...");
         if (debug) {
-            GLFWErrorCallback.create(new GLFWLoggerCallback()).set();
+            glfwErrorCallback = GLFWErrorCallback.create(new GLFWLoggerCallback()).set();
         }
         if (!glfwInit()) {
             throw new RuntimeException("GLFW initialization failed!");
@@ -104,14 +108,18 @@ public class GameWindowGLFW implements GameWindow {
         window = glfwCreateWindow(width, height, "Better than Adventure! " + Global.VERSION, 0, 0);
 
         // Set widths and heights
-        int[] w = new int[1];
-        int[] h = new int[1];
-        glfwGetWindowSize(window, w, h);
-        this.widthScreenCoords = w[0];
-        this.heightScreenCoords = h[0];
-        glfwGetFramebufferSize(window, w, h);
-        this.widthPixels = w[0];
-        this.heightPixels = h[0];
+        try (var stack = MemoryStack.stackPush()) {
+            var w = stack.callocInt(1);
+            var h = stack.callocInt(1);
+
+            glfwGetWindowSize(window, w, h);
+            this.widthScreenCoords = w.get(0);
+            this.heightScreenCoords = h.get(0);
+
+            glfwGetFramebufferSize(window, w, h);
+            this.widthPixels = w.get(0);
+            this.heightPixels = h.get(0);
+        }
 
         // Center window
         MonitorInfo monitor = new MonitorInfo(glfwGetPrimaryMonitor());
@@ -142,8 +150,7 @@ public class GameWindowGLFW implements GameWindow {
         {
             int[] resolutions = new int[]{16, 32, 64, 128, 256};
             GLFWImage.Buffer gb = GLFWImage.create(resolutions.length);
-            for (int i = 0; i < resolutions.length; i++) {
-                int res = resolutions[i];
+            for (int res : resolutions) {
                 ByteBuffer icon = getImageBuffer("/icon/" + res + ".png");
                 if (icon == null) {
                     LOGGER.error("Icon at resolution '{}' is null! Skipping icons!", res);
@@ -151,9 +158,10 @@ public class GameWindowGLFW implements GameWindow {
                     break iconLabel;
                 }
                 GLFWImage iconGI = GLFWImage.create().set(res, res, icon);
-                gb.put(i, iconGI);
+                gb.put(iconGI);
+                stbiIconImages.add(icon);
             }
-            glfwSetWindowIcon(window, gb);
+            glfwSetWindowIcon(window, gb.flip());
         }
 
         // Show window
@@ -164,7 +172,8 @@ public class GameWindowGLFW implements GameWindow {
         GLCapabilities capabilities = GL.createCapabilities();
         if (capabilities.OpenGL43 && debug) {
             GL11.glEnable(GL43.GL_DEBUG_OUTPUT);
-            GL43.glDebugMessageCallback(new OpenGLLoggerCallback(), NULL);
+            glDebugMessageCallback = new OpenGLLoggerCallback();
+            GL43.glDebugMessageCallback(glDebugMessageCallback, NULL);
             LOGGER.info("GL4.3 supported, enabling GL Error logging");
         } else {
             LOGGER.info("GL4.3 not supported, cannot enable GL Error logging");
@@ -256,18 +265,20 @@ public class GameWindowGLFW implements GameWindow {
     @Override
     public void updateWindowState() {
         if (!isFullscreen) {
-            int[] x = new int[1];
-            int[] y = new int[1];
-            glfwGetWindowPos(window, x, y);
-
-            int[] w = new int[1];
-            int[] h = new int[1];
-            glfwGetWindowSize(window, w, h);
-
-            this.windowPosX = x[0];
-            this.windowPosY = y[0];
-            this.windowWidth = w[0];
-            this.windowHeight = h[0];
+            try (var stack = MemoryStack.stackPush()) {
+                var x = stack.callocInt(1);
+                var y = stack.callocInt(1);
+                glfwGetWindowPos(window, x, y);
+
+                var w = stack.callocInt(1);
+                var h = stack.callocInt(1);
+                glfwGetWindowSize(window, w, h);
+
+                this.windowPosX = x.get(0);
+                this.windowPosY = y.get(0);
+                this.windowWidth = w.get(0);
+                this.windowHeight = h.get(0);
+            }
         }
 
         boolean fullscreen = mc.gameSettings.fullscreen.value;
@@ -311,12 +322,14 @@ public class GameWindowGLFW implements GameWindow {
     public MonitorInfo getMonitorAt(int x, int y) {
         PointerBuffer monitorPointers = glfwGetMonitors();
 
-        for (int i = monitorPointers.position(); i < monitorPointers.limit(); i++) {
-            long monitor = monitorPointers.get(i);
+        if (monitorPointers != null) {
+            for (int i = monitorPointers.position(); i < monitorPointers.limit(); i++) {
+                long monitor = monitorPointers.get(i);
 
-            MonitorInfo info = new MonitorInfo(monitor);
-            if (x >= info.posX && y >= info.posY && x < info.posX + info.widthScreenCoords && y < info.posY + info.heightScreenCoords) {
-                return info;
+                MonitorInfo info = new MonitorInfo(monitor);
+                if (x >= info.posX && y >= info.posY && x < info.posX + info.widthScreenCoords && y < info.posY + info.heightScreenCoords) {
+                    return info;
+                }
             }
         }
 
@@ -417,6 +430,14 @@ public class GameWindowGLFW implements GameWindow {
         return this.window;
     }
 
+    @Override
+    public void free() {
+        Callbacks.glfwFreeCallbacks(this.window);
+        if (glfwErrorCallback != null) glfwErrorCallback.free();
+        if (glDebugMessageCallback != null) glDebugMessageCallback.free();
+        stbiIconImages.forEach(STBImage::stbi_image_free);
+    }
+
     public static class MonitorInfo {
 
         public final long handle;
@@ -429,13 +450,15 @@ public class GameWindowGLFW implements GameWindow {
         public MonitorInfo(long monitor) {
             this.handle = monitor;
 
-            GLFWVidMode vidmode = glfwGetVideoMode(monitor);
+            GLFWVidMode vidmode = Objects.requireNonNull(glfwGetVideoMode(monitor), "No Video for monitor");
 
-            int[] x = new int[1];
-            int[] y = new int[1];
-            glfwGetMonitorPos(monitor, x, y);
-            posX = x[0];
-            posY = y[0];
+            try (var stack = MemoryStack.stackPush()) {
+                var x = stack.callocInt(1);
+                var y = stack.callocInt(1);
+                glfwGetMonitorPos(monitor, x, y);
+                posX = x.get(0);
+                posY = y.get(0);
+            }
 
             widthScreenCoords = vidmode.width();
             heightScreenCoords = vidmode.height();
@@ -443,7 +466,6 @@ public class GameWindowGLFW implements GameWindow {
         }
     }
 
-    private static ByteBuffer buffer = BufferUtils.createByteBuffer(1024 * 1024);
     /**
      * Reads the specified image resource and returns the raw data as a ByteBuffer.
      *
@@ -456,24 +478,37 @@ public class GameWindowGLFW implements GameWindow {
                 LOGGER.error("No icon could be found at '{}'!", resource);
                 return null;
             }
-            buffer.clear();
-            int value;
-            while ((value = stream.read()) != -1) {
-                if (buffer.remaining() < 1) {
-                    final ByteBuffer newBuf = BufferUtils.createByteBuffer(buffer.capacity() * 2);
-                    newBuf.put(buffer);
-                    buffer = newBuf;
-                }
-                buffer.put((byte) value);
+            ByteBuffer returnBuf;
+            try (final var stack = MemoryStack.stackPush()) {
+                final IntBuffer x = stack.mallocInt(1);
+                final IntBuffer y = stack.mallocInt(1);
+                final IntBuffer comp = stack.mallocInt(1);
+                var buffer = streamToBuffer(stream);
+                returnBuf = Objects.requireNonNull(STBImage.stbi_load_from_memory(buffer, x, y, comp, STBImage.STBI_rgb_alpha), STBImage::stbi_failure_reason);
+                MemoryUtil.memFree(buffer);
             }
-            final IntBuffer x = BufferUtils.createIntBuffer(1);
-            final IntBuffer y = BufferUtils.createIntBuffer(1);
-            final IntBuffer comp = BufferUtils.createIntBuffer(1);
-            return (ByteBuffer) Objects.requireNonNull((ByteBuffer) STBImage.stbi_load_from_memory((ByteBuffer) (buffer.flip()), x, y, comp, STBImage.STBI_rgb_alpha),
-                STBImage::stbi_failure_reason);
+            return returnBuf;
         } catch (final Exception e) {
             LOGGER.error("Couldn't open icon image...", e);
             return null;
         }
     }
+
+    public static ByteBuffer streamToBuffer(@NotNull InputStream inputStream) throws IOException {
+        var byteNum = inputStream.available();
+        var byteBuffer = MemoryUtil.memAlloc(byteNum);
+
+        int read = inputStream.read();
+        while (read != -1) {
+            if (byteBuffer.remaining() == 0) {
+                var oldBuf = byteBuffer;
+                byteBuffer = MemoryUtil.memAlloc((int) (oldBuf.capacity() * 1.25f));
+                byteBuffer.put(oldBuf);
+                MemoryUtil.memFree(oldBuf);
+            }
+            byteBuffer.put((byte) read);
+            read = inputStream.read();
+        }
+        return byteBuffer.flip();
+    }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/util/debug/OpenGLLoggerCallback.java b/game/client/src/main/java/net/minecraft/client/util/debug/OpenGLLoggerCallback.java
index 5a4b7b4c6..d5d174389 100644
--- a/game/client/src/main/java/net/minecraft/client/util/debug/OpenGLLoggerCallback.java
+++ b/game/client/src/main/java/net/minecraft/client/util/debug/OpenGLLoggerCallback.java
@@ -6,12 +6,12 @@ import org.jetbrains.annotations.NotNull;
 import org.lwjgl.opengl.ARBFramebufferObject;
 import org.lwjgl.opengl.GL11;
 import org.lwjgl.opengl.GL43;
-import org.lwjgl.opengl.GLDebugMessageCallbackI;
+import org.lwjgl.opengl.GLDebugMessageCallback;
 import org.lwjgl.system.MemoryUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class OpenGLLoggerCallback implements GLDebugMessageCallbackI {
+public class OpenGLLoggerCallback extends GLDebugMessageCallback {
     private static final Logger LOGGER = LoggerFactory.getLogger("OpenGL");
 
     private final Int2BooleanMap didReport = new Int2BooleanOpenHashMap();
@@ -61,42 +61,42 @@ public class OpenGLLoggerCallback implements GLDebugMessageCallbackI {
     }
 
     public @NotNull String getIdName(int error) {
-        switch (error) {
-            case GL11.GL_INVALID_ENUM: return "Invalid Enum";
-            case GL11.GL_INVALID_VALUE: return "Invalid Value";
-            case GL11.GL_INVALID_OPERATION: return "Invalid Operation";
-            case GL11.GL_STACK_OVERFLOW: return "Stack Overflow";
-            case GL11.GL_STACK_UNDERFLOW: return "Stack Underflow";
-            case GL11.GL_OUT_OF_MEMORY: return "Out of Memory";
-            case ARBFramebufferObject.GL_INVALID_FRAMEBUFFER_OPERATION: return "Invalid Framebuffer Operation";
-            default: return "Unknown 0x" + Integer.toHexString(error);
-        }
+        return switch (error) {
+            case GL11.GL_INVALID_ENUM -> "Invalid Enum";
+            case GL11.GL_INVALID_VALUE -> "Invalid Value";
+            case GL11.GL_INVALID_OPERATION -> "Invalid Operation";
+            case GL11.GL_STACK_OVERFLOW -> "Stack Overflow";
+            case GL11.GL_STACK_UNDERFLOW -> "Stack Underflow";
+            case GL11.GL_OUT_OF_MEMORY -> "Out of Memory";
+            case ARBFramebufferObject.GL_INVALID_FRAMEBUFFER_OPERATION -> "Invalid Framebuffer Operation";
+            default -> "Unknown 0x" + Integer.toHexString(error);
+        };
     }
 
     public @NotNull String getSourceName(int source) {
-        switch (source) {
-            case GL43.GL_DEBUG_SOURCE_API: return "OpenGL API";
-            case GL43.GL_DEBUG_SOURCE_WINDOW_SYSTEM: return "Window System API";
-            case GL43.GL_DEBUG_SOURCE_SHADER_COMPILER: return "Shader Compiler";
-            case GL43.GL_DEBUG_SOURCE_THIRD_PARTY: return "Third Party";
-            case GL43.GL_DEBUG_SOURCE_APPLICATION: return "Application";
-            case GL43.GL_DEBUG_SOURCE_OTHER: return "Other";
-            default: return "Other 0x" + Integer.toHexString(source);
-        }
+        return switch (source) {
+            case GL43.GL_DEBUG_SOURCE_API -> "OpenGL API";
+            case GL43.GL_DEBUG_SOURCE_WINDOW_SYSTEM -> "Window System API";
+            case GL43.GL_DEBUG_SOURCE_SHADER_COMPILER -> "Shader Compiler";
+            case GL43.GL_DEBUG_SOURCE_THIRD_PARTY -> "Third Party";
+            case GL43.GL_DEBUG_SOURCE_APPLICATION -> "Application";
+            case GL43.GL_DEBUG_SOURCE_OTHER -> "Other";
+            default -> "Other 0x" + Integer.toHexString(source);
+        };
     }
 
     public @NotNull String getTypeName(int type) {
-        switch (type) {
-            case GL43.GL_DEBUG_TYPE_ERROR: return "Error";
-            case GL43.GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR: return "Deprecated Behavior";
-            case GL43.GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR: return "Undefined Behavior";
-            case GL43.GL_DEBUG_TYPE_PORTABILITY: return "Not Portable";
-            case GL43.GL_DEBUG_TYPE_PERFORMANCE: return "Performance";
-            case GL43.GL_DEBUG_TYPE_MARKER: return "Marker";
-            case GL43.GL_DEBUG_TYPE_PUSH_GROUP: return "Group Push";
-            case GL43.GL_DEBUG_TYPE_POP_GROUP: return "Group Pop";
-            case GL43.GL_DEBUG_TYPE_OTHER: return "Other";
-            default: return "Other 0x" + Integer.toHexString(type);
-        }
+        return switch (type) {
+            case GL43.GL_DEBUG_TYPE_ERROR -> "Error";
+            case GL43.GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR -> "Deprecated Behavior";
+            case GL43.GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR -> "Undefined Behavior";
+            case GL43.GL_DEBUG_TYPE_PORTABILITY -> "Not Portable";
+            case GL43.GL_DEBUG_TYPE_PERFORMANCE -> "Performance";
+            case GL43.GL_DEBUG_TYPE_MARKER -> "Marker";
+            case GL43.GL_DEBUG_TYPE_PUSH_GROUP -> "Group Push";
+            case GL43.GL_DEBUG_TYPE_POP_GROUP -> "Group Pop";
+            case GL43.GL_DEBUG_TYPE_OTHER -> "Other";
+            default -> "Other 0x" + Integer.toHexString(type);
+        };
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/util/helper/ScreenShot.java b/game/client/src/main/java/net/minecraft/client/util/helper/ScreenShot.java
index a3ac8a4b9..bccf69cf7 100644
--- a/game/client/src/main/java/net/minecraft/client/util/helper/ScreenShot.java
+++ b/game/client/src/main/java/net/minecraft/client/util/helper/ScreenShot.java
@@ -1,78 +1,59 @@
 package net.minecraft.client.util.helper;
 
-import java.awt.image.*;
 import java.io.File;
-import java.nio.ByteBuffer;
-import java.nio.IntBuffer;
-import java.nio.ShortBuffer;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
-import javax.imageio.ImageIO;
-
 import com.mojang.logging.LogUtils;
-import net.minecraft.client.Minecraft;
-import org.lwjgl.BufferUtils;
-import org.lwjgl.glfw.GLFW;
-import org.lwjgl.opengl.AMDInterleavedElements;
 import org.lwjgl.opengl.GL11;
 
-import com.b100.utils.ImageUtils;
+import org.lwjgl.stb.STBImageWrite;
+import org.lwjgl.system.MemoryUtil;
 import org.slf4j.Logger;
 
 public class ScreenShot
 {
     private static final Logger LOGGER = LogUtils.getLogger();
+    private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
+
     public static String saveScreenshot(File mcDir, int width, int height)
     {
         try
         {
             File screenshotsDir = new File(mcDir, "screenshots");
+            //noinspection ResultOfMethodCallIgnored
             screenshotsDir.mkdir();
-            if(buffer == null || buffer.capacity() < width * height * 3)
-            {
-                buffer = BufferUtils.createByteBuffer(width * height * 3);
-            }
-            if(imageData == null || imageData.length < width * height * 3)
-            {
-                pixelData = new byte[width * height * 3];
-                imageData = new int[width * height];
-            }
-            GL11.glPixelStorei(3333 /*GL_PACK_ALIGNMENT*/, 1);
-            GL11.glPixelStorei(3317 /*GL_UNPACK_ALIGNMENT*/, 1);
-            buffer.clear();
-            GL11.glReadPixels(0, 0, width, height, 6407 /*GL_RGB*/, 5121 /*GL_UNSIGNED_BYTE*/, buffer);
-            buffer.clear();
+
             String dateString = dateFormat.format(new Date());
             File destFile;
-            for(int k = 1; (destFile = new File(screenshotsDir, dateString + (k != 1 ? "_" + k : "") + ".png")).exists(); k++) { }
-            buffer.get(pixelData);
-            for(int l = 0; l < width; l++)
-            {
-                for(int i1 = 0; i1 < height; i1++)
-                {
-                    int j1 = l + (height - i1 - 1) * width;
-                    int k1 = pixelData[j1 * 3 + 0] & 0xff;
-                    int l1 = pixelData[j1 * 3 + 1] & 0xff;
-                    int i2 = pixelData[j1 * 3 + 2] & 0xff;
-                    int j2 = 0xff000000 | k1 << 16 | l1 << 8 | i2;
-                    imageData[l + i1 * width] = j2;
-                }
+            int id = 1;
+            while ((destFile = new File(screenshotsDir, dateString + (id != 1 ? "_" + id : "") + ".png")).exists()) {
+                id++;
+            }
 
+            var buffer1 = MemoryUtil.memCalloc(width * height * 3);
+            var buffer2 = MemoryUtil.memCalloc(width * height * 3);
+            GL11.glPixelStorei(GL11.GL_PACK_ALIGNMENT, 1);
+            GL11.glPixelStorei(GL11.GL_UNPACK_ALIGNMENT, 1);
+            GL11.glReadPixels(0, 0, width, height, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, buffer1);
+
+            for (int y = 0; y < height; y++) { // Flip image vertically
+                int index = y * width * 3;
+                buffer2.put(index, buffer1, height * width * 3 - (y + 1) * width * 3, width * 3);
             }
 
-            BufferedImage bufferedimage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
-            bufferedimage.setRGB(0, 0, width, height, imageData, 0, width);
-            ImageIO.write(bufferedimage, "png", destFile);
-            boolean copiedImage = false;
+            STBImageWrite.stbi_write_png(destFile.getAbsolutePath(), width, height, 3, buffer2, width * 3);
+
+            MemoryUtil.memFree(buffer1);
+            MemoryUtil.memFree(buffer2);
+
             try {
-                copiedImage = FileOpener.toClipboard(destFile.getAbsolutePath());
-            } catch (Exception ignored) {
-            }
-            if (copiedImage) {
-                return "Saved screenshot as " + destFile.getName() + " and copied to clipboard.";
-            }
+                boolean copiedImage = FileOpener.toClipboard(destFile.getAbsolutePath());
+                if (copiedImage) {
+                    return "Saved screenshot as " + destFile.getName() + " and copied to clipboard.";
+                }
+            } catch (Exception ignored) {}
             return "Saved screenshot as " + destFile.getName();
         }
         catch(Exception exception)
@@ -82,9 +63,4 @@ public class ScreenShot
         }
     }
 
-    private static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss");
-    private static ByteBuffer buffer;
-    private static byte[] pixelData;
-    private static int[] imageData;
-
 }
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_down.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_down.png
index 18c3d82c8..cea63a243 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_down.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sign/arrow_down.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_empty.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_empty.png
index 05f3dfde1..927d22fa3 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_empty.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_empty.png differ
diff --git a/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_half.png b/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_half.png
index 242b6b3f1..61adeba87 100644
Binary files a/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_half.png and b/game/client/src/main/resources/assets/minecraft/textures/gui/sprites/hud/armor_half.png differ
diff --git a/game/core/src/main/java/net/minecraft/core/Global.java b/game/core/src/main/java/net/minecraft/core/Global.java
index 0c8c58c74..1eb3d00ac 100644
--- a/game/core/src/main/java/net/minecraft/core/Global.java
+++ b/game/core/src/main/java/net/minecraft/core/Global.java
@@ -13,6 +13,7 @@ public class Global
 	public static final boolean DISABLE_OLD_WORLDS = false;
 	public static final int ASSET_PACK_FORMAT = Version.ASSET_PACK_FORMAT;
 	public static final boolean NET_DEBUG = false;
+	public static boolean DEBUG_MODE = Version.BUILD_CHANNEL == BuildChannel.DEVELOPMENT;
 	public static final boolean ASSERTIONS_ENABLED;
 	static {
 		// Apparently the best way to check if assertions are enabled
diff --git a/game/core/src/main/java/net/minecraft/core/entity/EntityFishingBobber.java b/game/core/src/main/java/net/minecraft/core/entity/EntityFishingBobber.java
index 186d33348..517591ae8 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/EntityFishingBobber.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/EntityFishingBobber.java
@@ -411,18 +411,20 @@ public class EntityFishingBobber extends Entity
         }
         else if(ticksCatchable > 0)
         {
-            EntityItem entityitem = new EntityItem(world, x, y, z, new ItemStack(Items.FOOD_FISH_RAW));
-            double dx = owner.x - x;
-            double dy = owner.y - y;
-            double dz = owner.z - z;
-            double distance = MathHelper.sqrt(dx * dx + dy * dy + dz * dz);
-            double scale = 0.1D;
-            entityitem.xd = dx * scale;
-            entityitem.yd = dy * scale + (double) MathHelper.sqrt(distance) * 0.08D;
-            entityitem.zd = dz * scale;
-            world.entityJoinedWorld(entityitem);
-            owner.addStat(StatList.fishCaughtStat, 1);
-            damage = 1;
+            if (!world.isClientSide) {
+                EntityItem entityitem = new EntityItem(world, x, y, z, new ItemStack(Items.FOOD_FISH_RAW));
+                double dx = owner.x - x;
+                double dy = owner.y - y;
+                double dz = owner.z - z;
+                double distance = MathHelper.sqrt(dx * dx + dy * dy + dz * dz);
+                double scale = 0.1D;
+                entityitem.xd = dx * scale;
+                entityitem.yd = dy * scale + (double) MathHelper.sqrt(distance) * 0.08D;
+                entityitem.zd = dz * scale;
+                world.entityJoinedWorld(entityitem);
+                owner.addStat(StatList.fishCaughtStat, 1);
+                damage = 1;
+            }
         }
         if(isInGround())
         {
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 e8d238d42..e15b4f444 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
@@ -464,6 +464,18 @@ public abstract class Player
         world.playSoundAtEntity(null, this, getDeathSound(), getSoundVolume(), (random.nextFloat() - random.nextFloat()) * 0.2F + pitch);
     }
 
+    @Override
+    protected String getHurtSound()
+    {
+        return playerConfig.hurtSound().hurtSound;
+    }
+
+    @Override
+    protected String getDeathSound()
+    {
+        return playerConfig.hurtSound().deathSound;
+    }
+
     private void collideWithPlayer(Entity entity)
     {
         entity.playerTouch(this);
@@ -1801,23 +1813,25 @@ public abstract class Player
     }
 
     public static class PlayerConfig {
-        public static final int MASK_LEFT_HAND = 0b0000_0001;
-        public static final int MASK_CAPE = 0b0000_0010;
-        public static final int MASK_OUTER_HEAD = 0b0000_0100;
-        public static final int MASK_OUTER_TORSO = 0b0000_1000;
-        public static final int MASK_OUTER_ARM_LEFT = 0b0001_0000;
-        public static final int MASK_OUTER_ARM_RIGHT = 0b0010_0000;
-        public static final int MASK_OUTER_LEG_LEFT = 0b0100_0000;
-        public static final int MASK_OUTER_LEG_RIGHT = 0b1000_0000;
+        public static final int MASK_LEFT_HAND = 0b0000_0000_0000_0001;
+        public static final int MASK_CAPE = 0b0000_0000_0000_0010;
+        public static final int MASK_OUTER_HEAD = 0b0000_0000_0000_0100;
+        public static final int MASK_OUTER_TORSO = 0b0000_0000_0000_1000;
+        public static final int MASK_OUTER_ARM_LEFT = 0b0000_0000_0001_0000;
+        public static final int MASK_OUTER_ARM_RIGHT = 0b0000_0000_0010_0000;
+        public static final int MASK_OUTER_LEG_LEFT = 0b0000_0000_0100_0000;
+        public static final int MASK_OUTER_LEG_RIGHT = 0b0000_0000_1000_0000;
+        public static final int MASK_HURT_SOUND = 0b0000_1111_0000_0000;
+        public static final int MASK_DEV_MODEL = 0b0001_0000_0000_0000;
 
         public PlayerConfigListener listener;
-        public byte config = 0;
+        public short config = 0;
 
         private void setToggle(boolean flag, int mask) {
             if (flag) {
-                config = (byte) (config | mask);
+                config = (short) (config | mask);
             } else {
-                config = (byte) (config & ~mask);
+                config = (short) (config & ~mask);
             }
             if (listener != null) listener.onValueChange();
         }
@@ -1836,6 +1850,10 @@ public abstract class Player
         public boolean sleeveRightEnabled() {return (config & MASK_OUTER_ARM_RIGHT) != 0;}
         public boolean pantLeftEnabled() {return (config & MASK_OUTER_LEG_LEFT) != 0;}
         public boolean pantRightEnabled() {return (config & MASK_OUTER_LEG_RIGHT) != 0;}
+        public boolean devModelEnabled() {return (config & MASK_DEV_MODEL) != 0;}
+        public @NotNull HurtSound hurtSound() {
+            return HurtSound.getHurtSoundFromId((config & MASK_HURT_SOUND) >> 8);
+        }
 
         public void setLeftHand(boolean leftHand) {setToggle(leftHand, MASK_LEFT_HAND);}
         public void setCape(boolean cape) {setToggle(cape, MASK_CAPE);}
@@ -1845,9 +1863,47 @@ public abstract class Player
         public void setSleeveRight(boolean sleeveRight) {setToggle(sleeveRight, MASK_OUTER_ARM_RIGHT);}
         public void setPantLeft(boolean pantLeft) {setToggle(pantLeft, MASK_OUTER_LEG_LEFT);}
         public void setPantRight(boolean pantRight) {setToggle(pantRight, MASK_OUTER_LEG_RIGHT);}
+        public void setDevModelEnabled(boolean pantRight) {setToggle(pantRight, MASK_DEV_MODEL);}
+        public void setHurtSound(@NotNull HurtSound hurtSound) {
+            this.config = (short) ((this.config & ~MASK_HURT_SOUND) | ((hurtSound.ordinal() << 8) & MASK_HURT_SOUND));
+            if (listener != null) listener.onValueChange();
+        }
 
         public interface PlayerConfigListener {
             void onValueChange();
         }
+
+        public enum HurtSound {
+            MASCULINE("masculine", "mob.player.masculine.hurt", "mob.player.masculine.death"),
+            FEMININE("feminine", "mob.player.feminine.hurt", "mob.player.feminine.death"),
+            NEUTRAL("neutral", "mob.player.neutral.hurt", "mob.player.neutral.death");
+
+            private static final HurtSound[] hurtSounds = new HurtSound[16];
+            private static int maxHurtSound;
+            static {
+                for (HurtSound sound : values()) {
+                    hurtSounds[sound.ordinal()] = sound;
+                    if (sound.ordinal() > maxHurtSound) maxHurtSound = sound.ordinal();
+                }
+            }
+
+            @NotNull
+            public final String key;
+            @NotNull
+            public final String hurtSound;
+            @NotNull
+            public final String deathSound;
+
+            HurtSound(@NotNull String key, @NotNull String hurtSound, @NotNull String deathSound) {
+                this.key = key;
+                this.hurtSound = hurtSound;
+                this.deathSound = deathSound;
+            }
+
+            public static @NotNull HurtSound getHurtSoundFromId(int id) {
+                if (id < 0 || id > maxHurtSound) return MASCULINE;
+                return hurtSounds[id];
+            }
+        }
     }
 }
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddParticle.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddParticle.java
index 5c1aa9150..4ff21d59b 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddParticle.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddParticle.java
@@ -72,6 +72,7 @@ public class PacketAddParticle extends Packet{
         this.motionX = dis.readDouble();
         this.motionY = dis.readDouble();
         this.motionZ = dis.readDouble();
+        this.data = dis.readInt();
         this.maxDistance = dis.readDouble();
         if (dis.readBoolean()){
             this.isGroup = true;
@@ -96,6 +97,7 @@ public class PacketAddParticle extends Packet{
         dos.writeDouble(motionX);
         dos.writeDouble(motionY);
         dos.writeDouble(motionZ);
+        dos.writeInt(data);
         dos.writeDouble(maxDistance);
         dos.writeBoolean(isGroup);
         if (isGroup){
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java
index 96e1b38d6..2c0f39671 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketAddPlayer.java
@@ -24,7 +24,7 @@ public class PacketAddPlayer extends Packet
     public @Nullable CompoundTag heldObjectTag;
     public String nickname;
     public byte chatColor;
-    public byte playerConfig;
+    public short playerConfig;
     public int gamemode;
 
 
@@ -72,6 +72,7 @@ public class PacketAddPlayer extends Packet
         this.currentItem = dis.readShort();
         this.nickname = readStringUTF16BE(dis, MAX_NICKNAME_SIZE);
         this.chatColor = dis.readByte();
+        this.playerConfig = dis.readShort();
         this.gamemode = Byte.toUnsignedInt(dis.readByte());
 
         if (dis.readByte() == 1) {
@@ -96,6 +97,7 @@ public class PacketAddPlayer extends Packet
         dos.writeShort(this.currentItem);
         writeStringUTF16BE(this.nickname, dos);
         dos.writeByte(this.chatColor);
+        dos.writeShort(this.playerConfig);
         dos.writeByte(this.gamemode & 0xFF);
 
         if (this.heldObjectTag != null) {
diff --git a/game/core/src/main/java/net/minecraft/core/net/packet/PacketPlayerConfig.java b/game/core/src/main/java/net/minecraft/core/net/packet/PacketPlayerConfig.java
index bd5ea3cc2..f7d1d5f6d 100644
--- a/game/core/src/main/java/net/minecraft/core/net/packet/PacketPlayerConfig.java
+++ b/game/core/src/main/java/net/minecraft/core/net/packet/PacketPlayerConfig.java
@@ -9,7 +9,7 @@ import java.io.IOException;
 
 public class PacketPlayerConfig extends Packet {
     public int entityId;
-    public byte config;
+    public short config;
     public PacketPlayerConfig() {}
     public PacketPlayerConfig(Player.PlayerConfig config) {
         this.entityId = -1;
@@ -22,13 +22,13 @@ public class PacketPlayerConfig extends Packet {
     @Override
     public void read(DataInputStream dis) throws IOException {
         entityId = dis.readInt();
-        config = dis.readByte();
+        config = dis.readShort();
     }
 
     @Override
     public void write(DataOutputStream dos) throws IOException {
         dos.writeInt(entityId);
-        dos.writeByte(config);
+        dos.writeShort(config);
     }
 
     @Override
diff --git a/game/core/src/main/resources/assets/minecraft/sounds/sounds.json b/game/core/src/main/resources/assets/minecraft/sounds/sounds.json
index a98d95157..bc67d6a65 100644
--- a/game/core/src/main/resources/assets/minecraft/sounds/sounds.json
+++ b/game/core/src/main/resources/assets/minecraft/sounds/sounds.json
@@ -1,4 +1,49 @@
 {
+  "mob.player.masculine.hurt": {
+    "subtitle": "subtitles.mob.player.hurt",
+    "sounds": [
+      "mob/player/masc_hurt.ogg"
+    ]
+  },
+  "mob.player.masculine.death": {
+    "subtitle": "subtitles.mob.player.death",
+    "sounds": [
+      {
+        "name": "mob.player.masculine.hurt",
+        "type": "event"
+      }
+    ]
+  },
+  "mob.player.feminine.hurt": {
+    "subtitle": "subtitles.mob.player.hurt",
+    "sounds": [
+      "mob/player/fem_hurt.ogg"
+    ]
+  },
+  "mob.player.feminine.death": {
+    "subtitle": "subtitles.mob.player.death",
+    "sounds": [
+      {
+        "name": "mob.player.feminine.hurt",
+        "type": "event"
+      }
+    ]
+  },
+  "mob.player.neutral.hurt": {
+    "subtitle": "subtitles.mob.player.hurt",
+    "sounds": [
+      "mob/player/neutral_hurt.ogg"
+    ]
+  },
+  "mob.player.neutral.death": {
+    "subtitle": "subtitles.mob.player.death",
+    "sounds": [
+      {
+        "name": "mob.player.neutral.hurt",
+        "type": "event"
+      }
+    ]
+  },
   "mob.wolf.bark": {
     "subtitle": "subtitles.mob.wolf.bark",
     "sounds": [
diff --git a/game/core/src/main/resources/lang/en_US/item.lang b/game/core/src/main/resources/lang/en_US/item.lang
index 34869c379..e27a281a7 100644
--- a/game/core/src/main/resources/lang/en_US/item.lang
+++ b/game/core/src/main/resources/lang/en_US/item.lang
@@ -161,7 +161,7 @@ item.food.porkchop.raw.desc=Uncooked meat from a pig.
 item.food.porkchop.cooked.name=Cooked Porkchop
 item.food.porkchop.cooked.desc=Braised meat from a pig. Smoking!
 item.food.venison.raw.name=Raw Venison
-item.food.venison.raw.desc=Uncooked meat from a pig.
+item.food.venison.raw.desc=Uncooked meat from a deer.
 item.food.venison.cooked.name=Cooked Venison
 item.food.venison.cooked.desc=Seared steak from a deer. Delicious!
 item.painting.name=Painting
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 55afa489d..d33a3ee39 100644
--- a/game/core/src/main/resources/lang/en_US/options.lang
+++ b/game/core/src/main/resources/lang/en_US/options.lang
@@ -92,6 +92,8 @@ options.mipmapType.smooth=Smooth
 options.clouds=Clouds
 options.cloudHeight=Cloud Height
 options.cloudHeight.default=Default
+options.entityRenderDistance=Entity Render Distance
+options.entityRenderDistance.default=Default
 options.armorDurabilityOverlay=Armor Durability Overlay
 options.overlayShowCoords=Coordinates
 options.overlayShowDirection=Direction
@@ -228,6 +230,11 @@ options.player.sleeve.left=Left Sleeve
 options.player.sleeve.right=Right Sleeve
 options.player.pant.left=Left Pant Leg
 options.player.pant.right=Right Pant Leg
+options.player.devmodel=Dev Model
+options.player.hurtsound=Hurt Sound
+options.player.hurtsound.masculine=Masculine
+options.player.hurtsound.feminine=Feminine
+options.player.hurtsound.neutral=Neutral
 
 key.attack=Attack
 key.interact=Interact
diff --git a/game/core/src/main/resources/lang/en_US/subtitles.lang b/game/core/src/main/resources/lang/en_US/subtitles.lang
index 665afe394..3f4160498 100644
--- a/game/core/src/main/resources/lang/en_US/subtitles.lang
+++ b/game/core/src/main/resources/lang/en_US/subtitles.lang
@@ -37,6 +37,8 @@ subtitles.mob.spider=Spider hiss
 subtitles.mob.ghast.charge=Ghast charging
 subtitles.mob.slime.attack=Slime attack
 subtitles.mob.slime=Slime plop
+subtitles.mob.player.death=Player death
+subtitles.mob.player.hurt=Player hurt
 
 subtitles.fall.small=Small fall
 subtitles.damage.fall.big=Big fall
diff --git a/game/server/src/main/java/net/minecraft/server/MinecraftServer.java b/game/server/src/main/java/net/minecraft/server/MinecraftServer.java
index c2a7a3597..dc2752fda 100644
--- a/game/server/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/game/server/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -869,6 +869,10 @@ public class MinecraftServer
                     pointer++;
                     break;
                 }
+                case "--debug": {
+                    Global.DEBUG_MODE = true;
+                    break;
+                }
                 case "--offline": {
                     offline = true;
                     pointer++;
