From 89ebab3ab8b52e49617dbcabf5ca3f9fb3e98920 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 4 Jan 2023 14:24:54 -0500 Subject: [PATCH] Trim ModelManager maps --- .../modernfix/mixin/ModelManagerMixin.java | 37 +++++++++++++++++++ src/main/resources/modernfix.mixins.json | 3 +- 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/ModelManagerMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/mixin/ModelManagerMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/ModelManagerMixin.java new file mode 100644 index 00000000..665fd3b0 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/ModelManagerMixin.java @@ -0,0 +1,37 @@ +package org.embeddedt.modernfix.mixin; + +import net.minecraft.client.renderer.model.ModelBakery; +import net.minecraft.client.renderer.model.ModelManager; +import net.minecraft.profiler.IProfiler; +import net.minecraft.resources.IResourceManager; +import net.minecraftforge.client.model.ModelLoader; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; +import org.embeddedt.modernfix.ModernFix; +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; + +import java.util.HashMap; +import java.util.Map; + +@Mixin(ModelManager.class) +public class ModelManagerMixin { + private void trimBakeryMap(ModelBakery bakery, String fieldName) { + Map map = ObfuscationReflectionHelper.getPrivateValue(ModelBakery.class, bakery, fieldName); + int size = map.size(); + ModernFix.LOGGER.warn("Trimming " + fieldName + " with " + size + " entries"); + if(map instanceof HashMap) { + ObfuscationReflectionHelper.setPrivateValue(ModelBakery.class, bakery, new HashMap<>(), fieldName); + } else + map.clear(); + } + @Inject(method = "apply(Lnet/minecraft/client/renderer/model/ModelBakery;Lnet/minecraft/resources/IResourceManager;Lnet/minecraft/profiler/IProfiler;)V", at = @At("RETURN")) + private void trimModelCaches(ModelBakery bakery, IResourceManager p_212853_2_, IProfiler p_212853_3_, CallbackInfo ci) { + trimBakeryMap(bakery, "unbakedCache"); + trimBakeryMap(bakery, "bakedCache"); + trimBakeryMap(bakery, "topLevelModels"); + // bakedTopLevelModels is used as the model registry + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index 4fd7a941..6930eb79 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -18,7 +18,8 @@ "client": [ "MinecraftMixin", "RenderTypeMixin", - "ModelBakeryMixin" + "ModelBakeryMixin", + "ModelManagerMixin" ], "injectors": { "defaultRequire": 1