Update to 1.21.9/10

This commit is contained in:
Jonas Herzig
2025-10-12 14:37:21 +02:00
parent e6db9daf80
commit d3929cb6dc
26 changed files with 321 additions and 22 deletions

View File

@@ -0,0 +1,60 @@
package com.replaymod.render.mixin;
import com.llamalad7.mixinextras.sugar.Local;
import com.llamalad7.mixinextras.sugar.Share;
import com.llamalad7.mixinextras.sugar.ref.LocalRef;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.particle.BillboardParticle;
import net.minecraft.client.particle.BillboardParticleSubmittable;
import net.minecraft.client.render.Camera;
import net.minecraft.util.math.Vec3d;
import org.joml.Quaternionf;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(BillboardParticle.class)
public abstract class MixinParticleManager {
@Shadow public abstract void render(BillboardParticleSubmittable par1, Camera par2, float par3);
@Inject(method = "render(Lnet/minecraft/client/particle/BillboardParticleSubmittable;Lnet/minecraft/client/render/Camera;F)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/BillboardParticle$Rotator;setRotation(Lorg/joml/Quaternionf;Lnet/minecraft/client/render/Camera;F)V"))
private void faceCameraAtParticle(
CallbackInfo ci,
@Local(argsOnly = true) float partialTicks,
@Local(argsOnly = true) Camera camera,
@Share("orgRotation") LocalRef<Quaternionf> orgRotationRef
) {
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler();
if (handler == null || !handler.omnidirectional) {
return;
}
Quaternionf rotation = camera.getRotation();
orgRotationRef.set(new Quaternionf(rotation));
Vec3d from = new Vec3d(0, 0, -1);
Vec3d to = MCVer.getPosition((BillboardParticle)(Object) this, partialTicks)
.subtract(camera.getPos())
.normalize();
Vec3d axis = from.crossProduct(to);
rotation.set((float) axis.x, (float) axis.y, (float) axis.z, (float) (1 + from.dotProduct(to)));
rotation.normalize();
}
@Inject(method = "render(Lnet/minecraft/client/particle/BillboardParticleSubmittable;Lnet/minecraft/client/render/Camera;F)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/particle/BillboardParticle$Rotator;setRotation(Lorg/joml/Quaternionf;Lnet/minecraft/client/render/Camera;F)V", shift = At.Shift.AFTER))
private void faceCameraAtParticleCleanup(
CallbackInfo ci,
@Local(argsOnly = true) Camera camera,
@Share("orgRotation") LocalRef<Quaternionf> orgRotationRef
) {
Quaternionf orgRotation = orgRotationRef.get();
if (orgRotation == null) {
return;
}
camera.getRotation().set(orgRotation.x, orgRotation.y, orgRotation.z, orgRotation.w);
}
}

View File

@@ -0,0 +1,38 @@
package com.replaymod.render.mixin;
import com.llamalad7.mixinextras.sugar.Local;
import com.llamalad7.mixinextras.sugar.ref.LocalRef;
import com.replaymod.core.versions.MCVer;
import com.replaymod.render.hooks.EntityRendererHandler;
import net.minecraft.client.render.entity.EntityRenderManager;
import net.minecraft.client.render.state.CameraRenderState;
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;
@Mixin(EntityRenderManager.class)
public abstract class MixinRenderManager {
@Inject(method = "render", at = @At("HEAD"))
private void replayModRender_reorientForCubicRendering(
CallbackInfo ci,
@Local(argsOnly = true, ordinal = 0) double dx,
@Local(argsOnly = true, ordinal = 1) double dy,
@Local(argsOnly = true, ordinal = 2) double dz,
@Local(argsOnly = true) LocalRef<CameraRenderState> cameraRenderStateRef
) {
EntityRendererHandler handler = ((EntityRendererHandler.IEntityRenderer) MCVer.getMinecraft().gameRenderer).replayModRender_getHandler();
if (handler == null || !handler.omnidirectional) {
return;
}
CameraRenderState org = cameraRenderStateRef.get();
CameraRenderState copy = new CameraRenderState();
copy.blockPos = org.blockPos;
copy.pos = org.pos;
copy.initialized = org.initialized;
copy.entityPos = org.entityPos;
copy.orientation.lookAlong((float) dx, (float) dy, (float) dz, 0f, 1f, 0f);
cameraRenderStateRef.set(copy);
}
}