diff --git a/modules/events/src/main/java/org/polyfrost/oneconfig/api/event/v1/events/RenderLivingEntityEvent.java b/modules/events/src/main/java/org/polyfrost/oneconfig/api/event/v1/events/RenderLivingEntityEvent.java new file mode 100644 index 000000000..aca069a72 --- /dev/null +++ b/modules/events/src/main/java/org/polyfrost/oneconfig/api/event/v1/events/RenderLivingEntityEvent.java @@ -0,0 +1,49 @@ +package org.polyfrost.oneconfig.api.event.v1.events; + +public abstract class RenderLivingEntityEvent extends Event.Cancellable { + + private final Object entity; + private final float partialTicks; + private final double x, y, z; + + public RenderLivingEntityEvent(Object entity, float partialTicks, double x, double y, double z) { + this.entity = entity; + this.partialTicks = partialTicks; + this.x = x; + this.y = y; + this.z = z; + } + + public Object getEntity() { + return entity; + } + + public float getPartialTicks() { + return partialTicks; + } + + public double getX() { + return x; + } + + public double getY() { + return y; + } + + public double getZ() { + return z; + } + + public static class Pre extends RenderLivingEntityEvent { + public Pre(Object entity, float partialTicks, double x, double y, double z) { + super(entity, partialTicks, x, y, z); + } + } + + public static class Post extends RenderLivingEntityEvent { + public Post(Object entity, float partialTicks, double x, double y, double z) { + super(entity, partialTicks, x, y, z); + } + } + +} diff --git a/versions/mappings/forge-1.16.5-1.12.2.txt b/versions/mappings/forge-1.16.5-1.12.2.txt index 659fdd7e7..da187a8a6 100644 --- a/versions/mappings/forge-1.16.5-1.12.2.txt +++ b/versions/mappings/forge-1.16.5-1.12.2.txt @@ -25,6 +25,8 @@ net.minecraft.client.shader.ShaderInstance net.minecraft.client.shader.ShaderMan net.minecraft.client.renderer.GameRenderer net.minecraft.client.renderer.EntityRenderer net.minecraft.client.renderer.GameRenderer renderWorld() renderWorldPass() +net.minecraft.entity.LivingEntity net.minecraft.entity.EntityLivingBase + net.minecraft.client.world.ClientWorld net.minecraft.client.multiplayer.WorldClient net.minecraft.network.IPacket net.minecraft.network.Packet diff --git a/versions/mappings/forge-1.17.1-1.16.5.txt b/versions/mappings/forge-1.17.1-1.16.5.txt index c4cf039f4..0ab46e1d0 100644 --- a/versions/mappings/forge-1.17.1-1.16.5.txt +++ b/versions/mappings/forge-1.17.1-1.16.5.txt @@ -101,6 +101,16 @@ net.minecraft.client.multiplayer.ClientPacketListener send() sendPacket() net.minecraft.client.multiplayer.ClientPacketListener suggestionsProvider clientSuggestionProvider net.minecraft.client.multiplayer.ClientSuggestionProvider minecraft mc +net.minecraft.client.renderer.MultiBufferSource net.minecraft.client.renderer.IRenderTypeBuffer + +net.minecraft.world.entity.Entity getX() getPosX() +net.minecraft.world.entity.Entity getY() getPosY() +net.minecraft.world.entity.Entity getZ() getPosZ() + +net.minecraft.client.renderer.entity.LivingEntityRenderer net.minecraft.client.renderer.entity.LivingRenderer + +net.minecraft.world.entity.LivingEntity net.minecraft.entity.LivingEntity + net.minecraft.client.player.LocalPlayer chat() sendChatMessage() net.minecraft.client.player.LocalPlayer net.minecraft.client.entity.player.ClientPlayerEntity diff --git a/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/RendererLivingEntityMixin.java b/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/RendererLivingEntityMixin.java new file mode 100644 index 000000000..0563645d4 --- /dev/null +++ b/versions/src/main/java/org/polyfrost/oneconfig/internal/mixin/RendererLivingEntityMixin.java @@ -0,0 +1,131 @@ +package org.polyfrost.oneconfig.internal.mixin; + +//#if MC >= 1.16.5 +//$$ import com.mojang.blaze3d.matrix.MatrixStack; +//$$ import net.minecraft.client.renderer.IRenderTypeBuffer; +//$$ import net.minecraft.client.renderer.entity.LivingRenderer; +//#else +import net.minecraft.client.renderer.entity.RendererLivingEntity; +//#endif + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.profiler.Profiler; +import org.polyfrost.oneconfig.api.event.v1.EventManager; +import org.polyfrost.oneconfig.api.event.v1.events.RenderLivingEntityEvent; +import org.polyfrost.universal.UMinecraft; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +//#if MC >= 1.16.5 +//$$ @Mixin(LivingRenderer.class) +//#else +@Mixin(RendererLivingEntity.class) +//#endif +public class RendererLivingEntityMixin { + + @Inject( + //#if MC >= 1.17.1 + //#if FABRIC + //$$ method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", + //#else + //$$ method = "render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", + //#endif + //#elseif MC >= 1.16.5 + //$$ method = "render(Lnet/minecraft/entity/LivingEntity;FFLcom/mojang/blaze3d/matrix/MatrixStack;Lnet/minecraft/client/renderer/IRenderTypeBuffer;I)V", + //#else + method = "doRender(Lnet/minecraft/entity/EntityLivingBase;DDDFF)V", + //#endif + at = @At("HEAD"), + cancellable = true + ) + private void onPreEntityRenderCallback( + T entity, + //#if MC <= 1.12.2 + double x, + double y, + double z, + //#endif + float entityYaw, + float partialTicks, + //#if MC >= 1.16.5 + //$$ MatrixStack matrixStack, + //$$ IRenderTypeBuffer buffer, + //$$ int packedLight, + //#endif + CallbackInfo ci + ) { + Profiler profiler = UMinecraft.getMinecraft() + //#if MC >= 1.16.5 + //$$ .getProfiler(); + //#else + .mcProfiler; + //#endif + profiler.startSection("oneconfig_renderlivingentity_event_pre"); + + //#if MC >= 1.16.5 + //$$ double x = entity.getPosX(); + //$$ double y = entity.getPosY(); + //$$ double z = entity.getPosZ(); + //#endif + RenderLivingEntityEvent event = new RenderLivingEntityEvent.Pre(entity, partialTicks, x, y, z); + EventManager.INSTANCE.post(event); + if (event.cancelled) { + ci.cancel(); + } + + profiler.endSection(); + } + + @Inject( + //#if MC >= 1.17.1 + //#if FABRIC + //$$ method = "render(Lnet/minecraft/entity/LivingEntity;FFLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V", + //#else + //$$ method = "render(Lnet/minecraft/world/entity/LivingEntity;FFLcom/mojang/blaze3d/vertex/PoseStack;Lnet/minecraft/client/renderer/MultiBufferSource;I)V", + //#endif + //#elseif MC >= 1.16.5 + //$$ method = "render(Lnet/minecraft/entity/LivingEntity;FFLcom/mojang/blaze3d/matrix/MatrixStack;Lnet/minecraft/client/renderer/IRenderTypeBuffer;I)V", + //#else + method = "doRender(Lnet/minecraft/entity/EntityLivingBase;DDDFF)V", + //#endif + at = @At("TAIL") + ) + private void onPostEntityRenderCallback( + T entity, + //#if MC <= 1.12.2 + double x, + double y, + double z, + //#endif + float entityYaw, + float partialTicks, + //#if MC >= 1.16.5 + //$$ MatrixStack matrixStack, + //$$ IRenderTypeBuffer buffer, + //$$ int packedLight, + //#endif + CallbackInfo ci + ) { + Profiler profiler = UMinecraft.getMinecraft() + //#if MC >= 1.16.5 + //$$ .getProfiler(); + //#else + .mcProfiler; + //#endif + profiler.startSection("oneconfig_renderlivingentity_event_post"); + + //#if MC >= 1.16.5 + //$$ double x = entity.getPosX(); + //$$ double y = entity.getPosY(); + //$$ double z = entity.getPosZ(); + //#endif + RenderLivingEntityEvent event = new RenderLivingEntityEvent.Post(entity, partialTicks, x, y, z); + EventManager.INSTANCE.post(event); + // Can't cancel when the method has already returned lol + + profiler.endSection(); + } + +} diff --git a/versions/src/main/resources/mixins.oneconfig.json b/versions/src/main/resources/mixins.oneconfig.json index 11ca0719a..dda6c730f 100644 --- a/versions/src/main/resources/mixins.oneconfig.json +++ b/versions/src/main/resources/mixins.oneconfig.json @@ -17,6 +17,7 @@ "ShaderGroupAccessor", "SoundManagerMixin", "EntityRendererMixin", + "RendererLivingEntityMixin", "WorldClientMixin", "SoundManagerMixin", "compat.OptifineConfigMixin",