diff --git a/src/main/java/com/minelittlepony/client/mixin/MixinVertextConsumers.java b/src/main/java/com/minelittlepony/client/mixin/MixinVertextConsumers.java new file mode 100644 index 00000000..91ec6243 --- /dev/null +++ b/src/main/java/com/minelittlepony/client/mixin/MixinVertextConsumers.java @@ -0,0 +1,39 @@ +package com.minelittlepony.client.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Arrays; + +import net.minecraft.client.render.VertexConsumer; +import net.minecraft.client.render.VertexConsumers; + +/** + * Unmojang this code so the game doesn't crash + * any time you try to create a union with multiples of the same vertex consumer. + */ +@Mixin(VertexConsumers.class) +abstract class MixinVertextConsumers { + private static final String T = "Lnet/minecraft/client/render/VertexConsumer;"; + + @Inject(method = "union(" + T + T + ")" + T, at = @At("HEAD"), cancellable = true) + private static void onUnion(VertexConsumer first, VertexConsumer second, CallbackInfoReturnable info) { + if (first == second) { + info.setReturnValue(first); + } + } + + @Inject(method = "union([" + T + ")" + T, at = @At("HEAD"), cancellable = true) + private static void onUnion(VertexConsumer[] delegates, CallbackInfoReturnable info) { + int oldLength = delegates.length; + delegates = Arrays.stream(delegates).distinct().toArray(VertexConsumer[]::new); + + if (delegates.length == 1) { + info.setReturnValue(delegates[0]); + } else if (delegates.length != oldLength) { + info.setReturnValue(new VertexConsumers.Union(delegates)); + } + } +} diff --git a/src/main/resources/minelp.mixin.json b/src/main/resources/minelp.mixin.json index df844702..38d41c24 100644 --- a/src/main/resources/minelp.mixin.json +++ b/src/main/resources/minelp.mixin.json @@ -14,6 +14,7 @@ "MixinHeldItemRenderer", "MixinClientPlayerEntity", "MixinPlayerMoveC2SPacket", - "MixinPlayerPositionLookS2CPacket" + "MixinPlayerPositionLookS2CPacket", + "MixinVertextConsumers" ] }