From a9c947517c13538a9b85b402b430250372b0294d Mon Sep 17 00:00:00 2001 From: Nassim Jahnke Date: Sat, 24 Aug 2024 16:46:57 +0200 Subject: [PATCH] Don't unnecessarily re-wrap objects in passthrough --- .../api/protocol/remapper/PacketHandlers.java | 2 +- .../protocol/packet/PacketWrapperImpl.java | 37 +++++++++++------- .../rewriter/EntityPacketRewriter1_12.java | 5 ++- .../viaversion/rewriter/EntityRewriter.java | 38 ++++--------------- 4 files changed, 35 insertions(+), 47 deletions(-) diff --git a/api/src/main/java/com/viaversion/viaversion/api/protocol/remapper/PacketHandlers.java b/api/src/main/java/com/viaversion/viaversion/api/protocol/remapper/PacketHandlers.java index 8d4ff21e0..73b21c222 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/protocol/remapper/PacketHandlers.java +++ b/api/src/main/java/com/viaversion/viaversion/api/protocol/remapper/PacketHandlers.java @@ -54,7 +54,7 @@ public abstract class PacketHandlers implements PacketHandler { * @param type type to map */ public void map(Type type) { - handler(wrapper -> wrapper.write(type, wrapper.read(type))); + handler(wrapper -> wrapper.passthrough(type)); } /** diff --git a/common/src/main/java/com/viaversion/viaversion/protocol/packet/PacketWrapperImpl.java b/common/src/main/java/com/viaversion/viaversion/protocol/packet/PacketWrapperImpl.java index 5e17ca15f..92ad9561a 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocol/packet/PacketWrapperImpl.java +++ b/common/src/main/java/com/viaversion/viaversion/protocol/packet/PacketWrapperImpl.java @@ -133,23 +133,26 @@ public class PacketWrapperImpl implements PacketWrapper { @Override public T read(Type type) { - if (readableObjects.isEmpty()) { - Preconditions.checkNotNull(inputBuffer, "This packet does not have an input buffer."); - // We could in the future log input read values, but honestly for things like bulk maps, mem waste D: - try { - return type.read(inputBuffer); - } catch (Exception e) { - throw createInformativeException(e, type, packetValues.size() + 1); - } - } + return readableObjects.isEmpty() ? readFromBuffer(type) : pollReadableObject(type).value; + } - PacketValue readValue = readableObjects.poll(); + private T readFromBuffer(Type type) { + Preconditions.checkNotNull(inputBuffer, "This packet does not have an input buffer."); + try { + return type.read(inputBuffer); + } catch (Exception e) { + throw createInformativeException(e, type, packetValues.size() + 1); + } + } + + private PacketValue pollReadableObject(Type type) { + PacketValue readValue = readableObjects.poll(); Type readType = readValue.type(); if (readType == type || (type.getBaseClass() == readType.getBaseClass() && type.getOutputClass() == readType.getOutputClass())) { //noinspection unchecked - return (T) readValue.value(); + return (PacketValue) readValue; } else { throw createInformativeException(new IOException("Unable to read type " + type.getTypeName() + ", found " + readValue.type().getTypeName()), type, readableObjects.size()); } @@ -182,9 +185,15 @@ public class PacketWrapperImpl implements PacketWrapper { @Override public T passthrough(Type type) throws InformativeException { - T value = read(type); - write(type, value); - return value; + if (readableObjects.isEmpty()) { + T value = readFromBuffer(type); + packetValues.add(new PacketValue<>(type, value)); + return value; + } else { + PacketValue value = pollReadableObject(type); + packetValues.add(value); + return value.value; + } } @Override diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_11_1to1_12/rewriter/EntityPacketRewriter1_12.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_11_1to1_12/rewriter/EntityPacketRewriter1_12.java index 3f92829c9..fe711670d 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_11_1to1_12/rewriter/EntityPacketRewriter1_12.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_11_1to1_12/rewriter/EntityPacketRewriter1_12.java @@ -23,6 +23,7 @@ import com.viaversion.viaversion.api.minecraft.item.Item; import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers; import com.viaversion.viaversion.api.type.Types; import com.viaversion.viaversion.api.type.types.version.Types1_12; +import com.viaversion.viaversion.api.type.types.version.Types1_9; import com.viaversion.viaversion.protocols.v1_11_1to1_12.Protocol1_11_1To1_12; import com.viaversion.viaversion.protocols.v1_9_1to1_9_3.packet.ClientboundPackets1_9_3; import com.viaversion.viaversion.rewriter.EntityRewriter; @@ -62,7 +63,7 @@ public class EntityPacketRewriter1_12 extends EntityRewriter { int[] entityIds = wrapper.passthrough(Types.VAR_INT_ARRAY_PRIMITIVE); @@ -349,34 +344,17 @@ public abstract class EntityRewriter> dataType, Type> mappedDataType) { protocol.registerClientbound(packetType, wrapper -> { int entityId = wrapper.passthrough(Types.VAR_INT); - tracker(wrapper.user()).removeEntity(entityId); - }); - } - - public void registerSetEntityData(C packetType, @Nullable Type> dataType, Type> mappedDataType) { - protocol.registerClientbound(packetType, new PacketHandlers() { - @Override - public void register() { - map(Types.VAR_INT); // 0 - Entity ID - if (dataType != null) { - map(dataType, mappedDataType); - } else { - map(mappedDataType); - } - handler(wrapper -> { - int entityId = wrapper.get(Types.VAR_INT, 0); - List entityData = wrapper.get(mappedDataType, 0); - handleEntityData(entityId, entityData, wrapper.user()); - }); + List entityData; + if (dataType != null) { + entityData = wrapper.read(dataType); + wrapper.write(mappedDataType, entityData); + } else { + entityData = wrapper.passthrough(mappedDataType); } + handleEntityData(entityId, entityData, wrapper.user()); }); }