From cd8df2c5a0a67a2522cc9b73da10d2cb65af515a Mon Sep 17 00:00:00 2001 From: Adrian Bergqvist Date: Tue, 30 May 2023 19:52:41 +0200 Subject: [PATCH] CRPM detection --- build.gradle.kts | 2 +- .../org/adde0109/ambassador/Ambassador.java | 2 +- .../VelocityForgeClientConnectionPhase.java | 17 +++++++++++++---- .../packet/GenericForgeLoginWrapperPacket.java | 3 ++- .../forge/packet/IForgeLoginWrapperPacket.java | 2 ++ .../forge/packet/ModListReplyPacket.java | 13 ++++++++++--- .../backend/ForgeLoginSessionHandler.java | 8 +------- 7 files changed, 30 insertions(+), 17 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 15657ed..734602b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "org.adde0109" -version = "1.4.0-beta-rc2" +version = "1.4.0-beta-rc4" repositories { mavenCentral() diff --git a/src/main/java/org/adde0109/ambassador/Ambassador.java b/src/main/java/org/adde0109/ambassador/Ambassador.java index 486919e..3def4c1 100644 --- a/src/main/java/org/adde0109/ambassador/Ambassador.java +++ b/src/main/java/org/adde0109/ambassador/Ambassador.java @@ -40,7 +40,7 @@ import static com.velocitypowered.api.network.ProtocolVersion.MINECRAFT_1_19; import static com.velocitypowered.api.network.ProtocolVersion.MINECRAFT_1_19_3; import static com.velocitypowered.proxy.protocol.packet.brigadier.ArgumentIdentifier.mapSet; -@Plugin(id = "ambassador", name = "Ambassador", version = "1.4.0-beta-rc1", authors = {"adde0109"}) +@Plugin(id = "ambassador", name = "Ambassador", version = "1.4.0-beta-rc4", authors = {"adde0109"}) public class Ambassador { public ProxyServer server; diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java index 66bb7e8..0ca9c3c 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java @@ -33,6 +33,11 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase VelocityForgeClientConnectionPhase nextPhase() { return IN_PROGRESS; } + + @Override + public void resetConnectionPhase(ConnectedPlayer player) { + RESETTABLE.resetConnectionPhase(player); + } }, IN_PROGRESS { }, @@ -58,9 +63,8 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase if (connection.getState() == StateRegistry.PLAY) { connection.write(new PluginMessage("fml:handshake", Unpooled.wrappedBuffer(ForgeHandshakeUtils.generatePluginResetPacket()))); - connection.setState(StateRegistry.LOGIN); } else { - connection.write(new LoginPluginMessage(98,"fml:handshake", Unpooled.wrappedBuffer(ForgeHandshakeUtils.generateResetPacket()))); + connection.write(new LoginPluginMessage(98,"fml:loginwrapper", Unpooled.wrappedBuffer(ForgeHandshakeUtils.generateResetPacket()))); } //Prepare to receive reset ACK @@ -94,12 +98,13 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase if (msg.getId() == 98) { player.getConnection().getChannel().pipeline().remove(ForgeConstants.RESET_LISTENER); player.setPhase(NOT_STARTED); + player.getConnection().setState(StateRegistry.LOGIN); player.getConnection().getChannel().pipeline().remove(ForgeConstants.LOGIN_PACKET_QUEUE); if (!(server.getConnection().getType() instanceof ForgeFMLConnectionType)) { // -> vanilla - complete(player); + complete(player, msg.getSuccess()); player.getConnectionInFlight().getConnection().getChannel().config().setAutoRead(true); } @@ -173,12 +178,16 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase } public void complete(ConnectedPlayer player) { + complete(player, isResettable(player)); + } + + public void complete(ConnectedPlayer player, boolean resettable) { MinecraftConnection connection = player.getConnection(); ((OutboundSuccessHolder) connection.getChannel().pipeline().get(ForgeConstants.SERVER_SUCCESS_LISTENER)) .sendPacket(); connection.setState(StateRegistry.PLAY); - if (isResettable(player)) { + if (resettable) { player.setPhase(RESETTABLE); RESETTABLE.onTransitionToNewPhase(player); RESETTABLE.clientModList = clientModList; diff --git a/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java b/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java index b979677..61b5319 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java @@ -24,7 +24,8 @@ public class GenericForgeLoginWrapperPacket extends DeferredByteBufHolder implem return id; } - public boolean success() { + @Override + public boolean getSuccess() { return success; } } diff --git a/src/main/java/org/adde0109/ambassador/forge/packet/IForgeLoginWrapperPacket.java b/src/main/java/org/adde0109/ambassador/forge/packet/IForgeLoginWrapperPacket.java index 22ac150..4326477 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/IForgeLoginWrapperPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/IForgeLoginWrapperPacket.java @@ -5,4 +5,6 @@ import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; public interface IForgeLoginWrapperPacket { public LoginPluginResponse encode(); public int getId(); + + public boolean getSuccess(); } diff --git a/src/main/java/org/adde0109/ambassador/forge/packet/ModListReplyPacket.java b/src/main/java/org/adde0109/ambassador/forge/packet/ModListReplyPacket.java index 2d14eb3..7f94105 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/ModListReplyPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/ModListReplyPacket.java @@ -2,7 +2,6 @@ package org.adde0109.ambassador.forge.packet; import com.velocitypowered.api.proxy.messages.ChannelIdentifier; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; -import com.velocitypowered.api.util.ModInfo; import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; import io.netty.buffer.ByteBuf; @@ -21,12 +20,15 @@ public class ModListReplyPacket implements IForgeLoginWrapperPacket { private final int id; + private final boolean success; + private ModListReplyPacket(List mods, Map channels, Map registries, int id) { + String> channels, Map registries, int id, boolean success) { this.mods = mods; this.channels = channels; this.registries = registries; this.id = id; + this.success = success; } public static ModListReplyPacket read(LoginPluginResponse msg) { @@ -48,7 +50,7 @@ public class ModListReplyPacket implements IForgeLoginWrapperPacket { for (int x = 0; x < len; x++) registries.put(ProtocolUtils.readString(input, 32767), ProtocolUtils.readString(input, 0x100)); - return new ModListReplyPacket(mods, channels, registries, msg.getId()); + return new ModListReplyPacket(mods, channels, registries, msg.getId(), true); } @Override @@ -85,6 +87,11 @@ public class ModListReplyPacket implements IForgeLoginWrapperPacket { return id; } + @Override + public boolean getSuccess() { + return success; + } + public List getMods() { return mods; } diff --git a/src/main/java/org/adde0109/ambassador/velocity/backend/ForgeLoginSessionHandler.java b/src/main/java/org/adde0109/ambassador/velocity/backend/ForgeLoginSessionHandler.java index 529e1c3..8ee3e59 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/backend/ForgeLoginSessionHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/backend/ForgeLoginSessionHandler.java @@ -10,6 +10,7 @@ import com.velocitypowered.proxy.protocol.packet.Disconnect; import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; import com.velocitypowered.proxy.protocol.packet.ServerLoginSuccess; import com.velocitypowered.proxy.util.except.QuietRuntimeException; +import io.netty.buffer.Unpooled; import org.adde0109.ambassador.forge.*; public class ForgeLoginSessionHandler implements MinecraftSessionHandler { @@ -48,17 +49,10 @@ public class ForgeLoginSessionHandler implements MinecraftSessionHandler { } ConnectedPlayer player = serverConnection.getPlayer(); if (!(serverConnection.getConnection().getType() instanceof ForgeFMLConnectionType)) { - if (player.getConnectedServer() == null) { //Initial Vanilla - //Send empty mod list in order to get client mod list - //((VelocityForgeClientConnectionPhase) player.getPhase()).sendVanillaModlist(player); - //player.getConnectionInFlight().getConnection().getChannel().config().setAutoRead(false); - ((VelocityForgeClientConnectionPhase) player.getPhase()).complete(player); - } else if (player.getConnectedServer().getConnection().getType() instanceof ForgeFMLConnectionType) { //Forge -> vanilla player.getPhase().resetConnectionPhase(player); player.getConnectionInFlight().getConnection().getChannel().config().setAutoRead(false); - } } else { ((VelocityForgeClientConnectionPhase) player.getPhase()).complete(player); }