diff --git a/src/main/java/org/embeddedt/modernfix/common/mixin/safety/LivingEntityRendererMixin.java b/src/main/java/org/embeddedt/modernfix/common/mixin/safety/LivingEntityRendererMixin.java index 8e165b7b..c6dac5de 100644 --- a/src/main/java/org/embeddedt/modernfix/common/mixin/safety/LivingEntityRendererMixin.java +++ b/src/main/java/org/embeddedt/modernfix/common/mixin/safety/LivingEntityRendererMixin.java @@ -1,28 +1,34 @@ package org.embeddedt.modernfix.common.mixin.safety; +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import net.minecraft.client.Minecraft; +import net.minecraft.client.model.EntityModel; import net.minecraft.client.renderer.entity.LivingEntityRenderer; import net.minecraft.client.renderer.entity.layers.RenderLayer; +import net.minecraft.world.entity.Entity; +import org.embeddedt.modernfix.ModernFix; import org.embeddedt.modernfix.annotation.ClientOnlyMixin; -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.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.Collections; -import java.util.List; @Mixin(LivingEntityRenderer.class) @ClientOnlyMixin -public class LivingEntityRendererMixin { - @Shadow @Final @Mutable - protected List> layers; +public abstract class LivingEntityRendererMixin> { + @Shadow + public abstract boolean addLayer(RenderLayer layer); - @Inject(method = "", at = @At("RETURN")) - private void synchronizeLayerList(CallbackInfo ci) { - /* allows buggy mods to call addLayer concurrently, order is not deterministic but can't fix that */ - this.layers = Collections.synchronizedList(layers); + /** + * @author embeddedt + * @reason avoid CMEs from buggy mods calling addLayer on wrong thread + */ + @WrapMethod(method = "addLayer") + private boolean handleOffThreadLayerAdd(RenderLayer layer, Operation original) { + if (!Minecraft.getInstance().isSameThread()) { + ModernFix.LOGGER.error("LivingEntityRenderer.addLayer called on wrong thread", new Exception()); + Minecraft.getInstance().tell(() -> this.addLayer(layer)); + return true; + } + return original.call(layer); } }