diff --git a/game/client/src/main/java/net/minecraft/client/GLAllocation.java b/game/client/src/main/java/net/minecraft/client/GLAllocation.java
index a21921e5f..91378c500 100644
--- a/game/client/src/main/java/net/minecraft/client/GLAllocation.java
+++ b/game/client/src/main/java/net/minecraft/client/GLAllocation.java
@@ -5,7 +5,7 @@ import java.nio.*;
 import it.unimi.dsi.fastutil.ints.IntArrayList;
 import it.unimi.dsi.fastutil.ints.IntList;
 import org.lwjgl.BufferUtils;
-import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL41;
 
 public class GLAllocation {
 	
@@ -14,13 +14,13 @@ public class GLAllocation {
 	public GLAllocation() {}
 
 	public static synchronized int generateTexture() {
-		int tex = GL11.glGenTextures();
+		int tex = GL41.glGenTextures();
 		textureNames.add(tex);
 		return tex;
 	}
 	
 	public static synchronized void deleteTexture(int tex) {
-		GL11.glDeleteTextures(tex);
+		GL41.glDeleteTextures(tex);
 		for (int i = 0; i < textureNames.size(); i++) {
 			if (textureNames.getInt(i) == tex) {
 				textureNames.removeInt(i);
@@ -37,7 +37,7 @@ public class GLAllocation {
 		}
 
 		intbuffer.flip();
-		GL11.glDeleteTextures(intbuffer);
+		GL41.glDeleteTextures(intbuffer);
 		textureNames.clear();
 	}
 }
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 0031d1dff..c4d9a4201 100644
--- a/game/client/src/main/java/net/minecraft/client/Minecraft.java
+++ b/game/client/src/main/java/net/minecraft/client/Minecraft.java
@@ -571,13 +571,9 @@ public class Minecraft
         LOGGER.info("Setting up OpenGL values...");
 
         OpenGLHelper.checkError("pre startup");
-//        glEnable(GL11.GL_TEXTURE_2D);
-//        glShadeModel(GL11.GL_SMOOTH);
         GL41.glClearDepth(1.0D);
         GLRenderer.enableState(State.DEPTH_TEST);
         GLRenderer.setDepthFunc(CompareFunc.LESS_EQUAL);
-//        glEnable(GL11.GL_ALPHA_TEST);
-//        glAlphaFunc(GL11.GL_GREATER, 0.1F);
         GLRenderer.setCullFace(CullFace.BACK);
         GLRenderer.projectionM4f().identity();
         GLRenderer.viewM4f().identity();
@@ -758,10 +754,6 @@ public class Minecraft
         GL41.glViewport(0, 0, this.gameWindow.getWidthPixels(), this.gameWindow.getHeightPixels());
         GL41.glClearColor(0.0F, 0.0F, 0.0F, 0.0F);
 
-//        glDisable(GL11.GL_LIGHTING);
-//        glEnable(GL11.GL_TEXTURE_2D);
-//        glDisable(GL11.GL_FOG);
-
         if (this.mojrand == 0) {
             this.textureManager.loadTexture("/assets/minecraft/textures/gui/title/majonk.png").bind();
         }
@@ -785,10 +777,6 @@ public class Minecraft
 
         drawMojangLogoVertices(t, (this.resolution.getScaledWidthScreenCoords() - width) / 2, (this.resolution.getScaledHeightScreenCoords() - height) / 2, 0, 0, width, height);
 
-//        glDisable(GL11.GL_LIGHTING);
-//        glDisable(GL11.GL_FOG);
-//        glEnable(GL11.GL_ALPHA_TEST);
-//        glAlphaFunc(GL_GREATER, 0.1F);
         this.gameWindow.update();
     }
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ControllerGlyphElement.java b/game/client/src/main/java/net/minecraft/client/gui/ControllerGlyphElement.java
index bcdeb7118..d5e5a6484 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ControllerGlyphElement.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ControllerGlyphElement.java
@@ -68,8 +68,6 @@ public class ControllerGlyphElement extends Gui {
             this.minecraft.textureManager.loadTexture("/assets/minecraft/textures/gui/controller/" + controller.getType().getAssetName() + ".png").bind();
         }
 
-//        GL11.glEnable(GL11.GL_TEXTURE_2D);
-
         drawTexturedModalRect(x, y, glyph.getU(), glyph.getV(), GLYPH_WIDTH, GLYPH_HEIGHT);
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ExceptionPopupElement.java b/game/client/src/main/java/net/minecraft/client/gui/ExceptionPopupElement.java
index 8401570ee..43f6dd3c9 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ExceptionPopupElement.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ExceptionPopupElement.java
@@ -31,7 +31,6 @@ public class ExceptionPopupElement {
             s.append("Java: ").append(System.getProperty("java.version")).append(", ").append(System.getProperty("java.vendor")).append("\n");
             s.append("VM: ").append(System.getProperty("java.vm.name")).append(" (").append(System.getProperty("java.vm.info")).append("), ").append(System.getProperty("java.vm.vendor")).append("\n");
             s.append("LWJGL: ").append(Sys.getVersion()).append("\n");
-            //s1 = GL11.glGetString(GL41.GL_VENDOR);
             s.append("OpenGL: ").append(GL41.glGetString(GL41.GL_RENDERER)).append(" version ").append(GL41.glGetString(GL41.GL_VERSION)).append(", ").append(GL41.glGetString(GL41.GL_VENDOR)).append("\n\n");
         } catch (Throwable throwable) {
             s.append("[failed to get system properties (").append(throwable).append(")]\n\n");
@@ -66,7 +65,6 @@ public class ExceptionPopupElement {
             s.append("Java: ").append(System.getProperty("java.version")).append(", ").append(System.getProperty("java.vendor")).append("\n");
             s.append("VM: ").append(System.getProperty("java.vm.name")).append(" (").append(System.getProperty("java.vm.info")).append("), ").append(System.getProperty("java.vm.vendor")).append("\n");
             s.append("LWJGL: ").append(Sys.getVersion()).append("\n");
-            //s1 = GL11.glGetString(GL41.GL_VENDOR);
             s.append("OpenGL: ").append(GL41.glGetString(GL41.GL_RENDERER)).append(" version ").append(GL41.glGetString(GL41.GL_VERSION)).append(", ").append(GL41.glGetString(GL41.GL_VENDOR)).append("\n\n");
         } catch (Throwable throwable) {
             s.append("[failed to get system properties (").append(throwable).append(")]\n\n");
diff --git a/game/client/src/main/java/net/minecraft/client/gui/Gui.java b/game/client/src/main/java/net/minecraft/client/gui/Gui.java
index a32fcd029..501e00cbe 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/Gui.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/Gui.java
@@ -168,9 +168,7 @@ public class Gui {
         GLRenderer.pushFrame();
         GLRenderer.setShader(Shaders.COLOR);
         GLRenderer.enableState(State.BLEND);
-//        GL11.glDisable(GL_ALPHA_TEST);
         GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
-//        GL11.glShadeModel(GL_SMOOTH);
         final TessellatorGeneral tessellator = GLRenderer.getTessellator();
         tessellator.startDrawingQuads();
         tessellator.setColor4f(r1, g1, b1, a1);
@@ -180,9 +178,7 @@ public class Gui {
         tessellator.addVertex(minX, maxY, 0.0D);
         tessellator.addVertex(maxX, maxY, 0.0D);
         tessellator.draw();
-//        GL11.glShadeModel(GL_FLAT);
         GLRenderer.disableState(State.BLEND);
-//        GL11.glEnable(GL_ALPHA_TEST);
         GLRenderer.popFrame();
     }
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ItemElement.java b/game/client/src/main/java/net/minecraft/client/gui/ItemElement.java
index 5123037c4..12e03ff40 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ItemElement.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ItemElement.java
@@ -30,7 +30,6 @@ public class ItemElement extends Gui {
         // Do setup
         Lighting.enableInventoryLight();
         GLRenderer.setColor4f(1f, 1f, 1f, 1f);
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
 
         // Draw slot background
         if (slot != null) {
@@ -95,7 +94,6 @@ public class ItemElement extends Gui {
         }
 
         // Clean up
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         Lighting.disable();
         GLRenderer.disableState(State.DEPTH_TEST);
     }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/Screen.java b/game/client/src/main/java/net/minecraft/client/gui/Screen.java
index 32d85eb37..0e9676970 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/Screen.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/Screen.java
@@ -171,7 +171,6 @@ public abstract class Screen extends Gui {
 
     public void renderTexturedBackground() {
         GLRenderer.globalSetLightEnabled(false);
-//        GL11.glDisable(GL11.GL_FOG);
         final TessellatorGeneral tessellator = GLRenderer.getTessellator();
         this.mc.textureManager.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
         GLRenderer.setColor4f(1f, 1f, 1f, 1f);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenHudDesigner.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenHudDesigner.java
index 3adbb7fc2..37d35421e 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenHudDesigner.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenHudDesigner.java
@@ -273,7 +273,6 @@ public class ScreenHudDesigner
     public void renderTexturedBackground() {
         super.renderTexturedBackground();
         GLRenderer.globalSetLightEnabled(false);
-//        GL11.glDisable(GL11.GL_FOG);
         TessellatorGeneral tessellator = GLRenderer.getTessellator();
         this.mc.textureManager.loadTexture("/assets/minecraft/textures/gui/designer_bg.png").bind();
         GLRenderer.setColor4f(1.0F, 1.0F, 1.0F, 1.0F);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScreenStats.java b/game/client/src/main/java/net/minecraft/client/gui/ScreenStats.java
index c61d9f810..055f1240d 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScreenStats.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScreenStats.java
@@ -92,12 +92,10 @@ public class ScreenStats extends Screen {
 
     private void renderItemAsIcon(int x, int y, int itemID) {
         renderBackgroundIcon(x + 1, y + 1);
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         Lighting.enableInventoryLight();
         Item item = Item.itemsList[itemID];
         ItemModelDispatcher.getInstance().getDispatch(item).renderGui(GLRenderer.getTessellator(), null, item.getDefaultStack(), x + 2, y + 2, LightmapHelper.getLightmapCoord(15, 15), 1f);
         Lighting.disable();
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
     }
 
     private void renderBackgroundIcon(int x, int y) {
@@ -209,9 +207,6 @@ public class ScreenStats extends Screen {
 
         @Override
         protected void renderDecorations(int x, int y) {
-//            GL11.glEnable(GL11.GL_TEXTURE_2D);
-//            GL11.glShadeModel(GL11.GL_FLAT);
-//            GL11.glEnable(GL11.GL_ALPHA_TEST);
             try {
                 GLRenderer.pushFrame();
                 GLRenderer.setShader(Shaders.INTERFACE);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/ScrolledSelectionList.java b/game/client/src/main/java/net/minecraft/client/gui/ScrolledSelectionList.java
index 88681190c..4dd1d0c83 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/ScrolledSelectionList.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/ScrolledSelectionList.java
@@ -164,7 +164,6 @@ public abstract class ScrolledSelectionList {
 
         capYPosition();
         GLRenderer.globalSetLightEnabled(false);
-//        GL11.glDisable(GL11.GL_FOG);
         TessellatorGeneral tessellator = GLRenderer.getTessellator();
         this.minecraft.textureManager.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
         GLRenderer.setColor4f(1.0F, 1.0F, 1.0F, 1.0F);
@@ -216,8 +215,6 @@ public abstract class ScrolledSelectionList {
         renderHoleBackground(this.y1, this.height, 255, 255);
         GLRenderer.enableState(State.BLEND);
         GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
-//        GL11.glDisable(GL11.GL_ALPHA_TEST);
-//        GL11.glShadeModel(GL11.GL_SMOOTH);
         GLRenderer.pushFrame();
         GLRenderer.setShader(Shaders.COLOR);
         tessellator.startDrawingQuads();
@@ -271,8 +268,6 @@ public abstract class ScrolledSelectionList {
         }
         renderDecorations(x, y);
         GLRenderer.popFrame();
-//        GL11.glShadeModel(GL11.GL_FLAT);
-//        GL11.glEnable(GL11.GL_ALPHA_TEST);
         GLRenderer.disableState(State.BLEND);
     }
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java b/game/client/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java
index 6bc6a97b5..e0a5ada27 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/achievements/ScreenAchievements.java
@@ -330,9 +330,6 @@ public class ScreenAchievements extends Screen
 
         GLRenderer.enableState(State.BLEND);
         GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
-//        GL11.glDisable(GL11.GL_ALPHA_TEST);
-//        GL11.glShadeModel(GL11.GL_SMOOTH);
-//        GL11.glEnable(GL11.GL_TEXTURE_2D);
 
         super.render(mx, my, partialTick); // Draw Buttons
         GLRenderer.enableState(State.DEPTH_TEST);
@@ -341,9 +338,6 @@ public class ScreenAchievements extends Screen
 
         GLRenderer.globalSetLightEnabled(false);
         GLRenderer.disableState(State.DEPTH_TEST);
-//        GL11.glEnable(GL11.GL_TEXTURE_2D);
-//        GL11.glShadeModel(GL11.GL_FLAT);
-//        GL11.glEnable(GL11.GL_ALPHA_TEST);
 
         if (drawSidebar()){
             Scissor.enable(this.pageListLeft, this.top, this.pageListRight - this.pageListLeft, this.bottom - this.top);
@@ -365,8 +359,6 @@ public class ScreenAchievements extends Screen
             GLRenderer.setShader(Shaders.COLOR);
             GLRenderer.enableState(State.BLEND);
             GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
-//            GL11.glDisable(GL11.GL_ALPHA_TEST);
-//            GL11.glShadeModel(GL11.GL_SMOOTH);
 
             byte fadeDist = 4;
             TessellatorGeneral tessellator = GLRenderer.getTessellator();
@@ -480,10 +472,7 @@ public class ScreenAchievements extends Screen
         GLRenderer.pushFrame();
         GLRenderer.modelM4f().translate(0, 0, -200F);
         Scissor.enable(this.viewportLeft, this.viewportTop, this.viewportWidth, this.viewportHeight);
-//        GL11.glEnable(GL11.GL_TEXTURE_2D);
         GLRenderer.globalSetLightEnabled(false);
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
-//        GL11.glEnable(GL11.GL_COLOR_MATERIAL);
         drawRectDouble(this.viewportLeft, this.viewportTop, this.viewportRight, this.viewportBottom, 0xFF000000 | this.currentPage.backgroundColor()); // Ensures that the viewport always has a background of some kind
 
         GLRenderer.pushFrame();
@@ -495,8 +484,6 @@ public class ScreenAchievements extends Screen
 
         Lighting.enableInventoryLight();
         GLRenderer.globalSetLightEnabled(false);
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
-//        GL11.glEnable(GL11.GL_COLOR_MATERIAL);
         this.hoveredAchievement = drawAchievementIcons(mouseX, mouseY, shiftX, shiftY);
 
         GLRenderer.popFrame();
diff --git a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenInventory.java b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenInventory.java
index 47d3a97d4..00e62e2f1 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenInventory.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenInventory.java
@@ -252,8 +252,6 @@ public class ScreenInventory extends ScreenContainerAbstract {
         int k = (this.height - this.ySize) / 2;
         drawTexturedModalRect(j, k, 0, 0, this.xSize, this.ySize);
 
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
-//        GL11.glEnable(GL11.GL_COLOR_MATERIAL);
         GLRenderer.pushFrame();
         GLRenderer.setShader(Shaders.WORLD);
         GLRenderer.getFogState().disable();
@@ -287,7 +285,6 @@ public class ScreenInventory extends ScreenContainerAbstract {
         this.mc.thePlayer.xRot = f4;
         GLRenderer.popFrame();
         Lighting.disable();
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
     }
 
     @Override
diff --git a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenInventoryCreative.java b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenInventoryCreative.java
index 91b920e26..8e010b1e5 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenInventoryCreative.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenInventoryCreative.java
@@ -166,8 +166,6 @@ public class ScreenInventoryCreative extends ScreenInventory implements ITextCha
         this.searchField.yPosition = y + 7;
         drawTexturedModalRect(x, (double) y, 0, 0, this.xSize, this.ySize, this.xSize / 2, this.ySize / 2);
 
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
-//        GL11.glEnable(GL11.GL_COLOR_MATERIAL);
         GLRenderer.pushFrame();
         GLRenderer.enableState(State.DEPTH_TEST);
         GLRenderer.setShader(Shaders.WORLD);
@@ -201,7 +199,6 @@ public class ScreenInventoryCreative extends ScreenInventory implements ITextCha
         this.mc.thePlayer.xRot = f4;
         GLRenderer.popFrame();
         Lighting.disable();
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         this.searchField.drawTextBox();
     }
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenTrommel.java b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenTrommel.java
index 7ba7105f2..3442f0131 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/container/ScreenTrommel.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/container/ScreenTrommel.java
@@ -5,7 +5,6 @@ import net.minecraft.core.block.entity.TileEntityTrommel;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.player.inventory.container.ContainerInventory;
 import net.minecraft.core.player.inventory.menu.MenuTrommel;
-import org.lwjgl.opengl.GL11;
 
 public class ScreenTrommel extends ScreenContainerAbstract {
     private final TileEntityTrommel trommelInventory;
diff --git a/game/client/src/main/java/net/minecraft/client/gui/guidebook/GuidebookPage.java b/game/client/src/main/java/net/minecraft/client/gui/guidebook/GuidebookPage.java
index 4560d6fa7..605338140 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/guidebook/GuidebookPage.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/guidebook/GuidebookPage.java
@@ -6,7 +6,6 @@ import net.minecraft.client.render.font.FontRenderer;
 import net.minecraft.client.render.renderer.GLRenderer;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.util.helper.Color;
-import org.lwjgl.opengl.GL11;
 
 public abstract class GuidebookPage
     extends Gui {
diff --git a/game/client/src/main/java/net/minecraft/client/gui/guidebook/ScreenGuidebook.java b/game/client/src/main/java/net/minecraft/client/gui/guidebook/ScreenGuidebook.java
index cfea9c8e4..c3caa69e5 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/guidebook/ScreenGuidebook.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/guidebook/ScreenGuidebook.java
@@ -563,14 +563,11 @@ public class ScreenGuidebook
                 GLRenderer.setDepthMask(true);
                 Lighting.enableInventoryLight();
                 GLRenderer.setColor4f(1, 1, 1, 1);
-//                GL11.glEnable(GL12.GL_RESCALE_NORMAL);
 
                 GLRenderer.enableState(State.DEPTH_TEST);
-//                ItemModelDispatcher.getInstance().getDispatch(icon).renderItemIntoGui(GLRenderer.getTessellator(), fr, re, icon, x + iconOffset + xo, y + 4, 1.0f);
                 ItemModelDispatcher.getInstance().getDispatch(icon).renderGui(GLRenderer.getTessellator(), null, icon, this.x + iconOffset + xo, this.y + 4, LightmapHelper.getLightmapCoord(15, 15), 1f);
                 GLRenderer.disableState(State.DEPTH_TEST);
 
-//                GL11.glDisable(GL12.GL_RESCALE_NORMAL);
                 Lighting.disable();
                 GLRenderer.globalSetLightEnabled(false);
                 GLRenderer.disableState(State.DEPTH_TEST);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/guidebook/mobs/GuidebookPageMob.java b/game/client/src/main/java/net/minecraft/client/gui/guidebook/mobs/GuidebookPageMob.java
index 885d0090c..f9d5ccfa4 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/guidebook/mobs/GuidebookPageMob.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/guidebook/mobs/GuidebookPageMob.java
@@ -242,8 +242,6 @@ public class GuidebookPageMob
 
         Scissor.enable(x + 9, y + 9, 52, 70);
 
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
-//        GL11.glEnable(GL11.GL_COLOR_MATERIAL);
         GLRenderer.enableState(State.DEPTH_TEST);
         GLRenderer.pushFrame();
         GLRenderer.setShader(Shaders.WORLD);
@@ -267,7 +265,6 @@ public class GuidebookPageMob
         EntityRendererDispatcher.instance.renderEntityPreviewWithPosYaw(GLRenderer.getTessellator(), this.example, 0.0D, 0.0D, 0.0D, 0.0F, 1.0F);
         GLRenderer.popFrame();
         Lighting.disable();
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         GLRenderer.disableState(State.DEPTH_TEST);
 
         Scissor.disable();
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 c7c42233c..c648dd819 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
@@ -126,10 +126,8 @@ public class HudIngame extends Gui {
 
         //Sleep Overlay
         Lighting.disable();
-//        GL11.glDisable(GL_RESCALE_NORMAL);
         if (this.mc.thePlayer.getSleepTimer() > 0) {
             GLRenderer.disableState(State.DEPTH_TEST);
-//            GL11.glDisable(GL_ALPHA_TEST);
             int i2 = this.mc.thePlayer.getSleepTimer();
             float f3 = (float) i2 / 100F;
             if (f3 > 1.0F) {
@@ -137,7 +135,6 @@ public class HudIngame extends Gui {
             }
             int j4 = (int) (220F * f3) << 24 | 0x101020;
             drawRect(0, 0, width, height, j4);
-//            GL11.glEnable(GL_ALPHA_TEST);
             GLRenderer.enableState(State.DEPTH_TEST);
         }
 
@@ -577,7 +574,6 @@ public class HudIngame extends Gui {
 
         GLRenderer.enableState(State.BLEND);
         GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
-//        GL11.glDisable(GL_ALPHA_TEST);
         GLRenderer.pushFrame();
         GLRenderer.modelM4f().translate(0.0F, height - 48, 0.0F);
         int y = -12;
@@ -613,7 +609,6 @@ public class HudIngame extends Gui {
         }
 
         GLRenderer.popFrame();
-//        GL11.glEnable(GL_ALPHA_TEST);
         GLRenderer.disableState(State.BLEND);
     }
 
@@ -645,7 +640,6 @@ public class HudIngame extends Gui {
         GLRenderer.setDepthMask(false);
         GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
         GLRenderer.setColor4f(1.0F, 1.0F, 1.0F, 1.0F);
-//        GL11.glDisable(GL_ALPHA_TEST);
         this.mc.textureManager.loadTexture("/assets/minecraft/textures/misc/pumpkinblur.png").bind();
         TessellatorGeneral tessellator = GLRenderer.getTessellator();
         tessellator.startDrawingQuads();
@@ -656,7 +650,6 @@ public class HudIngame extends Gui {
         tessellator.draw();
         GLRenderer.setDepthMask(true);
         GLRenderer.enableState(State.DEPTH_TEST);
-//        GL11.glEnable(GL_ALPHA_TEST);
         GLRenderer.setColor4f(1.0F, 1.0F, 1.0F, 1.0F);
     }
 
@@ -687,7 +680,6 @@ public class HudIngame extends Gui {
             intensity *= intensity;
             intensity = intensity * 0.8F + 0.2F;
         }
-//        GL11.glDisable(GL_ALPHA_TEST);
         GLRenderer.disableState(State.DEPTH_TEST);
         GLRenderer.setDepthMask(false);
         GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
@@ -707,7 +699,6 @@ public class HudIngame extends Gui {
         tessellator.draw();
         GLRenderer.setDepthMask(true);
         GLRenderer.enableState(State.DEPTH_TEST);
-//        GL11.glEnable(GL_ALPHA_TEST);
         GLRenderer.setColor4f(1.0F, 1.0F, 1.0F, 1.0F);
     }
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngameDoom.java b/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngameDoom.java
index 9293c965c..9b49a334d 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngameDoom.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/hud/HudIngameDoom.java
@@ -211,9 +211,6 @@ public class HudIngameDoom
     }
 
     private void drawHotbarIndicator() {
-//        GLRenderer.setColor4f(1f, 1f, 1f, 1f);
-//        GL11.glBindTexture(GL11.GL_TEXTURE_2D, mc.renderEngine.getTexture("/assets/minecraft/textures/gui/doom.png"));
-
         int width = this.mc.resolution.getScaledWidthScreenCoords();
         int height = this.mc.resolution.getScaledHeightScreenCoords();
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentCrosshair.java b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentCrosshair.java
index 080de3209..525ae7d04 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentCrosshair.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentCrosshair.java
@@ -7,7 +7,6 @@ import net.minecraft.client.render.renderer.BlendFactor;
 import net.minecraft.client.render.renderer.GLRenderer;
 import net.minecraft.client.render.renderer.State;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
-import org.lwjgl.opengl.GL11;
 
 public class HudComponentCrosshair
     extends HudComponent {
diff --git a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentHeldItemCount.java b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentHeldItemCount.java
index 8ead0c6b7..070a574ca 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentHeldItemCount.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentHeldItemCount.java
@@ -70,7 +70,6 @@ public class HudComponentHeldItemCount
             if (renderItem) {
                 GLRenderer.enableState(State.DEPTH_TEST);
                 GLRenderer.disableState(State.BLEND);
-//                GL11.glEnable(GL12.GL_RESCALE_NORMAL);
                 Lighting.enableInventoryLight();
                 ItemModelDispatcher.getInstance().getDispatch(heldItemStack).renderGui(GLRenderer.getTessellator(), null, heldItemStack, xx, yy, LightmapHelper.getLightmapCoord(15, 15), partialTick);
                 Lighting.disable();
@@ -93,7 +92,6 @@ public class HudComponentHeldItemCount
 
         GLRenderer.enableState(State.DEPTH_TEST);
         GLRenderer.disableState(State.BLEND);
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         Lighting.enableInventoryLight();
         ItemModelDispatcher.getInstance().getDispatch(heldItemStack).renderGui(GLRenderer.getTessellator(), null, heldItemStack, xx, yy, LightmapHelper.getLightmapCoord(15, 15), 0.0f);
         Lighting.disable();
diff --git a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentHotbar.java b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentHotbar.java
index a57d71a1e..95f9bce85 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentHotbar.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentHotbar.java
@@ -74,7 +74,6 @@ public class HudComponentHotbar
         // Setup items
         GLRenderer.enableState(State.DEPTH_TEST);
         GLRenderer.enableState(State.BLEND);
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         Lighting.enableInventoryLight();
         int lastHotbarStart = (mc.thePlayer.inventory.getHotbarOffset() + 27) % 36;
         int nextHotbarStart = (mc.thePlayer.inventory.getHotbarOffset() + 9) % 36;
@@ -166,7 +165,6 @@ public class HudComponentHotbar
         // Setup items
         GLRenderer.enableState(State.DEPTH_TEST);
         GLRenderer.enableState(State.BLEND);
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         Lighting.enableInventoryLight();
 
         // Render hotbar items
diff --git a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentSubtitles.java b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentSubtitles.java
index 04ff0a8bd..d458922b9 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentSubtitles.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentSubtitles.java
@@ -68,7 +68,6 @@ public class HudComponentSubtitles extends HudComponentMovable {
 
         GLRenderer.enableState(State.BLEND);
         GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
-//        GL11.glDisable(GL_ALPHA_TEST);
         for (int i = 0; i < subtitleEntries.size() && i < messagesToShow; i++)
         {
             SubtitleTracker.SubtitleEntry entry = subtitleEntries.get(i);
@@ -113,7 +112,6 @@ public class HudComponentSubtitles extends HudComponentMovable {
                 }
             }
         }
-//        GL11.glEnable(GL_ALPHA_TEST);
         GLRenderer.disableState(State.BLEND);
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentVehicleHealthBar.java b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentVehicleHealthBar.java
index 1d9fb6105..3ab76caad 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentVehicleHealthBar.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/hud/component/HudComponentVehicleHealthBar.java
@@ -8,7 +8,6 @@ import net.minecraft.client.render.renderer.State;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.util.helper.MathHelper;
-import org.lwjgl.opengl.GL11;
 
 import java.util.Random;
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/keyboard/ScreenKeyboard.java b/game/client/src/main/java/net/minecraft/client/gui/keyboard/ScreenKeyboard.java
index 6eefe9f74..fd3e0b839 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/keyboard/ScreenKeyboard.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/keyboard/ScreenKeyboard.java
@@ -14,7 +14,6 @@ import net.minecraft.core.util.helper.MathHelper;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.input.Keyboard;
-import org.lwjgl.opengl.GL11;
 
 import java.util.Arrays;
 import java.util.HashMap;
diff --git a/game/client/src/main/java/net/minecraft/client/gui/keyboard/keys/CharKey.java b/game/client/src/main/java/net/minecraft/client/gui/keyboard/keys/CharKey.java
index f8f5a5f80..fc5242ec2 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/keyboard/keys/CharKey.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/keyboard/keys/CharKey.java
@@ -18,7 +18,6 @@ import net.minecraft.core.util.helper.MathHelper;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.lwjgl.input.Keyboard;
-import org.lwjgl.opengl.GL11;
 
 import java.lang.reflect.Type;
 import java.util.ArrayList;
@@ -74,7 +73,7 @@ public class CharKey extends Key {
             double animProgress = MathHelper.clamp((getHoldTime() - EXTRAS_HOLD_LENGTH) / 100d, 0, 1);
             GLRenderer.pushFrame();
             GLRenderer.enableState(State.BLEND);
-            GL11.glEnable(GL11.GL_DEPTH_TEST);
+            GLRenderer.enableState(State.DEPTH_TEST);
             GLRenderer.modelM4f().translate(0, 0, 10);
 
             final int size = (int) (64 * animProgress);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/keyboard/keys/Key.java b/game/client/src/main/java/net/minecraft/client/gui/keyboard/keys/Key.java
index 94942e0d9..798e60027 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/keyboard/keys/Key.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/keyboard/keys/Key.java
@@ -21,7 +21,6 @@ import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.sound.SoundCategory;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import org.lwjgl.opengl.GL11;
 
 import java.lang.reflect.Type;
 import java.util.HashMap;
diff --git a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/ScreenModelViewer.java b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/ScreenModelViewer.java
index 169eb5803..273614ceb 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/modelviewer/ScreenModelViewer.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/modelviewer/ScreenModelViewer.java
@@ -42,14 +42,14 @@ import java.util.Date;
 import java.util.List;
 import java.util.Locale;
 
-import static org.lwjgl.opengl.GL11.GL_RGBA;
-import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
-import static org.lwjgl.opengl.GL11.GL_TEXTURE_HEIGHT;
-import static org.lwjgl.opengl.GL11.GL_TEXTURE_WIDTH;
-import static org.lwjgl.opengl.GL11.GL_UNSIGNED_BYTE;
-import static org.lwjgl.opengl.GL11.glGetError;
-import static org.lwjgl.opengl.GL11.glGetTexImage;
-import static org.lwjgl.opengl.GL11.glGetTexLevelParameteri;
+import static org.lwjgl.opengl.GL41.GL_RGBA;
+import static org.lwjgl.opengl.GL41.GL_TEXTURE_2D;
+import static org.lwjgl.opengl.GL41.GL_TEXTURE_HEIGHT;
+import static org.lwjgl.opengl.GL41.GL_TEXTURE_WIDTH;
+import static org.lwjgl.opengl.GL41.GL_UNSIGNED_BYTE;
+import static org.lwjgl.opengl.GL41.glGetError;
+import static org.lwjgl.opengl.GL41.glGetTexImage;
+import static org.lwjgl.opengl.GL41.glGetTexLevelParameteri;
 
 public class ScreenModelViewer extends ScreenPhotoMode implements ListenerTextFieldElement.ITextChangeListener {
     private static final Logger LOGGER = LogUtils.getLogger();
diff --git a/game/client/src/main/java/net/minecraft/client/gui/nbteditor/ScreenNBTEditor.java b/game/client/src/main/java/net/minecraft/client/gui/nbteditor/ScreenNBTEditor.java
index 372f7bb87..282ba17fd 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/nbteditor/ScreenNBTEditor.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/nbteditor/ScreenNBTEditor.java
@@ -67,10 +67,8 @@ public class ScreenNBTEditor extends Screen {
             int popupY = this.height / 2 - popupHeight / 2;
 
             GLRenderer.globalSetLightEnabled(false);
-//            GL11.glDisable(GL11.GL_FOG);
             GLRenderer.setColor4f(1.0F, 1.0F, 1.0F, 1.0F);
 
-//            GL11.glEnable(GL11.GL_TEXTURE_2D);
             float f = 32F;
             t.startDrawingQuads();
             this.mc.textureManager.loadTexture("/assets/minecraft/textures/gui/background.png").bind();
diff --git a/game/client/src/main/java/net/minecraft/client/gui/options/ScreenOptions.java b/game/client/src/main/java/net/minecraft/client/gui/options/ScreenOptions.java
index 33b7a21cd..c1694d823 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/options/ScreenOptions.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/options/ScreenOptions.java
@@ -285,8 +285,6 @@ public class ScreenOptions
         if (this.mc.currentWorld == null) {
 
             int shadowSize = 4;
-//            GL11.glDisable(GL_ALPHA_TEST);
-//            GL11.glShadeModel(GL_SMOOTH);
 
             GLRenderer.pushFrame();
             GLRenderer.setShader(Shaders.COLOR);
@@ -313,8 +311,6 @@ public class ScreenOptions
             tessellator.draw();
 
             GLRenderer.popFrame();
-//            GL11.glShadeModel(GL_FLAT);
-//            GL11.glEnable(GL_ALPHA_TEST);
         }
 
         overlayBackground(this.pagesListWidth, this.pagesListWidth + SEPARATOR_WIDTH, this.top, this.bottom);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/paged/ScreenPaged.java b/game/client/src/main/java/net/minecraft/client/gui/paged/ScreenPaged.java
index 4a94b27a9..f68d4b21a 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/paged/ScreenPaged.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/paged/ScreenPaged.java
@@ -243,9 +243,6 @@ public class ScreenPaged
 
         // Draw shadows
         if (this.mc.currentWorld == null) {
-//            GL11.glDisable(GL_ALPHA_TEST);
-//            GL11.glShadeModel(GL_SMOOTH);
-
             GLRenderer.pushFrame();
             GLRenderer.disableState(State.DEPTH_TEST);
             GLRenderer.enableState(State.BLEND);
@@ -271,9 +268,6 @@ public class ScreenPaged
             tessellator.addVertexWithUV(0, this.bottom - shadowSize, 0.0D, 0.0D, 0.0D);
             tessellator.draw();
             GLRenderer.popFrame();
-
-//            GL11.glShadeModel(GL_FLAT);
-//            GL11.glEnable(GL_ALPHA_TEST);
         }
 
         this.overlayBackground(this.leftWidth, this.leftWidth + SEPARATOR_WIDTH, this.top, this.bottom);
diff --git a/game/client/src/main/java/net/minecraft/client/gui/popup/ListComponent.java b/game/client/src/main/java/net/minecraft/client/gui/popup/ListComponent.java
index 1367f34a7..9cecac3bd 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/popup/ListComponent.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/popup/ListComponent.java
@@ -106,9 +106,10 @@ public class ListComponent
         this.drawBackground(x, y);
         this.drawScrollbar(x, y, mouseY);
 
-        Scissor.enable(x + 1, y + 1, this.getWidth() - 2, this.getHeight() - 2);
         GLRenderer.popFrame();
 
+        Scissor.enable(x + 1, y + 1, this.getWidth() - 2, this.getHeight() - 2);
+
         // Draw buttons
         for (int i = 0; i < this.buttons.length; i++) {
             if (this.canScroll()) {
diff --git a/game/client/src/main/java/net/minecraft/client/gui/popup/PopupScreen.java b/game/client/src/main/java/net/minecraft/client/gui/popup/PopupScreen.java
index d6ba8acd5..4c37a4cbd 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/popup/PopupScreen.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/popup/PopupScreen.java
@@ -166,7 +166,6 @@ public final class PopupScreen
         final int popupY = this.height / 2 - this.popupHeight / 2;
 
         GLRenderer.globalSetLightEnabled(false);
-//        GL11.glDisable(GL11.GL_FOG);
         final @NotNull TessellatorGeneral tessellator = GLRenderer.getTessellator();
         GLRenderer.setColor4f(1.0F, 1.0F, 1.0F, 1.0F);
 
diff --git a/game/client/src/main/java/net/minecraft/client/gui/toasts/GuiElementToastsHud.java b/game/client/src/main/java/net/minecraft/client/gui/toasts/GuiElementToastsHud.java
index aa83e367f..95f0b5379 100644
--- a/game/client/src/main/java/net/minecraft/client/gui/toasts/GuiElementToastsHud.java
+++ b/game/client/src/main/java/net/minecraft/client/gui/toasts/GuiElementToastsHud.java
@@ -151,7 +151,6 @@ public class GuiElementToastsHud extends Gui {
         }
         GLRenderer.disableState(State.BLEND);
 
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         Lighting.disable();
         GLRenderer.globalSetLightEnabled(false);
         GLRenderer.disableState(State.DEPTH_TEST);
@@ -171,11 +170,9 @@ public class GuiElementToastsHud extends Gui {
         GLRenderer.setDepthMask(true);
         Lighting.enableInventoryLight();
         GLRenderer.setColor4f(1, 1, 1, 1);
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
 
         GLRenderer.enableState(State.DEPTH_TEST);
         ItemStack icon = toast.getIcon(duration);
-//        ItemModelDispatcher.getInstance().getDispatch(icon).renderItemIntoGui(GLRenderer.getTessellator(), mc.font, mc.textureManager, icon, x + 8, y + 8, 1.0f);
         if (icon != null) ItemModelDispatcher.getInstance().getDispatch(icon).renderGui(GLRenderer.getTessellator(), null, icon, x + 8, y + 8, LightmapHelper.getLightmapCoord(15, 15), 1.0f);
         GLRenderer.disableState(State.DEPTH_TEST);
     }
diff --git a/game/client/src/main/java/net/minecraft/client/render/FogManager.java b/game/client/src/main/java/net/minecraft/client/render/FogManager.java
index 2dc9aa35d..a3ab99b23 100644
--- a/game/client/src/main/java/net/minecraft/client/render/FogManager.java
+++ b/game/client/src/main/java/net/minecraft/client/render/FogManager.java
@@ -1,7 +1,6 @@
 package net.minecraft.client.render;
 
 import static net.minecraft.client.render.uniform.UniformBlock.N;
-import static org.lwjgl.opengl.GL11.*;
 
 import net.minecraft.client.world.WorldClient;
 import net.minecraft.core.block.material.Materials;
@@ -17,6 +16,7 @@ import net.minecraft.client.render.camera.CameraUtil;
 import net.minecraft.client.render.colorizer.Colorizers;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.Dimension;
+import org.lwjgl.opengl.GL41;
 
 public class FogManager {
     public static final int FOG_MODE_SKY = -1;
@@ -170,7 +170,7 @@ public class FogManager {
             this.fogGreen = color[1];
             this.fogBlue = color[2];
         }
-        glClearColor(this.fogRed, this.fogGreen, this.fogBlue, 0.0F);
+        GL41.glClearColor(this.fogRed, this.fogGreen, this.fogBlue, 0.0F);
     }
 
     public static class FogState {
diff --git a/game/client/src/main/java/net/minecraft/client/render/ItemRenderer.java b/game/client/src/main/java/net/minecraft/client/render/ItemRenderer.java
index aaede56bb..a21273c1f 100644
--- a/game/client/src/main/java/net/minecraft/client/render/ItemRenderer.java
+++ b/game/client/src/main/java/net/minecraft/client/render/ItemRenderer.java
@@ -58,7 +58,6 @@ public class ItemRenderer {
             GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
             GLRenderer.enableState(State.DEPTH_TEST);
             GLRenderer.setDepthFunc(CompareFunc.LESS);
-//            GL11.glEnable(GL12.GL_RESCALE_NORMAL);
             float brightness = 1.0f;
             GLRenderer.setLightmapCoord1i(this.mc.thePlayer.getLightmap(partialTick));
             GLRenderer.setColor4f(brightness, brightness, brightness, 1.0f);
@@ -134,14 +133,12 @@ public class ItemRenderer {
                 GLRenderer.popFrame();
             }
             GLRenderer.popFrame();
-//            GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         }
         Lighting.disable();
     }
 
     public void renderOverlays(float partialTicks) {
         GLRenderer.disableState(State.DEPTH_TEST);
-//        glDisable(GL_ALPHA_TEST);
 
         if (this.mc.thePlayer.isOnFire()) {
             TextureRegistry.worldAtlas.bind();
@@ -188,7 +185,6 @@ public class ItemRenderer {
             this.mc.textureManager.loadTexture("/assets/minecraft/textures/misc/water.png").bind();
             renderWarpedTextureOverlay(partialTicks);
         }
-//        glEnable(GL_ALPHA_TEST);
         GLRenderer.enableState(State.DEPTH_TEST);
     }
 
diff --git a/game/client/src/main/java/net/minecraft/client/render/Lighting.java b/game/client/src/main/java/net/minecraft/client/render/Lighting.java
index f838cf2f1..9c7478508 100644
--- a/game/client/src/main/java/net/minecraft/client/render/Lighting.java
+++ b/game/client/src/main/java/net/minecraft/client/render/Lighting.java
@@ -26,7 +26,7 @@ public final class Lighting {
     }
 
     public static void enableLight() {
-        enableLight(0.4f, 0.6f);
+        enableLight(0.5f, 0.6f);
     }
 
     public static void enableLight(float ambientBrightness, float lightBrightness) {
diff --git a/game/client/src/main/java/net/minecraft/client/render/PanelCrashReport.java b/game/client/src/main/java/net/minecraft/client/render/PanelCrashReport.java
index e9cbced5f..9c9e4523f 100644
--- a/game/client/src/main/java/net/minecraft/client/render/PanelCrashReport.java
+++ b/game/client/src/main/java/net/minecraft/client/render/PanelCrashReport.java
@@ -1,6 +1,6 @@
 package net.minecraft.client.render;
 
-import static org.lwjgl.opengl.GL11.*;
+import static org.lwjgl.opengl.GL41.*;
 
 import java.awt.BorderLayout;
 import java.awt.Color;
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 c05b9bf5c..4ae3f4066 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
@@ -338,8 +338,6 @@ public class RenderGlobal
         GLRenderer.globalSetLightEnabled(false);
         GLRenderer.enableState(State.DEPTH_TEST);
         GLRenderer.setDepthFunc(CompareFunc.ALWAYS);
-//        GL11.glDisable(GL11.GL_FOG);
-//        GL11.glDisable(GL11.GL_ALPHA_TEST);
 
         final double scale = 1f;
         double auroraY = (this.world.getWorldType().getMinY() + this.world.getWorldType().getYRange() + 64f) * 2f;
@@ -388,8 +386,6 @@ public class RenderGlobal
         }
         t.draw();
 
-//        GL11.glEnable(GL11.GL_FOG);
-//        GL11.glEnable(GL11.GL_ALPHA_TEST);
         GLRenderer.setDepthFunc(CompareFunc.LESS_EQUAL);
         GLRenderer.setColor4f(1f, 1f, 1f, 1f);
         GLRenderer.disableState(State.BLEND);
@@ -1074,7 +1070,6 @@ public class RenderGlobal
         GLRenderer.pushFrame();
         TessellatorGeneral tessellator = GLRenderer.getTessellator();
         GLRenderer.enableState(State.BLEND);
-//        GL11.glEnable(GL11.GL_ALPHA_TEST);
         GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE);
         GLRenderer.setColor4f(1.0F, 1.0F, 1.0F, (MathHelper.sin((float) System.currentTimeMillis() / 100F) * 0.2F + 0.4F) * 0.5F);
         if (this.destroyProgress > 0.0F) {
@@ -1084,7 +1079,6 @@ public class RenderGlobal
             GLRenderer.pushFrame();
             int k = this.world.getBlockId(tileHit.tilePos);
             Block<?> block = k <= 0 ? null : Blocks.blocksList[k];
-//            GL11.glDisable(GL11.GL_ALPHA_TEST);
             GLRenderer.setPolygonOffset(-3F, -3F);
             GLRenderer.enableState(State.POLYGON_OFFSET_FILL);
             double x = camera.getX(partialTick);
@@ -1093,7 +1087,6 @@ public class RenderGlobal
             if (block == null) {
                 block = Blocks.STONE;
             }
-//            GL11.glEnable(GL11.GL_ALPHA_TEST);
             tessellator.startDrawingQuads();
             tessellator.setTranslation(-x, -y, -z);
             tessellator.lockColor();
@@ -1110,7 +1103,6 @@ public class RenderGlobal
             tessellator.setTranslation(0.0D, 0.0D, 0.0D);
             GLRenderer.popFrame();
         }
-//        GL11.glDisable(GL11.GL_ALPHA_TEST);
         GLRenderer.popFrame();
     }
 
diff --git a/game/client/src/main/java/net/minecraft/client/render/Scissor.java b/game/client/src/main/java/net/minecraft/client/render/Scissor.java
index 979651199..01c32d546 100644
--- a/game/client/src/main/java/net/minecraft/client/render/Scissor.java
+++ b/game/client/src/main/java/net/minecraft/client/render/Scissor.java
@@ -1,10 +1,10 @@
 package net.minecraft.client.render;
 
 import net.minecraft.client.Minecraft;
+import net.minecraft.client.render.renderer.GLRenderer;
+import net.minecraft.client.render.renderer.State;
 import net.minecraft.core.util.helper.MathHelper;
-import org.lwjgl.opengl.GL11;
-
-import static org.lwjgl.opengl.GL11.GL_SCISSOR_TEST;
+import org.lwjgl.opengl.GL41;
 
 public abstract class Scissor {
 	private static Minecraft mc = Minecraft.getMinecraft();
@@ -18,12 +18,12 @@ public abstract class Scissor {
         int xSizePixels = xSize * xScale;
         int ySizePixels = ySize * yScale;
 
-        GL11.glScissor(xPixels, yPixels, Math.max(xSizePixels, 0), Math.max(ySizePixels, 0));
-        GL11.glEnable(GL_SCISSOR_TEST);
+        GL41.glScissor(xPixels, yPixels, Math.max(xSizePixels, 0), Math.max(ySizePixels, 0));
+        GLRenderer.enableState(State.SCISSOR_TEST);
     }
 
     public static void disable() {
-        GL11.glDisable(GL_SCISSOR_TEST);
+        GLRenderer.disableState(State.SCISSOR_TEST);
     }
 
     public static void scissor(int x, int y, int xSize, int ySize, Runnable method) {
diff --git a/game/client/src/main/java/net/minecraft/client/render/TextureManager.java b/game/client/src/main/java/net/minecraft/client/render/TextureManager.java
index c95484f2f..4ac2f973d 100644
--- a/game/client/src/main/java/net/minecraft/client/render/TextureManager.java
+++ b/game/client/src/main/java/net/minecraft/client/render/TextureManager.java
@@ -2,7 +2,7 @@ package net.minecraft.client.render;
 
 import static net.minecraft.client.util.helper.Textures.*;
 import static net.minecraft.client.util.helper.Buffer.*;
-import static org.lwjgl.opengl.GL12.*;
+import static org.lwjgl.opengl.GL41.*;
 
 import java.awt.image.BufferedImage;
 import java.nio.ByteBuffer;
@@ -55,7 +55,7 @@ import net.minecraft.client.util.helper.Buffer;
 import net.minecraft.core.util.helper.DyeColor;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL41;
 import org.slf4j.Logger;
 
 public class TextureManager {
@@ -428,7 +428,7 @@ public class TextureManager {
 
 	public void bindTexture(int textureID) {
 		if (textureID < 0) return;
-		GL11.glBindTexture(GL_TEXTURE_2D, textureID);
+		GL41.glBindTexture(GL_TEXTURE_2D, textureID);
 	}
 
 	public boolean bindDownloadableTexture(String urlTexture, String backupTexture, ImageParser imageParser) {
diff --git a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelFluid.java b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelFluid.java
index 4247cd617..f7a21a501 100644
--- a/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelFluid.java
+++ b/game/client/src/main/java/net/minecraft/client/render/block/model/BlockModelFluid.java
@@ -14,6 +14,7 @@ import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.pos.TilePos;
 import net.minecraft.core.world.pos.TilePosc;
 import org.jetbrains.annotations.NotNull;
+import org.joml.Math;
 import org.joml.primitives.AABBdc;
 
 public class BlockModelFluid<T extends BlockLogicFluid> extends BlockModelStandard<T> {
@@ -23,13 +24,9 @@ public class BlockModelFluid<T extends BlockLogicFluid> extends BlockModelStanda
 
     @Override
     public boolean render(@NotNull TessellatorGeneral tessellator, @NotNull WorldSource worldSource, @NotNull TilePosc tilePos) {
-        int color = BlockColorDispatcher.getInstance().getDispatch(this.block).getWorldColor(worldSource, tilePos, 0);
-        float r = (float) (color >> 16 & 0xff) / 255F;
-        float g = (float) (color >> 8 & 0xff) / 255F;
-        float b = (float) (color & 0xff) / 255F;
+        tessellator.setColor1i(BlockColorDispatcher.getInstance().getDispatch(this.block).getWorldColor(worldSource, tilePos, 0));
 
         TilePos queryPos = new TilePos();
-
         final int x = tilePos.x();
         final int y = tilePos.y();
         final int z = tilePos.z();
@@ -38,27 +35,22 @@ public class BlockModelFluid<T extends BlockLogicFluid> extends BlockModelStanda
 
         boolean renderTop = shouldSideBeRendered(worldSource, bounds, tilePos.up(queryPos), Side.TOP);
         boolean flag1 = shouldSideBeRendered(worldSource, bounds, tilePos.down(queryPos), Side.BOTTOM);
-        boolean[] aflag = new boolean[4];
-        aflag[0] = shouldSideBeRendered(worldSource, bounds, tilePos.north(queryPos), Side.NORTH);
-        aflag[1] = shouldSideBeRendered(worldSource, bounds, tilePos.south(queryPos), Side.SOUTH);
-        aflag[2] = shouldSideBeRendered(worldSource, bounds, tilePos.west(queryPos), Side.WEST);
-        aflag[3] = shouldSideBeRendered(worldSource, bounds, tilePos.east(queryPos), Side.EAST);
-        if (!renderTop && !flag1 && !aflag[0] && !aflag[1] && !aflag[2] && !aflag[3]) {
+        boolean[] sideRenderFlags = new boolean[4];
+        sideRenderFlags[0] = shouldSideBeRendered(worldSource, bounds, tilePos.north(queryPos), Side.NORTH);
+        sideRenderFlags[1] = shouldSideBeRendered(worldSource, bounds, tilePos.south(queryPos), Side.SOUTH);
+        sideRenderFlags[2] = shouldSideBeRendered(worldSource, bounds, tilePos.west(queryPos), Side.WEST);
+        sideRenderFlags[3] = shouldSideBeRendered(worldSource, bounds, tilePos.east(queryPos), Side.EAST);
+        if (!renderTop && !flag1 && !sideRenderFlags[0] && !sideRenderFlags[1] && !sideRenderFlags[2] && !sideRenderFlags[3]) {
             return false;
         }
         boolean didRender = false;
 
-        final float sideBottom = 0.5f;
-        final float sideTop = 1.0f;
-        final float sideNorthSouth = 0.8f;
-        final float sideEastWest = 0.6f;
-
         final float yOff = 0.001f;
         int meta = worldSource.getBlockData(tilePos);
-        float f7 = this.block.getLogic().getFluidHeight(worldSource, tilePos);
-        float f8 = this.block.getLogic().getFluidHeight(worldSource, tilePos.add(0, 0, 1, queryPos));
-        float f9 = this.block.getLogic().getFluidHeight(worldSource, tilePos.add(1, 0, 1, queryPos));
-        float f10 = this.block.getLogic().getFluidHeight(worldSource, tilePos.add(1, 0, 0, queryPos));
+        float h = this.block.getLogic().getFluidHeight(worldSource, tilePos);
+        float hs = this.block.getLogic().getFluidHeight(worldSource, tilePos.add(0, 0, 1, queryPos));
+        float hes = this.block.getLogic().getFluidHeight(worldSource, tilePos.add(1, 0, 1, queryPos));
+        float he = this.block.getLogic().getFluidHeight(worldSource, tilePos.add(1, 0, 0, queryPos));
         if (renderBlocks.renderAllFaces || renderTop) {
             didRender = true;
             IconCoordinate texture = getBlockTextureFromSideAndMetadata(Side.TOP, meta);
@@ -68,7 +60,6 @@ public class BlockModelFluid<T extends BlockLogicFluid> extends BlockModelStanda
             } else {
                 rotation = 0.0F;
             }
-            float blockBrightness = 1.0f;
             int light = this.block.getLightmapCoord(worldSource, tilePos);
             int lightUp = this.block.getLightmapCoord(worldSource, tilePos.up(queryPos));
 
@@ -76,33 +67,42 @@ public class BlockModelFluid<T extends BlockLogicFluid> extends BlockModelStanda
             if (texture.namespaceId.toString().contains("_flowing")) {
                 double centerU = texture.getSubIconU(0.5);
                 double centerV = texture.getSubIconV(0.5);
-                float cSin = MathHelper.cos(rotation) / 2;
-                float sin = MathHelper.sin(rotation) / 2;
+                float cSin = Math.cos(rotation) / 2;
+                float sin = Math.sin(rotation) / 2;
 
                 double minU = texture.getIconUMin();
                 double maxU = texture.getIconUMax();
                 double minV = texture.getIconVMin();
                 double maxV = texture.getIconVMax();
 
-                tessellator.setColorOpaque3f(sideTop * blockBrightness * r, sideTop * blockBrightness * g, sideTop * blockBrightness * b);
-                tessellator.addVertexWithUV(x, (float) y + f7, z, ((minU - centerU) * sin - (maxV - centerV) * cSin) + centerU, ((maxV - centerV) * sin + (minU - centerU) * cSin) + centerV);
-                tessellator.addVertexWithUV(x, (float) y + f8, z + 1, ((maxU - centerU) * sin - (maxV - centerV) * cSin) + centerU, ((maxV - centerV) * sin + (maxU - centerU) * cSin) + centerV);
-                tessellator.addVertexWithUV(x + 1, (float) y + f9, z + 1, ((maxU - centerU) * sin - (minV - centerV) * cSin) + centerU, ((minV - centerV) * sin + (maxU - centerU) * cSin) + centerV);
-                tessellator.addVertexWithUV(x + 1, (float) y + f10, z, ((minU - centerU) * sin - (minV - centerV) * cSin) + centerU, ((minV - centerV) * sin + (minU - centerU) * cSin) + centerV);
+                double du = (maxU - centerU);
+                double dv = (maxV - centerV);
+
+                tessellator.setNormal(0, 1, 0);
+                tessellator.addVertexWithUV(x, (float) y + h, z,
+                    Math.clamp(minU, maxU, -du * sin - dv * cSin + centerU),
+                    Math.clamp(minV, maxV, dv * sin + -du * cSin + centerV));
+                tessellator.addVertexWithUV(x, (float) y + hs, z + 1,
+                    Math.clamp(minU, maxU, du * sin - dv * cSin + centerU),
+                    Math.clamp(minV, maxV, dv * sin + du * cSin + centerV));
+                tessellator.addVertexWithUV(x + 1, (float) y + hes, z + 1,
+                    Math.clamp(minU, maxU, du * sin - (-dv) * cSin + centerU),
+                    Math.clamp(minV, maxV, -dv * sin + du * cSin + centerV));
+                tessellator.addVertexWithUV(x + 1, (float) y + he, z,
+                    Math.clamp(minU, maxU, -du * sin - (-dv) * cSin + centerU),
+                    Math.clamp(minV, maxV, -dv * sin + -du * cSin + centerV));
             } else {
-                tessellator.setColorOpaque3f(sideTop * blockBrightness * r, sideTop * blockBrightness * g, sideTop * blockBrightness * b);
-                tessellator.addVertexWithUV(x, (float) y + f7, z, texture.getIconUMin(), texture.getIconVMax());
-                tessellator.addVertexWithUV(x, (float) y + f8, z + 1, texture.getIconUMax(), texture.getIconVMax());
-                tessellator.addVertexWithUV(x + 1, (float) y + f9, z + 1, texture.getIconUMax(), texture.getIconVMin());
-                tessellator.addVertexWithUV(x + 1, (float) y + f10, z, texture.getIconUMin(), texture.getIconVMin());
+                tessellator.setNormal(0, 1, 0);
+                tessellator.addVertexWithUV(x, (float) y + h, z, texture.getIconUMin(), texture.getIconVMax());
+                tessellator.addVertexWithUV(x, (float) y + hs, z + 1, texture.getIconUMax(), texture.getIconVMax());
+                tessellator.addVertexWithUV(x + 1, (float) y + hes, z + 1, texture.getIconUMax(), texture.getIconVMin());
+                tessellator.addVertexWithUV(x + 1, (float) y + he, z, texture.getIconUMin(), texture.getIconVMin());
             }
 
         }
         if (renderBlocks.renderAllFaces || flag1) {
-            float brightness = 1.0f;
             tessellator.setLightmapCoord1i(this.block.getLightmapCoord(worldSource, tilePos.down(queryPos)));
-            tessellator.setColorOpaque3f(sideBottom * brightness * r, sideBottom * brightness * g, sideBottom * brightness * b);
-
+            tessellator.setNormal(0, -1, 0);
             renderBlocks.renderBottomFace(tessellator, bounds, x, y + yOff, z, getBlockTextureFromSideAndMetadata(Side.TOP, 0));
             didRender = true;
         }
@@ -115,71 +115,69 @@ public class BlockModelFluid<T extends BlockLogicFluid> extends BlockModelStanda
                 case 2 -> posB.set(x - 1, y, z); // West
                 case 3 -> posB.set(x + 1, y, z); // East
             }
-            float uOff;
-            if (side == 0 || side == 1) {
-                uOff = (x & 1) == 0 ? 0.0f : 0.5f;
-            } else {
-                uOff = (z & 1) == 0 ? 0.0f : 0.5f;
-            }
             IconCoordinate texture = getBlockTextureFromSideAndMetadata(Side.getSideById(side + 2), meta);
-            if (!renderBlocks.renderAllFaces && !aflag[side]) {
+            if (!renderBlocks.renderAllFaces && !sideRenderFlags[side]) {
                 continue;
             }
             float f13;
             float f15;
-            float f17;
-            float f19;
-            float f20;
-            float f21;
-            if (side == 0) {
-                f13 = f7;
-                f15 = f10;
-                f17 = x + 0.0001f;
-                f20 = x + 1 - 0.0001f;
-                f19 = z + 0.0001f;
-                f21 = z + 0.0001f;
-            } else if (side == 1) {
-                f13 = f9;
-                f15 = f8;
-                f17 = x + 1 - 0.0001f;
-                f20 = x + 0.0001f;
-                f19 = z + 1 - 0.0001f;
-                f21 = z + 1 - 0.001f;
-            } else if (side == 2) {
-                f13 = f8;
-                f15 = f7;
-                f17 = x + 0.0001f;
-                f20 = x + 0.0001f;
-                f19 = z + 1 - 0.0001f;
-                f21 = z + 0.0001f;
-            } else {
-                f13 = f10;
-                f15 = f9;
-                f17 = x + 1 - 0.0001f;
-                f20 = x + 1 - 0.0001f;
-                f19 = z + 0.0001f;
-                f21 = z + 1 - 0.0001f;
+            float x1;
+            float z1;
+            float x2;
+            float z2;
+            switch (side) {
+                case 0 -> { // North
+                    f13 = h;
+                    f15 = he;
+                    x1 = x + 0.0001f;
+                    x2 = x + 1 - 0.0001f;
+                    z1 = z + 0.0001f;
+                    z2 = z + 0.0001f;
+                }
+                case 1 -> { // South
+                    f13 = hes;
+                    f15 = hs;
+                    x1 = x + 1 - 0.0001f;
+                    x2 = x + 0.0001f;
+                    z1 = z + 1 - 0.0001f;
+                    z2 = z + 1 - 0.001f;
+                }
+                case 2 -> { // West
+                    f13 = hs;
+                    f15 = h;
+                    x1 = x + 0.0001f;
+                    x2 = x + 0.0001f;
+                    z1 = z + 1 - 0.0001f;
+                    z2 = z + 0.0001f;
+                }
+                default -> { // East
+                    f13 = he;
+                    f15 = hes;
+                    x1 = x + 1 - 0.0001f;
+                    x2 = x + 1 - 0.0001f;
+                    z1 = z + 0.0001f;
+                    z2 = z + 1 - 0.0001f;
+                }
             }
             didRender = true;
-            float vOff = (y & 1) == 0 ? 0.0F : 0.5f;
-            double d4 = texture.getSubIconU(0.0F + uOff);
-            double d5 = texture.getSubIconU(0.5F + uOff);
-            double d6 = texture.getSubIconV(0.5F - f13 / 2 + vOff);
-            double d7 = texture.getSubIconV(0.5F - f15 / 2 + vOff);
-            double d8 = texture.getSubIconV(0.5F + vOff);
-            float brightness = 1.0f;
+            double u1 = texture.getSubIconU(0.0F);
+            double u2 = texture.getSubIconU(0.5F);
+            double v1 = texture.getSubIconV(0.5F - f13 / 2);
+            double v2 = texture.getSubIconV(0.5F - f15 / 2);
+            double v3 = texture.getSubIconV(0.5F);
             tessellator.setLightmapCoord1i(this.block.getLightmapCoord(worldSource, posB));
-            if (side < 2) {
-                brightness *= sideNorthSouth;
-            } else {
-                brightness *= sideEastWest;
+            switch (side) {
+                case 0 -> tessellator.setNormal(0, 0, -1);
+                case 1 -> tessellator.setNormal(0, 0, 1);
+                case 2 -> tessellator.setNormal(-1, 0, 0);
+                case 3 -> tessellator.setNormal(1, 0, 0);
             }
-            tessellator.setColorOpaque3f(sideTop * brightness * r, sideTop * brightness * g, sideTop * brightness * b);
-            tessellator.addVertexWithUV(f17, (float) y + f13, f19, d4, d6);
-            tessellator.addVertexWithUV(f20, (float) y + f15, f21, d5, d7);
-            tessellator.addVertexWithUV(f20, y, f21, d5, d8);
-            tessellator.addVertexWithUV(f17, y, f19, d4, d8);
+            tessellator.addVertexWithUV(x1, (float) y + f13, z1, u1, v1);
+            tessellator.addVertexWithUV(x2, (float) y + f15, z2, u2, v2);
+            tessellator.addVertexWithUV(x2, y, z2, u2, v3);
+            tessellator.addVertexWithUV(x1, y, z1, u1, v3);
         }
+        tessellator.setNormal(0, 1, 0);
         return didRender;
     }
 
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererArrow.java b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererArrow.java
index bf99e95e6..bd5d46a11 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererArrow.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererArrow.java
@@ -30,7 +30,6 @@ public class EntityRendererArrow extends EntityRenderer<ProjectileArrow> {
         float tailMaxV = (float) (10 + arrowType * 10) / 32F;
         float scale = 9F / 160F;
 
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         float shakeAmount = (float) arrow.shake - partialTick;
         if (shakeAmount > 0.0F) {
             float shakeAngle = -MathHelper.sin(shakeAmount * 3F) * shakeAmount;
@@ -41,7 +40,6 @@ public class EntityRendererArrow extends EntityRenderer<ProjectileArrow> {
         GLRenderer.modelM4f().rotateX(Math.toRadians(45f));
         GLRenderer.modelM4f().scale(scale, scale, scale);
         GLRenderer.modelM4f().translate(-4F, 0.0F, 0.0F);
-//        GL11.glNormal3f(scale, 0.0F, 0.0F);
 
         // Draw arrow tail
         tessellator.startDrawingQuads();
@@ -50,7 +48,6 @@ public class EntityRendererArrow extends EntityRenderer<ProjectileArrow> {
         tessellator.addVertexWithUV(-7D, 2D, 2D, tailMaxU, tailMaxV);
         tessellator.addVertexWithUV(-7D, 2D, -2D, tailMinU, tailMaxV);
         tessellator.draw();
-//        GL11.glNormal3f(-scale, 0.0F, 0.0F);
         tessellator.startDrawingQuads();
         tessellator.addVertexWithUV(-7D, 2D, -2D, tailMinU, tailMinV);
         tessellator.addVertexWithUV(-7D, 2D, 2D, tailMaxU, tailMinV);
@@ -61,7 +58,6 @@ public class EntityRendererArrow extends EntityRenderer<ProjectileArrow> {
         // Draw arrow body
         for (int i = 0; i < 4; i++) {
             GLRenderer.modelM4f().rotateX(Math.PI_OVER_2_f);
-//            GL11.glNormal3f(0.0F, 0.0F, scale);
             tessellator.startDrawingQuads();
             tessellator.addVertexWithUV(-8D, -2D, 0.0D, bodyMinU, bodyMinV);
             tessellator.addVertexWithUV(8D, -2D, 0.0D, bodyMaxU, bodyMinV);
@@ -70,7 +66,6 @@ public class EntityRendererArrow extends EntityRenderer<ProjectileArrow> {
             tessellator.draw();
         }
 
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         GLRenderer.popFrame();
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererBoat.java b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererBoat.java
index 06c83cbdc..558acc8cc 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererBoat.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererBoat.java
@@ -27,7 +27,6 @@ public class EntityRendererBoat extends EntityRenderer<EntityBoat> {
     @Override
     public void render(@NotNull final TessellatorGeneral tessellator, @NotNull final EntityBoat entity, final double x, final double y, final double z,
                        final float yaw, final float partialTick) {
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         GLRenderer.pushFrame();
         GLRenderer.modelM4f().translate((float) x, (float) y, (float) z);
         GLRenderer.modelM4f().rotateY(Math.toRadians(180F - yaw));
@@ -59,9 +58,7 @@ public class EntityRendererBoat extends EntityRenderer<EntityBoat> {
         GLRenderer.modelM4f().scale(1.0F / f4, 1.0F / f4, 1.0F / f4);
         bindTexture("/assets/minecraft/textures/entity/boat.png");
         GLRenderer.modelM4f().scale(1 / 16f, 1 / 16f, -1 / 16f);
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         getModel("main").render();
         GLRenderer.popFrame();
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererFallingBlock.java b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererFallingBlock.java
index 0bc021248..b0c440bdb 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererFallingBlock.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererFallingBlock.java
@@ -33,17 +33,13 @@ public class EntityRendererFallingBlock extends EntityRenderer<EntityFallingBloc
             this.container = new BlocksContainer(fallingBlock.world);
         }
         GLRenderer.pushFrame();
+        GLRenderer.setColor4f(1f, 1f, 1f, 1f);
+        GLRenderer.setLightmapCoord2f(15, 15);
         GLRenderer.modelM4f().translate((float) x, (float) y, (float) z);
         TextureRegistry.worldAtlas.bind();
-        Lighting.disable();
         GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
         GLRenderer.enableState(State.BLEND);
         GLRenderer.disableState(State.CULL_FACE);
-//        if (this.mc.isAmbientOcclusionEnabled()) {
-//            GL11.glShadeModel(GL11.GL_SMOOTH);
-//        } else {
-//            GL11.glShadeModel(GL11.GL_FLAT);
-//        }
 
         TilePos blockPos = new TilePos(fallingBlock);
 
@@ -58,8 +54,6 @@ public class EntityRendererFallingBlock extends EntityRenderer<EntityFallingBloc
 
         tessellator.setTranslation(0.0D, 0.0D, 0.0D);
         tessellator.draw();
-
-        Lighting.enableLight();
         GLRenderer.popFrame();
 
         TileEntityRenderer<TileEntity> renderer = TileEntityRenderDispatcher.instance.getRenderer(fallingBlock.carriedBlock.entity);
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererFishingBobber.java b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererFishingBobber.java
index 01795afdd..57a967328 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererFishingBobber.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererFishingBobber.java
@@ -2,13 +2,13 @@ package net.minecraft.client.render.entity;
 
 import net.minecraft.client.render.renderer.DrawMode;
 import net.minecraft.client.render.renderer.GLRenderer;
+import net.minecraft.client.render.renderer.Shaders;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.TessellatorGeneral;
 import net.minecraft.core.entity.EntityFishingBobber;
 import net.minecraft.core.util.helper.MathHelper;
 import org.jetbrains.annotations.NotNull;
 import org.joml.Vector3d;
-import org.lwjgl.opengl.GL11;
 
 public class EntityRendererFishingBobber extends EntityRendererSprite<EntityFishingBobber> {
 
@@ -45,7 +45,8 @@ public class EntityRendererFishingBobber extends EntityRendererSprite<EntityFish
             double xa = (float) (xp - xh);
             double ya = (float) (yp - yh);
             double za = (float) (zp - zh);
-            GL11.glDisable(GL11.GL_TEXTURE_2D);
+            GLRenderer.pushFrame();
+            GLRenderer.setShader(Shaders.COLOR_WORLD);
             GLRenderer.globalSetLightEnabled(false);
             tessellator.startDrawing(DrawMode.LINE_STRIP);
             tessellator.setColorOpaque1i(0);
@@ -56,7 +57,7 @@ public class EntityRendererFishingBobber extends EntityRendererSprite<EntityFish
 
             tessellator.draw();
             GLRenderer.globalSetLightEnabled(true);
-            GL11.glEnable(GL11.GL_TEXTURE_2D);
+            GLRenderer.popFrame();
         }
     }
 }
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererLightningBolt.java b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererLightningBolt.java
index 1d1294cab..96dc05415 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererLightningBolt.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererLightningBolt.java
@@ -10,7 +10,6 @@ import net.minecraft.client.render.renderer.State;
 import net.minecraft.client.render.tessellator.TessellatorGeneral;
 import net.minecraft.core.entity.EntityLightning;
 import org.jetbrains.annotations.NotNull;
-import org.lwjgl.opengl.GL11;
 
 public class EntityRendererLightningBolt extends EntityRenderer<EntityLightning> {
 
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererMinecart.java b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererMinecart.java
index 7a37bb233..0c5c394ce 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererMinecart.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererMinecart.java
@@ -21,7 +21,6 @@ public class EntityRendererMinecart extends EntityRenderer<EntityMinecart> {
 
     @Override
     public void render(@NotNull final TessellatorGeneral tessellator, @NotNull final EntityMinecart minecart, final double x, final double y, final double z, final float yaw, final float partialTick) {
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         GLRenderer.pushFrame();
 
         final double lerpX = MathHelper.lerp(minecart.xo, minecart.x, partialTick);
@@ -117,7 +116,6 @@ public class EntityRendererMinecart extends EntityRenderer<EntityMinecart> {
         GLRenderer.modelM4f().scale(1 / 16f, 1 / 16f, -1 / 16f);
         getModel("main").render();
         GLRenderer.popFrame();
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
     }
 
     private static void drawDebugVec(final @NotNull TessellatorGeneral tessellator, final @NotNull Vector3dc start, final @NotNull Vector3dc end, final double scale, final float r, final float g, final float b, final float a) {
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererPainting.java b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererPainting.java
index cb0ba48cd..97d384fdf 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererPainting.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererPainting.java
@@ -124,7 +124,6 @@ public class EntityRendererPainting extends EntityRenderer<EntityPainting> {
         GLRenderer.pushFrame();
         GLRenderer.modelM4f().translate((float) x, (float) y, (float) z);
         GLRenderer.modelM4f().rotateY(Math.toRadians(yaw));
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         ArtType art = entity.art;
         float scale = 0.0625F;
         GLRenderer.modelM4f().scale(scale, scale, scale);
@@ -138,7 +137,6 @@ public class EntityRendererPainting extends EntityRenderer<EntityPainting> {
             renderBorder(entity, entity.art.sizeX, entity.art.sizeY);
             GLRenderer.disableState(State.BLEND);
         }
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         GLRenderer.popFrame();
     }
 
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererSprite.java b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererSprite.java
index 579c03eeb..76e82e574 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererSprite.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/EntityRendererSprite.java
@@ -43,7 +43,6 @@ public class EntityRendererSprite<T extends Entity> extends EntityRenderer<T> {
             GLRenderer.setColor4f(1.0F, 1.0F, 1.0F, 1.0F);
             GLRenderer.setLightmapCoord1i(LightmapHelper.getLightmapCoord(15, 15));
         }
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         GLRenderer.modelM4f().scale(0.5F * this.scale, 0.5F * this.scale, 0.5F * this.scale);
         this.itemIconIndex.parentAtlas.bind();
         float f2 = (float) this.itemIconIndex.getIconUMin();
@@ -62,7 +61,6 @@ public class EntityRendererSprite<T extends Entity> extends EntityRenderer<T> {
         tessellator.addVertexWithUV(f6 - f7, 1.0F - f8, 0.0D, f3, f4);
         tessellator.addVertexWithUV(0.0F - f7, 1.0F - f8, 0.0D, f2, f4);
         tessellator.draw();
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         GLRenderer.popFrame();
         if (this.fullBright) {
             GLRenderer.globalSetLightEnabled(true);
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/MobRenderer.java b/game/client/src/main/java/net/minecraft/client/render/entity/MobRenderer.java
index 89fca765b..448fec596 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/MobRenderer.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/MobRenderer.java
@@ -35,8 +35,6 @@ public abstract class MobRenderer<T extends Mob> extends EntityRenderer<T> {
     @Override
     public void render(final @NotNull TessellatorGeneral tessellator, final @NotNull T entity, final double x, final double y, final double z, final float yaw, final float partialTick) {
         loadEntityTexture(entity);
-//        bindTexture("/assets/minecraft/textures/entity/creeper/debug.png");
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
         GLRenderer.enableState(State.BLEND);
         GLRenderer.disableState(State.CULL_FACE);
@@ -60,14 +58,12 @@ public abstract class MobRenderer<T extends Mob> extends EntityRenderer<T> {
             }
         }
         renderAdditional(tessellator, entity, partialTick);
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
 
         final int argb = getOverlayColor(entity, 1f, partialTick);
         final boolean hasOverlayAlpha = Color.alphaFromInt(argb) > 0;
         if (hasOverlayAlpha || entity.hurtTime > 0 || entity.deathTime > 0) {
             GLRenderer.pushFrame();
             GLRenderer.setShader(Shaders.COLOR_WORLD);
-//            GL11.glDisable(GL11.GL_ALPHA_TEST);
             GLRenderer.enableState(State.BLEND);
             GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
             GLRenderer.setDepthFunc(CompareFunc.EQUAL);
@@ -96,7 +92,6 @@ public abstract class MobRenderer<T extends Mob> extends EntityRenderer<T> {
             }
             GLRenderer.setDepthFunc(CompareFunc.LESS_EQUAL);
             GLRenderer.disableState(State.BLEND);
-//            GL11.glEnable(GL11.GL_ALPHA_TEST);
             GLRenderer.popFrame();
         }
 
@@ -104,7 +99,6 @@ public abstract class MobRenderer<T extends Mob> extends EntityRenderer<T> {
 
         GLRenderer.enableState(State.CULL_FACE);
         GLRenderer.disableState(State.BLEND);
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         renderSpecials(tessellator, entity, x, y, z);
     }
 
@@ -185,7 +179,6 @@ public abstract class MobRenderer<T extends Mob> extends EntityRenderer<T> {
 
         GLRenderer.pushFrame();
         GLRenderer.modelM4f().translate((float) x, (float) y + entity.getHeadHeight() + 0.8f, (float) z);
-//        GL11.glNormal3f(0.0F, 1.0F, 0.0F);
         GLRenderer.modelM4f().rotateY(Math.toRadians(-this.renderDispatcher.viewLerpYaw));
         GLRenderer.modelM4f().rotateX(Math.toRadians(this.renderDispatcher.viewLerpPitch));
         GLRenderer.modelM4f().scale(-scale, -scale, scale);
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererButterfly.java b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererButterfly.java
index f6b94890b..e5b64674c 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererButterfly.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererButterfly.java
@@ -34,7 +34,6 @@ public class MobRendererButterfly extends EntityRenderer<MobButterfly> {
         textureManager.bindTexture(textureManager.loadTexture(texture));
         GLRenderer.pushFrame();
         GLRenderer.modelM4f().translate((float) x, (float) y + 0.25f, (float) z);
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         GLRenderer.disableState(State.CULL_FACE);
         GLRenderer.globalSetLightEnabled(false);
         GLRenderer.modelM4f().scale(0.5F * scale, 0.5F * scale, 0.5F * scale);
@@ -68,7 +67,6 @@ public class MobRendererButterfly extends EntityRenderer<MobButterfly> {
         tessellator.draw();
         GLRenderer.popFrame();
 
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         GLRenderer.enableState(State.CULL_FACE);
         GLRenderer.globalSetLightEnabled(true);
         GLRenderer.popFrame();
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererCreeper.java b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererCreeper.java
index 97ee97b94..ed5a936cf 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererCreeper.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererCreeper.java
@@ -1,5 +1,6 @@
 package net.minecraft.client.render.entity;
 
+import net.minecraft.client.render.renderer.BlendFactor;
 import net.minecraft.client.render.renderer.GLRenderer;
 import net.minecraft.client.render.renderer.State;
 import net.minecraft.core.entity.monster.MobCreeper;
@@ -7,7 +8,6 @@ import net.minecraft.core.util.helper.Color;
 import net.minecraft.core.util.helper.MathHelper;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import org.lwjgl.opengl.GL11;
 import org.useless.dragonfly.models.entity.BoneTransform;
 import org.useless.dragonfly.models.entity.StaticEntityModel;
 
@@ -33,20 +33,16 @@ public class MobRendererCreeper extends MobRenderer<MobCreeper> {
             model = getModel("charged");
             bindTexture("/assets/minecraft/textures/armor/power.png");
             final float ticks = creeper.tickCount + partialTick;
-            GL11.glMatrixMode(GL11.GL_TEXTURE);
-            GL11.glLoadIdentity();
+            GLRenderer.textureM4f().identity();
             final float _x = ticks * 0.01F;
             final float _y = ticks * 0.01F;
-            GLRenderer.modelM4f().translate(_x, _y, 0.0F);
-            GL11.glMatrixMode(GL11.GL_MODELVIEW);
+            GLRenderer.textureM4f().translate(_x, _y, 0.0F);
             GLRenderer.enableState(State.BLEND);
             GLRenderer.setColor4f(0.5f, 0.5f, 0.5f, 1.0F);
             GLRenderer.globalSetLightEnabled(false);
-            GL11.glBlendFunc(GL11.GL_ONE, GL11.GL_ONE);
+            GLRenderer.setBlendFunc(BlendFactor.ONE, BlendFactor.ONE);
         } else if (layer == 2) { // Reset funky powered rendering
-            GL11.glMatrixMode(GL11.GL_TEXTURE);
-            GL11.glLoadIdentity();
-            GL11.glMatrixMode(GL11.GL_MODELVIEW);
+            GLRenderer.textureM4f().identity();
             GLRenderer.globalSetLightEnabled(true);
             GLRenderer.disableState(State.BLEND);
             return 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 a73472626..da5b77a44 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
@@ -80,11 +80,6 @@ public class MobRendererPlayer extends MobRendererBipedArmored<Player> {
             GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
             GLRenderer.enableState(State.BLEND);
             GLRenderer.disableState(State.CULL_FACE);
-//            if (mc.isAmbientOcclusionEnabled()) {
-//                GL11.glShadeModel(GL11.GL_SMOOTH);
-//            } else {
-//                GL11.glShadeModel(GL11.GL_FLAT);
-//            }
             GLRenderer.modelM4f().scale(0.55f, -0.55f, 0.55f);
             GLRenderer.modelM4f().translate(0, -0.75f, -0.75f);
 
@@ -110,10 +105,6 @@ public class MobRendererPlayer extends MobRendererBipedArmored<Player> {
             }
 
             GLRenderer.popFrame();
-//            GL11.glEnable(GL_LIGHTING);
-//            GL11.glEnable(GL_LIGHT0);
-//            GL11.glEnable(GL_LIGHT1);
-//            GL11.glEnable(GL_COLOR_MATERIAL);
         }
     }
 
@@ -143,7 +134,6 @@ public class MobRendererPlayer extends MobRendererBipedArmored<Player> {
                     final FontRenderer font = getFont();
                     GLRenderer.pushFrame();
                     GLRenderer.modelM4f().translate((float) x + 0.0F, (float) y + 2.3F, (float) z);
-//                    GL11.glNormal3f(0.0F, 1.0F, 0.0F);
                     GLRenderer.modelM4f().rotateY(org.joml.Math.toRadians(-this.renderDispatcher.viewLerpYaw));
                     GLRenderer.modelM4f().rotateX(org.joml.Math.toRadians(this.renderDispatcher.viewLerpPitch));
                     GLRenderer.modelM4f().scale(-f1, -f1, f1);
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererQuadruped.java b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererQuadruped.java
index 21007b1af..12ada44a4 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererQuadruped.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererQuadruped.java
@@ -6,7 +6,6 @@ import net.minecraft.core.entity.animal.MobCow;
 import net.minecraft.core.util.helper.MathHelper;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import org.lwjgl.opengl.GL11;
 import org.useless.dragonfly.models.entity.BoneTransform;
 import org.useless.dragonfly.models.entity.StaticEntityModel;
 
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererSlime.java b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererSlime.java
index e493129a8..d0cfdd623 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererSlime.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererSlime.java
@@ -19,7 +19,6 @@ public class MobRendererSlime extends MobRenderer<MobSlime> {
     @Override
     protected @Nullable StaticEntityModel getAndSetupModelForLayer(@NotNull final MobSlime entity, final float brightness, final float partialTick, final int layer) {
         final StaticEntityModel model = getModel("main");
-//        GL11.glEnable(GL12.GL_NORMALIZE);
         GLRenderer.enableState(State.BLEND);
         GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
 
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererSpider.java b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererSpider.java
index fb07dd858..0a7269b45 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererSpider.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererSpider.java
@@ -8,7 +8,6 @@ import net.minecraft.core.entity.monster.MobSpider;
 import net.minecraft.core.util.helper.MathHelper;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
-import org.lwjgl.opengl.GL11;
 import org.useless.dragonfly.models.entity.BoneTransform;
 import org.useless.dragonfly.models.entity.StaticEntityModel;
 
diff --git a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererWolf.java b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererWolf.java
index 6413e042e..f3e27b964 100644
--- a/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererWolf.java
+++ b/game/client/src/main/java/net/minecraft/client/render/entity/MobRendererWolf.java
@@ -125,11 +125,9 @@ public class MobRendererWolf extends MobRenderer<MobWolf> {
             GLRenderer.pushFrame();
             getModel("main").translateToBone("mouthItem");
             GLRenderer.modelM4f().scale(MobRenderer.ENTITY_RENDER_SCALE, -MobRenderer.ENTITY_RENDER_SCALE, MobRenderer.ENTITY_RENDER_SCALE);
-//            GL11.glEnable(GL12.GL_RESCALE_NORMAL);
             GLRenderer.enableState(State.BLEND);
             ItemModelDispatcher.getInstance().getDispatch(itemstack).render(GLRenderer.getTessellator(), entity, itemstack, DisplayPos.GROUND, Minecraft.getMinecraft().gameSettings.items3D.value, 1, entity.getLightmap(partialTick), partialTick, true);
             GLRenderer.disableState(State.BLEND);
-//            GL11.glDisable(GL12.GL_RESCALE_NORMAL);
             GLRenderer.popFrame();
         }
     }
diff --git a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModel.java b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModel.java
index 650aa367e..f0f09125d 100644
--- a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModel.java
+++ b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModel.java
@@ -44,7 +44,6 @@ public abstract class ItemModel {
     }
 
     public void renderItemEntity(@NotNull TessellatorGeneral tessellator, @NotNull ItemStack itemStack, boolean items3d, int clusterSize, int ticks, float yaw, int lightmap, float partialTick) {
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         GLRenderer.enableState(State.BLEND);
         if (items3d) {
             GLRenderer.modelM4f().rotateY(Math.toRadians(yaw));
@@ -53,7 +52,6 @@ public abstract class ItemModel {
         }
         render(tessellator, null, itemStack, DisplayPos.GROUND, items3d, clusterSize, lightmap, partialTick, false);
         GLRenderer.disableState(State.BLEND);
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
     }
 
     public void renderFirstPerson(@NotNull TessellatorGeneral tessellator, @NotNull ItemRenderer itemRenderer, @NotNull Player player, @NotNull ItemStack itemStack, int lightmapCoord, float partialTick) {
@@ -61,7 +59,6 @@ public abstract class ItemModel {
         GLRenderer.enableState(State.BLEND);
         GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
         GLRenderer.enableState(State.CULL_FACE);
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         final float swingProgress = player.getSwingProgress(partialTick);
         final float animationProgress2 = MathHelper.sin(swingProgress * MathHelper.PI);
         final float animationProgress = MathHelper.sin(MathHelper.sqrt_float(swingProgress) * MathHelper.PI);
@@ -103,7 +100,6 @@ public abstract class ItemModel {
             render(tessellator,player, itemStack, DisplayPos.FIRST_PERSON_RIGHT_HAND, true, 1, lightmapCoord, partialTick, false);
         }
         GLRenderer.popFrame();
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
     }
 
     public abstract IconCoordinate getIcon(@Nullable Entity entity, ItemStack itemStack);
diff --git a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java
index a42708629..98ee01810 100644
--- a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java
+++ b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java
@@ -102,12 +102,10 @@ public class ItemModelBlock extends ItemModelStandard {
             super.renderItemEntity(tessellator, itemStack, items3d, clusterSize, ticks, yaw, lightmap, partialTick);
             return;
         }
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         GLRenderer.enableState(State.BLEND);
         GLRenderer.modelM4f().rotateY(Math.toRadians(yaw));
         render(tessellator, null, itemStack, DisplayPos.GROUND, items3d, clusterSize, lightmap, partialTick, false);
         GLRenderer.disableState(State.BLEND);
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
     }
 
     @Override
diff --git a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelMap.java b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelMap.java
index b522f4f53..47d32d723 100644
--- a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelMap.java
+++ b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelMap.java
@@ -36,7 +36,6 @@ public class ItemModelMap extends ItemModelStandard {
         // The map renders very differently from any other item, so has its own custom first person render code
         if (ItemMap.hasInitialized(itemStack)) {
             GLRenderer.pushFrame();
-//            GL11.glEnable(GL12.GL_RESCALE_NORMAL);
 
             final float rotationPitch = player.xRotO + (player.xRot - player.xRotO) * partialTick;
             final float swingProgress = player.getSwingProgress(partialTick);
@@ -50,7 +49,6 @@ public class ItemModelMap extends ItemModelStandard {
             GLRenderer.modelM4f().translate(0.0F, (-(1.0F - itemRenderer.getEquippedProgress(partialTick)) * 1.2F - f_val * 0.5F) + 0.04F, zOff); // Place map at right distance from camera
             GLRenderer.modelM4f().rotateY(Math.PI_OVER_2_f);
             GLRenderer.modelM4f().rotateZ(Math.toRadians(f_val * -85F));
-//            GL11.glEnable(GL12.GL_RESCALE_NORMAL);
 
             // Render both player arms
             this.mc.textureManager.bindDownloadableTexture(this.mc.thePlayer.skinURL, this.mc.thePlayer.getEntityTexture(), this.mc.thePlayer.slimModel ? PlayerSkinParser.instanceAlex : PlayerSkinParser.instanceSteve);
@@ -104,8 +102,6 @@ public class ItemModelMap extends ItemModelStandard {
             final float scale2 = 0.015625F;
             GLRenderer.modelM4f().scale(scale2, scale2, scale2);
 
-//            GL11.glNormal3f(0.0F, 0.0F, -1F);
-
             // Render paper background of map
             this.mc.textureManager.bindTexture(this.mc.textureManager.loadTexture("/assets/minecraft/textures/misc/mapbg.png"));
             tessellator.startDrawingQuads();
diff --git a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java
index 4caa237e7..85db19ea1 100644
--- a/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java
+++ b/game/client/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java
@@ -206,16 +206,13 @@ public class ItemModelStandard extends ItemModel{
         final int a = (int) (alpha * 255.0f);
         if (itemstack.stackSize != 1 || override != null) {
             final String s = override != null ? override : "" + itemstack.stackSize;
-//            GL11.glDisable(GL_LIGHTING);
             GLRenderer.disableState(State.DEPTH_TEST);
             fontRenderer.render(s, (x + 19) - 2 - fontRenderer.stringWidth(s), y + 6 + 3).setShadow().setColor(0xffffff | (a << 24)).call();
-//            GL11.glEnable(GL_LIGHTING);
             GLRenderer.enableState(State.DEPTH_TEST);
         }
         if (itemstack.isItemDamaged() || itemstack.getItem().showFullDurability()) {
             final int barWidth = (int) Math.round(13D - (itemstack.getItemDamageForDisplay() * 13D) / itemstack.getMaxDamage());
             final int progress = (int) Math.round(255D - (itemstack.getItemDamageForDisplay() * 255D) / itemstack.getMaxDamage());
-//            GL11.glDisable(GL_LIGHTING);
             GLRenderer.pushFrame();
             GLRenderer.disableState(State.DEPTH_TEST);
             GLRenderer.setShader(Shaders.COLOR);
@@ -227,7 +224,6 @@ public class ItemModelStandard extends ItemModel{
             renderColoredQuad(tessellator, x + 2, y + 13, barWidth, 1, colorFG, a);
             tessellator.draw();
             GLRenderer.popFrame();
-//            GL11.glEnable(GL_LIGHTING);
         }
         GLRenderer.popFrame();
     }
diff --git a/game/client/src/main/java/net/minecraft/client/render/renderer/GLRenderer.java b/game/client/src/main/java/net/minecraft/client/render/renderer/GLRenderer.java
index a25931e65..5b0a84583 100644
--- a/game/client/src/main/java/net/minecraft/client/render/renderer/GLRenderer.java
+++ b/game/client/src/main/java/net/minecraft/client/render/renderer/GLRenderer.java
@@ -11,13 +11,7 @@ import net.minecraft.client.render.tessellator.TessellatorShader;
 import net.minecraft.client.render.uniform.UniformBlockManager;
 import net.minecraft.core.util.helper.Color;
 import org.jetbrains.annotations.NotNull;
-import org.joml.Matrix4f;
-import org.joml.Matrix4fStack;
-import org.joml.Vector3dc;
-import org.joml.Vector3fc;
-import org.joml.Vector4dc;
-import org.joml.Vector4f;
-import org.joml.Vector4fc;
+import org.joml.*;
 import org.lwjgl.BufferUtils;
 import org.lwjgl.opengl.GL41;
 import org.slf4j.Logger;
@@ -74,6 +68,7 @@ public class GLRenderer {
     private final @NotNull Matrix4fStack projectionMatrixStack = new Matrix4fStack(RENDER_FRAMES_STACK_SIZE);
     private final @NotNull Matrix4fStack viewMatrixStack = new Matrix4fStack(RENDER_FRAMES_STACK_SIZE);
     private final @NotNull Matrix4fStack modelMatrixStack = new Matrix4fStack(RENDER_FRAMES_STACK_SIZE);
+    private final @NotNull Matrix4fStack textureMatrixStack = new Matrix4fStack(RENDER_FRAMES_STACK_SIZE);
 
     private final long[] stateConfigStack = new long[RENDER_FRAMES_STACK_SIZE];
     private long currentStateConfig = State.DITHER.bitMask | State.MULTISAMPLE.bitMask; // Spec says these two are default on https://docs.gl/gl4/glEnable
@@ -141,8 +136,8 @@ public class GLRenderer {
         shader.bind();
         if (instance.viewProjMatDirty) {
             GL41.glBindBuffer(GL41.GL_UNIFORM_BUFFER, UniformBlockManager.BLOCK_MATRICES.ubo);
-            UniformBlockManager.BLOCK_MATRICES.adapter.bufferData(projectionM4f(), 0, UniformBlockManager.BLOCK_MATRICES.buffer.clear());
-            UniformBlockManager.BLOCK_MATRICES.adapter.bufferData(projectionM4f().invert(matBuf), N * 4 * 4, UniformBlockManager.BLOCK_MATRICES.buffer);
+            UniformBlockManager.BLOCK_MATRICES.adapter.bufferData(projectionM4f(), N * 4 * 4 * 0, UniformBlockManager.BLOCK_MATRICES.buffer.clear());
+            UniformBlockManager.BLOCK_MATRICES.adapter.bufferData(projectionM4f().invert(matBuf), N * 4 * 4 * 1, UniformBlockManager.BLOCK_MATRICES.buffer);
             UniformBlockManager.BLOCK_MATRICES.adapter.bufferData(viewM4f(), N * 4 * 4 * 2, UniformBlockManager.BLOCK_MATRICES.buffer);
             UniformBlockManager.BLOCK_MATRICES.adapter.bufferData(viewM4f().invert(matBuf), N * 4 * 4 * 3, UniformBlockManager.BLOCK_MATRICES.buffer);
             GL41.glBufferSubData(GL41.GL_UNIFORM_BUFFER, 0, UniformBlockManager.BLOCK_MATRICES.buffer);
@@ -150,6 +145,7 @@ public class GLRenderer {
             instance.viewProjMatDirty = false;
         }
         shader.uniformMat4f("model", modelM4f());
+        shader.uniformMat4f("texture", textureM4f());
 
         shader.uniformVec4f("uColor", Color.redFromInt(instance.currentColor)/255f, Color.greenFromInt(instance.currentColor)/255f, Color.blueFromInt(instance.currentColor)/255f, Color.alphaFromInt(instance.currentColor)/255f);
         shader.uniformFloat("uCurrentTick", instance.mc.ticksRan + instance.mc.timer.partialTicks);
@@ -228,6 +224,10 @@ public class GLRenderer {
         return instance.modelMatrixStack;
     }
 
+    public static @NotNull Matrix4f textureM4f() {
+        return instance.textureMatrixStack;
+    }
+
     public static void setShader(@NotNull Shader shader) {
         instance.currentShader = shader;
     }
@@ -432,6 +432,7 @@ public class GLRenderer {
         instance.projectionMatrixStack.pushMatrix();
         instance.viewMatrixStack.pushMatrix();
         instance.modelMatrixStack.pushMatrix();
+        instance.textureMatrixStack.pushMatrix();
     }
 
     public static void popFrame() {
@@ -454,6 +455,7 @@ public class GLRenderer {
         instance.projectionMatrixStack.popMatrix();
         instance.viewMatrixStack.popMatrix();
         instance.modelMatrixStack.popMatrix();
+        instance.textureMatrixStack.popMatrix();
 
         long newConfig = instance.stateConfigStack[instance.stackIndex];
         State.setStateConfig(instance.currentStateConfig, newConfig);
diff --git a/game/client/src/main/java/net/minecraft/client/render/shader/Shader.java b/game/client/src/main/java/net/minecraft/client/render/shader/Shader.java
index 64b6c53c3..abc00a79b 100644
--- a/game/client/src/main/java/net/minecraft/client/render/shader/Shader.java
+++ b/game/client/src/main/java/net/minecraft/client/render/shader/Shader.java
@@ -1,6 +1,6 @@
 package net.minecraft.client.render.shader;
 
-import static org.lwjgl.opengl.GL20.*;
+import static org.lwjgl.opengl.GL41.*;
 
 import java.nio.FloatBuffer;
 
@@ -9,17 +9,14 @@ import it.unimi.dsi.fastutil.objects.Object2IntMap;
 import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
 import net.minecraft.client.render.OpenGLHelper;
 import org.jetbrains.annotations.NotNull;
-import org.joml.Matrix4fc;
-import org.joml.Vector2fc;
-import org.joml.Vector3fc;
-import org.joml.Vector4fc;
+import org.joml.*;
 import org.lwjgl.BufferUtils;
 import org.lwjgl.opengl.GL41;
 import org.slf4j.Logger;
 
 public class Shader {
     protected static final Logger LOGGER = LogUtils.getLogger();
-    private static final FloatBuffer mat4fBuf = BufferUtils.createFloatBuffer(16);
+    private static final FloatBuffer mat4fBuf = BufferUtils.createFloatBuffer(4 * 4);
     protected int program;
 
     protected int vertexShader;
diff --git a/game/client/src/main/java/net/minecraft/client/render/shader/ShaderGeometry.java b/game/client/src/main/java/net/minecraft/client/render/shader/ShaderGeometry.java
index 78f642142..d8b58e921 100644
--- a/game/client/src/main/java/net/minecraft/client/render/shader/ShaderGeometry.java
+++ b/game/client/src/main/java/net/minecraft/client/render/shader/ShaderGeometry.java
@@ -2,25 +2,25 @@ package net.minecraft.client.render.shader;
 
 import net.minecraft.client.render.OpenGLHelper;
 import org.jetbrains.annotations.NotNull;
-import org.lwjgl.opengl.GL32;
-
-import static org.lwjgl.opengl.GL11.GL_TRUE;
-import static org.lwjgl.opengl.GL20.GL_COMPILE_STATUS;
-import static org.lwjgl.opengl.GL20.GL_FRAGMENT_SHADER;
-import static org.lwjgl.opengl.GL20.GL_INFO_LOG_LENGTH;
-import static org.lwjgl.opengl.GL20.GL_LINK_STATUS;
-import static org.lwjgl.opengl.GL20.GL_VERTEX_SHADER;
-import static org.lwjgl.opengl.GL20.glAttachShader;
-import static org.lwjgl.opengl.GL20.glCompileShader;
-import static org.lwjgl.opengl.GL20.glCreateProgram;
-import static org.lwjgl.opengl.GL20.glCreateShader;
-import static org.lwjgl.opengl.GL20.glDeleteShader;
-import static org.lwjgl.opengl.GL20.glGetProgramInfoLog;
-import static org.lwjgl.opengl.GL20.glGetProgrami;
-import static org.lwjgl.opengl.GL20.glGetShaderInfoLog;
-import static org.lwjgl.opengl.GL20.glGetShaderi;
-import static org.lwjgl.opengl.GL20.glLinkProgram;
-import static org.lwjgl.opengl.GL20.glShaderSource;
+import org.lwjgl.opengl.GL41;
+
+import static org.lwjgl.opengl.GL41.GL_TRUE;
+import static org.lwjgl.opengl.GL41.GL_COMPILE_STATUS;
+import static org.lwjgl.opengl.GL41.GL_FRAGMENT_SHADER;
+import static org.lwjgl.opengl.GL41.GL_INFO_LOG_LENGTH;
+import static org.lwjgl.opengl.GL41.GL_LINK_STATUS;
+import static org.lwjgl.opengl.GL41.GL_VERTEX_SHADER;
+import static org.lwjgl.opengl.GL41.glAttachShader;
+import static org.lwjgl.opengl.GL41.glCompileShader;
+import static org.lwjgl.opengl.GL41.glCreateProgram;
+import static org.lwjgl.opengl.GL41.glCreateShader;
+import static org.lwjgl.opengl.GL41.glDeleteShader;
+import static org.lwjgl.opengl.GL41.glGetProgramInfoLog;
+import static org.lwjgl.opengl.GL41.glGetProgrami;
+import static org.lwjgl.opengl.GL41.glGetShaderInfoLog;
+import static org.lwjgl.opengl.GL41.glGetShaderi;
+import static org.lwjgl.opengl.GL41.glLinkProgram;
+import static org.lwjgl.opengl.GL41.glShaderSource;
 
 public class ShaderGeometry extends Shader{
 
@@ -43,7 +43,7 @@ public class ShaderGeometry extends Shader{
 
         this.vertexShader = glCreateShader(GL_VERTEX_SHADER);
         this.fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
-        this.geometryShader = glCreateShader(GL32.GL_GEOMETRY_SHADER);
+        this.geometryShader = glCreateShader(GL41.GL_GEOMETRY_SHADER);
 
         glShaderSource(this.vertexShader, vertexSource);
         glShaderSource(this.fragmentShader, fragmentSource);
diff --git a/game/client/src/main/java/net/minecraft/client/render/terrain/RenderList.java b/game/client/src/main/java/net/minecraft/client/render/terrain/RenderList.java
index 622154ca5..185e3bde5 100644
--- a/game/client/src/main/java/net/minecraft/client/render/terrain/RenderList.java
+++ b/game/client/src/main/java/net/minecraft/client/render/terrain/RenderList.java
@@ -1,6 +1,6 @@
 package net.minecraft.client.render.terrain;
 
-import static org.lwjgl.opengl.GL15.*;
+import static org.lwjgl.opengl.GL41.*;
 
 import java.nio.IntBuffer;
 import java.util.ArrayList;
diff --git a/game/client/src/main/java/net/minecraft/client/render/terrain/VertexBuffer.java b/game/client/src/main/java/net/minecraft/client/render/terrain/VertexBuffer.java
index f75ee716b..c0a63d84d 100644
--- a/game/client/src/main/java/net/minecraft/client/render/terrain/VertexBuffer.java
+++ b/game/client/src/main/java/net/minecraft/client/render/terrain/VertexBuffer.java
@@ -1,13 +1,12 @@
 package net.minecraft.client.render.terrain;
 
-import static org.lwjgl.opengl.GL15.*;
+import static org.lwjgl.opengl.GL41.*;
 
 import java.util.ArrayList;
 import java.util.List;
 
 import com.mojang.logging.CategorizedLogger;
 import com.mojang.logging.LogUtils;
-import org.lwjgl.opengl.GL31;
 
 import net.minecraft.client.render.OpenGLHelper;
 import org.lwjgl.opengl.GL41;
@@ -132,13 +131,13 @@ public class VertexBuffer {
 		
 		OpenGLHelper.checkError("create expand buffer");
 
-        glBindBuffer(GL31.GL_COPY_READ_BUFFER, this.vbo);
-        glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, newBuffer);
+        glBindBuffer(GL41.GL_COPY_READ_BUFFER, this.vbo);
+        glBindBuffer(GL41.GL_COPY_WRITE_BUFFER, newBuffer);
 
-        GL31.glCopyBufferSubData(GL31.GL_COPY_READ_BUFFER, GL31.GL_COPY_WRITE_BUFFER, 0, 0, this.capacity);
+        GL41.glCopyBufferSubData(GL41.GL_COPY_READ_BUFFER, GL41.GL_COPY_WRITE_BUFFER, 0, 0, this.capacity);
 
-        glBindBuffer(GL31.GL_COPY_READ_BUFFER, 0);
-        glBindBuffer(GL31.GL_COPY_WRITE_BUFFER, 0);
+        glBindBuffer(GL41.GL_COPY_READ_BUFFER, 0);
+        glBindBuffer(GL41.GL_COPY_WRITE_BUFFER, 0);
 
         OpenGLHelper.checkError("copy buffer");
 		
diff --git a/game/client/src/main/java/net/minecraft/client/render/texture/Texture.java b/game/client/src/main/java/net/minecraft/client/render/texture/Texture.java
index d97e8f693..c6c90092a 100644
--- a/game/client/src/main/java/net/minecraft/client/render/texture/Texture.java
+++ b/game/client/src/main/java/net/minecraft/client/render/texture/Texture.java
@@ -1,9 +1,9 @@
 package net.minecraft.client.render.texture;
 
 import static net.minecraft.client.util.helper.Buffer.buffer;
-import static org.lwjgl.opengl.GL11.*;
-import static org.lwjgl.opengl.GL12.GL_CLAMP_TO_EDGE;
-import static org.lwjgl.opengl.GL12.GL_TEXTURE_MAX_LEVEL;
+import static org.lwjgl.opengl.GL41.*;
+import static org.lwjgl.opengl.GL41.GL_CLAMP_TO_EDGE;
+import static org.lwjgl.opengl.GL41.GL_TEXTURE_MAX_LEVEL;
 
 import com.mojang.logging.LogUtils;
 import net.minecraft.client.GLAllocation;
diff --git a/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlag.java b/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlag.java
index 79a43b13a..689925dbf 100644
--- a/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlag.java
+++ b/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlag.java
@@ -42,7 +42,6 @@ public class TileEntityRendererFlag extends TileEntityRenderer<TileEntityFlag> {
     private long lastTick = 0;
 
     public void doRender(final @NotNull TessellatorGeneral tessellator, final @NotNull TileEntityFlag tileEntityFlag, final double x, final double y, final double z, final float partialTick, final boolean shortPole, final float windDirection, final float windIntensity) {
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         final World theWorld = this.mc.currentWorld;
         if (theWorld.getWorldTime() != this.lastTick) {
             this.lastTick = theWorld.getWorldTime();
diff --git a/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlowerJar.java b/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlowerJar.java
index 90869313a..d1351e425 100644
--- a/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlowerJar.java
+++ b/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlowerJar.java
@@ -2,17 +2,15 @@ package net.minecraft.client.render.tileentity;
 
 import net.minecraft.client.render.Lighting;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
+import net.minecraft.client.render.renderer.BlendFactor;
 import net.minecraft.client.render.renderer.GLRenderer;
+import net.minecraft.client.render.renderer.State;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.TessellatorGeneral;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.block.entity.TileEntityFlowerJar;
-import org.lwjgl.opengl.GL11;
 
-import static org.lwjgl.opengl.GL11.GL_BLEND;
-import static org.lwjgl.opengl.GL11.GL_ONE_MINUS_SRC_ALPHA;
-import static org.lwjgl.opengl.GL11.GL_SRC_ALPHA;
 
 public class TileEntityRendererFlowerJar extends TileEntityRenderer<TileEntityFlowerJar> {
 
@@ -26,12 +24,12 @@ public class TileEntityRendererFlowerJar extends TileEntityRenderer<TileEntityFl
             float scaleValue = 0.75F;
             GLRenderer.modelM4f().scale(scaleValue, scaleValue, scaleValue);
             GLRenderer.modelM4f().translate(0.66F, 0.75F, 0.66F);
-            GL11.glEnable(GL_BLEND);
-            GL11.glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+            GLRenderer.enableState(State.BLEND);
+            GLRenderer.setBlendFunc(BlendFactor.SRC_ALPHA, BlendFactor.ONE_MINUS_SRC_ALPHA);
             Lighting.disable();
             BlockModelDispatcher.getInstance().getDispatch(block).renderStandalone(tessellator, tileEntity.flowerData, tileEntity.worldObj.getLightmapCoord(tileEntity.x, tileEntity.y, tileEntity.z, 0));
             Lighting.enableLight();
-            GL11.glDisable(GL_BLEND);
+            GLRenderer.disableState(State.BLEND);
         }
         GLRenderer.popFrame();
     }
diff --git a/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java b/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
index 844eecd9f..2b4620b52 100644
--- a/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
+++ b/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
@@ -53,7 +53,6 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign> {
         if (block == null || !(block.getLogic() instanceof BlockLogicSign sign))
             return; // Check to make sure the block for the entity is present before rendering, some edge cases have the tile entity loaded before the block data and can cause a crash
 
-//        GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         GLRenderer.pushFrame();
 
         final StaticEntityModel model;
@@ -101,7 +100,6 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign> {
         GLRenderer.pushFrame();
         GLRenderer.enableState(State.BLEND);
         GLRenderer.modelM4f().translate(0 * scale, height * scale, 1.05f * scale);
-//        GL11.glNormal3f(0, 0, 1);
         GLRenderer.setDepthMask(false);
         GLRenderer.setColor4f(1, 1, 1, 1);
         final EnumSignPicture picture = tileEntity.getPicture();
@@ -164,7 +162,6 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign> {
         GLRenderer.setDepthMask(true);
         GLRenderer.setColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         GLRenderer.popFrame();
-//        GL11.glDisable(GL12.GL_RESCALE_NORMAL);
     }
 
     private static void drawTexturedModalRect(final double width, final double height, final int color, final @NotNull IconCoordinate coordinate) {
@@ -234,35 +231,10 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign> {
             this.referenceEntry.line4 = line4.toString();
             this.referenceEntry.config = config;
 
-//            MeshEntry entry = null;
-//            final int size = this.bufferedMeshes.size();
-//            for (int i = 0; i < size; i++) {
-//                final MeshEntry e = this.bufferedMeshes.get(i);
-//                if (this.referenceEntry.equals(e)) {
-//                    entry = e;
-//                    break;
-//                }
-//            }
-
-//            if (entry != null) {
-//                entry.lastUse = System.currentTimeMillis();
-//                GL11.glCallList(entry.list);
-//            } else {
-//                entry = new MeshEntry(line1, line2, line3, line4, config);
-//                entry.lastUse = System.currentTimeMillis();
-//                entry.list = getDisplayList();
-//
-//                GL11.glNewList(entry.list, GL11.GL_COMPILE);
-                sr.render(line1, -sr.stringWidth(line1) / 2, 0).setConfig(config).call();
-                sr.render(line2, -sr.stringWidth(line2) / 2, 10).setConfig(config).call();
-                sr.render(line3, -sr.stringWidth(line3) / 2, 20).setConfig(config).call();
-                sr.render(line4, -sr.stringWidth(line4) / 2, 30).setConfig(config).call();
-//                GL11.glEndList();
-//                GL11.glCallList(entry.list);
-//
-//                this.bufferedMeshes.add(entry);
-//            }
-
+            sr.render(line1, -sr.stringWidth(line1) / 2, 0).setConfig(config).call();
+            sr.render(line2, -sr.stringWidth(line2) / 2, 10).setConfig(config).call();
+            sr.render(line3, -sr.stringWidth(line3) / 2, 20).setConfig(config).call();
+            sr.render(line4, -sr.stringWidth(line4) / 2, 30).setConfig(config).call();
         }
 
         public static class MeshEntry {
diff --git a/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererStatue.java b/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererStatue.java
index 822ba11e4..79374338e 100644
--- a/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererStatue.java
+++ b/game/client/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererStatue.java
@@ -58,7 +58,6 @@ public class TileEntityRendererStatue extends TileEntityRenderer<TileEntityStatu
 
         final StaticEntityModel model = model(isPigman);
 
-//        GL12.glEnable(GL12.GL_RESCALE_NORMAL);
         GLRenderer.setColor4f(1.0F, 1.0F, 1.0F, 1.0F);
         bindTexture(BLOCK_SKIN_MAP.getOrDefault(lowerBlock, BLOCK_SKIN_MAP.get(Blocks.STATUE_STONE_LOWER)));
         GLRenderer.pushFrame();
@@ -81,12 +80,10 @@ public class TileEntityRendererStatue extends TileEntityRenderer<TileEntityStatu
 
         GLRenderer.enableState(State.CULL_FACE);
         GLRenderer.popFrame();
-//        GL12.glDisable(GL12.GL_RESCALE_NORMAL);
     }
 
     private void renderHeldItem(final @Nullable ItemStack itemStack, int lightmap, final boolean isPigman) {
         if (itemStack != null) {
-//            GL12.glEnable(GL12.GL_RESCALE_NORMAL);
             GLRenderer.setColor4f(1.0F, 1.0F, 1.0F, 1.0F);
             model(isPigman).translateToBone("rightItem");
             GLRenderer.modelM4f().scale(-1, 1, 1);
@@ -94,7 +91,6 @@ public class TileEntityRendererStatue extends TileEntityRenderer<TileEntityStatu
             ItemModelDispatcher.getInstance().getDispatch(itemStack).render(GLRenderer.getTessellator(), null, itemStack, DisplayPos.THIRD_PERSON_RIGHT_HAND, true, 1,
                lightmap, 1f, false);
             GLRenderer.enableState(State.CULL_FACE);
-//            GL12.glDisable(GL12.GL_RESCALE_NORMAL);
         }
     }
 
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 54085a2b6..e973bd7e1 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
@@ -37,8 +37,7 @@ import org.lwjgl.glfw.GLFWImage;
 import org.lwjgl.glfw.GLFWVidMode;
 import org.lwjgl.input.Keyboard;
 import org.lwjgl.input.Mouse;
-import org.lwjgl.opengl.Display;
-import org.lwjgl.opengl.GL;
+import org.lwjgl.opengl.*;
 
 import com.github.zarzelcow.legacylwjgl3.implementation.glfw.GLFWKeyboardImplementation;
 import com.github.zarzelcow.legacylwjgl3.implementation.glfw.GLFWMouseImplementation;
@@ -48,10 +47,6 @@ import com.github.zarzelcow.legacylwjgl3.implementation.input.InputImplementatio
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.PanelCrashReport;
 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.lwjgl.system.MemoryStack;
 import org.lwjgl.system.MemoryUtil;
@@ -134,7 +129,7 @@ public class GameWindowGLFW implements GameWindow {
 
         if (capabilities.OpenGL43) {
             if (debug) {
-                GL11.glEnable(GL43.GL_DEBUG_OUTPUT);
+                GL41.glEnable(GL43.GL_DEBUG_OUTPUT);
                 this.glDebugMessageCallback = new OpenGLLoggerCallback();
                 GL43.glDebugMessageCallback(this.glDebugMessageCallback, NULL);
                 LOGGER.info("GL4.3 supported, enabling GL Error logging");
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 d5d174389..664f8ff47 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
@@ -4,7 +4,7 @@ import it.unimi.dsi.fastutil.ints.Int2BooleanMap;
 import it.unimi.dsi.fastutil.ints.Int2BooleanOpenHashMap;
 import org.jetbrains.annotations.NotNull;
 import org.lwjgl.opengl.ARBFramebufferObject;
-import org.lwjgl.opengl.GL11;
+import org.lwjgl.opengl.GL41;
 import org.lwjgl.opengl.GL43;
 import org.lwjgl.opengl.GLDebugMessageCallback;
 import org.lwjgl.system.MemoryUtil;
@@ -26,31 +26,31 @@ public class OpenGLLoggerCallback extends GLDebugMessageCallback {
         switch (severity) {
             case GL43.GL_DEBUG_SEVERITY_HIGH: {
                 LOGGER.error(
-                    "High Severity error from '{}' Type='{}' ErrorCode[{}]:",
+                    "High Severity error from '{}' Type='{}' ErrorCode[{}]: {}",
                     getSourceName(source),
                     getTypeName(type),
                     getIdName(id),
-                    new RuntimeException(msg)
+                    msg
                 );
                 break;
             }
             case GL43.GL_DEBUG_SEVERITY_MEDIUM: {
                 LOGGER.warn(
-                    "Medium Severity error from '{}' Type='{}' ErrorCode[{}]:",
+                    "Medium Severity error from '{}' Type='{}' ErrorCode[{}]: {}",
                     getSourceName(source),
                     getTypeName(type),
                     getIdName(id),
-                    new RuntimeException(msg)
+                    msg
                 );
                 break;
             }
             case GL43.GL_DEBUG_SEVERITY_LOW: {
                 LOGGER.warn(
-                    "Low Severity issue from '{}' Type='{}' ErrorCode[{}]:",
+                    "Low Severity issue from '{}' Type='{}' ErrorCode[{}]: {}",
                     getSourceName(source),
                     getTypeName(type),
                     getIdName(id),
-                    new RuntimeException(msg)
+                    msg
                 );
                 break;
             }
@@ -62,12 +62,12 @@ public class OpenGLLoggerCallback extends GLDebugMessageCallback {
 
     public @NotNull String getIdName(int 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 GL41.GL_INVALID_ENUM -> "Invalid Enum";
+            case GL41.GL_INVALID_VALUE -> "Invalid Value";
+            case GL41.GL_INVALID_OPERATION -> "Invalid Operation";
+            case GL41.GL_STACK_OVERFLOW -> "Stack Overflow";
+            case GL41.GL_STACK_UNDERFLOW -> "Stack Underflow";
+            case GL41.GL_OUT_OF_MEMORY -> "Out of Memory";
             case ARBFramebufferObject.GL_INVALID_FRAMEBUFFER_OPERATION -> "Invalid Framebuffer Operation";
             default -> "Unknown 0x" + Integer.toHexString(error);
         };
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 bccf69cf7..c26e31e08 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
@@ -6,8 +6,8 @@ import java.text.SimpleDateFormat;
 import java.util.Date;
 
 import com.mojang.logging.LogUtils;
-import org.lwjgl.opengl.GL11;
 
+import org.lwjgl.opengl.GL41;
 import org.lwjgl.stb.STBImageWrite;
 import org.lwjgl.system.MemoryUtil;
 import org.slf4j.Logger;
@@ -34,9 +34,9 @@ public class ScreenShot
 
             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);
+            GL41.glPixelStorei(GL41.GL_PACK_ALIGNMENT, 1);
+            GL41.glPixelStorei(GL41.GL_UNPACK_ALIGNMENT, 1);
+            GL41.glReadPixels(0, 0, width, height, GL41.GL_RGB, GL41.GL_UNSIGNED_BYTE, buffer1);
 
             for (int y = 0; y < height; y++) { // Flip image vertically
                 int index = y * width * 3;
diff --git a/game/client/src/main/java/net/minecraft/client/util/helper/Textures.java b/game/client/src/main/java/net/minecraft/client/util/helper/Textures.java
index 332168a12..347ccb144 100644
--- a/game/client/src/main/java/net/minecraft/client/util/helper/Textures.java
+++ b/game/client/src/main/java/net/minecraft/client/util/helper/Textures.java
@@ -1,7 +1,6 @@
 package net.minecraft.client.util.helper;
 
 import static net.minecraft.client.util.helper.Buffer.*;
-import static org.lwjgl.opengl.GL11.*;
 
 import java.awt.Color;
 import java.awt.Graphics;
@@ -19,12 +18,12 @@ import com.mojang.logging.LogUtils;
 import it.unimi.dsi.fastutil.ints.IntList;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import org.jetbrains.annotations.NotNull;
-import org.lwjgl.opengl.GL12;
 
 import com.b100.utils.ImageUtils;
 
 import net.minecraft.client.GLAllocation;
 import net.minecraft.client.render.OpenGLHelper;
+import org.lwjgl.opengl.GL41;
 import org.slf4j.Logger;
 
 public class Textures {
@@ -125,15 +124,15 @@ public class Textures {
 			Integer tex = textureList.getInt(i);
 
             LOGGER.debug("Tex: {}", tex);
-			
-			glBindTexture(GL_TEXTURE_2D, tex);
-			int maxLevel = glGetTexParameteri(GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL);
+
+			GL41.glBindTexture(GL41.GL_TEXTURE_2D, tex);
+			int maxLevel = GL41.glGetTexParameteri(GL41.GL_TEXTURE_2D, GL41.GL_TEXTURE_MAX_LEVEL);
 
             LOGGER.debug("Max Level: {}", maxLevel);
 			
 			for(int level = 0; level <= maxLevel; level++) {
-				int w = glGetTexLevelParameteri(GL_TEXTURE_2D, level, GL_TEXTURE_WIDTH);
-				int h = glGetTexLevelParameteri(GL_TEXTURE_2D, level, GL_TEXTURE_HEIGHT);
+				int w = GL41.glGetTexLevelParameteri(GL41.GL_TEXTURE_2D, level, GL41.GL_TEXTURE_WIDTH);
+				int h = GL41.glGetTexLevelParameteri(GL41.GL_TEXTURE_2D, level, GL41.GL_TEXTURE_HEIGHT);
 				
 				OpenGLHelper.checkError("dump check texture size");
 				
@@ -148,8 +147,8 @@ public class Textures {
 				ByteBuffer buffer = Buffer.buffer;
 				
 				buffer.position(0).limit(size);
-				glGetTexImage(GL_TEXTURE_2D, level, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
-				if(glGetError() == 0) {
+				GL41.glGetTexImage(GL41.GL_TEXTURE_2D, level, GL41.GL_RGBA, GL41.GL_UNSIGNED_BYTE, buffer);
+				if(GL41.glGetError() == 0) {
 					buffer.position(0);
 					ImageUtils.saveExternalImage(getImage(buffer, w, h, true, false), new File(folder, "tex"+tex+"-level"+level+".png"));
 					
@@ -183,9 +182,9 @@ public class Textures {
 	}
 	
 	public static BufferedImage getTextureAsImage(int texture, boolean alpha, int level, boolean mirrorVertical) {
-		glBindTexture(GL_TEXTURE_2D, texture);
-		int w = glGetTexLevelParameteri(GL_TEXTURE_2D, level, GL_TEXTURE_WIDTH);
-		int h = glGetTexLevelParameteri(GL_TEXTURE_2D, level, GL_TEXTURE_HEIGHT);
+		GL41.glBindTexture(GL41.GL_TEXTURE_2D, texture);
+		int w = GL41.glGetTexLevelParameteri(GL41.GL_TEXTURE_2D, level, GL41.GL_TEXTURE_WIDTH);
+		int h = GL41.glGetTexLevelParameteri(GL41.GL_TEXTURE_2D, level, GL41.GL_TEXTURE_HEIGHT);
 		
 		if(w == 0 || h == 0) return null;
 
@@ -193,8 +192,8 @@ public class Textures {
 		
 		Buffer.reset();
 		Buffer.checkBufferSize(w * h * 16);
-		
-		glGetTexImage(GL_TEXTURE_2D, level, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
+
+		GL41.glGetTexImage(GL41.GL_TEXTURE_2D, level, GL41.GL_RGBA, GL41.GL_UNSIGNED_BYTE, buffer);
 		buffer.position(0);
 		buffer.limit(buffer.capacity());
 		
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 40fcbd4b1..8a53475e6 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
@@ -54,7 +54,8 @@
             "main":"geometry.deer"
         },
         "minecraft:creeper": {
-            "main":"geometry.creeper"
+            "main":"geometry.creeper",
+            "charged":"geometry.creeper.charged"
         },
         "minecraft:skeleton": {
             "main":"geometry.skeleton",
diff --git a/game/client/src/main/resources/shaders/world.vsh b/game/client/src/main/resources/shaders/world.vsh
index ae25ef18c..e6abd030c 100644
--- a/game/client/src/main/resources/shaders/world.vsh
+++ b/game/client/src/main/resources/shaders/world.vsh
@@ -18,6 +18,7 @@ uniform vec4 lightSourceDiffuse1;
 uniform vec4 lightSourceDiffuse2;
 
 uniform mat4 model;
+uniform mat4 texture;
 
 layout (std140) uniform Matrices {
     mat4 projection;
@@ -30,7 +31,7 @@ void main() {
     vec4 p = vec4(aPos, 1);
     gl_Position = matrices.projection * matrices.view * model * p;
 
-    TexCoord = aUV;
+    TexCoord = (texture * vec4(aUV, 0.0f, 1.0f)).xy;
     Color = aColor;
     LightMapCoord = aLightmap;
 
diff --git a/game/core/src/main/java/net/minecraft/core/block/BlockLogicLeavesCherryFlowering.java b/game/core/src/main/java/net/minecraft/core/block/BlockLogicLeavesCherryFlowering.java
index 3f4badadd..a4381e965 100644
--- a/game/core/src/main/java/net/minecraft/core/block/BlockLogicLeavesCherryFlowering.java
+++ b/game/core/src/main/java/net/minecraft/core/block/BlockLogicLeavesCherryFlowering.java
@@ -95,7 +95,7 @@ public class BlockLogicLeavesCherryFlowering extends BlockLogicLeavesCherry impl
             if(!world.isClientSide) {
                 if(world.getSeasonManager().getCurrentSeason() != Seasons.OVERWORLD_SPRING)
                     return true;
-                world.setBlockIdNotify(tilePos, setGrowthRate(meta, MAX_GROWTH_STATE));
+                world.setBlockDataNotify(tilePos, setGrowthRate(meta, MAX_GROWTH_STATE));
                 if (player == null || player.getGamemode().consumeBlocks()) {
                     itemStack.stackSize--;
                 }
diff --git a/game/core/src/main/java/net/minecraft/core/entity/EntityFallingBlock.java b/game/core/src/main/java/net/minecraft/core/entity/EntityFallingBlock.java
index 072755551..5024b055a 100644
--- a/game/core/src/main/java/net/minecraft/core/entity/EntityFallingBlock.java
+++ b/game/core/src/main/java/net/minecraft/core/entity/EntityFallingBlock.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.entity;
 
+import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.BlockLogicSand;
 import net.minecraft.core.block.Blocks;
@@ -8,6 +9,7 @@ import net.minecraft.core.block.entity.TileEntityDispatcher;
 import net.minecraft.core.block.motion.CarriedBlock;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.enums.EnumDropCause;
+import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
@@ -27,30 +29,30 @@ public class EntityFallingBlock extends Entity
     public EntityFallingBlock(World world)
     {
         super(world);
-        carriedBlock = new CarriedBlock(this, Blocks.SAND, 0, null);
-        fallTime = 0;
+        this.carriedBlock = new CarriedBlock(this, Blocks.SAND, 0, null);
+        this.fallTime = 0;
         setSize(1F, 1F);
-        heightOffset = bbHeight / 2.0F;
+        this.heightOffset = this.bbHeight / 2.0F;
     }
 
     public EntityFallingBlock(World world, double x, double y, double z, int blockId, int blockMeta, @Nullable TileEntity tileEntity) {
         super(world);
-        fallTime = 0;
-        carriedBlock = new CarriedBlock(this, blockId, blockMeta, tileEntity);
+        this.fallTime = 0;
+        this.carriedBlock = new CarriedBlock(this, blockId, blockMeta, tileEntity);
         if (tileEntity != null) {
             tileEntity.worldObj = null;
-            tileEntity.carriedBlock = carriedBlock;
+            tileEntity.carriedBlock = this.carriedBlock;
         }
-        blocksBuilding = true;
+        this.blocksBuilding = true;
         setSize(1F, 1F);
-        heightOffset = bbHeight / 2.0F;
+        this.heightOffset = this.bbHeight / 2.0F;
         setPos(x, y, z);
-        xd = 0.0D;
-        yd = 0.0D;
-        zd = 0.0D;
-        xo = x;
-        yo = y;
-        zo = z;
+        this.xd = 0.0D;
+        this.yd = 0.0D;
+        this.zd = 0.0D;
+        this.xo = x;
+        this.yo = y;
+        this.zo = z;
     }
 
     @Override
@@ -67,55 +69,55 @@ public class EntityFallingBlock extends Entity
     @Override
 	public boolean isPickable()
     {
-        return !removed;
+        return !this.removed;
     }
 
     @Override
 	public void tick()
     {
-        if(carriedBlock.blockId == 0)
+        if(this.carriedBlock.blockId == 0)
         {
             remove();
             return;
         }
-        pushesThisTick = 0;
-        pushTime *= 0.98f;
-        if (pushTime < 0.05f || (pushTime < 0.25 && onGround)){
-            pushTime = 0;
+        this.pushesThisTick = 0;
+        this.pushTime *= 0.98f;
+        if (this.pushTime < 0.05f || (this.pushTime < 0.25 && this.onGround)){
+            this.pushTime = 0;
         }
-        if (isOnFire() && carriedBlock.blockId == Blocks.TNT.id()) {
+        if (isOnFire() && this.carriedBlock.blockId == Blocks.TNT.id()) {
             remove();
-            EntityPrimedTNT entityPrimedTNT = new EntityPrimedTNT(world, x, y, z);
+            EntityPrimedTNT entityPrimedTNT = new EntityPrimedTNT(this.world, this.x, this.y, this.z);
             entityPrimedTNT.xd = this.xd;
             entityPrimedTNT.yd = this.yd;
             entityPrimedTNT.zd = this.zd;
             entityPrimedTNT.pushTime = this.pushTime;
-            world.entityJoinedWorld(entityPrimedTNT);
+            this.world.entityJoinedWorld(entityPrimedTNT);
             return;
         }
-        xo = x;
-        yo = y;
-        zo = z;
-        if (pushTime < 0.01 && yd <= 0) {
-            fallTime++;
+        this.xo = this.x;
+        this.yo = this.y;
+        this.zo = this.z;
+        if (this.pushTime < 0.01 && this.yd <= 0) {
+            this.fallTime++;
         }
-        yd -= 0.04D;
-        move(xd, yd, zd);
-        xd *= 0.98D;
-        yd *= 0.98D;
-        zd *= 0.98D;
+        this.yd -= 0.04D;
+        move(this.xd, this.yd, this.zd);
+        this.xd *= 0.98D;
+        this.yd *= 0.98D;
+        this.zd *= 0.98D;
         int x = MathHelper.round(this.x - 0.5);
         int y = MathHelper.round(this.y);
         int z = MathHelper.round(this.z - 0.5);
-        if(world.getBlockId(x, y, z) == carriedBlock.blockId && !hasRemovedBlock)
+        if(this.world.getBlockId(x, y, z) == this.carriedBlock.blockId && !this.hasRemovedBlock)
         {
-            world.setBlockWithNotify(x, y, z, 0);
-            hasRemovedBlock = true;
+            this.world.setBlockWithNotify(x, y, z, 0);
+            this.hasRemovedBlock = true;
         }
-        if (onGround) {
-            Block<?> selfBlock = carriedBlock.block();
-            Block<?> blockBelow = world.getBlock(x, y - 1, z);
-            Block<?> blockAt = world.getBlock(x, y, z);
+        if (this.onGround) {
+            Block<?> selfBlock = this.carriedBlock.block();
+            Block<?> blockBelow = this.world.getBlock(x, y - 1, z);
+            Block<?> blockAt = this.world.getBlock(x, y, z);
             double friction = selfBlock.friction;
             if (BlockTags.OVERRIDE_FRICTION.appliesTo(blockAt)) {
                 friction *= blockAt.friction * 0.91f;
@@ -124,83 +126,139 @@ public class EntityFallingBlock extends Entity
             } else {
                 friction *= 0.98;
             }
-            xd *= friction;
-            zd *= friction;
-            yd *= -0.5D;
-            pushTime *= (float) friction;
+            this.xd *= friction;
+            this.zd *= friction;
+            this.yd *= -0.5D;
+            this.pushTime *= (float) friction;
         }
 
-        double v = Math.hypot(xd, zd);
+        double v = Math.hypot(this.xd, this.zd);
         if (v < 0.001 || isInWall()) {
-            if(onGround || isInWall())
+            if(this.onGround || isInWall())
             {
                 Entity rider = getPassenger();
                 ejectRider();
                 remove();
-                if((!world.canBlockBePlacedAt(carriedBlock.blockId, x, y, z, true, Side.TOP) || BlockLogicSand.canFallBelow(world, new TilePos(x, y - 1, z)) || !world.setBlock(x, y, z, carriedBlock.blockId)) && !world.isClientSide)
+                if((!this.world.canBlockBePlacedAt(this.carriedBlock.blockId, x, y, z, true, Side.TOP) || BlockLogicSand.canFallBelow(this.world, new TilePos(x, y - 1, z)) || !this.world.setBlock(x, y, z, this.carriedBlock.blockId)) && !this.world.isClientSide)
                 {
-                    if(hasRemovedBlock) {
+                    if(this.hasRemovedBlock) {
                         drop();
                     }
-                } else if (!world.isClientSide) {
-                    world.setBlockMetadata(x, y, z, carriedBlock.metadata);
-                    if (carriedBlock.entity != null) {
-                        TileEntity oldEnt = world.getTileEntity(x, y, z);
+                } else if (!this.world.isClientSide) {
+                    this.world.setBlockMetadata(x, y, z, this.carriedBlock.metadata);
+                    if (this.carriedBlock.entity != null) {
+                        TileEntity oldEnt = this.world.getTileEntity(x, y, z);
                         if (oldEnt != null) {
                             oldEnt.invalidate();
                         }
-                        carriedBlock.entity.validate();
-                        carriedBlock.entity.x = x;
-                        carriedBlock.entity.y = y;
-                        carriedBlock.entity.z = z;
-                        carriedBlock.entity.worldObj = world;
-                        carriedBlock.entity.carriedBlock = null;
-                        world.replaceBlockTileEntity(x, y, z, carriedBlock.entity);
+                        this.carriedBlock.entity.validate();
+                        this.carriedBlock.entity.x = x;
+                        this.carriedBlock.entity.y = y;
+                        this.carriedBlock.entity.z = z;
+                        this.carriedBlock.entity.worldObj = this.world;
+                        this.carriedBlock.entity.carriedBlock = null;
+                        this.world.replaceBlockTileEntity(x, y, z, this.carriedBlock.entity);
                     }
-                    world.notifyBlockChange(x, y, z, carriedBlock.blockId);
+                    this.world.notifyBlockChange(x, y, z, this.carriedBlock.blockId);
                 }
                 if (rider != null) {
-                    TileEntity te = world.getTileEntity(x, y, z);
+                    TileEntity te = this.world.getTileEntity(x, y, z);
                     if (te instanceof IVehicle) rider.startRiding((IVehicle) te);
                 }
-            } else if(fallTime > 600 && !world.isClientSide) {
-                if(hasRemovedBlock) {
+            } else if(this.fallTime > 600 && !this.world.isClientSide) {
+                if(this.hasRemovedBlock) {
                     drop();
                 }
                 ejectRider();
                 remove();
             }
 
-            carriedBlock.heldTick(world, this);
+            this.carriedBlock.heldTick(this.world, this);
         }
     }
 
     public void drop() {
-        Block<?> block = carriedBlock.block();
+        Block<?> block = this.carriedBlock.block();
         if (block != null) {
-            ItemStack[] drops = block.getBreakResult(world, EnumDropCause.SILK_TOUCH, carriedBlock.metadata, carriedBlock.entity);
+            ItemStack[] drops = block.getBreakResult(this.world, EnumDropCause.SILK_TOUCH, this.carriedBlock.metadata, this.carriedBlock.entity);
             if (drops != null && drops.length > 0) {
                 for (int i = 0; i < drops.length; i++) {
                     dropItem(drops[i], 0);
                 }
             }
         }
-        if (carriedBlock.entity != null) {
+        if (this.carriedBlock.entity != null) {
             int x = MathHelper.round(this.x - 0.5);
             int y = MathHelper.round(this.y);
             int z = MathHelper.round(this.z - 0.5);
-            carriedBlock.entity.dropContents(world, x, y, z);
+            this.carriedBlock.entity.dropContents(this.world, x, y, z);
         }
     }
 
+    @Override
+    public int calcLightmap(float partialTick) {
+        if (Global.accessor.isFullbrightEnabled()) return 15 << 20 | 15;
+        TilePos blockPos = new TilePos(this.x, this.y - this.heightOffset + this.ySlideOffset + this.bbHeight * 0.66D, this.z);
+
+        final int skylight;
+        final int blocklight;
+        if (this.world.getBlockLitInteriorSurface(blockPos) || this.world.getBlock(blockPos) == this.carriedBlock.block()) {
+            TilePos queryPos = new TilePos();
+
+            int bU = this.world.getSavedLightValue(LightLayer.Block, blockPos.up(queryPos));
+            final int bW = this.world.getSavedLightValue(LightLayer.Block, blockPos.west(queryPos));
+            final int bE = this.world.getSavedLightValue(LightLayer.Block, blockPos.east(queryPos));
+            final int bS = this.world.getSavedLightValue(LightLayer.Block, blockPos.south(queryPos));
+            final int bN = this.world.getSavedLightValue(LightLayer.Block, blockPos.north(queryPos));
+            if (bW > bU) {
+                bU = bW;
+            }
+            if (bE > bU) {
+                bU = bE;
+            }
+            if (bS > bU) {
+                bU = bS;
+            }
+            if (bN > bU) {
+                bU = bN;
+            }
+            blocklight = bU;
+
+            int sU = this.world.getSavedLightValue(LightLayer.Sky, blockPos.up(queryPos));
+            final int sW = this.world.getSavedLightValue(LightLayer.Sky, blockPos.west(queryPos));
+            final int sE = this.world.getSavedLightValue(LightLayer.Sky, blockPos.east(queryPos));
+            final int sS = this.world.getSavedLightValue(LightLayer.Sky, blockPos.south(queryPos));
+            final int sN = this.world.getSavedLightValue(LightLayer.Sky, blockPos.north(queryPos));
+            if (sW > sU) {
+                sU = sW;
+            }
+            if (sE > sU) {
+                sU = sE;
+            }
+            if (sS > sU) {
+                sU = sS;
+            }
+            if (sN > sU) {
+                sU = sN;
+            }
+            skylight = sU;
+
+        } else {
+            skylight = this.world.getSavedLightValue(LightLayer.Sky, blockPos);
+            blocklight = this.world.getSavedLightValue(LightLayer.Block, blockPos);
+        }
+
+        return this.world.getLightmapCoord(skylight, blocklight);
+    }
+
     @Override
     public void addAdditionalSaveData(@NotNull CompoundTag tag)
     {
-        tag.putShort("Tile", (short)carriedBlock.blockId);
-        tag.putShort("TileData", (short) carriedBlock.metadata);
-        if (carriedBlock.entity != null) {
+        tag.putShort("Tile", (short) this.carriedBlock.blockId);
+        tag.putShort("TileData", (short) this.carriedBlock.metadata);
+        if (this.carriedBlock.entity != null) {
             CompoundTag entityTag = new CompoundTag();
-            carriedBlock.entity.writeToNBT(entityTag);
+            this.carriedBlock.entity.writeToNBT(entityTag);
             tag.putCompound("TileEntity", entityTag);
         }
     }
@@ -208,7 +266,7 @@ public class EntityFallingBlock extends Entity
     @Override
 	public void readAdditionalSaveData(@NotNull CompoundTag tag)
     {
-        carriedBlock = new CarriedBlock(this,
+        this.carriedBlock = new CarriedBlock(this,
             tag.getShort("Tile") & 0x3fff,
             tag.getShort("TileData") & 0xff,
             tag.containsKey("TileEntity") ? TileEntityDispatcher.createAndLoadEntity(tag.getCompound("TileEntity")) : null);
diff --git a/game/core/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderOverworld.java b/game/core/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderOverworld.java
index 3083b182f..fafc504cd 100644
--- a/game/core/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderOverworld.java
+++ b/game/core/src/main/java/net/minecraft/core/world/biome/provider/BiomeProviderOverworld.java
@@ -8,6 +8,7 @@ import net.minecraft.core.world.biome.data.BiomeRangeMap;
 import net.minecraft.core.world.noise.FractalNoise2D;
 import net.minecraft.core.world.noise.FractalNoise3D;
 import net.minecraft.core.world.noise.SimplexNoise;
+import net.minecraft.core.world.noise.WorleyNoise;
 import net.minecraft.core.world.type.WorldType;
 
 import java.util.Set;
@@ -47,10 +48,10 @@ public final class BiomeProviderOverworld
     {
         this.worldType = worldType;
 
-        this.temperatureMap = new FractalNoise3D<>(SimplexNoise.genOctaves(seed * 9871, 4));
-        this.humidityMap = new FractalNoise3D<>(SimplexNoise.genOctaves(seed * 39811, 4));
-        this.varietyMap = new FractalNoise3D<>(SimplexNoise.genOctaves(seed, 4));
-        this.noiseMap = new FractalNoise3D<>(SimplexNoise.genOctaves(seed * 543321, 2));
+        this.temperatureMap = new FractalNoise2D<>(SimplexNoise.genOctaves(seed * 9871, 4));
+        this.humidityMap = new FractalNoise2D<>(SimplexNoise.genOctaves(seed * 39811, 4));
+        this.varietyMap = new FractalNoise2D<>(SimplexNoise.genOctaves(seed, 4));
+        this.noiseMap = new FractalNoise2D<>(SimplexNoise.genOctaves(seed * 543321, 2));
     }
 
     public BiomeProviderOverworld withTemperatureScales(double xScale, double zScale, double lacunarity, double noise)
diff --git a/game/core/src/main/java/net/minecraft/core/world/generate/IceFloeLargeFeature.java b/game/core/src/main/java/net/minecraft/core/world/generate/IceFloeLargeFeature.java
index 23e4b195a..3bb495e7c 100644
--- a/game/core/src/main/java/net/minecraft/core/world/generate/IceFloeLargeFeature.java
+++ b/game/core/src/main/java/net/minecraft/core/world/generate/IceFloeLargeFeature.java
@@ -8,6 +8,7 @@ import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.chunk.Chunk;
 import net.minecraft.core.world.generate.chunk.ChunkGeneratorResult;
 import net.minecraft.core.world.noise.*;
+import net.minecraft.core.world.noise.operator.Normalize2D;
 import net.minecraft.core.world.pos.TilePos;
 import net.minecraft.core.world.type.WorldType;
 import org.jetbrains.annotations.NotNull;
@@ -18,15 +19,23 @@ import java.util.Random;
 
 public class IceFloeLargeFeature
     extends LargeFeature {
-    private @Nullable Noise2D noise = null;
+    private @Nullable WorleyNoise chunkNoise = null;
+    private @Nullable Noise2D gapNoise = null;
     private @Nullable Noise2D scaleNoise = null;
     private @Nullable World lastWorld = null;
 
     @Override
-    protected void doGeneration(@NotNull final World world, @NotNull final Random random, final int chunkX, final int chunkZ, final int baseChunkX, final int baseChunkZ, @NotNull final ChunkGeneratorResult result) {
-        if (this.noise == null || this.scaleNoise == null || this.lastWorld != world) {
-            this.noise = new FractalNoise2D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 4));
-            this.scaleNoise = new FractalNoise2D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 2));
+    protected void doGeneration(
+        @NotNull final World world,
+        @NotNull final Random random,
+        final int chunkX, final int chunkZ,
+        final int baseChunkX, final int baseChunkZ,
+        @NotNull final ChunkGeneratorResult result
+    ) {
+        if (this.chunkNoise == null || this.gapNoise == null || this.scaleNoise == null || this.lastWorld != world) {
+            this.chunkNoise = new WorleyNoise(new Random(world.getRandomSeed()));
+            this.gapNoise = new FractalNoise2D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 4));
+            this.scaleNoise = new Normalize2D<>(new FractalNoise2D<>(ImprovedPerlinNoise.genOctaves(world.getRandomSeed(), 2)));
             this.lastWorld = world;
         }
 
@@ -34,8 +43,7 @@ public class IceFloeLargeFeature
         final int oceanY = worldType.getMinY() + worldType.getOceanY();
 
         final @NotNull TilePos tilePos = new TilePos();
-        final @NotNull Vector2f vec = new Vector2f();
-        final @NotNull WorleyNoise.Result worley = new WorleyNoise.Result();
+        final @NotNull WorleyNoise.Result worleyResult = new WorleyNoise.Result();
 
         for (int x = 0; x < Chunk.CHUNK_SIZE_X; x++) {
             for (int z = 0; z < Chunk.CHUNK_SIZE_Z; z++) {
@@ -43,16 +51,16 @@ public class IceFloeLargeFeature
                 final @NotNull Biome biome = world.getBlockBiome(tilePos);
                 if (biome == Biomes.OVERWORLD_GLACIER) {
                     final float worleyScaleScale = 50.0f;
-
-                    // TODO: NORMALIZE THIS
-                    final float worleyScale = 0.875f + (float) (this.scaleNoise.getValue((baseChunkX * Chunk.CHUNK_SIZE_X + x) / worleyScaleScale, (baseChunkZ * Chunk.CHUNK_SIZE_Z + z) / worleyScaleScale)) * 0.25f;
-                    vec.x = (baseChunkX + ((float) x / (float) Chunk.CHUNK_SIZE_X)) * worleyScale;
-                    vec.y = (baseChunkZ + ((float) z / (float) Chunk.CHUNK_SIZE_Z)) * worleyScale;
-                    WorleyNoise.getWorleyDistance2d(vec, worley);
+                    final float worleyScale = 1.0f + (0.0625f - (float) (this.scaleNoise.getValue((baseChunkX * Chunk.CHUNK_SIZE_X + x) / worleyScaleScale, (baseChunkZ * Chunk.CHUNK_SIZE_Z + z) / worleyScaleScale))) * 0.125f;
+                    this.chunkNoise.getValue(
+                        (baseChunkX + ((float) x / (float) Chunk.CHUNK_SIZE_X)) * worleyScale,
+                        (baseChunkZ + ((float) z / (float) Chunk.CHUNK_SIZE_Z)) * worleyScale,
+                        worleyResult
+                    );
                     final float lineScale = 10.0f;
-                    final float lineWidth = (float) (this.noise.getValue((baseChunkX * Chunk.CHUNK_SIZE_X + x) / lineScale, (baseChunkZ * Chunk.CHUNK_SIZE_Z + z) / lineScale) / 2.0 + 0.5);
-                    if (MathHelper.unsignedMod(worley.index, 15) != 0) {
-                        if (worley.distance > 0.9f + lineWidth * 0.05f) {
+                    final float lineWidth = (float) (this.gapNoise.getValue((baseChunkX * Chunk.CHUNK_SIZE_X + x) / lineScale, (baseChunkZ * Chunk.CHUNK_SIZE_Z + z) / lineScale) / 2.0 + 0.5);
+                    if (MathHelper.unsignedMod(worleyResult.index, 15) != 0) {
+                        if (worleyResult.distance > 0.9f + lineWidth * 0.05f) {
                             continue;
                         }
                         for (int y = oceanY - 3; y < oceanY; y++) {
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/FractalNoise2D.java b/game/core/src/main/java/net/minecraft/core/world/noise/FractalNoise2D.java
index 9e86a5bb6..842460574 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/FractalNoise2D.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/FractalNoise2D.java
@@ -2,6 +2,8 @@ package net.minecraft.core.world.noise;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2d;
+import org.joml.Vector2dc;
 
 public class FractalNoise2D<T extends Noise2D>
     implements Noise2D {
@@ -13,17 +15,43 @@ public class FractalNoise2D<T extends Noise2D>
     protected double lacunarity = DEFAULT_LACUNARITY;
     protected double persistence = DEFAULT_PERSISTENCE;
 
+    protected final @NotNull Vector2d range = new Vector2d();
+
     public FractalNoise2D(final @NotNull T @NotNull [] octaves) {
         this.octaves = octaves;
+
+        this.calculateRange();
+    }
+
+    private void calculateRange() {
+        final @NotNull Vector2dc innerRange = this.octaves[0].getRange2D();
+
+        double min = 0.0;
+        double max = 0.0;
+        double amplitude = 1.0;
+
+        for (int i = 0; i < this.octaves.length; i++) {
+            min += innerRange.x() * amplitude;
+            max += innerRange.y() * amplitude;
+            amplitude *= this.persistence;
+        }
+
+        this.range.set(min, max);
+    }
+
+    @Override
+    public @NotNull Vector2dc getRange2D() {
+        return this.range;
     }
 
-    public final @NotNull FractalNoise2D<T> setLacunarity(final double lacunarity) {
+    public @NotNull FractalNoise2D<T> setLacunarity(final double lacunarity) {
         this.lacunarity = lacunarity;
         return this;
     }
 
-    public final @NotNull FractalNoise2D<T> setPersistence(final double persistence) {
+    public @NotNull FractalNoise2D<T> setPersistence(final double persistence) {
         this.persistence = persistence;
+        this.calculateRange();
         return this;
     }
 
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/FractalNoise3D.java b/game/core/src/main/java/net/minecraft/core/world/noise/FractalNoise3D.java
index 65c2c7d0a..0f15bba96 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/FractalNoise3D.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/FractalNoise3D.java
@@ -2,13 +2,47 @@ package net.minecraft.core.world.noise;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2d;
+import org.joml.Vector2dc;
 
 public class FractalNoise3D<T extends Noise3D>
     extends FractalNoise2D<T>
     implements Noise3D {
 
+    private final @NotNull Vector2d range = new Vector2d();
+
     public FractalNoise3D(final @NotNull T @NotNull [] octaves) {
         super(octaves);
+
+        this.calculateRange();
+    }
+
+    private void calculateRange() {
+        final @NotNull Vector2dc innerRange = this.octaves[0].getRange3D();
+
+        double min = 0.0;
+        double max = 0.0;
+        double amplitude = 1.0;
+
+        for (int i = 0; i < this.octaves.length; i++) {
+            min += innerRange.x() * amplitude;
+            max += innerRange.y() * amplitude;
+            amplitude *= this.persistence;
+        }
+
+        this.range.set(min, max);
+    }
+
+    @Override
+    public @NotNull Vector2dc getRange3D() {
+        return this.range;
+    }
+
+    @Override
+    public @NotNull FractalNoise2D<T> setPersistence(final double persistence) {
+        super.setPersistence(persistence);
+        this.calculateRange();
+        return this;
     }
 
     @Override
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/ImprovedPerlinNoise.java b/game/core/src/main/java/net/minecraft/core/world/noise/ImprovedPerlinNoise.java
index c46674408..954c6128b 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/ImprovedPerlinNoise.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/ImprovedPerlinNoise.java
@@ -2,7 +2,10 @@ package net.minecraft.core.world.noise;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2d;
+import org.joml.Vector2dc;
 
+import java.util.Arrays;
 import java.util.Random;
 
 // Derived from Ken Perlin's Improved Noise reference implementation: https://cs.nyu.edu/~perlin/noise/
@@ -51,12 +54,13 @@ public class ImprovedPerlinNoise
         }
     }
 
+    private static final @NotNull Vector2dc RANGE = new Vector2d(-Math.sqrt(3.0 / 4.0), Math.sqrt(3.0 / 4.0));
+
     private final @NotNull LegacyNoiseType legacyNoiseType;
 
     private final int @NotNull [] p;
     public final double xo;
     public final double yo;
-
     public final double zo;
 
     public ImprovedPerlinNoise(final @NotNull Random random) {
@@ -86,6 +90,16 @@ public class ImprovedPerlinNoise
         }
     }
 
+    @Override
+    public @NotNull Vector2dc getRange2D() {
+        return RANGE;
+    }
+
+    @Override
+    public @NotNull Vector2dc getRange3D() {
+        return RANGE;
+    }
+
     @Override
     public double getValue(final double x, final double z) {
         return this.getValue(x, z, 0);
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/Noise2D.java b/game/core/src/main/java/net/minecraft/core/world/noise/Noise2D.java
index ff74b3833..fc86587f3 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/Noise2D.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/Noise2D.java
@@ -2,10 +2,14 @@ package net.minecraft.core.world.noise;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2d;
+import org.joml.Vector2dc;
 
 import java.util.Arrays;
 
 public interface Noise2D {
+    @NotNull Vector2dc getRange2D();
+
     double getValue(final double x, final double z);
 
     double @NotNull [] addRegion(
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/Noise3D.java b/game/core/src/main/java/net/minecraft/core/world/noise/Noise3D.java
index 94e3d969a..ea9a7a74b 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/Noise3D.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/Noise3D.java
@@ -2,11 +2,15 @@ package net.minecraft.core.world.noise;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2d;
+import org.joml.Vector2dc;
 
 import java.util.Arrays;
 
 public interface Noise3D
     extends Noise2D {
+    @NotNull Vector2dc getRange3D();
+
     double getValue(final double x, final double y, final double z);
 
     double @NotNull [] addRegion(
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/SimplexNoise.java b/game/core/src/main/java/net/minecraft/core/world/noise/SimplexNoise.java
index cd5dacad0..c4a1dc1ba 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/SimplexNoise.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/SimplexNoise.java
@@ -2,6 +2,8 @@ package net.minecraft.core.world.noise;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2d;
+import org.joml.Vector2dc;
 
 import java.util.Random;
 
@@ -44,6 +46,8 @@ public class SimplexNoise
     private static final double F3 = 1.0 / 3.0;
     private static final double G3 = 1.0 / 6.0;
 
+    private static final @NotNull Vector2dc RANGE = new Vector2d(-1.0, 1.0);
+
     private final int @NotNull [] p;
     public final double xo;
     public final double yo;
@@ -68,6 +72,16 @@ public class SimplexNoise
         }
     }
 
+    @Override
+    public @NotNull Vector2dc getRange2D() {
+        return RANGE;
+    }
+
+    @Override
+    public @NotNull Vector2dc getRange3D() {
+        return RANGE;
+    }
+
     private static int fastFloor(final double d) {
         return d <= 0.0D ? (int) d - 1 : (int) d;
     }
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/WorleyNoise.java b/game/core/src/main/java/net/minecraft/core/world/noise/WorleyNoise.java
index 073ab4987..08be1ac72 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/WorleyNoise.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/WorleyNoise.java
@@ -2,68 +2,156 @@ package net.minecraft.core.world.noise;
 
 import net.minecraft.core.util.helper.MathHelper;
 import org.jetbrains.annotations.NotNull;
-import org.joml.Vector2f;
-import org.joml.Vector2fc;
-import org.joml.Vector3f;
-import org.joml.Vector3fc;
+import org.jetbrains.annotations.Nullable;
+import org.joml.*;
+
+import java.lang.Math;
+import java.util.Random;
 
 // NOTE: code shamelessly stolen from https://www.shadertoy.com/view/MslGD8,
 // https://www.reddit.com/r/proceduralgeneration/comments/4u0s1i/infinite_worleycellularvoroni_noise/,
 // and https://www.shadertoy.com/view/ldl3W8
-public final class WorleyNoise {
+public class WorleyNoise
+    implements Noise3D {
+    public static @NotNull WorleyNoise @NotNull [] genOctaves(final long seed, final int numOctaves) {
+        return genOctaves(seed, numOctaves, 0);
+    }
+
+    public static @NotNull WorleyNoise @NotNull [] genOctaves(final long seed, final int numOctaves, final int preOctaves) {
+        final @NotNull Random random = new Random(seed);
+
+        for (int i = 0; i < preOctaves; i++) {
+            random.nextDouble();
+            random.nextDouble();
+            random.nextDouble();
+
+            for (int j = 0; j < 256; j++) {
+                random.nextInt(256 - j);
+            }
+        }
+
+        final @NotNull WorleyNoise @NotNull [] octaves = new WorleyNoise[numOctaves];
+        for (int i = 0; i < numOctaves; i++) {
+            octaves[i] = new WorleyNoise(random);
+        }
+
+        return octaves;
+    }
+
     public static class Result {
-        public float distance;
+        public double distance;
         public int index;
     }
-    private WorleyNoise() { }
-
-    private static final @NotNull Vector2fc HASH_CONST_2D_A = new Vector2f(127.1f, 311.7f);
-    private static final @NotNull Vector2fc HASH_CONST_2D_B = new Vector2f(269.5f, 183.3f);
-    private static final @NotNull Vector3fc HASH_CONST_3D_A = new Vector3f(127.1f, 311.7f, 74.7f);
-    private static final @NotNull Vector3fc HASH_CONST_3D_B = new Vector3f(269.5f ,183.3f ,246.1f);
-    private static final @NotNull Vector3fc HASH_CONST_3D_C = new Vector3f(113.5f, 271.9f, 124.6f);
-    private static final float HASH_CONST_MULT = 18.5453f;
-
-    public static void getWorleyDistance2d(final @NotNull Vector2fc xy, final @NotNull Result result) {
-        final @NotNull Vector2fc ip = xy.floor(new Vector2f()); // nearest gridpoint
-        final @NotNull Vector2fc fp = xy.sub(ip, new Vector2f()); // fractional distance from gridpoint
-
-        final @NotNull Vector2f mg = new Vector2f();
-        final @NotNull Vector2f mr = new Vector2f();
-        float md = 8.0f;
+
+    private static final @NotNull Vector2dc RANGE = new Vector2d(0.5, 1.0);
+    private static final @NotNull Result DUMMY = new Result();
+
+    private final int @NotNull [] p;
+    private final double @NotNull [] @NotNull [] jitter;
+    public final double xo;
+    public final double yo;
+    public final double zo;
+
+    public WorleyNoise(final @NotNull Random random) {
+        this.p = new int[512];
+        this.xo = random.nextDouble() * 256;
+        this.yo = random.nextDouble() * 256;
+        this.zo = random.nextDouble() * 256;
+
+        // Assign initial values for each permutation
+        for (int i = 0; i < 256; i++) {
+            this.p[i] = i;
+        }
+
+        // Shuffle values
+        for (int i = 0; i < 256; i++) {
+            final int newI = random.nextInt(256 - i) + i;
+            final int temp = this.p[i];
+            this.p[i] = this.p[newI];
+            this.p[newI] = temp;
+            this.p[i + 256] = this.p[i];
+        }
+
+        this.jitter = new double[256][3];
+        for (int i = 0; i < 256; i++) {
+            this.jitter[i][0] = random.nextDouble();
+            this.jitter[i][1] = random.nextDouble();
+            this.jitter[i][2] = random.nextDouble();
+        }
+    }
+
+    @Override
+    public @NotNull Vector2dc getRange2D() {
+        return RANGE;
+    }
+
+    @Override
+    public @NotNull Vector2dc getRange3D() {
+        return RANGE;
+    }
+
+    public void getValue(final double x, final double z, final @NotNull Result result) {
+        final @NotNull Vector2dc ip = new Vector2d(x, z).floor();
+        final @NotNull Vector2dc fp = new Vector2d(x - ip.x(), z - ip.y());
+
+        final @NotNull Vector2d mg = new Vector2d();
+        final @NotNull Vector2d mr = new Vector2d();
+        double md = Double.POSITIVE_INFINITY;
+
         int index = 0;
 
-        final @NotNull Vector2f g = new Vector2f();
-        final @NotNull Vector2f o = new Vector2f();
-        final @NotNull Vector2f r = new Vector2f();
-        final @NotNull Vector2f pos = new Vector2f();
+        final @NotNull Vector2d g = new Vector2d();
+        final @NotNull Vector2d o = new Vector2d();
+        final @NotNull Vector2d r = new Vector2d();
+        final @NotNull Vector2d pos = new Vector2d();
 
         // First pass - regular voronoi
         for (int i = -1; i <= 1; i++) {
             for (int j = -1; j <= 1; j++) {
                 g.set(i, j);
-                hash(ip.add(g, pos), o); // o gives the offset of the gridpoint to use for lookup
-                g.add(o, r).sub(fp); // r gives distance to the point of interest in either direction
-                final float d = r.dot(r); // distance to gridpoint
-                if (d < md) { // check if this is the closest point
-                    md = d; // if it is, save the distance
+
+                // o gives the offset of the gridpoint to use for lookup
+                final int h = this.hash((int) ip.x() + (int) Math.floor(g.x), (int) ip.y() + (int) Math.floor(g.y));
+                o.set(
+                    this.jitter[h & 255][0],
+                    this.jitter[h & 255][1]
+                );
+
+                // r gives the distance to the point of interest in either direction
+                g.add(o, r).sub(fp);
+
+                // distance to gridpoint
+                final double d = r.dot(r);
+
+                // check if this is the closest point
+                if (d < md) {
+                    md = d;
                     mr.set(r);
                     mg.set(g);
-                    index = (int) (o.x * 10.0f) + (int) (o.y * 10.0f);
+                    index = (int) (o.x * 10.0) + (int) (o.y * 10.0);
                 }
             }
         }
 
         // Second pass - distance to borders
-        md = 8.0f;
+        md = Double.POSITIVE_INFINITY;
         for (int i = -2; i <= 2; i++) {
             for (int j = -2; j <= 2; j++) {
                 g.set(mg).add(i, j);
-                ip.add(g, pos);
-                hash(ip.add(g, pos), o);
-                g.add(o, r).sub(fp); // r gives distance to the point of interest in either direction
+
+                // o gives the offset of the gridpoint to use for lookup
+                final int h = this.hash((int) ip.x() + (int) Math.floor(g.x), (int) ip.y() + (int) Math.floor(g.y));
+                o.set(
+                    this.jitter[h & 255][0],
+                    this.jitter[h & 255][1]
+                );
+
+                // r gives the distance to the point of interest in either direction
+                g.add(o, r).sub(fp);
+
                 pos.set(mr).sub(r);
-                if (pos.dot(pos) > 0.00001f) {
+
+                if (pos.dot(pos) > 0.00001) {
                     g.set(mr).add(r).mul(0.5f);
                     o.set(r).sub(mr).normalize();
                     md = Math.min(md, g.dot(o));
@@ -71,53 +159,110 @@ public final class WorleyNoise {
             }
         }
 
-        result.distance = 1.0f - md;
+        result.distance = 1.0 - md;
         result.index = index;
     }
 
-    public static void getWorleyDistance3d(final @NotNull Vector3fc xyz, final @NotNull Result result) {
-        final @NotNull Vector3fc ip = xyz.floor(new Vector3f());
-        final @NotNull Vector3fc fp = xyz.sub(ip, new Vector3f());
+    @Override
+    public double getValue(final double x, final double z) {
+        this.getValue(x, z, DUMMY);
+        return DUMMY.distance;
+    }
+
+    @Override
+    public double @NotNull [] addRegion(
+        double @Nullable [] out,
+        final double x, final double z,
+        final int xSize, final int zSize,
+        final double xScale, final double zScale,
+        final double amplitude
+    ) {
+        if (out == null || out.length != xSize * zSize) {
+            out = new double[xSize * zSize];
+        }
+
+        int i = 0;
+        for (int xi = 0; xi < xSize; xi++) {
+            final double xx = (x + xi) * xScale + this.xo;
+
+            for (int zi = 0; zi < zSize; zi++) {
+                final double zz = (z + zi) * zScale + this.zo;
+
+                out[i++] += this.getValue(xx, zz) * amplitude;
+            }
+        }
+
+        return out;
+    }
+
+    @Override
+    public double getValue(final double x, final double y, final double z) {
+        final @NotNull Vector3dc ip = new Vector3d(x, y, z).floor();
+        final @NotNull Vector3dc fp = new Vector3d(x - ip.x(), y - ip.y(), z - ip.z());
+
+        final @NotNull Vector3d mg = new Vector3d();
+        final @NotNull Vector3d mr = new Vector3d();
+        double md = 8.0;
 
-        final @NotNull Vector3f mg = new Vector3f();
-        final @NotNull Vector3f mr = new Vector3f();
-        float md = 8.0f;
         int index = 0;
 
-        final @NotNull Vector3f g = new Vector3f();
-        final @NotNull Vector3f o = new Vector3f();
-        final @NotNull Vector3f r = new Vector3f();
-        final @NotNull Vector3f pos = new Vector3f();
+        final @NotNull Vector3d g = new Vector3d();
+        final @NotNull Vector3d o = new Vector3d();
+        final @NotNull Vector3d r = new Vector3d();
+        final @NotNull Vector3d pos = new Vector3d();
 
         // First pass - regular voronoi
         for (int i = -1; i <= 1; i++) {
             for (int j = -1; j <= 1; j++) {
                 for (int k = -1; k <= 1; k++) {
                     g.set(i, j, k);
-                    hash(ip.add(g, pos), o); // o gives the offset of the gridpoint to use for lookup
-                    g.add(o, r).sub(fp); // r gives distance to the point of interest in either direction
-                    final float d = r.dot(r); // distance to gridpoint
-                    if (d < md) { // check if this is the closest point
-                        md = d; // if it is, save the distance
+
+                    // o gives the offset of the gridpoint to use for lookup
+                    final int h = this.hash((int) ip.x() + i, (int) ip.y() + j, (int) ip.z() + k);
+                    o.set(
+                        this.jitter[h & 255][0],
+                        this.jitter[h & 255][1],
+                        this.jitter[h & 255][2]
+                    );
+
+                    // r gives the distance to the point of interest in either direction
+                    g.add(o, r).sub(fp);
+
+                    // distance to gridpoint
+                    final double d = r.dot(r);
+
+                    // check if this is the closest point
+                    if (d < md) {
+                        md = d;
                         mr.set(r);
                         mg.set(g);
-                        index = (int) (o.x * 10.0f) + (int) (o.y * 10.0f) + (int) (o.z * 10.0f);
+                        index = (int) (o.x * 10.0) + (int) (o.y * 10.0) + (int) (o.z * 10.0);
                     }
                 }
             }
         }
 
         // Second pass - distance to borders
-        md = 8.0f;
+        md = 8.0;
         for (int i = -2; i <= 2; i++) {
             for (int j = -2; j <= 2; j++) {
                 for (int k = -2; k <= 2; k++) {
                     g.set(mg).add(i, j, k);
-                    ip.add(g, pos);
-                    hash(ip.add(g, pos), o);
-                    g.add(o, r).sub(fp); // r gives distance to the point of interest in either direction
+
+                    // o gives the offset of the gridpoint to use for lookup
+                    final int h = this.hash((int) ip.x() + i, (int) ip.y() + j, (int) ip.z() + k);
+                    o.set(
+                        this.jitter[h & 255][0],
+                        this.jitter[h & 255][1],
+                        this.jitter[h & 255][2]
+                    );
+
+                    // r gives the distance to the point of interest in either direction
+                    g.add(o, r).sub(fp);
+
                     pos.set(mr).sub(r);
-                    if (pos.dot(pos) > 0.00001f) {
+
+                    if (pos.dot(pos) > 0.00001) {
                         g.set(mr).add(r).mul(0.5f);
                         o.set(r).sub(mr).normalize();
                         md = Math.min(md, g.dot(o));
@@ -126,48 +271,44 @@ public final class WorleyNoise {
             }
         }
 
-        result.distance = 1.0f - md;
-        result.index = index;
+        return 1.0 - md;
     }
 
-    private static void hash(final @NotNull Vector2fc p, final @NotNull Vector2f out) {
-        out.x = p.dot(HASH_CONST_2D_A);
-        out.y = p.dot(HASH_CONST_2D_B);
+    @Override
+    public double @NotNull [] addRegion(
+        double @Nullable [] out,
+        final double x, final double y, final double z,
+        final int xSize, final int ySize, final int zSize,
+        final double xScale, final double yScale, final double zScale,
+        final double amplitude
+    ) {
+        if (out == null || out.length != xSize * zSize) {
+            out = new double[xSize * zSize];
+        }
 
-        sin(out, out);
-        out.mul(HASH_CONST_MULT, out);
-        fract(out, out);
-    }
+        int i = 0;
+        for (int xi = 0; xi < xSize; xi++) {
+            final double xx = (x + xi) * xScale + this.xo;
 
-    private static void hash(final @NotNull Vector3fc p, final @NotNull Vector3f out) {
-        out.x = p.dot(HASH_CONST_3D_A);
-        out.y = p.dot(HASH_CONST_3D_B);
-        out.z = p.dot(HASH_CONST_3D_C);
+            for (int zi = 0; zi < zSize; zi++) {
+                final double zz = (z + zi) * zScale + this.zo;
 
-        sin(out, out);
-        out.mul(HASH_CONST_MULT, out);
-        fract(out, out);
-    }
+                for (int yi = 0; yi < ySize; yi++) {
+                    final double yy = (y + yi) * yScale + this.yo;
 
-    private static void sin(final @NotNull Vector2fc p, final @NotNull Vector2f out) {
-        out.x = (float) Math.sin(p.x());
-        out.y = (float) Math.sin(p.y());
-    }
+                    out[i++] += this.getValue(xx, yy, zz) * amplitude;
+                }
+            }
+        }
 
-    private static void sin(final @NotNull Vector3fc p, final @NotNull Vector3f out) {
-        out.x = (float) Math.sin(p.x());
-        out.y = (float) Math.sin(p.y());
-        out.z = (float) Math.sin(p.z());
+        return out;
     }
 
-    private static void fract(final @NotNull Vector2fc p, final @NotNull Vector2f out) {
-        out.x = p.x() - MathHelper.floor_float(p.x());
-        out.y = p.y() - MathHelper.floor_float(p.y());
+    private int hash(final int x, final int z) {
+        return this.p[(x + this.p[z & 255]) & 255];
     }
 
-    private static void fract(final @NotNull Vector3fc p, final @NotNull Vector3f out) {
-        out.x = p.x() - MathHelper.floor_float(p.x());
-        out.y = p.y() - MathHelper.floor_float(p.y());
-        out.z = p.z() - MathHelper.floor_float(p.z());
+    private int hash(final int x, final int y, final int z) {
+        return this.p[(x + this.p[(z + this.p[y & 255]) & 255]) & 255];
     }
 }
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Constant2D.java b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Constant2D.java
index 7a2ee024a..19e33b976 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Constant2D.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Constant2D.java
@@ -3,15 +3,24 @@ package net.minecraft.core.world.noise.operator;
 import net.minecraft.core.world.noise.Noise2D;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2d;
+import org.joml.Vector2dc;
 
 import java.util.Arrays;
 
 public class Constant2D
     implements Noise2D {
+    private final @NotNull Vector2dc range;
     protected final double value;
 
     public Constant2D(final double value) {
         this.value = value;
+        this.range = new Vector2d(value);
+    }
+
+    @Override
+    public @NotNull Vector2dc getRange2D() {
+        return this.range;
     }
 
     @Override
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Constant3D.java b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Constant3D.java
index 5f821e403..bace46bf3 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Constant3D.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Constant3D.java
@@ -3,6 +3,7 @@ package net.minecraft.core.world.noise.operator;
 import net.minecraft.core.world.noise.Noise3D;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2dc;
 
 import java.util.Arrays;
 
@@ -13,6 +14,11 @@ public class Constant3D
         super(value);
     }
 
+    @Override
+    public @NotNull Vector2dc getRange3D() {
+        return this.getRange2D();
+    }
+
     @Override
     public double getValue(final double x, final double y, final double z) {
         return this.value;
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Emboss2D.java b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Emboss2D.java
index 170772571..6917bced2 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Emboss2D.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Emboss2D.java
@@ -3,15 +3,25 @@ package net.minecraft.core.world.noise.operator;
 import net.minecraft.core.world.noise.Noise2D;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2d;
+import org.joml.Vector2dc;
 
 public class Emboss2D<T extends Noise2D>
     implements Noise2D {
+    private final @NotNull Vector2d range = new Vector2d();
     protected final @NotNull T noise;
 
     public Emboss2D(final @NotNull T noise) {
         this.noise = noise;
     }
 
+    @Override
+    public @NotNull Vector2dc getRange2D() {
+        final @NotNull Vector2dc noiseRange = this.noise.getRange2D();
+        this.range.set(noiseRange.x() - noiseRange.y(), noiseRange.y() - noiseRange.x());
+        return this.range;
+    }
+
     @Override
     public double getValue(final double x, final double z) {
         return this.noise.getValue(x, z) - this.noise.getValue(x + 1.0, z + 1.0);
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Emboss3D.java b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Emboss3D.java
index 196fc3511..4bff1c444 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Emboss3D.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Emboss3D.java
@@ -3,14 +3,25 @@ package net.minecraft.core.world.noise.operator;
 import net.minecraft.core.world.noise.Noise3D;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2d;
+import org.joml.Vector2dc;
 
 public class Emboss3D<T extends Noise3D>
     extends Emboss2D<T>
     implements Noise3D {
+    private final @NotNull Vector2d range = new Vector2d();
+
     public Emboss3D(@NotNull final T noise) {
         super(noise);
     }
 
+    @Override
+    public @NotNull Vector2dc getRange3D() {
+        final @NotNull Vector2dc noiseRange = this.noise.getRange3D();
+        this.range.set(noiseRange.x() - noiseRange.y(), noiseRange.y() - noiseRange.x());
+        return this.range;
+    }
+
     @Override
     public double getValue(final double x, final double y, final double z) {
         return this.noise.getValue(x, y, z) - this.noise.getValue(x + 1.0, y + 1.0, z + 1.0);
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Normalize2D.java b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Normalize2D.java
new file mode 100644
index 000000000..138e05dde
--- /dev/null
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Normalize2D.java
@@ -0,0 +1,56 @@
+package net.minecraft.core.world.noise.operator;
+
+import net.minecraft.core.world.noise.Noise2D;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2d;
+import org.joml.Vector2dc;
+
+public class Normalize2D<T extends Noise2D>
+    implements Noise2D {
+    private static final @NotNull Vector2dc RANGE = new Vector2d(0.0, 1.0);
+
+    protected final @NotNull T noise;
+
+    public Normalize2D(final @NotNull T noise) {
+        this.noise = noise;
+    }
+
+    @Override
+    public @NotNull Vector2dc getRange2D() {
+        return RANGE;
+    }
+
+    @Override
+    public double getValue(final double x, final double z) {
+        final @NotNull Vector2dc range = this.noise.getRange2D();
+        final double r = range.y() - range.x();
+        final double v = this.noise.getValue(x, z);
+        final double vo = v - range.x();
+        return vo / r;
+    }
+
+    @Override
+    public double @NotNull [] addRegion(
+        double @Nullable [] out,
+        final double x, final double z,
+        final int xSize, final int zSize,
+        final double xScale, final double zScale,
+        final double amplitude
+    ) {
+        if (out == null || out.length < xSize * zSize) {
+            out = new double[xSize * zSize];
+        }
+
+        final @NotNull Vector2dc range = this.noise.getRange2D();
+        final double r = range.y() - range.x();
+
+        final double @NotNull [] temp = this.noise.addRegion(null, x, z, xSize, zSize, xScale, zScale, amplitude);
+        for (int i = 0; i < out.length; i++) {
+            temp[i] = (temp[i] - range.x()) / r;
+            out[i] += temp[i];
+        }
+
+        return out;
+    }
+}
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Normalize3D.java b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Normalize3D.java
new file mode 100644
index 000000000..e3bfde927
--- /dev/null
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Normalize3D.java
@@ -0,0 +1,52 @@
+package net.minecraft.core.world.noise.operator;
+
+import net.minecraft.core.world.noise.Noise3D;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2dc;
+
+public class Normalize3D<T extends Noise3D>
+    extends Normalize2D<T>
+    implements Noise3D {
+    public Normalize3D(final @NotNull T noise) {
+        super(noise);
+    }
+
+    @Override
+    public @NotNull Vector2dc getRange3D() {
+        return this.getRange2D();
+    }
+
+    @Override
+    public double getValue(final double x, final double y, final double z) {
+        final @NotNull Vector2dc range = this.noise.getRange2D();
+        final double r = range.y() - range.x();
+        final double v = this.noise.getValue(x, y, z);
+        final double vo = v - range.x();
+        return vo / r;
+    }
+
+    @Override
+    public double @NotNull [] addRegion(
+        double @Nullable [] out,
+        final double x, final double y, final double z,
+        final int xSize, final int ySize, final int zSize,
+        final double xScale, final double yScale, final double zScale,
+        final double amplitude
+    ) {
+        if (out == null || out.length < xSize * zSize) {
+            out = new double[xSize * zSize];
+        }
+
+        final @NotNull Vector2dc range = this.noise.getRange2D();
+        final double r = range.y() - range.x();
+
+        final double @NotNull [] temp = this.noise.addRegion(null, x, y, z, xSize, ySize, zSize, xScale, yScale, zScale, amplitude);
+        for (int i = 0; i < out.length; i++) {
+            temp[i] = (temp[i] - range.x()) / r;
+            out[i] += temp[i];
+        }
+
+        return out;
+    }
+}
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Rotate2D.java b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Rotate2D.java
index c0cb028a1..c9bac69cf 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Rotate2D.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Rotate2D.java
@@ -3,6 +3,8 @@ package net.minecraft.core.world.noise.operator;
 import net.minecraft.core.world.noise.Noise2D;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2d;
+import org.joml.Vector2dc;
 
 public class Rotate2D<T extends Noise2D>
     implements Noise2D {
@@ -17,6 +19,11 @@ public class Rotate2D<T extends Noise2D>
         this.cos = Math.cos(yRot);
     }
 
+    @Override
+    public @NotNull Vector2dc getRange2D() {
+        return this.noise.getRange2D();
+    }
+
     @Override
     public double getValue(final double x, final double z) {
         return this.noise.getValue(x * this.cos + z * this.sin, z * this.cos - x * this.sin);
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Rotate3D.java b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Rotate3D.java
index 1ff820244..95c8e8074 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Rotate3D.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Rotate3D.java
@@ -3,6 +3,7 @@ package net.minecraft.core.world.noise.operator;
 import net.minecraft.core.world.noise.Noise3D;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2dc;
 
 public class Rotate3D<T extends Noise3D>
     extends Rotate2D<T>
@@ -23,6 +24,11 @@ public class Rotate3D<T extends Noise3D>
         };
     }
 
+    @Override
+    public @NotNull Vector2dc getRange3D() {
+        return this.noise.getRange3D();
+    }
+
     @Override
     public double getValue(final double x, final double y, final double z) {
         final double nx = this.rot[0][0] * x + this.rot[0][1] * y + this.rot[0][2] * z;
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Scale2D.java b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Scale2D.java
index 2e504f3a4..2eae3a8d8 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Scale2D.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Scale2D.java
@@ -3,6 +3,7 @@ package net.minecraft.core.world.noise.operator;
 import net.minecraft.core.world.noise.Noise2D;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2dc;
 
 public class Scale2D<T extends Noise2D>
     implements Noise2D {
@@ -16,6 +17,11 @@ public class Scale2D<T extends Noise2D>
         this.zScale = 1.0 / zScale;
     }
 
+    @Override
+    public @NotNull Vector2dc getRange2D() {
+        return this.noise.getRange2D();
+    }
+
     @Override
     public double getValue(final double x, final double z) {
         return this.noise.getValue(x * this.xScale, z * this.zScale);
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Scale3D.java b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Scale3D.java
index f578c5301..9e4a5c512 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Scale3D.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Scale3D.java
@@ -3,6 +3,7 @@ package net.minecraft.core.world.noise.operator;
 import net.minecraft.core.world.noise.Noise3D;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2dc;
 
 public class Scale3D<T extends Noise3D>
     extends Scale2D<T>
@@ -15,6 +16,11 @@ public class Scale3D<T extends Noise3D>
         this.yScale = yScale;
     }
 
+    @Override
+    public @NotNull Vector2dc getRange3D() {
+        return this.noise.getRange3D();
+    }
+
     @Override
     public double getValue(final double x, final double y, final double z) {
         return this.noise.getValue(x * this.xScale, y * this.yScale, z * this.zScale);
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Warp2D.java b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Warp2D.java
index 46e1b9380..1892f01ee 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Warp2D.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Warp2D.java
@@ -3,6 +3,7 @@ package net.minecraft.core.world.noise.operator;
 import net.minecraft.core.world.noise.Noise2D;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2dc;
 
 public class Warp2D<A extends Noise2D, B extends Noise2D, C extends Noise2D>
     implements Noise2D {
@@ -16,6 +17,11 @@ public class Warp2D<A extends Noise2D, B extends Noise2D, C extends Noise2D>
         this.warpZ = warpZ;
     }
 
+    @Override
+    public @NotNull Vector2dc getRange2D() {
+        return this.base.getRange2D();
+    }
+
     @Override
     public double getValue(final double x, final double z) {
         return this.base.getValue(
diff --git a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Warp3D.java b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Warp3D.java
index f2c8dc289..da3d1ee88 100644
--- a/game/core/src/main/java/net/minecraft/core/world/noise/operator/Warp3D.java
+++ b/game/core/src/main/java/net/minecraft/core/world/noise/operator/Warp3D.java
@@ -3,6 +3,7 @@ package net.minecraft.core.world.noise.operator;
 import net.minecraft.core.world.noise.Noise3D;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2dc;
 
 public class Warp3D<A extends Noise3D, B extends Noise3D, C extends Noise3D, D extends Noise3D>
     extends Warp2D<A, B, D>
@@ -15,6 +16,11 @@ public class Warp3D<A extends Noise3D, B extends Noise3D, C extends Noise3D, D e
         this.warpY = warpY;
     }
 
+    @Override
+    public @NotNull Vector2dc getRange3D() {
+        return this.base.getRange3D();
+    }
+
     @Override
     public double getValue(final double x, final double y, final double z) {
         return this.base.getValue(
diff --git a/game/core/src/test/java/TestNoise.java b/game/core/src/test/java/TestNoise.java
index 28711ac46..16f90ba68 100644
--- a/game/core/src/test/java/TestNoise.java
+++ b/game/core/src/test/java/TestNoise.java
@@ -1,8 +1,10 @@
 import net.minecraft.core.world.noise.*;
+import net.minecraft.core.world.noise.operator.Normalize2D;
 import org.jetbrains.annotations.NotNull;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.util.Arrays;
 import java.util.Random;
 
 public class TestNoise {
@@ -67,4 +69,23 @@ public class TestNoise {
         noise.getRegion(out, 0.0, 0.0, 4, 4, 512.0, 512.0);
         Assertions.assertArrayEquals(expected, out);
     }
+
+    @Test
+    public void test() {
+        double min = Double.POSITIVE_INFINITY, max = Double.NEGATIVE_INFINITY;
+
+        for (int i = 0; i < 1000; i++) {
+        final var noise = new Normalize2D<>(new FractalNoise2D<>(ImprovedPerlinNoise.genOctaves(0, 2)));
+//            final var noise = new Normalize2D<>(new WorleyNoise(new Random(i)));
+            final @NotNull Random random = new Random(i);
+
+            for (int x = 0; x < 1000; x++) {
+                final double d = noise.getValue(-5000 + random.nextFloat() * 10000, -5000 + random.nextFloat() * 10000);
+                min = Math.min(min, d);
+                max = Math.max(max, d);
+            }
+        }
+
+        System.out.println("min: " + min + " max: " + max);
+    }
 }
