Skip to content

Commit 2abc4fa

Browse files
committed
Add type checking to dynamic maps to avoid ClassCastException from badly behaved mods
1 parent 489136d commit 2abc4fa

File tree

6 files changed

+12
-7
lines changed

6 files changed

+12
-7
lines changed

common/src/main/java/org/embeddedt/modernfix/api/helpers/ModelHelpers.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public static ImmutableList<BlockState> getBlockStateForLocation(StateDefinition
4747
* @return a fake map of the top-level models
4848
*/
4949
public static Map<ResourceLocation, BakedModel> createFakeTopLevelMap(BiFunction<ResourceLocation, ModelState, BakedModel> modelGetter) {
50-
return new DynamicMap<>(location -> modelGetter.apply(location, BlockModelRotation.X0_Y0));
50+
return new DynamicMap<>(ResourceLocation.class, location -> modelGetter.apply(location, BlockModelRotation.X0_Y0));
5151
}
5252

5353
/**

common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/BlockModelShaperMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class BlockModelShaperMixin {
2929
@Inject(method = { "<init>", "replaceCache" }, at = @At("RETURN"))
3030
private void replaceModelMap(CallbackInfo ci) {
3131
// replace the backing map for mods which will access it
32-
this.modelByStateCache = new DynamicOverridableMap<>(state -> modelManager.getModel(ModelLocationCache.get(state)));
32+
this.modelByStateCache = new DynamicOverridableMap<>(BlockState.class, state -> modelManager.getModel(ModelLocationCache.get(state)));
3333
// Clear the cached models on blockstate objects
3434
for(Block block : BuiltInRegistries.BLOCK) {
3535
for(BlockState state : block.getStateDefinition().getPossibleStates()) {

common/src/main/java/org/embeddedt/modernfix/common/mixin/perf/dynamic_resources/ModelBakeryMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public abstract class ModelBakeryMixin implements IExtendedModelBakery {
7676

7777
@Shadow @Final public static ModelResourceLocation MISSING_MODEL_VARIANT;
7878

79-
private final Map<ModelResourceLocation, BakedModel> mfix$emulatedBakedRegistry = new DynamicOverridableMap<>(this::loadBakedModelDynamic);
79+
private final Map<ModelResourceLocation, BakedModel> mfix$emulatedBakedRegistry = new DynamicOverridableMap<>(ModelResourceLocation.class, this::loadBakedModelDynamic);
8080

8181
@Override
8282
public UnbakedModel mfix$loadUnbakedModelDynamic(ModelResourceLocation location) {

common/src/main/java/org/embeddedt/modernfix/util/DynamicInt2ObjectMap.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
public class DynamicInt2ObjectMap<V> extends DynamicMap<Integer, V> implements Int2ObjectMap<V> {
1515
public DynamicInt2ObjectMap(Function<Integer, V> function) {
16-
super(function);
16+
super(Integer.class, function);
1717
}
1818

1919
@Override

common/src/main/java/org/embeddedt/modernfix/util/DynamicMap.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111

1212
public class DynamicMap<K, V> implements Map<K, V> {
1313
protected final Function<K, V> function;
14+
private final Class<K> keyClass;
1415

15-
public DynamicMap(Function<K, V> function) {
16+
public DynamicMap(Class<K> keyClass, Function<K, V> function) {
17+
this.keyClass = keyClass;
1618
this.function = function;
1719
}
1820

@@ -38,6 +40,9 @@ public boolean containsValue(Object o) {
3840

3941
@Override
4042
public V get(Object o) {
43+
if(!keyClass.isInstance(o)) {
44+
return null;
45+
}
4146
return function.apply((K)o);
4247
}
4348

common/src/main/java/org/embeddedt/modernfix/util/DynamicOverridableMap.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
public class DynamicOverridableMap<K, V> extends DynamicMap<K, V> {
1111
private final Map<K, V> overrideMap;
1212

13-
public DynamicOverridableMap(Function<K, V> function) {
14-
super(function);
13+
public DynamicOverridableMap(Class<K> keyClass, Function<K, V> function) {
14+
super(keyClass, function);
1515
overrideMap = new Object2ObjectOpenHashMap<>();
1616
}
1717

0 commit comments

Comments
 (0)