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

@@ -31,6 +31,12 @@ import java.util.concurrent.TimeoutException;
public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading {
private ForceChunkLoadingHook replayModRender_hook;
//#if MC>=12109
//$$ private static final String SETUP_TERRAIN = "Lnet/minecraft/client/render/WorldRenderer;method_74752(Lnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/Frustum;Z)V";
//#else
private static final String SETUP_TERRAIN = "Lnet/minecraft/client/render/WorldRenderer;setupTerrain(Lnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/Frustum;ZZ)V";
//#endif
@Override
public void replayModRender_setHook(ForceChunkLoadingHook hook) {
this.replayModRender_hook = hook;
@@ -40,18 +46,28 @@ public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading {
@Shadow @Final private ChunkRenderingDataPreparer field_45615;
//#if MC>=12109
//$$ @Shadow protected abstract void method_74752(Camera par1, Frustum par2, boolean par3);
//#else
@Shadow protected abstract void setupTerrain(Camera par1, Frustum par2, boolean par3, boolean par4);
@Shadow private Frustum frustum;
@Shadow private Frustum capturedFrustum;
//#endif
@Shadow @Final private MinecraftClient client;
@Shadow protected abstract void applyFrustum(Frustum par1);
@Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/WorldRenderer;setupTerrain(Lnet/minecraft/client/render/Camera;Lnet/minecraft/client/render/Frustum;ZZ)V"))
private void forceAllChunks(CallbackInfo ci, @Local(argsOnly = true) Camera camera) {
@Inject(method = "render", at = @At(value = "INVOKE", target = SETUP_TERRAIN))
private void forceAllChunks(
CallbackInfo ci,
//#if MC>=12109
//$$ @Local Frustum frustum,
//#endif
@Local(argsOnly = true) Camera camera
) {
if (replayModRender_hook == null) {
return;
}
@@ -69,7 +85,11 @@ public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading {
boolean areWeDoneYet = true;
// Determine which chunks shall be visible
//#if MC>=12109
//$$ method_74752(camera, frustum, this.client.player.isSpectator());
//#else
setupTerrain(camera, this.frustum, this.capturedFrustum != null, this.client.player.isSpectator());
//#endif
// Wait for async processing to be complete
Future<?> fullUpdateFuture = renderingDataAcc.fullUpdateFuture();

View File

View File

@@ -0,0 +1,3 @@
essential.defaults.loom.minecraft=com.mojang:minecraft:1.21.10
essential.defaults.loom.mappings=net.fabricmc:yarn:1.21.10+build.2:v2
essential.loom.disableUnpick=true

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);
}
}

View File

@@ -0,0 +1,9 @@
net.minecraft.util.HeldItemContext getEntityWorld() net.minecraft.entity.Entity getWorld()
net.minecraft.util.HeldItemContext getEntityPos() net.minecraft.entity.Entity getPos()
net.minecraft.client.network.ClientPlayerLikeEntity getSkin() net.minecraft.client.network.AbstractClientPlayerEntity getSkinTextures()
net.minecraft.entity.PlayerLikeEntity isModelPartVisible() net.minecraft.entity.player.PlayerEntity isPartVisible()
com.mojang.authlib.GameProfile com.mojang.authlib.GameProfile
com.mojang.authlib.GameProfile id() getId()Ljava/util/UUID;
com.mojang.authlib.GameProfile name() getName()Ljava/lang/String;
com.mojang.authlib.GameProfile properties() getProperties()Lcom/mojang/authlib/properties/PropertyMap;