From 90bbc6844399eb2045b7943407437331a951a9b9 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Tue, 23 Feb 2021 11:45:08 +0100 Subject: [PATCH] Replace reflection in ChunkLoadingRenderGlobal with mixin --- .../hooks/ChunkLoadingRenderGlobal.java | 21 ++----------------- .../render/hooks/IForceChunkLoading.java | 13 ++++++++++++ .../render/mixin/Mixin_ForceChunkLoading.java | 10 +++++++-- 3 files changed, 23 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/replaymod/render/hooks/IForceChunkLoading.java diff --git a/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java b/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java index f43a0c9c..2fa09213 100644 --- a/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java +++ b/src/main/java/com/replaymod/render/hooks/ChunkLoadingRenderGlobal.java @@ -3,8 +3,6 @@ package com.replaymod.render.hooks; import net.minecraft.client.render.WorldRenderer; -import java.lang.reflect.Field; - //#if MC>=11500 //#else //$$ import com.replaymod.render.mixin.ChunkRenderDispatcherAccessor; @@ -45,20 +43,10 @@ public class ChunkLoadingRenderGlobal { this.hooked = renderGlobal; //#if MC>=11500 - install(); //#else //$$ setup(((WorldRendererAccessor) renderGlobal).getRenderDispatcher()); - //$$ install(); //#endif - } - - private void install() { - try { - Field hookField = WorldRenderer.class.getField("replayModRender_hook"); - hookField.set(hooked, this); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new Error(e); - } + IForceChunkLoading.from(renderGlobal).replayModRender_setHook(this); } //#if MC>=11500 @@ -153,12 +141,7 @@ public class ChunkLoadingRenderGlobal { //$$ workerJailingQueue.freeAll(); //#endif - try { - Field hookField = WorldRenderer.class.getField("replayModRender_hook"); - hookField.set(hooked, null); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new Error(e); - } + IForceChunkLoading.from(hooked).replayModRender_setHook(null); } //#if MC>=11500 diff --git a/src/main/java/com/replaymod/render/hooks/IForceChunkLoading.java b/src/main/java/com/replaymod/render/hooks/IForceChunkLoading.java new file mode 100644 index 00000000..57b8c943 --- /dev/null +++ b/src/main/java/com/replaymod/render/hooks/IForceChunkLoading.java @@ -0,0 +1,13 @@ +//#if MC>=10800 +package com.replaymod.render.hooks; + +import net.minecraft.client.render.WorldRenderer; + +public interface IForceChunkLoading { + void replayModRender_setHook(ChunkLoadingRenderGlobal hook); + + static IForceChunkLoading from(WorldRenderer worldRenderer) { + return (IForceChunkLoading) worldRenderer; + } +} +//#endif diff --git a/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java b/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java index 23f98910..8e6741a6 100644 --- a/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java +++ b/src/main/java/com/replaymod/render/mixin/Mixin_ForceChunkLoading.java @@ -3,6 +3,7 @@ package com.replaymod.render.mixin; //#if MC>=10800 import com.replaymod.compat.shaders.ShaderReflection; import com.replaymod.render.hooks.ChunkLoadingRenderGlobal; +import com.replaymod.render.hooks.IForceChunkLoading; import net.minecraft.client.render.Camera; import net.minecraft.client.render.Frustum; import net.minecraft.client.render.WorldRenderer; @@ -31,8 +32,13 @@ import java.util.Set; //#endif @Mixin(WorldRenderer.class) -public abstract class Mixin_ForceChunkLoading { - public ChunkLoadingRenderGlobal replayModRender_hook; +public abstract class Mixin_ForceChunkLoading implements IForceChunkLoading { + private ChunkLoadingRenderGlobal replayModRender_hook; + + @Override + public void replayModRender_setHook(ChunkLoadingRenderGlobal hook) { + this.replayModRender_hook = hook; + } //#if MC>=11500 @Shadow private Set chunksToRebuild;