diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/mantle_model_cme/ConnectedModelMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/mantle_model_cme/ConnectedModelMixin.java new file mode 100644 index 00000000..913205c3 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/mantle_model_cme/ConnectedModelMixin.java @@ -0,0 +1,24 @@ +package org.embeddedt.modernfix.forge.mixin.bugfix.mantle_model_cme; + +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.annotation.RequiresMod; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Pseudo +@Mixin(targets = { "slimeknights/mantle/client/model/connected/ConnectedModel$Baked" }, remap = false) +@RequiresMod("mantle") +@ClientOnlyMixin +public class ConnectedModelMixin { + @SuppressWarnings("unused") + @Shadow + @Final + @Mutable + private final Map nameMappingCache = new ConcurrentHashMap<>(); +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/mantle_model_cme/FluidTextureModelLoaderMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/mantle_model_cme/FluidTextureModelLoaderMixin.java new file mode 100644 index 00000000..018369dd --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/mantle_model_cme/FluidTextureModelLoaderMixin.java @@ -0,0 +1,24 @@ +package org.embeddedt.modernfix.forge.mixin.bugfix.mantle_model_cme; + +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.annotation.RequiresMod; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +@Pseudo +@Mixin(targets = { "slimeknights/mantle/client/model/fluid/FluidTextureModel$Loader" }, remap = false) +@RequiresMod("mantle") +@ClientOnlyMixin +public class FluidTextureModelLoaderMixin { + @SuppressWarnings("unused") + @Shadow + @Final + @Mutable + private final Map modelCache = new ConcurrentHashMap<>(); +} diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/mantle_model_cme/RetexturedModelBakedMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/mantle_model_cme/RetexturedModelBakedMixin.java new file mode 100644 index 00000000..69a1b90e --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/mantle_model_cme/RetexturedModelBakedMixin.java @@ -0,0 +1,29 @@ +package org.embeddedt.modernfix.forge.mixin.bugfix.mantle_model_cme; + +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.resources.ResourceLocation; +import org.embeddedt.modernfix.annotation.ClientOnlyMixin; +import org.embeddedt.modernfix.annotation.RequiresMod; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Fix ConcurrentModificationException from Mantle models by making the cache thread-safe. + */ +@Pseudo +@Mixin(targets = { "slimeknights/mantle/client/model/RetexturedModel$BakedModel" }, remap = false) +@RequiresMod("mantle") +@ClientOnlyMixin +public class RetexturedModelBakedMixin { + @SuppressWarnings("unused") + @Shadow + @Final + @Mutable + private final Map cache = new ConcurrentHashMap<>(); +}