Fix concurrency bugs in Mantle models

Backports eb111d2083
Related: https://github.com/embeddedt/embeddium/issues/251
This commit is contained in:
embeddedt 2024-03-31 16:34:46 -04:00
parent 8873a055bc
commit ec189b55a2
No known key found for this signature in database
GPG Key ID: A69433EC199B5613
3 changed files with 77 additions and 0 deletions

View File

@ -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<String, String> nameMappingCache = new ConcurrentHashMap<>();
}

View File

@ -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<>();
}

View File

@ -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<ResourceLocation, BakedModel> cache = new ConcurrentHashMap<>();
}