From 89e76d369be29a12f0244511af084cdfc34a8e66 Mon Sep 17 00:00:00 2001 From: FlorianMichael <60033407+FlorianMichael@users.noreply.github.com> Date: Tue, 7 May 2024 00:09:24 +0200 Subject: [PATCH] Fix destroy entities handling in 1.7->1.8 Split into multiple packets since 1.8 can handle a larger list of entities than 1.7 can, causing NegativeArraySizeException's to appear on some servers. --- .../MetadataRewriter1_7_6_10To1_8.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/com/viaversion/viarewind/protocol/protocol1_7_6_10to1_8/metadata/MetadataRewriter1_7_6_10To1_8.java b/common/src/main/java/com/viaversion/viarewind/protocol/protocol1_7_6_10to1_8/metadata/MetadataRewriter1_7_6_10To1_8.java index 2444d686a..343bcbbd9 100644 --- a/common/src/main/java/com/viaversion/viarewind/protocol/protocol1_7_6_10to1_8/metadata/MetadataRewriter1_7_6_10To1_8.java +++ b/common/src/main/java/com/viaversion/viarewind/protocol/protocol1_7_6_10to1_8/metadata/MetadataRewriter1_7_6_10To1_8.java @@ -17,6 +17,8 @@ */ package com.viaversion.viarewind.protocol.protocol1_7_6_10to1_8.metadata; +import com.google.common.collect.Lists; +import com.google.common.primitives.Ints; import com.viaversion.viarewind.ViaRewind; import com.viaversion.viarewind.api.rewriter.VREntityRewriter; import com.viaversion.viarewind.api.type.Types1_7_6_10; @@ -87,14 +89,19 @@ public void register() { }); } }); - protocol.registerClientbound(ClientboundPackets1_8.DESTROY_ENTITIES, new PacketHandlers() { - @Override - public void register() { - map(Type.VAR_INT_ARRAY_PRIMITIVE, Types1_7_6_10.BYTE_INT_ARRAY); // Entity ids - handler(wrapper -> { - final int[] entities = wrapper.get(Types1_7_6_10.BYTE_INT_ARRAY, 0); - untrackEntities(wrapper.user(), entities); - }); + protocol.registerClientbound(ClientboundPackets1_8.DESTROY_ENTITIES, wrapper -> { + final int[] entities = wrapper.read(Type.VAR_INT_ARRAY_PRIMITIVE); + untrackEntities(wrapper.user(), entities); + + wrapper.cancel(); + + // Split entity destroy packets into smaller packets because 1.8 can handle more entities at once then 1.7 can. + final List> parts = Lists.partition(Ints.asList(entities), Byte.MAX_VALUE); + + for (List part : parts) { + final PacketWrapper destroy = PacketWrapper.create(ClientboundPackets1_7_2_5.DESTROY_ENTITIES, wrapper.user()); + destroy.write(Types1_7_6_10.BYTE_INT_ARRAY, part.stream().mapToInt(Integer::intValue).toArray()); + destroy.scheduleSend(Protocol1_7_6_10To1_8.class); } }); protocol.registerClientbound(ClientboundPackets1_8.ENTITY_METADATA, new PacketHandlers() {