diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java index b12fbefa..b1d684c2 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -3,6 +3,7 @@ package org.embeddedt.modernfix.forge.mixin.perf.dynamic_resources; import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.cache.RemovalNotification; +import com.google.common.collect.ForwardingMap; import com.google.common.collect.ImmutableList; import net.minecraft.client.Minecraft; import net.minecraft.client.color.block.BlockColors; @@ -36,6 +37,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.io.IOException; import java.util.*; +import java.util.concurrent.ConcurrentMap; import java.util.concurrent.TimeUnit; import java.util.function.BiConsumer; import java.util.function.BiFunction; @@ -74,9 +76,14 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { private HashMap smallLoadingCache = new HashMap<>(); + // disable fabric recursion + @SuppressWarnings("unused") + private boolean fabric_enableGetOrLoadModelGuard; + @Redirect(method = "", at = @At(value = "FIELD", opcode = Opcodes.PUTFIELD, target = "Lnet/minecraft/client/resources/model/ModelBakery;blockColors:Lnet/minecraft/client/color/block/BlockColors;")) private void replaceTopLevelBakedModels(ModelBakery bakery, BlockColors val) { + fabric_enableGetOrLoadModelGuard = false; this.blockColors = val; this.loadedBakedModels = CacheBuilder.newBuilder() .expireAfterAccess(ModelBakeryHelpers.MAX_MODEL_LIFETIME_SECS, TimeUnit.SECONDS) @@ -93,7 +100,19 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { .softValues() .build(); this.bakedCache = loadedBakedModels.asMap(); - this.unbakedCache = loadedModels.asMap(); + ConcurrentMap unbakedCacheBackingMap = loadedModels.asMap(); + this.unbakedCache = new ForwardingMap() { + @Override + protected Map delegate() { + return unbakedCacheBackingMap; + } + + @Override + public UnbakedModel put(ResourceLocation key, UnbakedModel value) { + smallLoadingCache.put(key, value); + return super.put(key, value); + } + }; this.bakedTopLevelModels = new DynamicBakedModelProvider((ModelBakery)(Object)this, bakedCache); } diff --git a/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java b/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java index f03444c1..9131b046 100644 --- a/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java +++ b/forge/src/main/java/org/embeddedt/modernfix/platform/forge/ModernFixPlatformHooksImpl.java @@ -107,6 +107,8 @@ public class ModernFixPlatformHooksImpl implements ModernFixPlatformHooks { noGroupField.setAccessible(true); InjectorGroupInfo noGroup = (InjectorGroupInfo)noGroupField.get(null); groupMembersField.set(noGroup, new DummyList<>()); + } catch(NoSuchFieldException ignored) { + // Connector will replace FML's mixin with one which already has the fix, don't bother logging } catch(RuntimeException | ReflectiveOperationException e) { ModernFixMixinPlugin.instance.logger.error("Failed to patch mixin memory leak", e); }