Skip to content

Commit

Permalink
Fix EffectRenderer and RenderGlobal leaking world instance when leavi…
Browse files Browse the repository at this point in the history
…ng world (#278)

* Fix EffectRenderer and RenderGlobal leaking world instance when leaving world

* Fix RenderGlobal leaking world instances inside of WorldRenderer arrays
  • Loading branch information
tth05 authored Nov 15, 2023
1 parent 08e989c commit 6d036a5
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/main/java/com/mitchej123/hodgepodge/LoadingConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ public class LoadingConfig {
public boolean fixThaumcraftGolemMarkerLoading;
public boolean fixTimeCommandWithGC;
public boolean fixUnfocusedFullscreen;
public boolean fixRenderersWorldLeak;
public boolean fixForgeUpdateChecker;
public boolean fixUrlDetection;
public boolean fixVanillaUnprotectedGetBlock;
Expand Down Expand Up @@ -290,6 +291,7 @@ public LoadingConfig(File file) {
fixThaumcraftAspectSorting = config.get(Category.FIXES.toString(), "fixThaumcraftAspectSorting", true, "Fix Thaumcraft Aspects being sorted by tag instead of by name").getBoolean();
fixThaumcraftGolemMarkerLoading = config.get(Category.FIXES.toString(), "fixThaumcraftGolemMarkerLoading", true, "Fix golem's marker loading failure when dimensionId larger than MAX_BYTE").getBoolean();
fixUnfocusedFullscreen = config.get(Category.FIXES.toString(), "fixUnfocusedFullscreen", true, "Fix exiting fullscreen when you tab out of the game").getBoolean();
fixRenderersWorldLeak = config.get(Category.FIXES.toString(), "fixRenderersWorldLeak", true, "Fix EffectRenderer and RenderGlobal leaking world instance when leaving world").getBoolean();
fixUrlDetection = config.get(Category.FIXES.toString(), "fixUrlDetection", true, "Fix URISyntaxException in forge.").getBoolean();
fixVanillaUnprotectedGetBlock = config.get(Category.FIXES.toString(), "fixVanillaUnprotectedGetBlock", true, "Fixes various unchecked vanilla getBlock() methods").getBoolean();
fixVillageUncheckedGetBlock = config.get(Category.FIXES.toString(), "fixVillageUncheckedGetBlock", true, "Fixes village unchecked getBlock() calls").getBoolean();
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,12 @@ public enum Mixins {
FIX_UNFOCUSED_FULLSCREEN(new Builder("Fix Unfocused Fullscreen").setPhase(Phase.EARLY)
.addMixinClasses("minecraft.MixinMinecraft_UnfocusedFullscreen").setSide(Side.CLIENT)
.setApplyIf(() -> Common.config.fixUnfocusedFullscreen).addTargetedMod(TargetedMod.VANILLA)),
FIX_RENDERERS_WORLD_LEAK(new Builder("Fix Renderers World Leak").setPhase(Phase.EARLY)
.addMixinClasses(
"minecraft.MixinMinecraft_ClearRenderersWorldLeak",
"minecraft.MixinRenderGlobal_FixWordLeak")
.setSide(Side.CLIENT).setApplyIf(() -> Common.config.fixRenderersWorldLeak)
.addTargetedMod(TargetedMod.VANILLA)),
FIX_OPTIFINE_CHUNKLOADING_CRASH(new Builder("Fix Optifine Chunkloading Crash").setPhase(Phase.EARLY)
.setApplyIf(() -> Common.config.fixOptifineChunkLoadingCrash).setSide(Side.CLIENT)
.addTargetedMod(TargetedMod.VANILLA).addTargetedMod(TargetedMod.OPTIFINE)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.mitchej123.hodgepodge.mixins.early.minecraft;

import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.client.particle.EffectRenderer;
import net.minecraft.client.renderer.RenderGlobal;

import org.objectweb.asm.Opcodes;
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(Minecraft.class)
public abstract class MixinMinecraft_ClearRenderersWorldLeak {

@Shadow
public EffectRenderer effectRenderer;

@Shadow
public RenderGlobal renderGlobal;

@Inject(
method = "loadWorld(Lnet/minecraft/client/multiplayer/WorldClient;Ljava/lang/String;)V",
at = @At(
value = "FIELD",
target = "Lnet/minecraft/client/Minecraft;theWorld:Lnet/minecraft/client/multiplayer/WorldClient;",
opcode = Opcodes.PUTFIELD,
shift = At.Shift.AFTER))
private void hodgepodge$fixRenderersWorldLeak(WorldClient worldClient, String loadingMessage, CallbackInfo ci) {
if (worldClient == null) {
if (renderGlobal != null) {
renderGlobal.setWorldAndLoadRenderers(null);
}

if (effectRenderer != null) {
effectRenderer.clearEffects(null);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package com.mitchej123.hodgepodge.mixins.early.minecraft;

import java.util.List;

import net.minecraft.client.multiplayer.WorldClient;
import net.minecraft.client.renderer.RenderGlobal;
import net.minecraft.client.renderer.WorldRenderer;

import org.objectweb.asm.Opcodes;
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(RenderGlobal.class)
public abstract class MixinRenderGlobal_FixWordLeak {

@Shadow
public List tileEntities;

@Shadow
private WorldRenderer[] worldRenderers;

@Shadow
private WorldRenderer[] sortedWorldRenderers;

@Inject(
method = "setWorldAndLoadRenderers(Lnet/minecraft/client/multiplayer/WorldClient;)V",
at = @At(
value = "FIELD",
target = "Lnet/minecraft/client/renderer/RenderGlobal;theWorld:Lnet/minecraft/client/multiplayer/WorldClient;",
opcode = Opcodes.PUTFIELD,
shift = At.Shift.AFTER))
public void hodgepodge$clearWorldRenderersAndTileEntities(WorldClient worldClient, CallbackInfo ci) {
if (worldClient == null) {
tileEntities.clear();

if (worldRenderers != null) {
for (WorldRenderer worldRenderer : worldRenderers) {
worldRenderer.stopRendering();
}
}

worldRenderers = null;
sortedWorldRenderers = null;
}
}
}

0 comments on commit 6d036a5

Please sign in to comment.