From 1bc3d407d19c8c2e6cfe5f554de25831b5b40c00 Mon Sep 17 00:00:00 2001 From: Nassim Jahnke Date: Thu, 3 Aug 2023 23:03:42 +1000 Subject: [PATCH] More juicy, untested work --- .../Protocol1_20_2To1_20.java | 112 ++++++++++-------- .../rewriter/EntityPacketRewriter1_20_2.java | 2 - ...ocolState.java => ConfigurationState.java} | 53 ++++++--- 3 files changed, 95 insertions(+), 72 deletions(-) rename common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/storage/{FakeProtocolState.java => ConfigurationState.java} (56%) diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/Protocol1_20_2To1_20.java b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/Protocol1_20_2To1_20.java index 705c1f0e9..0cab27e6f 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/Protocol1_20_2To1_20.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/protocol1_20_2to1_20/Protocol1_20_2To1_20.java @@ -17,7 +17,6 @@ */ package com.viaversion.viaversion.protocols.protocol1_20_2to1_20; -import com.viaversion.viaversion.api.Via; import com.viaversion.viaversion.api.connection.UserConnection; import com.viaversion.viaversion.api.minecraft.entities.Entity1_19_4Types; import com.viaversion.viaversion.api.protocol.AbstractProtocol; @@ -29,7 +28,6 @@ import com.viaversion.viaversion.api.rewriter.ItemRewriter; import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.data.entity.EntityTrackerBase; import com.viaversion.viaversion.exception.CancelException; -import com.viaversion.viaversion.protocol.packet.PacketWrapperImpl; import com.viaversion.viaversion.protocols.base.ClientboundLoginPackets; import com.viaversion.viaversion.protocols.base.ServerboundLoginPackets; import com.viaversion.viaversion.protocols.protocol1_19_4to1_19_3.ClientboundPackets1_19_4; @@ -40,12 +38,10 @@ import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.Serverbou import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.packet.ServerboundPackets1_20_2; import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.rewriter.BlockItemPacketRewriter1_20_2; import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.rewriter.EntityPacketRewriter1_20_2; -import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.storage.FakeProtocolState; +import com.viaversion.viaversion.protocols.protocol1_20_2to1_20.storage.ConfigurationState; import com.viaversion.viaversion.rewriter.SoundRewriter; import com.viaversion.viaversion.rewriter.StatisticsRewriter; import com.viaversion.viaversion.rewriter.TagRewriter; -import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; import org.checkerframework.checker.nullness.qual.Nullable; import java.util.UUID; @@ -62,10 +58,8 @@ public final class Protocol1_20_2To1_20 extends AbstractProtocol { - wrapper.user().get(FakeProtocolState.class).setGameProfileSent(true); + wrapper.user().get(ConfigurationState.class).setBridgePhase(ConfigurationState.BridgePhase.PROFILE_SENT); }); registerServerbound(State.LOGIN, ServerboundLoginPackets.LOGIN_ACKNOWLEDGED.getId(), -1, wrapper -> { System.out.println("Login acknowleged!"); - wrapper.user().getProtocolInfo().setState(State.PLAY); - wrapper.user().get(FakeProtocolState.class).setConfigurationState(true); wrapper.cancel(); + final ConfigurationState configurationState = wrapper.user().get(ConfigurationState.class); + configurationState.setBridgePhase(ConfigurationState.BridgePhase.CONFIGURATION); + wrapper.user().getProtocolInfo().setState(State.PLAY); + + for (final ConfigurationState.QueuedPacket packet : configurationState.packetQueue()) { + final PacketWrapper queuedWrapper; + if (packet.packetType() != null) { + queuedWrapper = PacketWrapper.create(packet.packetType(), packet.buf(), wrapper.user()); + } else { + //noinspection deprecation + queuedWrapper = PacketWrapper.create(packet.packetId(), packet.buf(), wrapper.user()); + } + + queuedWrapper.send(Protocol1_20_2To1_20.class, false); + } + + configurationState.packetQueue().clear(); }); cancelServerbound(State.LOGIN, ServerboundLoginPackets.CUSTOM_QUERY_ANSWER.getId()); // TODO ? // TODO Make sure this is called in other protocols as well/the base protocol registerServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_2.FINISH_CONFIGURATION.getId(), -1, wrapper -> { - wrapper.user().get(FakeProtocolState.class).setConfigurationState(false); - System.out.println("NOW PLAYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"); + wrapper.user().get(ConfigurationState.class).reset(); wrapper.cancel(); + System.out.println("CLIENT NOW ALSO ENTERING PLAY STATE"); }); + registerServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_2.CUSTOM_PAYLOAD.getId(), -1, wrapper -> { - if (wrapper.user().getProtocolInfo().getState() == State.PLAY) { - wrapper.setPacketType(ServerboundPackets1_19_4.PLUGIN_MESSAGE); - } else { - wrapper.user().get(FakeProtocolState.class).addPacketToQueue(wrapper, false); - wrapper.cancel(); - } + wrapper.setPacketType(ServerboundPackets1_20_2.PLUGIN_MESSAGE); + wrapper.user().get(ConfigurationState.class).addPacketToQueue(wrapper, false); }); registerServerbound(State.CONFIGURATION, ServerboundConfigurationPackets1_20_2.KEEP_ALIVE.getId(), ServerboundPackets1_19_4.KEEP_ALIVE.getId(), wrapper -> { }); @@ -125,13 +136,8 @@ public final class Protocol1_20_2To1_20 extends AbstractProtocol { }); - // Sad emoji - cancelClientbound(ClientboundPackets1_19_4.UPDATE_ENABLED_FEATURES); - - registerServerbound(ServerboundPackets1_20_2.CONFIGURATION_ACKNOWLEDGED, null, wrapper -> { - wrapper.user().get(FakeProtocolState.class).setConfigurationState(false); - wrapper.cancel(); - }); + cancelClientbound(ClientboundPackets1_19_4.UPDATE_ENABLED_FEATURES); // Sad emoji + cancelServerbound(ServerboundPackets1_20_2.CONFIGURATION_ACKNOWLEDGED); // TODO Check if we can just not send batches (probably fine like this) cancelServerbound(ServerboundPackets1_20_2.CHUNK_BATCH_RECEIVED); @@ -139,26 +145,31 @@ public final class Protocol1_20_2To1_20 extends AbstractProtocol packetQueue = new ArrayList<>(); - private boolean configurationState; - private boolean gameProfileSent; + private BridgePhase bridgePhase = BridgePhase.NONE; - public boolean isConfigurationState() { - return configurationState; + public BridgePhase bridgePhase() { + return bridgePhase; } - public void setConfigurationState(final boolean configurationState) { - this.configurationState = configurationState; + public void setBridgePhase(final BridgePhase bridgePhase) { + this.bridgePhase = bridgePhase; } - public void addPacketToQueue(final PacketWrapper wrapper, final boolean clientbound) { - packetQueue.add(new QueuedPacket(((PacketWrapperImpl) wrapper).getInputBuffer().copy(), clientbound)); // TODO + public void addPacketToQueue(final PacketWrapper wrapper, final boolean clientbound) throws Exception { + // Caching packet buffers is cursed, copy to heap buffers to make sure we don't start leaking in dumb cases + final ByteBuf copy = Unpooled.buffer(); + wrapper.writeToBuffer(copy); + packetQueue.add(new QueuedPacket(copy, clientbound, wrapper.getPacketType(), wrapper.getId())); } public List packetQueue() { return packetQueue; } - public boolean hasGameProfileBeenSent() { - return gameProfileSent; - } - - public void setGameProfileSent(final boolean gameProfileSent) { - this.gameProfileSent = gameProfileSent; + public void reset() { + packetQueue.clear(); + bridgePhase = BridgePhase.NONE; } @Override public boolean clearOnServerSwitch() { - return false; + return false; // This might be bad + } + + public enum BridgePhase { + NONE, PROFILE_SENT, CONFIGURATION } public static final class QueuedPacket { private final ByteBuf buf; private final boolean clientbound; + private final PacketType packetType; + private final int packetId; - private QueuedPacket(final ByteBuf buf, final boolean clientbound) { + private QueuedPacket(final ByteBuf buf, final boolean clientbound, final PacketType packetType, final int packetId) { this.buf = buf; this.clientbound = clientbound; + this.packetType = packetType; + this.packetId = packetId; } public ByteBuf buf() { @@ -76,5 +85,13 @@ public class FakeProtocolState implements StorableObject { public boolean clientbound() { return clientbound; } + + public int packetId() { + return packetId; + } + + public @Nullable PacketType packetType() { + return packetType; + } } }