diff --git a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java index 456ceea7..5e7f2f63 100644 --- a/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java +++ b/common/src/main/java/org/embeddedt/modernfix/dynamicresources/DynamicBakedModelProvider.java @@ -2,6 +2,7 @@ package org.embeddedt.modernfix.dynamicresources; import com.google.common.collect.ImmutableSet; import com.mojang.math.Transformation; +import it.unimi.dsi.fastutil.objects.Object2ObjectMaps; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import net.minecraft.client.renderer.block.model.BakedQuad; import net.minecraft.client.renderer.block.model.ItemOverrides; @@ -38,7 +39,8 @@ public class DynamicBakedModelProvider implements Map, BakedModel> bakedCache; - private final Map permanentOverrides; + private volatile Map permanentOverridesView = null; + private final Map permanentOverridesMutable; private BakedModel missingModel; private static final BakedModel SENTINEL = new BakedModel() { @Override @@ -85,7 +87,7 @@ public class DynamicBakedModelProvider implements Map, BakedModel> cache) { this.bakery = bakery; this.bakedCache = cache; - this.permanentOverrides = Collections.synchronizedMap(new Object2ObjectOpenHashMap<>()); + this.permanentOverridesMutable = new Object2ObjectOpenHashMap<>(); if(currentInstance == null) currentInstance = this; } @@ -107,14 +109,27 @@ public class DynamicBakedModelProvider implements Map getPermanentOverrides() { + Map map = permanentOverridesView; + if(map == null) { + synchronized (this) { + map = permanentOverridesView; + if(map == null) { + permanentOverridesView = map = Object2ObjectMaps.unmodifiable(new Object2ObjectOpenHashMap<>(permanentOverridesMutable)); + } + } + } + return map; + } + @Override public boolean containsKey(Object o) { - return permanentOverrides.getOrDefault(o, SENTINEL) != null; + return getPermanentOverrides().getOrDefault(o, SENTINEL) != null; } @Override public boolean containsValue(Object o) { - return permanentOverrides.containsValue(o) || bakedCache.containsValue(o); + return getPermanentOverrides().containsValue(o) || bakedCache.containsValue(o); } private static boolean isVanillaTopLevelModel(ResourceLocation location) { @@ -140,7 +155,7 @@ public class DynamicBakedModelProvider implements Map map) { - permanentOverrides.putAll(map); + synchronized (this) { + permanentOverridesMutable.putAll(map); + permanentOverridesView = null; + } } @Override @@ -210,23 +236,27 @@ public class DynamicBakedModelProvider implements Map function) { - Set overridenLocations = permanentOverrides.keySet(); - permanentOverrides.replaceAll(function); + synchronized (this) { + permanentOverridesMutable.replaceAll(function); + permanentOverridesView = null; + } boolean uvLock = BlockModelRotation.X0_Y0.isUvLocked(); Transformation rotation = BlockModelRotation.X0_Y0.getRotation(); bakedCache.replaceAll((loc, oldModel) -> { - if(loc.getMiddle() != rotation || loc.getRight() != uvLock || overridenLocations.contains(loc.getLeft())) + if(loc.getMiddle() != rotation || loc.getRight() != uvLock || getPermanentOverrides().containsKey(loc.getLeft())) return oldModel; else return function.apply(loc.getLeft(), oldModel);