From fcb2491c669b561ff544d6c49eb8d3362f06eb19 Mon Sep 17 00:00:00 2001 From: Adrian Bergqvist Date: Wed, 14 Sep 2022 22:47:11 +0200 Subject: [PATCH] WIP: Packet Handling --- .../forge/ForgeFML2ClientConnectionPhase.java | 20 +++++++++++++++++-- .../forge/ForgeHandshakeHandler.java | 9 +++++++-- .../VelocityForgeClientConnectionPhase.java | 10 ++++++++-- .../VelocityForgeHandshakeSessionHandler.java | 13 +++++++++++- 4 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeFML2ClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/ForgeFML2ClientConnectionPhase.java index 0ec1a08..538e272 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeFML2ClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeFML2ClientConnectionPhase.java @@ -4,19 +4,24 @@ import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.client.ClientConnectionPhase; import com.velocitypowered.proxy.connection.client.ConnectedPlayer; import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; +import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; +import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import org.adde0109.ambassador.velocity.VelocityForgeClientConnectionPhase; import org.adde0109.ambassador.velocity.VelocityForgeHandshakeSessionHandler; +import javax.annotation.Nullable; + public class ForgeFML2ClientConnectionPhase implements VelocityForgeClientConnectionPhase { private final MinecraftConnection connection; + private boolean isResettable; + private ByteBuf modListData; ForgeFML2ClientConnectionPhase(MinecraftConnection connection) { this.connection = connection; } @Override - public void handleLogin(ForgeHandshakeUtils.CachedServerHandshake handshake) { - this.connection.setSessionHandler(new VelocityForgeHandshakeSessionHandler()); + public void handleLogin(@Nullable ForgeHandshakeUtils.CachedServerHandshake handshake) { if(handshake == null) { this.connection.write(new LoginPluginMessage(98,"fml:loginwrapper", Unpooled.wrappedBuffer(ForgeHandshakeUtils.generateResetPacket()))); } else { @@ -24,7 +29,18 @@ public class ForgeFML2ClientConnectionPhase implements VelocityForgeClientConnec for (int i = 0;i phase.handleLogin(msg)); + getInitialHandshake(player).whenCompleteAsync((msg,ex) -> { + if (ex != null) { + ambassador.logger.warn("Forge player, " + player.getUsername() + ", is entering vanilla-mode because of: " + ex.getMessage()); + } + phase.handleLogin(msg); + }, player.getConnection().eventLoop()); } private CompletableFuture getInitialHandshake(ConnectedPlayer player) { @@ -47,7 +52,7 @@ public class ForgeHandshakeHandler { if((initialServer = ambassador.config.getServer(player.getConnection().getProtocolVersion().getProtocol())) != null) { future = ForgeHandshakeUtils.HandshakeReceiver.downloadHandshake(initialServer); } else { - future = CompletableFuture.failedFuture(new Exception("No initial server specified")); + future = CompletableFuture.failedFuture(new Exception("No initial server is specified")); } return future; } diff --git a/src/main/java/org/adde0109/ambassador/velocity/VelocityForgeClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/velocity/VelocityForgeClientConnectionPhase.java index 8ad5430..9d592ab 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/VelocityForgeClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/velocity/VelocityForgeClientConnectionPhase.java @@ -1,10 +1,16 @@ package org.adde0109.ambassador.velocity; +import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.client.ClientConnectionPhase; +import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; import org.adde0109.ambassador.forge.ForgeHandshakeUtils; -public interface VelocityForgeClientConnectionPhase extends ClientConnectionPhase { - default void handleLogin(ForgeHandshakeUtils.CachedServerHandshake handshake) { +import javax.annotation.Nullable; +public interface VelocityForgeClientConnectionPhase extends ClientConnectionPhase { + + default void handleLogin(@Nullable ForgeHandshakeUtils.CachedServerHandshake initialHandshake) { + } + default void handle(LoginPluginResponse packet) { } } diff --git a/src/main/java/org/adde0109/ambassador/velocity/VelocityForgeHandshakeSessionHandler.java b/src/main/java/org/adde0109/ambassador/velocity/VelocityForgeHandshakeSessionHandler.java index 58dded4..48653cf 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/VelocityForgeHandshakeSessionHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/VelocityForgeHandshakeSessionHandler.java @@ -1,11 +1,22 @@ package org.adde0109.ambassador.velocity; import com.velocitypowered.proxy.connection.MinecraftSessionHandler; +import com.velocitypowered.proxy.connection.client.ClientConnectionPhase; import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; public class VelocityForgeHandshakeSessionHandler implements MinecraftSessionHandler { + + private final VelocityForgeClientConnectionPhase phase; + public VelocityForgeHandshakeSessionHandler(VelocityForgeClientConnectionPhase phase) { + this.phase = phase; + } + @Override public boolean handle(LoginPluginResponse packet) { - return true; + //TODO: Check if we sent it + if (packet.getId() == 1 && packet.getId() == 98) { + phase.handle(packet); + } + return true; } }