From 2cdc8b88a5d0c234cb0f3f2593da947f7c44fdcc Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Fri, 5 May 2023 09:38:36 -0400 Subject: [PATCH] Make block model cache overridable for even more invasive mods --- .../BlockModelShaperMixin.java | 4 +- .../modernfix/util/DynamicOverridableMap.java | 42 +++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 common/src/main/java/org/embeddedt/modernfix/util/DynamicOverridableMap.java 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); + } +}