Doesn't ping the server. Legacy forwarding
This commit is contained in:
parent
02940cc805
commit
4dfa9d02bd
|
|
@ -4,7 +4,7 @@ plugins {
|
|||
}
|
||||
|
||||
group 'org.adde0109'
|
||||
version '1.0.13-alpha'
|
||||
version '1.1.0-alpha'
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ import org.slf4j.Logger;
|
|||
|
||||
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 ProxyServer server;
|
||||
|
|
|
|||
|
|
@ -1,25 +1,25 @@
|
|||
package org.adde0109.ambassador.forge;
|
||||
|
||||
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.ServerPing;
|
||||
import com.velocitypowered.proxy.VelocityServer;
|
||||
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
||||
import com.velocitypowered.proxy.connection.backend.VelocityServerConnection;
|
||||
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.packet.LoginPluginMessage;
|
||||
import io.netty.buffer.ByteBuf;
|
||||
import io.netty.channel.Channel;
|
||||
import io.netty.channel.ChannelInitializer;
|
||||
import io.netty.util.ReferenceCountUtil;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.NamedTextColor;
|
||||
import org.adde0109.ambassador.velocity.VelocityForgeClientConnectionPhase;
|
||||
import org.adde0109.ambassador.velocity.VelocityLoginPayloadManager;
|
||||
import org.apache.commons.collections4.map.PassiveExpiringMap;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.Arrays;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
|
|
@ -33,25 +33,32 @@ public class FML2ClientConnectionPhase extends VelocityForgeClientConnectionPhas
|
|||
private RegisteredServer triedServer;
|
||||
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
|
||||
public void handleLogin(ConnectedPlayer player, VelocityServer server, Continuation continuation) {
|
||||
this.continuation = continuation;
|
||||
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());
|
||||
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
|
||||
|
|
@ -73,30 +80,13 @@ public class FML2ClientConnectionPhase extends VelocityForgeClientConnectionPhas
|
|||
if (triedServer != null)
|
||||
player.sendMessage(Component.translatable("velocity.error.connecting-server-error",
|
||||
Component.text(triedServer.getServerInfo().getName())));
|
||||
if (clientPhase == ClientPhase.MODLIST) {
|
||||
clientPhase = ClientPhase.MODDED;
|
||||
internalServerConnection = player.getConnectionInFlight();
|
||||
player.resetInFlightConnection();
|
||||
continuation.resume();
|
||||
}
|
||||
clientPhase = clientPhase == ClientPhase.MODLIST ? ClientPhase.MODDED : ClientPhase.VANILLA;
|
||||
internalServerConnection = player.getConnectionInFlight();
|
||||
player.resetInFlightConnection();
|
||||
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
|
||||
|
|
@ -120,15 +110,4 @@ public class FML2ClientConnectionPhase extends VelocityForgeClientConnectionPhas
|
|||
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();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,8 +30,9 @@ public class ForgeFMLConnectionType implements ConnectionType {
|
|||
@Override
|
||||
public GameProfile addGameProfileTokensIfRequired(GameProfile original, PlayerInfoForwarding forwardingType) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import com.velocitypowered.api.event.connection.PostLoginEvent;
|
|||
import com.velocitypowered.api.event.permission.PermissionsSetupEvent;
|
||||
import com.velocitypowered.api.event.player.KickedFromServerEvent;
|
||||
import com.velocitypowered.api.event.player.PlayerChooseInitialServerEvent;
|
||||
import com.velocitypowered.api.event.player.ServerPostConnectEvent;
|
||||
import com.velocitypowered.api.event.player.ServerPreConnectEvent;
|
||||
import com.velocitypowered.proxy.VelocityServer;
|
||||
import com.velocitypowered.proxy.connection.client.ConnectedPlayer;
|
||||
|
|
@ -44,7 +45,7 @@ public class VelocityEventHandler {
|
|||
continuation.resume();
|
||||
}
|
||||
|
||||
@Subscribe(order = PostOrder.FIRST)
|
||||
@Subscribe(order = PostOrder.LAST)
|
||||
public void onServerPreConnectEvent(ServerPreConnectEvent event, Continuation continuation) {
|
||||
ConnectedPlayer player = (ConnectedPlayer) event.getPlayer();
|
||||
if (!(player.getPhase() instanceof VelocityForgeClientConnectionPhase phase)) {
|
||||
|
|
@ -65,10 +66,22 @@ public class VelocityEventHandler {
|
|||
continuation.resume();
|
||||
return;
|
||||
}
|
||||
if (phase.forced != null)
|
||||
event.setInitialServer(phase.forced);
|
||||
if (event.getInitialServer().isEmpty())
|
||||
event.setInitialServer(phase.internalServerConnection.getServer());
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package org.adde0109.ambassador.velocity.backend;
|
||||
|
||||
import com.velocitypowered.proxy.VelocityServer;
|
||||
import com.velocitypowered.proxy.config.PlayerInfoForwarding;
|
||||
import com.velocitypowered.proxy.connection.ConnectionType;
|
||||
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
||||
import com.velocitypowered.proxy.connection.backend.VelocityServerConnection;
|
||||
|
|
@ -69,10 +70,12 @@ public class VelocityForgeBackendHandshakeHandler extends ChannelDuplexHandler {
|
|||
if (connection.getAssociation() instanceof VelocityServerConnection serverConnection) {
|
||||
if (serverConnection.getPlayer().getConnection().getType() instanceof ForgeFMLConnectionType type) {
|
||||
initBackend(connection,serverConnection,type);
|
||||
if (type == ForgeConstants.ForgeFML2) {
|
||||
handshake.setServerAddress(handshake.getServerAddress() + ForgeConstants.FML2Marker);
|
||||
} else if (type == ForgeConstants.ForgeFML3) {
|
||||
handshake.setServerAddress(handshake.getServerAddress() + ForgeConstants.FML3Marker);
|
||||
if (server.getConfiguration().getPlayerInfoForwardingMode() != PlayerInfoForwarding.LEGACY) {
|
||||
if (type == ForgeConstants.ForgeFML2) {
|
||||
handshake.setServerAddress(handshake.getServerAddress() + ForgeConstants.FML2Marker);
|
||||
} else if (type == ForgeConstants.ForgeFML3) {
|
||||
handshake.setServerAddress(handshake.getServerAddress() + ForgeConstants.FML3Marker);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ctx.pipeline().remove(this);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user