Avoid synchronizing layer list in LivingEntityRenderer
This commit is contained in:
parent
79d2b28d5b
commit
ab8a8068e0
|
|
@ -1,28 +1,34 @@
|
||||||
package org.embeddedt.modernfix.common.mixin.safety;
|
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.LivingEntityRenderer;
|
||||||
import net.minecraft.client.renderer.entity.layers.RenderLayer;
|
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.embeddedt.modernfix.annotation.ClientOnlyMixin;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Mutable;
|
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
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)
|
@Mixin(LivingEntityRenderer.class)
|
||||||
@ClientOnlyMixin
|
@ClientOnlyMixin
|
||||||
public class LivingEntityRendererMixin {
|
public abstract class LivingEntityRendererMixin<T extends Entity, M extends EntityModel<T>> {
|
||||||
@Shadow @Final @Mutable
|
@Shadow
|
||||||
protected List<RenderLayer<?, ?>> layers;
|
public abstract boolean addLayer(RenderLayer<T, M> layer);
|
||||||
|
|
||||||
@Inject(method = "<init>", at = @At("RETURN"))
|
/**
|
||||||
private void synchronizeLayerList(CallbackInfo ci) {
|
* @author embeddedt
|
||||||
/* allows buggy mods to call addLayer concurrently, order is not deterministic but can't fix that */
|
* @reason avoid CMEs from buggy mods calling addLayer on wrong thread
|
||||||
this.layers = Collections.synchronizedList(layers);
|
*/
|
||||||
|
@WrapMethod(method = "addLayer")
|
||||||
|
private boolean handleOffThreadLayerAdd(RenderLayer<T, M> layer, Operation<Boolean> 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user