From 0d31b09f5047a215805ed9237f8eaff06d9612bc Mon Sep 17 00:00:00 2001
From: modmuss <modmuss50@gmail.com>
Date: Tue, 11 Feb 2025 16:41:40 +0000
Subject: [PATCH] Fix incorrect HUD z index for sub layers (#4437)

Fixes #4435
---
 .../fabric/impl/client/rendering/SubLayer.java         | 10 ++++++++--
 .../mixin/client/rendering/LayeredDrawerAccessor.java  |  6 ++++++
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/SubLayer.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/SubLayer.java
index 8919572e3..c02c968ff 100644
--- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/SubLayer.java
+++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/impl/client/rendering/SubLayer.java
@@ -22,6 +22,8 @@ import net.minecraft.client.gui.DrawContext;
 import net.minecraft.client.gui.LayeredDrawer;
 import net.minecraft.client.render.RenderTickCounter;
 
+import net.fabricmc.fabric.mixin.client.rendering.LayeredDrawerAccessor;
+
 /**
  * A layer that wraps another layered drawer that can be added to {@link net.fabricmc.fabric.api.client.rendering.v1.LayeredDrawerWrapper LayeredDrawerWrapper}.
  *
@@ -30,11 +32,15 @@ import net.minecraft.client.render.RenderTickCounter;
  * @param delegate     the layered drawer to wrap
  * @param shouldRender a boolean supplier that determines if the layer should render
  */
-public record SubLayer(LayeredDrawer delegate, BooleanSupplier shouldRender) implements LayeredDrawer.Layer {
+public record SubLayer(LayeredDrawer delegate, BooleanSupplier shouldRender, LayeredDrawerAccessor layeredDrawerAccessor) implements LayeredDrawer.Layer {
+	public SubLayer(LayeredDrawer delegate, BooleanSupplier shouldRender) {
+		this(delegate, shouldRender, (LayeredDrawerAccessor) delegate);
+	}
+
 	@Override
 	public void render(DrawContext context, RenderTickCounter tickCounter) {
 		if (shouldRender.getAsBoolean()) {
-			delegate.render(context, tickCounter);
+			layeredDrawerAccessor.invokeRenderInternal(context, tickCounter);
 		}
 	}
 }
diff --git a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/LayeredDrawerAccessor.java b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/LayeredDrawerAccessor.java
index 36f6111fe..730054712 100644
--- a/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/LayeredDrawerAccessor.java
+++ b/fabric-rendering-v1/src/client/java/net/fabricmc/fabric/mixin/client/rendering/LayeredDrawerAccessor.java
@@ -20,11 +20,17 @@ import java.util.List;
 
 import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.gen.Accessor;
+import org.spongepowered.asm.mixin.gen.Invoker;
 
+import net.minecraft.client.gui.DrawContext;
 import net.minecraft.client.gui.LayeredDrawer;
+import net.minecraft.client.render.RenderTickCounter;
 
 @Mixin(LayeredDrawer.class)
 public interface LayeredDrawerAccessor {
 	@Accessor
 	List<LayeredDrawer.Layer> getLayers();
+
+	@Invoker("renderInternal")
+	void invokeRenderInternal(DrawContext context, RenderTickCounter tickCounter);
 }