diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java new file mode 100644 index 00000000..10109809 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/LivingEntityRendererMixin.java @@ -0,0 +1,30 @@ +package org.embeddedt.modernfix.forge.mixin.bugfix.entity_pose_stack; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.LivingEntityRenderer; +import net.minecraftforge.client.event.RenderLivingEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.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 = "render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/eventbus/api/IEventBus;post(Lnet/minecraftforge/eventbus/api/Event;)Z", ordinal = 0)) + private boolean fireCheckingPoseStack(IEventBus instance, Event event) { + PoseStack stack = ((RenderLivingEvent)event).getPoseStack(); + int size = ((PoseStackAccessor)stack).getPoseStack().size(); + if (instance.post(event)) { + // Pop the stack if someone pushed it in the event + while (((PoseStackAccessor)stack).getPoseStack().size() > size) { + stack.popPose(); + } + return true; + } else { + return false; + } + } +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PlayerRendererMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PlayerRendererMixin.java new file mode 100644 index 00000000..71180460 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PlayerRendererMixin.java @@ -0,0 +1,30 @@ +package org.embeddedt.modernfix.forge.mixin.bugfix.entity_pose_stack; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.renderer.entity.player.PlayerRenderer; +import net.minecraftforge.client.event.RenderPlayerEvent; +import net.minecraftforge.eventbus.api.Event; +import net.minecraftforge.eventbus.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(PlayerRenderer.class) +@ClientOnlyMixin +public class PlayerRendererMixin { + @Redirect(method = "render(Lnet/minecraft/client/player/AbstractClientPlayer;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/eventbus/api/IEventBus;post(Lnet/minecraftforge/eventbus/api/Event;)Z", ordinal = 0)) + private boolean fireCheckingPoseStack(IEventBus instance, Event event) { + PoseStack stack = ((RenderPlayerEvent)event).getPoseStack(); + int size = ((PoseStackAccessor)stack).getPoseStack().size(); + if (instance.post(event)) { + // Pop the stack if someone pushed it in the event + while (((PoseStackAccessor)stack).getPoseStack().size() > size) { + stack.popPose(); + } + return true; + } else { + return false; + } + } +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java new file mode 100644 index 00000000..a0a8ec30 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/entity_pose_stack/PoseStackAccessor.java @@ -0,0 +1,15 @@ +package org.embeddedt.modernfix.forge.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; + +import java.util.Deque; + +@Mixin(PoseStack.class) +@ClientOnlyMixin +public interface PoseStackAccessor { + @Accessor + Deque getPoseStack(); +}