From dbf343bf910d22bff13d670c61343f97733b89ff Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 28 Dec 2025 19:24:01 -0500 Subject: [PATCH] Reimplement mixin.bugfix.entity_pose_stack --- .../AvatarRendererMixin.java | 29 +++++++++++++++++++ .../LivingEntityRendererMixin.java | 29 +++++++++++++++++++ .../entity_pose_stack/PoseStackAccessor.java | 13 +++++++++ 3 files changed, 71 insertions(+) create mode 100644 src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/entity_pose_stack/AvatarRendererMixin.java create mode 100644 src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java create mode 100644 src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java diff --git a/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/entity_pose_stack/AvatarRendererMixin.java b/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/entity_pose_stack/AvatarRendererMixin.java new file mode 100644 index 00000000..a47aa8d8 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/entity_pose_stack/AvatarRendererMixin.java @@ -0,0 +1,29 @@ +package org.embeddedt.modernfix.common.mixin.bugfix.entity_pose_stack; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.player.AvatarRenderer; +import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.client.event.RenderPlayerEvent; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(AvatarRenderer.class) +@ClientOnlyMixin +public class AvatarRendererMixin { + @Redirect(method = "submit(Lnet/minecraft/client/renderer/entity/state/AvatarRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/neoforged/bus/api/IEventBus;post(Lnet/neoforged/bus/api/Event;)Lnet/neoforged/bus/api/Event;", ordinal = 0)) + private Event fireCheckingPoseStack(IEventBus instance, Event event) { + PoseStack stack = ((RenderPlayerEvent)event).getPoseStack(); + int size = ((PoseStackAccessor)stack).mfix$getLastIndex(); + instance.post(event); + if (((RenderPlayerEvent.Pre)event).isCanceled()) { + // Pop the stack if someone pushed it in the event + while (((PoseStackAccessor)stack).mfix$getLastIndex() > size) { + stack.popPose(); + } + } + return event; + } +} diff --git a/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java b/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java new file mode 100644 index 00000000..f9c19e9b --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java @@ -0,0 +1,29 @@ +package org.embeddedt.modernfix.common.mixin.bugfix.entity_pose_stack; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.neoforged.neoforge.client.event.RenderLivingEvent; +import net.neoforged.bus.api.Event; +import net.neoforged.bus.api.IEventBus; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(LivingEntityRenderer.class) +@ClientOnlyMixin +public class LivingEntityRendererMixin { + @Redirect(method = "submit(Lnet/minecraft/client/renderer/entity/state/LivingEntityRenderState;Lcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/SubmitNodeCollector;Lnet/minecraft/client/renderer/state/CameraRenderState;)V", at = @At(value = "INVOKE", target = "Lnet/neoforged/bus/api/IEventBus;post(Lnet/neoforged/bus/api/Event;)Lnet/neoforged/bus/api/Event;", ordinal = 0)) + private Event fireCheckingPoseStack(IEventBus instance, Event event) { + PoseStack stack = ((RenderLivingEvent)event).getPoseStack(); + int size = ((PoseStackAccessor)stack).mfix$getLastIndex(); + instance.post(event); + if (((RenderLivingEvent.Pre)event).isCanceled()) { + // Pop the stack if someone pushed it in the event + while (((PoseStackAccessor)stack).mfix$getLastIndex() > size) { + stack.popPose(); + } + } + return event; + } +} \ No newline at end of file diff --git a/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java b/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java new file mode 100644 index 00000000..a459165c --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/common/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java @@ -0,0 +1,13 @@ +package org.embeddedt.modernfix.common.mixin.bugfix.entity_pose_stack; + +import com.mojang.blaze3d.vertex.PoseStack; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(PoseStack.class) +@ClientOnlyMixin +public interface PoseStackAccessor { + @Accessor("lastIndex") + int mfix$getLastIndex(); +}