diff --git a/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/biome_dictionary_cme/BiomeDictionaryTypeMixin.java b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/biome_dictionary_cme/BiomeDictionaryTypeMixin.java new file mode 100644 index 00000000..cb5039c5 --- /dev/null +++ b/forge/src/main/java/org/embeddedt/modernfix/forge/mixin/bugfix/biome_dictionary_cme/BiomeDictionaryTypeMixin.java @@ -0,0 +1,30 @@ +package org.embeddedt.modernfix.forge.mixin.bugfix.biome_dictionary_cme; + +import net.minecraftforge.common.BiomeDictionary; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Map; +import java.util.concurrent.ConcurrentSkipListMap; + +@Mixin(value = BiomeDictionary.Type.class, remap = false) +public class BiomeDictionaryTypeMixin { + @Shadow + @Mutable + @Final + private static Map byName; + + /** + * @author embeddedt + * @reason Biome types are created concurrently so the backing map needs to be thread-safe + */ + @Redirect(method = "", at = @At(value = "FIELD", target = "Lnet/minecraftforge/common/BiomeDictionary$Type;byName:Ljava/util/Map;", opcode = Opcodes.PUTSTATIC)) + private static void useConcurrentMap(Map treeMap) { + byName = new ConcurrentSkipListMap<>(); + } +}