diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockModelShaperMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockModelShaperMixin.java index 129157b6..c5c70db9 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockModelShaperMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockModelShaperMixin.java @@ -6,7 +6,7 @@ import net.minecraft.client.resources.model.ModelManager; import net.minecraft.world.level.block.state.BlockState; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; import org.embeddedt.modernfix.dynamicresources.ModelLocationCache; -import org.embeddedt.modernfix.util.DynamicMap; +import org.embeddedt.modernfix.util.DynamicOverridableMap; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -26,7 +26,7 @@ public class BlockModelShaperMixin { @Inject(method = "", at = @At("RETURN")) private void replaceModelMap(CallbackInfo ci) { // replace the backing map for mods which will access it - this.modelByStateCache = new DynamicMap<>(state -> modelManager.getModel(ModelLocationCache.get(state))); + this.modelByStateCache = new DynamicOverridableMap<>(state -> modelManager.getModel(ModelLocationCache.get(state))); } /** diff --git a/common/src/main/java/org/embeddedt/modernfix/util/DynamicOverridableMap.java b/common/src/main/java/org/embeddedt/modernfix/util/DynamicOverridableMap.java new file mode 100644 index 00000000..e16d3f96 --- /dev/null +++ b/common/src/main/java/org/embeddedt/modernfix/util/DynamicOverridableMap.java @@ -0,0 +1,42 @@ +package org.embeddedt.modernfix.util; + +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.function.Function; + +public class DynamicOverridableMap extends DynamicMap { + private final Map overrideMap; + + public DynamicOverridableMap(Function function) { + super(function); + overrideMap = new Object2ObjectOpenHashMap<>(); + } + + @Override + public @Nullable V put(K k, V v) { + if(v == null) + throw new IllegalArgumentException(); + overrideMap.put(k, v); + return null; + } + + @Override + public V get(Object o) { + V val = overrideMap.get(o); + if(val != null) + return val; + return super.get(o); + } + + @Override + public void putAll(@NotNull Map map) { + for(V val : map.values()) { + if(val == null) + throw new IllegalArgumentException(); + } + overrideMap.putAll(map); + } +}