3
0
Mirror von https://github.com/PaperMC/Velocity.git synchronisiert 2024-12-24 23:30:26 +01:00

Fix disconnect issues in 1.7-specific logic.

Dieser Commit ist enthalten in:
Andrew Steinborn 2020-10-30 06:34:28 -04:00
Ursprung 8a16db3794
Commit 9a0affbca9
2 geänderte Dateien mit 15 neuen und 14 gelöschten Zeilen

Datei anzeigen

@ -223,20 +223,21 @@ public class MinecraftConnection extends ChannelInboundHandlerAdapter {
*/
public void closeWith(Object msg) {
if (channel.isActive()) {
boolean is1Point8 = this.getProtocolVersion().compareTo(ProtocolVersion.MINECRAFT_1_8) >= 0;
boolean isLegacyOrPing = this.getState() == StateRegistry.HANDSHAKE
|| this.getState() == StateRegistry.STATUS;
if (channel.eventLoop().inEventLoop() && (is1Point8 || isLegacyOrPing)) {
boolean is1_7 = this.getProtocolVersion().compareTo(ProtocolVersion.MINECRAFT_1_8) < 0
&& this.getProtocolVersion().compareTo(ProtocolVersion.MINECRAFT_1_7_2) >= 0;
if (is1_7) {
channel.eventLoop().execute(() -> {
// 1.7.x versions have a race condition with switching protocol states, so just explicitly
// close the connection after a short while.
this.setAutoReading(false);
channel.eventLoop().schedule(() -> {
knownDisconnect = true;
channel.writeAndFlush(msg).addListener(ChannelFutureListener.CLOSE);
}, 250, TimeUnit.MILLISECONDS);
});
} else {
knownDisconnect = true;
channel.writeAndFlush(msg).addListener(ChannelFutureListener.CLOSE);
} else {
// 1.7.x versions have a race condition with switching protocol states, so just explicitly
// close the connection after a short while.
this.setAutoReading(false);
channel.eventLoop().schedule(() -> {
knownDisconnect = true;
channel.writeAndFlush(msg).addListener(ChannelFutureListener.CLOSE);
}, 250, TimeUnit.MILLISECONDS);
}
}
}

Datei anzeigen

@ -208,7 +208,7 @@ public class LoginSessionHandler implements MinecraftSessionHandler {
onlineMode);
final GameProfile finalProfile = profile;
server.getEventManager().fire(profileRequestEvent).thenCompose(profileEvent -> {
server.getEventManager().fire(profileRequestEvent).thenComposeAsync(profileEvent -> {
if (mcConnection.isClosed()) {
// The player disconnected after we authenticated them.
return CompletableFuture.completedFuture(null);
@ -234,7 +234,7 @@ public class LoginSessionHandler implements MinecraftSessionHandler {
completeLoginProtocolPhaseAndInitialize(player);
}
}, mcConnection.eventLoop());
}).exceptionally((ex) -> {
}, mcConnection.eventLoop()).exceptionally((ex) -> {
logger.error("Exception during connection of {}", finalProfile, ex);
return null;
});