From 2abc4fa56b0bbe7f631a9ec2c72463eeb7ee8e00 Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Mon, 19 Aug 2024 18:17:25 -0400 Subject: [PATCH] Add type checking to dynamic maps to avoid ClassCastException from badly behaved mods --- .../org/embeddedt/modernfix/api/helpers/ModelHelpers.java | 2 +- .../perf/dynamic_resources/BlockModelShaperMixin.java | 2 +- .../mixin/perf/dynamic_resources/ModelBakeryMixin.java | 2 +- .../org/embeddedt/modernfix/util/DynamicInt2ObjectMap.java | 2 +- .../main/java/org/embeddedt/modernfix/util/DynamicMap.java | 7 ++++++- .../embeddedt/modernfix/util/DynamicOverridableMap.java | 4 ++-- 6 files changed, 12 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/org/embeddedt/modernfix/api/helpers/ModelHelpers.java b/common/src/main/java/org/embeddedt/modernfix/api/helpers/ModelHelpers.java index 13b689a6..32ae00b2 100644 --- a/common/src/main/java/org/embeddedt/modernfix/api/helpers/ModelHelpers.java +++ b/common/src/main/java/org/embeddedt/modernfix/api/helpers/ModelHelpers.java @@ -47,7 +47,7 @@ public final class ModelHelpers { * @return a fake map of the top-level models */ public static Map createFakeTopLevelMap(BiFunction modelGetter) { - return new DynamicMap<>(location -> modelGetter.apply(location, BlockModelRotation.X0_Y0)); + return new DynamicMap<>(ResourceLocation.class, location -> modelGetter.apply(location, BlockModelRotation.X0_Y0)); } /** 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 d146bfb2..40df98f0 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 @@ -29,7 +29,7 @@ public class BlockModelShaperMixin { @Inject(method = { "", "replaceCache" }, at = @At("RETURN")) private void replaceModelMap(CallbackInfo ci) { // replace the backing map for mods which will access it - this.modelByStateCache = new DynamicOverridableMap<>(state -> modelManager.getModel(ModelLocationCache.get(state))); + this.modelByStateCache = new DynamicOverridableMap<>(BlockState.class, state -> modelManager.getModel(ModelLocationCache.get(state))); // Clear the cached models on blockstate objects for(Block block : BuiltInRegistries.BLOCK) { for(BlockState state : block.getStateDefinition().getPossibleStates()) { diff --git a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ModelBakeryMixin.java b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ModelBakeryMixin.java index 9021a357..4d76363d 100644 --- a/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ModelBakeryMixin.java +++ b/common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ModelBakeryMixin.java @@ -76,7 +76,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery { @Shadow @Final public static ModelResourceLocation MISSING_MODEL_VARIANT; - private final Map mfix$emulatedBakedRegistry = new DynamicOverridableMap<>(this::loadBakedModelDynamic); + private final Map mfix$emulatedBakedRegistry = new DynamicOverridableMap<>(ModelResourceLocation.class, this::loadBakedModelDynamic); @Override public UnbakedModel mfix$loadUnbakedModelDynamic(ModelResourceLocation location) { diff --git a/common/src/main/java/org/embeddedt/modernfix/util/DynamicInt2ObjectMap.java b/common/src/main/java/org/embeddedt/modernfix/util/DynamicInt2ObjectMap.java index 7046d4a1..b0986819 100644 --- a/common/src/main/java/org/embeddedt/modernfix/util/DynamicInt2ObjectMap.java +++ b/common/src/main/java/org/embeddedt/modernfix/util/DynamicInt2ObjectMap.java @@ -13,7 +13,7 @@ import java.util.function.Function; public class DynamicInt2ObjectMap extends DynamicMap implements Int2ObjectMap { public DynamicInt2ObjectMap(Function function) { - super(function); + super(Integer.class, function); } @Override diff --git a/common/src/main/java/org/embeddedt/modernfix/util/DynamicMap.java b/common/src/main/java/org/embeddedt/modernfix/util/DynamicMap.java index 07efab65..db7c144e 100644 --- a/common/src/main/java/org/embeddedt/modernfix/util/DynamicMap.java +++ b/common/src/main/java/org/embeddedt/modernfix/util/DynamicMap.java @@ -11,8 +11,10 @@ import java.util.function.Function; public class DynamicMap implements Map { protected final Function function; + private final Class keyClass; - public DynamicMap(Function function) { + public DynamicMap(Class keyClass, Function function) { + this.keyClass = keyClass; this.function = function; } @@ -38,6 +40,9 @@ public class DynamicMap implements Map { @Override public V get(Object o) { + if(!keyClass.isInstance(o)) { + return null; + } return function.apply((K)o); } diff --git a/common/src/main/java/org/embeddedt/modernfix/util/DynamicOverridableMap.java b/common/src/main/java/org/embeddedt/modernfix/util/DynamicOverridableMap.java index e16d3f96..d684294e 100644 --- a/common/src/main/java/org/embeddedt/modernfix/util/DynamicOverridableMap.java +++ b/common/src/main/java/org/embeddedt/modernfix/util/DynamicOverridableMap.java @@ -10,8 +10,8 @@ import java.util.function.Function; public class DynamicOverridableMap extends DynamicMap { private final Map overrideMap; - public DynamicOverridableMap(Function function) { - super(function); + public DynamicOverridableMap(Class keyClass, Function function) { + super(keyClass, function); overrideMap = new Object2ObjectOpenHashMap<>(); }