Mirror von
https://github.com/PaperMC/Velocity.git
synchronisiert 2024-12-25 07:40:13 +01:00
Handle unexpected disconnects without a reason.
Dieser Commit ist enthalten in:
Ursprung
871319d679
Commit
84947564e4
@ -6,6 +6,7 @@ import com.velocitypowered.api.proxy.messages.MessageHandler;
|
|||||||
import com.velocitypowered.proxy.VelocityServer;
|
import com.velocitypowered.proxy.VelocityServer;
|
||||||
import com.velocitypowered.proxy.connection.VelocityConstants;
|
import com.velocitypowered.proxy.connection.VelocityConstants;
|
||||||
import com.velocitypowered.proxy.connection.client.ClientPlaySessionHandler;
|
import com.velocitypowered.proxy.connection.client.ClientPlaySessionHandler;
|
||||||
|
import com.velocitypowered.proxy.connection.util.ConnectionMessages;
|
||||||
import com.velocitypowered.proxy.protocol.MinecraftPacket;
|
import com.velocitypowered.proxy.protocol.MinecraftPacket;
|
||||||
import com.velocitypowered.proxy.protocol.ProtocolConstants;
|
import com.velocitypowered.proxy.protocol.ProtocolConstants;
|
||||||
import com.velocitypowered.proxy.protocol.packet.*;
|
import com.velocitypowered.proxy.protocol.packet.*;
|
||||||
@ -44,6 +45,7 @@ public class BackendPlaySessionHandler implements MinecraftSessionHandler {
|
|||||||
connection.getPlayer().getConnection().write(packet);
|
connection.getPlayer().getConnection().write(packet);
|
||||||
} else if (packet instanceof Disconnect) {
|
} else if (packet instanceof Disconnect) {
|
||||||
Disconnect original = (Disconnect) packet;
|
Disconnect original = (Disconnect) packet;
|
||||||
|
connection.disconnect();
|
||||||
connection.getPlayer().handleConnectionException(connection.getServerInfo(), original);
|
connection.getPlayer().handleConnectionException(connection.getServerInfo(), original);
|
||||||
} else if (packet instanceof JoinGame) {
|
} else if (packet instanceof JoinGame) {
|
||||||
playerHandler.handleBackendJoinGame((JoinGame) packet);
|
playerHandler.handleBackendJoinGame((JoinGame) packet);
|
||||||
@ -113,6 +115,18 @@ public class BackendPlaySessionHandler implements MinecraftSessionHandler {
|
|||||||
connection.getPlayer().handleConnectionException(connection.getServerInfo(), throwable);
|
connection.getPlayer().handleConnectionException(connection.getServerInfo(), throwable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public VelocityServer getServer() {
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disconnected() {
|
||||||
|
if (connection.isGracefulDisconnect()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
connection.getPlayer().handleConnectionException(connection.getServerInfo(), Disconnect.create(ConnectionMessages.UNEXPECTED_DISCONNECT));
|
||||||
|
}
|
||||||
|
|
||||||
private boolean canForwardPluginMessage(PluginMessage message) {
|
private boolean canForwardPluginMessage(PluginMessage message) {
|
||||||
ClientPlaySessionHandler playerHandler =
|
ClientPlaySessionHandler playerHandler =
|
||||||
(ClientPlaySessionHandler) connection.getPlayer().getConnection().getSessionHandler();
|
(ClientPlaySessionHandler) connection.getPlayer().getConnection().getSessionHandler();
|
||||||
|
@ -44,6 +44,7 @@ public class VelocityServerConnection implements MinecraftConnectionAssociation,
|
|||||||
private MinecraftConnection minecraftConnection;
|
private MinecraftConnection minecraftConnection;
|
||||||
private boolean legacyForge = false;
|
private boolean legacyForge = false;
|
||||||
private boolean hasCompletedJoin = false;
|
private boolean hasCompletedJoin = false;
|
||||||
|
private boolean gracefulDisconnect = false;
|
||||||
|
|
||||||
public VelocityServerConnection(ServerInfo target, ConnectedPlayer proxyPlayer, VelocityServer server) {
|
public VelocityServerConnection(ServerInfo target, ConnectedPlayer proxyPlayer, VelocityServer server) {
|
||||||
this.serverInfo = target;
|
this.serverInfo = target;
|
||||||
@ -148,6 +149,7 @@ public class VelocityServerConnection implements MinecraftConnectionAssociation,
|
|||||||
if (minecraftConnection != null) {
|
if (minecraftConnection != null) {
|
||||||
minecraftConnection.close();
|
minecraftConnection.close();
|
||||||
minecraftConnection = null;
|
minecraftConnection = null;
|
||||||
|
gracefulDisconnect = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,4 +183,8 @@ public class VelocityServerConnection implements MinecraftConnectionAssociation,
|
|||||||
public void setHasCompletedJoin(boolean hasCompletedJoin) {
|
public void setHasCompletedJoin(boolean hasCompletedJoin) {
|
||||||
this.hasCompletedJoin = hasCompletedJoin;
|
this.hasCompletedJoin = hasCompletedJoin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isGracefulDisconnect() {
|
||||||
|
return gracefulDisconnect;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -205,15 +205,20 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player {
|
|||||||
String plainTextReason = PASS_THRU_TRANSLATE.serialize(disconnectReason);
|
String plainTextReason = PASS_THRU_TRANSLATE.serialize(disconnectReason);
|
||||||
if (connectedServer != null && connectedServer.getServerInfo().equals(info)) {
|
if (connectedServer != null && connectedServer.getServerInfo().equals(info)) {
|
||||||
logger.error("{}: kicked from server {}: {}", this, info.getName(), plainTextReason);
|
logger.error("{}: kicked from server {}: {}", this, info.getName(), plainTextReason);
|
||||||
|
handleConnectionException(info, disconnectReason, TextComponent.builder()
|
||||||
|
.content("Kicked from " + info.getName() + ": ")
|
||||||
|
.color(TextColor.RED)
|
||||||
|
.append(disconnectReason)
|
||||||
|
.build());
|
||||||
} else {
|
} else {
|
||||||
logger.error("{}: disconnected while connecting to {}: {}", this, info.getName(), plainTextReason);
|
logger.error("{}: disconnected while connecting to {}: {}", this, info.getName(), plainTextReason);
|
||||||
}
|
|
||||||
handleConnectionException(info, disconnectReason, TextComponent.builder()
|
handleConnectionException(info, disconnectReason, TextComponent.builder()
|
||||||
.content("Unable to connect to " + info.getName() + ": ")
|
.content("Unable to connect to " + info.getName() + ": ")
|
||||||
.color(TextColor.RED)
|
.color(TextColor.RED)
|
||||||
.append(disconnectReason)
|
.append(disconnectReason)
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void handleConnectionException(ServerInfo info, @Nullable Component kickReason, Component friendlyReason) {
|
private void handleConnectionException(ServerInfo info, @Nullable Component kickReason, Component friendlyReason) {
|
||||||
boolean alreadyConnected = connectedServer != null && connectedServer.getServerInfo().equals(info);;
|
boolean alreadyConnected = connectedServer != null && connectedServer.getServerInfo().equals(info);;
|
||||||
|
@ -7,6 +7,7 @@ public class ConnectionMessages {
|
|||||||
public static final TextComponent ALREADY_CONNECTED = TextComponent.of("You are already connected to this server!", TextColor.RED);
|
public static final TextComponent ALREADY_CONNECTED = TextComponent.of("You are already connected to this server!", TextColor.RED);
|
||||||
public static final TextComponent IN_PROGRESS = TextComponent.of("You are already connecting to a server!", TextColor.RED);
|
public static final TextComponent IN_PROGRESS = TextComponent.of("You are already connecting to a server!", TextColor.RED);
|
||||||
public static final TextComponent INTERNAL_SERVER_CONNECTION_ERROR = TextComponent.of("Internal server connection error");
|
public static final TextComponent INTERNAL_SERVER_CONNECTION_ERROR = TextComponent.of("Internal server connection error");
|
||||||
|
public static final TextComponent UNEXPECTED_DISCONNECT = TextComponent.of("Unexpectedly disconnected from server - crash?");
|
||||||
|
|
||||||
private ConnectionMessages() {
|
private ConnectionMessages() {
|
||||||
throw new AssertionError();
|
throw new AssertionError();
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren