diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/ForgeClientConnectionPhase.java new file mode 100644 index 0000000..f1f0e06 --- /dev/null +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeClientConnectionPhase.java @@ -0,0 +1,13 @@ +package org.adde0109.ambassador.forge; + +import com.velocitypowered.proxy.connection.backend.VelocityServerConnection; +import com.velocitypowered.proxy.connection.client.ClientConnectionPhase; +import com.velocitypowered.proxy.connection.client.ConnectedPlayer; +import com.velocitypowered.proxy.protocol.packet.PluginMessage; + +public class ForgeClientConnectionPhase implements ClientConnectionPhase { + + public void handleLogin() { + + } +} diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeConnectionType.java b/src/main/java/org/adde0109/ambassador/forge/ForgeConnectionType.java new file mode 100644 index 0000000..efecbce --- /dev/null +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeConnectionType.java @@ -0,0 +1,24 @@ +package org.adde0109.ambassador.forge; + +import com.velocitypowered.api.util.GameProfile; +import com.velocitypowered.proxy.config.PlayerInfoForwarding; +import com.velocitypowered.proxy.connection.ConnectionType; +import com.velocitypowered.proxy.connection.backend.BackendConnectionPhase; +import com.velocitypowered.proxy.connection.client.ClientConnectionPhase; + +public class ForgeConnectionType implements ConnectionType { + @Override + public ClientConnectionPhase getInitialClientPhase() { + return new ForgeClientConnectionPhase(); + } + + @Override + public BackendConnectionPhase getInitialBackendPhase() { + return null; + } + + @Override + public GameProfile addGameProfileTokensIfRequired(GameProfile original, PlayerInfoForwarding forwardingType) { + return original; + } +} diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeHandler.java b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeHandler.java index 18eddc4..07b62dc 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeHandler.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeHandler.java @@ -4,8 +4,10 @@ import com.velocitypowered.api.event.Continuation; import com.velocitypowered.api.event.PostOrder; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.connection.PreLoginEvent; +import com.velocitypowered.api.event.permission.PermissionsSetupEvent; import com.velocitypowered.api.event.player.KickedFromServerEvent; import com.velocitypowered.api.event.player.ServerLoginPluginMessageEvent; +import com.velocitypowered.api.network.ProtocolVersion; import com.velocitypowered.api.proxy.LoginPhaseConnection; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.messages.ChannelIdentifier; @@ -15,10 +17,18 @@ import java.net.InetSocketAddress; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +import com.velocitypowered.proxy.connection.ConnectionType; +import com.velocitypowered.proxy.connection.ConnectionTypes; +import com.velocitypowered.proxy.connection.MinecraftConnection; +import com.velocitypowered.proxy.connection.client.ConnectedPlayer; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TranslatableComponent; import net.kyori.adventure.text.format.NamedTextColor; import org.adde0109.ambassador.Ambassador; +import org.checkerframework.checker.units.qual.A; public class ForgeHandshakeHandler { @@ -37,37 +47,45 @@ public class ForgeHandshakeHandler { @Subscribe(order = PostOrder.LAST) public void onPreLoginEvent(PreLoginEvent event, Continuation continuation) { - if (!ambassador.config.shouldHandle(event.getConnection().getProtocolVersion().getProtocol()) || !event.getResult().isAllowed()) { + if (event.getConnection().getProtocolVersion().compareTo(ProtocolVersion.MINECRAFT_1_13) < 0) { continuation.resume(); return; } - RegisteredServer defaultServer = ambassador.config.getServer(event.getConnection().getProtocolVersion().getProtocol()); - ForgeConnection forgeConnection = new ForgeConnection((LoginPhaseConnection) event.getConnection(), ambassador.logger); - forgeConnection.testIfForge((LoginPhaseConnection) event.getConnection()) - .thenAccept((isForge) -> { - if (isForge) - registerForgeConnection(forgeConnection); - }); - - if (ambassador.forgeServerSwitchHandler.reSyncMap.containsKey(event.getUsername())) { - forgeConnection.sync(ambassador.forgeServerSwitchHandler.reSyncMap.remove(event.getUsername())).thenAccept((done) -> { - continuation.resume(); - }); - forgeConnection.setForced(true); - } else if (defaultServer != null) { - //If a connection does not already exist, create one. - if (!forgeServerConnectionMap.containsKey(defaultServer)) { - forgeServerConnectionMap.put(defaultServer, new ForgeServerConnection(defaultServer)); - } - //Forge Handshake - forgeConnection.sync(forgeServerConnectionMap.get(defaultServer)).thenAccept((done) -> { - continuation.resume(); - }); - forgeConnection.setForced(ambassador.config.getForced(forgeConnection.getConnection().getProtocolVersion().getProtocol())); - } else { + MinecraftConnection connection = (MinecraftConnection)event.getConnection(); + ((LoginPhaseConnection) event.getConnection()).sendLoginPluginMessage( + MinecraftChannelIdentifier.create("fml","loginwrapper"), + ForgeHandshakeUtils.generateTestPacket(),(msg) -> { + if (connection.getType() == ConnectionTypes.VANILLA) { + if (msg != null) { + connection.setType(new ForgeConnectionType()); + } + } + }); + //SEND ===CLIENT MODLIST REQUEST=== + ((LoginPhaseConnection) event.getConnection()).sendLoginPluginMessage( + MinecraftChannelIdentifier.create("fml","loginwrapper"), + ForgeHandshakeUtils.generateTestPacket(),(msg) -> { + if (msg != null) { + connection.setType(new ForgeConnectionType()); + //Handle the response + } + }); + continuation.resume(); + } + @Subscribe + public void onPermissionsSetupEvent(PermissionsSetupEvent event, Continuation continuation) { + //Filters... + if (!(event.getSubject() instanceof ConnectedPlayer)) { continuation.resume(); + return; } + ConnectedPlayer player = ((ConnectedPlayer) event.getSubject()); + if (!(player.getConnection().getType() instanceof ForgeConnectionType)) { + continuation.resume(); + return; + } + ((ForgeClientConnectionPhase) player.getPhase()).handleLogin(); } private void registerForgeConnection(ForgeConnection forgeConnection) { diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeSessionHandler.java b/src/main/java/org/adde0109/ambassador/forge/ForgeSessionHandler.java new file mode 100644 index 0000000..e904ec1 --- /dev/null +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeSessionHandler.java @@ -0,0 +1,32 @@ +package org.adde0109.ambassador.forge; + +import com.velocitypowered.proxy.connection.MinecraftConnection; +import com.velocitypowered.proxy.connection.MinecraftSessionHandler; +import com.velocitypowered.proxy.protocol.MinecraftPacket; +import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; +import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; +import io.netty.buffer.Unpooled; + +public class ForgeSessionHandler implements MinecraftSessionHandler { + private final MinecraftSessionHandler delegate; + private final MinecraftConnection connection; + + public ForgeSessionHandler(MinecraftSessionHandler delegate, MinecraftConnection connection) { + this.delegate = delegate; + this.connection = connection; + } + + @Override + public void handleGeneric(MinecraftPacket packet) { + packet.handle(delegate); + } + + @Override + public void activated() { + } + + @Override + public boolean handle(LoginPluginResponse packet) { + //DETECT FML or PCF + return false; +}