From 718cae82e83908a38b4ba544b6dbe337bad12e42 Mon Sep 17 00:00:00 2001
From: Sollace <sollacea@gmail.com>
Date: Mon, 20 Mar 2023 19:50:37 +0000
Subject: [PATCH] Fixed crash due to duplicate buffers

---
 .../client/mixin/MixinVertextConsumers.java   | 39 +++++++++++++++++++
 src/main/resources/minelp.mixin.json          |  3 +-
 2 files changed, 41 insertions(+), 1 deletion(-)
 create mode 100644 src/main/java/com/minelittlepony/client/mixin/MixinVertextConsumers.java

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<VertexConsumer> info) {
+        if (first == second) {
+            info.setReturnValue(first);
+        }
+    }
+
+    @Inject(method = "union([" + T + ")" + T, at = @At("HEAD"), cancellable = true)
+    private static void onUnion(VertexConsumer[] delegates, CallbackInfoReturnable<VertexConsumer> 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"
     ]
 }