Skip to content

Commit 7fdc624

Browse files
authored
fix: provide fallback when server dies on bungeecord (#1602)
### Motivation Currently, when a server unexpectedly closes the connection to the proxy, the player gets disconnected as CloudNet does not provide a fallback server. This is due to the fact that the ServerKickEvent is only called when the server sends a kick packet. In case the server goes down, BungeeCord tries to connect the player to the first priority (in our case a dummy `lobby` server as BungeeCord won't start without a priority) with the connection reason `SERVER_DOWN_REDIRECT`. We can catch this reason and provide a proper fallback in `ServerConnectEvent`. ### Modification Catch the `SERVER_DOWN_REDIRECT` reason in `ServerConnectEvent` and provide a proper fallback. If no fallback is available, disconnect the player with the new disconnection reason introduced in #1399. ### Result Players will be provided with a proper fallback in case of an unexpected connection close by the downstream service instead of being disconnected.
1 parent 860999f commit 7fdc624

1 file changed

Lines changed: 17 additions & 9 deletions

File tree

modules/bridge/impl/src/main/java/eu/cloudnetservice/modules/bridge/impl/platform/bungeecord/BungeeCordPlayerManagementListener.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -133,17 +133,20 @@ public void handle(@NonNull ServerConnectEvent event) {
133133
}
134134
}
135135

136-
// initial connect reasons, LOBBY_FALLBACK will be used if the initial fallback is not present
137-
if (event.getReason() == Reason.JOIN_PROXY || event.getReason() == Reason.LOBBY_FALLBACK) {
138-
var target = this.management.fallback(player)
136+
var serverDownRedirect = event.getReason() == Reason.SERVER_DOWN_REDIRECT;
137+
var lobbyFallbackRedirect = event.getReason() == Reason.JOIN_PROXY || event.getReason() == Reason.LOBBY_FALLBACK;
138+
if (serverDownRedirect || lobbyFallbackRedirect) {
139+
var fallback = this.management.fallback(player)
139140
.map(service -> this.proxyServer.getServerInfo(service.name()))
140141
.orElse(null);
141-
if (target != null) {
142-
// fallback found, connect to the fallback
143-
event.setTarget(target);
144-
} else {
145-
// no fallback found, disconnect the player
146-
event.setCancelled(true);
142+
if (fallback != null) {
143+
event.setTarget(fallback);
144+
return;
145+
}
146+
147+
// no fallback found, disconnect the player with the correct reason according to the connect reason
148+
event.setCancelled(true);
149+
if (lobbyFallbackRedirect) {
147150
var kickMessage = this.management.configuration().findMessage(
148151
player.getLocale(),
149152
"proxy-join-disconnect-because-no-hub",
@@ -153,6 +156,11 @@ public void handle(@NonNull ServerConnectEvent event) {
153156
if (kickMessage != null) {
154157
player.disconnect(kickMessage);
155158
}
159+
} else {
160+
var kickedFrom = player.getServer().getInfo();
161+
var disconnectReason = new TextComponent("Disconnected by Server");
162+
var kickReason = this.buildKickReasonMessage(player, kickedFrom, disconnectReason, "server-kick-no-other-hub");
163+
player.disconnect(kickReason);
156164
}
157165
}
158166
}

0 commit comments

Comments
 (0)