Doesn't ping the server. Legacy forwarding

This commit is contained in:
Adrian Bergqvist 2022-10-27 22:33:21 +02:00
parent 02940cc805
commit 4dfa9d02bd
No known key found for this signature in database
GPG Key ID: FAE7D8EDE225E686
6 changed files with 56 additions and 60 deletions

View File

@ -4,7 +4,7 @@ plugins {
} }
group 'org.adde0109' group 'org.adde0109'
version '1.0.13-alpha' version '1.1.0-alpha'
repositories { repositories {
maven { maven {

View File

@ -22,7 +22,7 @@ import org.slf4j.Logger;
import java.nio.file.Path; import java.nio.file.Path;
@Plugin(id = "ambassador", name = "Ambassador", version = "1.0.13-alpha", authors = {"adde0109"}) @Plugin(id = "ambassador", name = "Ambassador", version = "1.1.0-alpha", authors = {"adde0109"})
public class Ambassador { public class Ambassador {
public ProxyServer server; public ProxyServer server;

View File

@ -1,25 +1,25 @@
package org.adde0109.ambassador.forge; package org.adde0109.ambassador.forge;
import com.velocitypowered.api.event.Continuation; import com.velocitypowered.api.event.Continuation;
import com.velocitypowered.api.event.player.PlayerChooseInitialServerEvent;
import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.api.proxy.server.RegisteredServer;
import com.velocitypowered.api.proxy.server.ServerPing; import com.velocitypowered.api.proxy.server.ServerPing;
import com.velocitypowered.proxy.VelocityServer; import com.velocitypowered.proxy.VelocityServer;
import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.MinecraftConnection;
import com.velocitypowered.proxy.connection.backend.VelocityServerConnection; import com.velocitypowered.proxy.connection.backend.VelocityServerConnection;
import com.velocitypowered.proxy.connection.client.ConnectedPlayer; import com.velocitypowered.proxy.connection.client.ConnectedPlayer;
import com.velocitypowered.proxy.connection.client.LoginSessionHandler;
import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.ProtocolUtils;
import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.util.ReferenceCountUtil; import io.netty.util.ReferenceCountUtil;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import org.adde0109.ambassador.velocity.VelocityForgeClientConnectionPhase; import org.adde0109.ambassador.velocity.VelocityForgeClientConnectionPhase;
import org.adde0109.ambassador.velocity.VelocityLoginPayloadManager;
import org.apache.commons.collections4.map.PassiveExpiringMap; import org.apache.commons.collections4.map.PassiveExpiringMap;
import java.lang.reflect.Method;
import java.util.Arrays; import java.util.Arrays;
import java.util.Optional;
import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -33,25 +33,32 @@ public class FML2ClientConnectionPhase extends VelocityForgeClientConnectionPhas
private RegisteredServer triedServer; private RegisteredServer triedServer;
private Continuation continuation; private Continuation continuation;
private static final Method CONNECT_TO_INITIAL_SERVER;
static {
try {
CONNECT_TO_INITIAL_SERVER = LoginSessionHandler.class.getDeclaredMethod("connectToInitialServer", ConnectedPlayer.class);
CONNECT_TO_INITIAL_SERVER.setAccessible(true);
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
}
@Override @Override
public void handleLogin(ConnectedPlayer player, VelocityServer server, Continuation continuation) { public void handleLogin(ConnectedPlayer player, VelocityServer server, Continuation continuation) {
this.continuation = continuation; this.continuation = continuation;
final MinecraftConnection connection = player.getConnection(); final MinecraftConnection connection = player.getConnection();
final Runnable defaultTask = () -> {
Optional<RegisteredServer> initialFromConfig = player.getNextServerToTry();
PlayerChooseInitialServerEvent event = new PlayerChooseInitialServerEvent(player,
initialFromConfig.orElse(null));
server.getEventManager().fire(event)
.thenRun(() -> {
Optional<RegisteredServer> toTry = event.getInitialServer();
tryServer(player, toTry.orElse(null));
});
};
forced = TEMPORARY_FORCED.remove(player.getUsername()); forced = TEMPORARY_FORCED.remove(player.getUsername());
connection.eventLoop().submit(defaultTask); if (forced != null) {
player.createConnectionRequest(forced).fireAndForget();
} else {
try {
CONNECT_TO_INITIAL_SERVER.invoke(player.getConnection().getSessionHandler(),player);
} catch (ReflectiveOperationException e) {
continuation.resumeWithException(e);
}
}
} }
@Override @Override
@ -73,30 +80,13 @@ public class FML2ClientConnectionPhase extends VelocityForgeClientConnectionPhas
if (triedServer != null) if (triedServer != null)
player.sendMessage(Component.translatable("velocity.error.connecting-server-error", player.sendMessage(Component.translatable("velocity.error.connecting-server-error",
Component.text(triedServer.getServerInfo().getName()))); Component.text(triedServer.getServerInfo().getName())));
if (clientPhase == ClientPhase.MODLIST) { clientPhase = clientPhase == ClientPhase.MODLIST ? ClientPhase.MODDED : ClientPhase.VANILLA;
clientPhase = ClientPhase.MODDED; internalServerConnection = player.getConnectionInFlight();
internalServerConnection = player.getConnectionInFlight(); player.resetInFlightConnection();
player.resetInFlightConnection(); continuation.resume();
continuation.resume();
}
} }
private void tryServer(ConnectedPlayer player, RegisteredServer server) {
if (server == null) {
player.disconnect0(Component.translatable("velocity.error.no-available-servers",
NamedTextColor.RED), true);
return;
}
server.ping().whenCompleteAsync((msg,ex) -> {
if (ex != null) {
if (throwable == null)
throwable = ex;
tryServer(player, player.getNextServerToTry().orElse(null));
} else {
handlePingResponse(player, server, msg);
}
}, player.getConnection().eventLoop());
}
@Override @Override
@ -120,15 +110,4 @@ public class FML2ClientConnectionPhase extends VelocityForgeClientConnectionPhas
ReferenceCountUtil.release(buf); ReferenceCountUtil.release(buf);
} }
} }
private void handlePingResponse(ConnectedPlayer player, RegisteredServer server, ServerPing ping) {
if (ping.getModinfo().isEmpty()) {
clientPhase = ClientPhase.VANILLA;
continuation.resume();
} else {
player.createConnectionRequest(server).fireAndForget();
}
}
} }

View File

@ -30,8 +30,9 @@ public class ForgeFMLConnectionType implements ConnectionType {
@Override @Override
public GameProfile addGameProfileTokensIfRequired(GameProfile original, PlayerInfoForwarding forwardingType) { public GameProfile addGameProfileTokensIfRequired(GameProfile original, PlayerInfoForwarding forwardingType) {
if (forwardingType == PlayerInfoForwarding.LEGACY) { if (forwardingType == PlayerInfoForwarding.LEGACY) {
original.addProperties(Collections.singleton(new GameProfile.Property("extraData", "\1FML" + netVersion + "\1", ""))); return original.addProperties(Collections.singleton(new GameProfile.Property("extraData", "\1FML" + netVersion + "\1", "")));
} else {
return original;
} }
return original;
} }
} }

View File

@ -9,6 +9,7 @@ import com.velocitypowered.api.event.connection.PostLoginEvent;
import com.velocitypowered.api.event.permission.PermissionsSetupEvent; import com.velocitypowered.api.event.permission.PermissionsSetupEvent;
import com.velocitypowered.api.event.player.KickedFromServerEvent; import com.velocitypowered.api.event.player.KickedFromServerEvent;
import com.velocitypowered.api.event.player.PlayerChooseInitialServerEvent; import com.velocitypowered.api.event.player.PlayerChooseInitialServerEvent;
import com.velocitypowered.api.event.player.ServerPostConnectEvent;
import com.velocitypowered.api.event.player.ServerPreConnectEvent; import com.velocitypowered.api.event.player.ServerPreConnectEvent;
import com.velocitypowered.proxy.VelocityServer; import com.velocitypowered.proxy.VelocityServer;
import com.velocitypowered.proxy.connection.client.ConnectedPlayer; import com.velocitypowered.proxy.connection.client.ConnectedPlayer;
@ -44,7 +45,7 @@ public class VelocityEventHandler {
continuation.resume(); continuation.resume();
} }
@Subscribe(order = PostOrder.FIRST) @Subscribe(order = PostOrder.LAST)
public void onServerPreConnectEvent(ServerPreConnectEvent event, Continuation continuation) { public void onServerPreConnectEvent(ServerPreConnectEvent event, Continuation continuation) {
ConnectedPlayer player = (ConnectedPlayer) event.getPlayer(); ConnectedPlayer player = (ConnectedPlayer) event.getPlayer();
if (!(player.getPhase() instanceof VelocityForgeClientConnectionPhase phase)) { if (!(player.getPhase() instanceof VelocityForgeClientConnectionPhase phase)) {
@ -65,10 +66,22 @@ public class VelocityEventHandler {
continuation.resume(); continuation.resume();
return; return;
} }
if (phase.forced != null)
event.setInitialServer(phase.forced);
if (event.getInitialServer().isEmpty()) if (event.getInitialServer().isEmpty())
event.setInitialServer(phase.internalServerConnection.getServer()); event.setInitialServer(phase.internalServerConnection.getServer());
continuation.resume(); continuation.resume();
} }
@Subscribe(order = PostOrder.LAST)
public void onServerPostConnectEvent(ServerPostConnectEvent event, Continuation continuation) {
ConnectedPlayer player = (ConnectedPlayer) event.getPlayer();
if (!(player.getPhase() instanceof VelocityForgeClientConnectionPhase phase)) {
continuation.resume();
return;
}
if (phase.internalServerConnection != null) {
player.setConnectedServer(null);
}
continuation.resume();
}
} }

View File

@ -1,6 +1,7 @@
package org.adde0109.ambassador.velocity.backend; package org.adde0109.ambassador.velocity.backend;
import com.velocitypowered.proxy.VelocityServer; import com.velocitypowered.proxy.VelocityServer;
import com.velocitypowered.proxy.config.PlayerInfoForwarding;
import com.velocitypowered.proxy.connection.ConnectionType; import com.velocitypowered.proxy.connection.ConnectionType;
import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.MinecraftConnection;
import com.velocitypowered.proxy.connection.backend.VelocityServerConnection; import com.velocitypowered.proxy.connection.backend.VelocityServerConnection;
@ -69,10 +70,12 @@ public class VelocityForgeBackendHandshakeHandler extends ChannelDuplexHandler {
if (connection.getAssociation() instanceof VelocityServerConnection serverConnection) { if (connection.getAssociation() instanceof VelocityServerConnection serverConnection) {
if (serverConnection.getPlayer().getConnection().getType() instanceof ForgeFMLConnectionType type) { if (serverConnection.getPlayer().getConnection().getType() instanceof ForgeFMLConnectionType type) {
initBackend(connection,serverConnection,type); initBackend(connection,serverConnection,type);
if (type == ForgeConstants.ForgeFML2) { if (server.getConfiguration().getPlayerInfoForwardingMode() != PlayerInfoForwarding.LEGACY) {
handshake.setServerAddress(handshake.getServerAddress() + ForgeConstants.FML2Marker); if (type == ForgeConstants.ForgeFML2) {
} else if (type == ForgeConstants.ForgeFML3) { handshake.setServerAddress(handshake.getServerAddress() + ForgeConstants.FML2Marker);
handshake.setServerAddress(handshake.getServerAddress() + ForgeConstants.FML3Marker); } else if (type == ForgeConstants.ForgeFML3) {
handshake.setServerAddress(handshake.getServerAddress() + ForgeConstants.FML3Marker);
}
} }
} else { } else {
ctx.pipeline().remove(this); ctx.pipeline().remove(this);