Mirror von
https://github.com/PaperMC/Velocity.git
synchronisiert 2024-11-17 05:20:14 +01:00
fix missing server info in some events when kicked from current server (#703)
Dieser Commit ist enthalten in:
Ursprung
aa38d3e561
Commit
3ae93875b8
@ -13,6 +13,7 @@ import com.velocitypowered.api.event.annotation.AwaitingEvent;
|
|||||||
import com.velocitypowered.api.proxy.ConnectionRequestBuilder;
|
import com.velocitypowered.api.proxy.ConnectionRequestBuilder;
|
||||||
import com.velocitypowered.api.proxy.ConnectionRequestBuilder.Status;
|
import com.velocitypowered.api.proxy.ConnectionRequestBuilder.Status;
|
||||||
import com.velocitypowered.api.proxy.Player;
|
import com.velocitypowered.api.proxy.Player;
|
||||||
|
import com.velocitypowered.api.proxy.ServerConnection;
|
||||||
import com.velocitypowered.api.proxy.server.RegisteredServer;
|
import com.velocitypowered.api.proxy.server.RegisteredServer;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import org.checkerframework.checker.nullness.qual.Nullable;
|
import org.checkerframework.checker.nullness.qual.Nullable;
|
||||||
@ -27,6 +28,7 @@ public final class ServerPreConnectEvent implements
|
|||||||
|
|
||||||
private final Player player;
|
private final Player player;
|
||||||
private final RegisteredServer originalServer;
|
private final RegisteredServer originalServer;
|
||||||
|
private final RegisteredServer previousServer;
|
||||||
private ServerResult result;
|
private ServerResult result;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -35,8 +37,21 @@ public final class ServerPreConnectEvent implements
|
|||||||
* @param originalServer the server the player was trying to connect to
|
* @param originalServer the server the player was trying to connect to
|
||||||
*/
|
*/
|
||||||
public ServerPreConnectEvent(Player player, RegisteredServer originalServer) {
|
public ServerPreConnectEvent(Player player, RegisteredServer originalServer) {
|
||||||
|
this(player, originalServer,
|
||||||
|
player.getCurrentServer().map(ServerConnection::getServer).orElse(null));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates the ServerPreConnectEvent.
|
||||||
|
* @param player the player who is connecting to a server
|
||||||
|
* @param originalServer the server the player was trying to connect to
|
||||||
|
* @param previousServer the server the player ís connected to
|
||||||
|
*/
|
||||||
|
public ServerPreConnectEvent(Player player, RegisteredServer originalServer,
|
||||||
|
@Nullable RegisteredServer previousServer) {
|
||||||
this.player = Preconditions.checkNotNull(player, "player");
|
this.player = Preconditions.checkNotNull(player, "player");
|
||||||
this.originalServer = Preconditions.checkNotNull(originalServer, "originalServer");
|
this.originalServer = Preconditions.checkNotNull(originalServer, "originalServer");
|
||||||
|
this.previousServer = previousServer;
|
||||||
this.result = ServerResult.allowed(originalServer);
|
this.result = ServerResult.allowed(originalServer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,13 +76,24 @@ public final class ServerPreConnectEvent implements
|
|||||||
/**
|
/**
|
||||||
* Returns the server that the player originally tried to connect to. To get the server the
|
* Returns the server that the player originally tried to connect to. To get the server the
|
||||||
* player will connect to, see the {@link ServerResult} of this event. To get the server the
|
* player will connect to, see the {@link ServerResult} of this event. To get the server the
|
||||||
* player is currently on when this event is fired, use {@link Player#getCurrentServer()}.
|
* player is currently on when this event is fired, use {@link #getPreviousServer()}.
|
||||||
* @return the server that the player originally tried to connect to
|
* @return the server that the player originally tried to connect to
|
||||||
*/
|
*/
|
||||||
public RegisteredServer getOriginalServer() {
|
public RegisteredServer getOriginalServer() {
|
||||||
return originalServer;
|
return originalServer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the server that the player is currently connected to. Prefer this method over using
|
||||||
|
* {@link Player#getCurrentServer()} as the current server might get reset after server kicks to
|
||||||
|
* prevent connection issues. This is {@code null} if they were not connected to another server
|
||||||
|
* beforehand (for instance, if the player has just joined the proxy).
|
||||||
|
* @return the server the player is currently connected to.
|
||||||
|
*/
|
||||||
|
public @Nullable RegisteredServer getPreviousServer() {
|
||||||
|
return previousServer;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "ServerPreConnectEvent{"
|
return "ServerPreConnectEvent{"
|
||||||
|
@ -11,6 +11,7 @@ import com.velocitypowered.api.proxy.messages.ChannelMessageSink;
|
|||||||
import com.velocitypowered.api.proxy.messages.ChannelMessageSource;
|
import com.velocitypowered.api.proxy.messages.ChannelMessageSource;
|
||||||
import com.velocitypowered.api.proxy.server.RegisteredServer;
|
import com.velocitypowered.api.proxy.server.RegisteredServer;
|
||||||
import com.velocitypowered.api.proxy.server.ServerInfo;
|
import com.velocitypowered.api.proxy.server.ServerInfo;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a connection to a backend server from the proxy for a client.
|
* Represents a connection to a backend server from the proxy for a client.
|
||||||
@ -24,6 +25,14 @@ public interface ServerConnection extends ChannelMessageSource, ChannelMessageSi
|
|||||||
*/
|
*/
|
||||||
RegisteredServer getServer();
|
RegisteredServer getServer();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the server that the player associated with this connection was connected to before
|
||||||
|
* switching to this connection.
|
||||||
|
*
|
||||||
|
* @return the server the player was connected to.
|
||||||
|
*/
|
||||||
|
Optional<RegisteredServer> getPreviousServer();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the server info for this connection.
|
* Returns the server info for this connection.
|
||||||
*
|
*
|
||||||
|
@ -22,6 +22,7 @@ import static com.velocitypowered.proxy.connection.forge.legacy.LegacyForgeHands
|
|||||||
|
|
||||||
import com.velocitypowered.api.event.player.ServerConnectedEvent;
|
import com.velocitypowered.api.event.player.ServerConnectedEvent;
|
||||||
import com.velocitypowered.api.event.player.ServerPostConnectEvent;
|
import com.velocitypowered.api.event.player.ServerPostConnectEvent;
|
||||||
|
import com.velocitypowered.api.proxy.server.RegisteredServer;
|
||||||
import com.velocitypowered.proxy.VelocityServer;
|
import com.velocitypowered.proxy.VelocityServer;
|
||||||
import com.velocitypowered.proxy.connection.ConnectionTypes;
|
import com.velocitypowered.proxy.connection.ConnectionTypes;
|
||||||
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
import com.velocitypowered.proxy.connection.MinecraftConnection;
|
||||||
@ -88,6 +89,7 @@ public class TransitionSessionHandler implements MinecraftSessionHandler {
|
|||||||
@Override
|
@Override
|
||||||
public boolean handle(JoinGame packet) {
|
public boolean handle(JoinGame packet) {
|
||||||
MinecraftConnection smc = serverConn.ensureConnected();
|
MinecraftConnection smc = serverConn.ensureConnected();
|
||||||
|
RegisteredServer previousServer = serverConn.getPreviousServer().orElse(null);
|
||||||
VelocityServerConnection existingConnection = serverConn.getPlayer().getConnectedServer();
|
VelocityServerConnection existingConnection = serverConn.getPlayer().getConnectedServer();
|
||||||
|
|
||||||
final ConnectedPlayer player = serverConn.getPlayer();
|
final ConnectedPlayer player = serverConn.getPlayer();
|
||||||
@ -104,8 +106,7 @@ public class TransitionSessionHandler implements MinecraftSessionHandler {
|
|||||||
// The goods are in hand! We got JoinGame. Let's transition completely to the new state.
|
// The goods are in hand! We got JoinGame. Let's transition completely to the new state.
|
||||||
smc.setAutoReading(false);
|
smc.setAutoReading(false);
|
||||||
server.getEventManager()
|
server.getEventManager()
|
||||||
.fire(new ServerConnectedEvent(player, serverConn.getServer(),
|
.fire(new ServerConnectedEvent(player, serverConn.getServer(), previousServer))
|
||||||
existingConnection != null ? existingConnection.getServer() : null))
|
|
||||||
.thenRunAsync(() -> {
|
.thenRunAsync(() -> {
|
||||||
// Make sure we can still transition (player might have disconnected here).
|
// Make sure we can still transition (player might have disconnected here).
|
||||||
if (!serverConn.isActive()) {
|
if (!serverConn.isActive()) {
|
||||||
@ -136,7 +137,7 @@ public class TransitionSessionHandler implements MinecraftSessionHandler {
|
|||||||
|
|
||||||
// We're done! :)
|
// We're done! :)
|
||||||
server.getEventManager().fireAndForget(new ServerPostConnectEvent(player,
|
server.getEventManager().fireAndForget(new ServerPostConnectEvent(player,
|
||||||
existingConnection == null ? null : existingConnection.getServer()));
|
previousServer));
|
||||||
resultFuture.complete(ConnectionRequestResults.successful(serverConn.getServer()));
|
resultFuture.complete(ConnectionRequestResults.successful(serverConn.getServer()));
|
||||||
}, smc.eventLoop())
|
}, smc.eventLoop())
|
||||||
.exceptionally(exc -> {
|
.exceptionally(exc -> {
|
||||||
|
@ -26,6 +26,7 @@ import com.google.common.collect.ImmutableList;
|
|||||||
import com.velocitypowered.api.network.ProtocolVersion;
|
import com.velocitypowered.api.network.ProtocolVersion;
|
||||||
import com.velocitypowered.api.proxy.ServerConnection;
|
import com.velocitypowered.api.proxy.ServerConnection;
|
||||||
import com.velocitypowered.api.proxy.messages.ChannelIdentifier;
|
import com.velocitypowered.api.proxy.messages.ChannelIdentifier;
|
||||||
|
import com.velocitypowered.api.proxy.server.RegisteredServer;
|
||||||
import com.velocitypowered.api.proxy.server.ServerInfo;
|
import com.velocitypowered.api.proxy.server.ServerInfo;
|
||||||
import com.velocitypowered.api.util.GameProfile.Property;
|
import com.velocitypowered.api.util.GameProfile.Property;
|
||||||
import com.velocitypowered.proxy.VelocityServer;
|
import com.velocitypowered.proxy.VelocityServer;
|
||||||
@ -49,6 +50,7 @@ import java.nio.charset.StandardCharsets;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.function.UnaryOperator;
|
import java.util.function.UnaryOperator;
|
||||||
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
|
||||||
@ -57,6 +59,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
|
|||||||
public class VelocityServerConnection implements MinecraftConnectionAssociation, ServerConnection {
|
public class VelocityServerConnection implements MinecraftConnectionAssociation, ServerConnection {
|
||||||
|
|
||||||
private final VelocityRegisteredServer registeredServer;
|
private final VelocityRegisteredServer registeredServer;
|
||||||
|
private final @Nullable VelocityRegisteredServer previousServer;
|
||||||
private final ConnectedPlayer proxyPlayer;
|
private final ConnectedPlayer proxyPlayer;
|
||||||
private final VelocityServer server;
|
private final VelocityServer server;
|
||||||
private @Nullable MinecraftConnection connection;
|
private @Nullable MinecraftConnection connection;
|
||||||
@ -69,12 +72,15 @@ public class VelocityServerConnection implements MinecraftConnectionAssociation,
|
|||||||
/**
|
/**
|
||||||
* Initializes a new server connection.
|
* Initializes a new server connection.
|
||||||
* @param registeredServer the server to connect to
|
* @param registeredServer the server to connect to
|
||||||
|
* @param previousServer the server the player is coming from
|
||||||
* @param proxyPlayer the player connecting to the server
|
* @param proxyPlayer the player connecting to the server
|
||||||
* @param server the Velocity proxy instance
|
* @param server the Velocity proxy instance
|
||||||
*/
|
*/
|
||||||
public VelocityServerConnection(VelocityRegisteredServer registeredServer,
|
public VelocityServerConnection(VelocityRegisteredServer registeredServer,
|
||||||
|
@Nullable VelocityRegisteredServer previousServer,
|
||||||
ConnectedPlayer proxyPlayer, VelocityServer server) {
|
ConnectedPlayer proxyPlayer, VelocityServer server) {
|
||||||
this.registeredServer = registeredServer;
|
this.registeredServer = registeredServer;
|
||||||
|
this.previousServer = previousServer;
|
||||||
this.proxyPlayer = proxyPlayer;
|
this.proxyPlayer = proxyPlayer;
|
||||||
this.server = server;
|
this.server = server;
|
||||||
}
|
}
|
||||||
@ -209,6 +215,11 @@ public class VelocityServerConnection implements MinecraftConnectionAssociation,
|
|||||||
return registeredServer;
|
return registeredServer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<RegisteredServer> getPreviousServer() {
|
||||||
|
return Optional.ofNullable(this.previousServer);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ServerInfo getServerInfo() {
|
public ServerInfo getServerInfo() {
|
||||||
return registeredServer.getServerInfo();
|
return registeredServer.getServerInfo();
|
||||||
|
@ -482,7 +482,12 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ConnectionRequestBuilder createConnectionRequest(RegisteredServer server) {
|
public ConnectionRequestBuilder createConnectionRequest(RegisteredServer server) {
|
||||||
return new ConnectionRequestBuilderImpl(server);
|
return new ConnectionRequestBuilderImpl(server, this.connectedServer);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ConnectionRequestBuilder createConnectionRequest(RegisteredServer server,
|
||||||
|
@Nullable VelocityServerConnection previousConnection) {
|
||||||
|
return new ConnectionRequestBuilderImpl(server, previousConnection);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -652,7 +657,7 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
|||||||
connectionInFlight = null;
|
connectionInFlight = null;
|
||||||
|
|
||||||
// Make sure we clear the current connected server as the connection is invalid.
|
// Make sure we clear the current connected server as the connection is invalid.
|
||||||
boolean previouslyConnected = connectedServer != null;
|
VelocityServerConnection previousConnection = connectedServer;
|
||||||
if (kickedFromCurrent) {
|
if (kickedFromCurrent) {
|
||||||
connectedServer = null;
|
connectedServer = null;
|
||||||
}
|
}
|
||||||
@ -667,7 +672,7 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
|||||||
disconnect(res.getReasonComponent());
|
disconnect(res.getReasonComponent());
|
||||||
} else if (event.getResult() instanceof RedirectPlayer) {
|
} else if (event.getResult() instanceof RedirectPlayer) {
|
||||||
RedirectPlayer res = (RedirectPlayer) event.getResult();
|
RedirectPlayer res = (RedirectPlayer) event.getResult();
|
||||||
createConnectionRequest(res.getServer())
|
createConnectionRequest(res.getServer(), previousConnection)
|
||||||
.connect()
|
.connect()
|
||||||
.whenCompleteAsync((status, throwable) -> {
|
.whenCompleteAsync((status, throwable) -> {
|
||||||
if (throwable != null) {
|
if (throwable != null) {
|
||||||
@ -710,7 +715,7 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
|||||||
}, connection.eventLoop());
|
}, connection.eventLoop());
|
||||||
} else if (event.getResult() instanceof Notify) {
|
} else if (event.getResult() instanceof Notify) {
|
||||||
Notify res = (Notify) event.getResult();
|
Notify res = (Notify) event.getResult();
|
||||||
if (event.kickedDuringServerConnect() && previouslyConnected) {
|
if (event.kickedDuringServerConnect() && previousConnection != null) {
|
||||||
sendMessage(Identity.nil(), res.getMessageComponent());
|
sendMessage(Identity.nil(), res.getMessageComponent());
|
||||||
} else {
|
} else {
|
||||||
disconnect(res.getMessageComponent());
|
disconnect(res.getMessageComponent());
|
||||||
@ -1060,9 +1065,12 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
|||||||
private class ConnectionRequestBuilderImpl implements ConnectionRequestBuilder {
|
private class ConnectionRequestBuilderImpl implements ConnectionRequestBuilder {
|
||||||
|
|
||||||
private final RegisteredServer toConnect;
|
private final RegisteredServer toConnect;
|
||||||
|
private final @Nullable VelocityRegisteredServer previousServer;
|
||||||
|
|
||||||
ConnectionRequestBuilderImpl(RegisteredServer toConnect) {
|
ConnectionRequestBuilderImpl(RegisteredServer toConnect,
|
||||||
|
@Nullable VelocityServerConnection previousConnection) {
|
||||||
this.toConnect = Preconditions.checkNotNull(toConnect, "info");
|
this.toConnect = Preconditions.checkNotNull(toConnect, "info");
|
||||||
|
this.previousServer = previousConnection == null ? null : previousConnection.getServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -1096,7 +1104,7 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ServerPreConnectEvent event = new ServerPreConnectEvent(ConnectedPlayer.this,
|
ServerPreConnectEvent event = new ServerPreConnectEvent(ConnectedPlayer.this,
|
||||||
toConnect);
|
toConnect, previousServer);
|
||||||
return server.getEventManager().fire(event)
|
return server.getEventManager().fire(event)
|
||||||
.thenComposeAsync(newEvent -> {
|
.thenComposeAsync(newEvent -> {
|
||||||
Optional<RegisteredServer> newDest = newEvent.getResult().getServer();
|
Optional<RegisteredServer> newDest = newEvent.getResult().getServer();
|
||||||
@ -1114,7 +1122,7 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
|||||||
|
|
||||||
VelocityRegisteredServer vrs = (VelocityRegisteredServer) realDestination;
|
VelocityRegisteredServer vrs = (VelocityRegisteredServer) realDestination;
|
||||||
VelocityServerConnection con = new VelocityServerConnection(vrs,
|
VelocityServerConnection con = new VelocityServerConnection(vrs,
|
||||||
ConnectedPlayer.this, server);
|
previousServer, ConnectedPlayer.this, server);
|
||||||
connectionInFlight = con;
|
connectionInFlight = con;
|
||||||
return con.connect().whenCompleteAsync(
|
return con.connect().whenCompleteAsync(
|
||||||
(result, exception) -> this.resetIfInFlightIs(con), connection.eventLoop());
|
(result, exception) -> this.resetIfInFlightIs(con), connection.eventLoop());
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren