Describe the bug
Some players are not disconnected properly and their instance is stuck in PlayerManager forever. I'll show an example of a random buggy player.
A player with a bad connection or glitched client joins the server.
2023-05-13 08:17:18.702 [Bedrock Listener - #3] DEBUG - [/100.100.100.100:33330] <-> Received first data
2023-05-13 08:17:23.361 [Bedrock Listener - #3] INFO - [/100.100.100.100:33330|Vogy] <-> Upstream has connected (protocol=567 version=1.19.60)
2023-05-13 08:17:23.368 [Bedrock Listener - #3] INFO - Encryption enabled for /100.100.100.100:33330
After 10 seconds, the player got timed out somehow (maybe it's a client bug). Notice it does not say "Upstream has disconnected: disconnect.timeout", only this
2023-05-13 08:17:33.921 [RakNet Listener - #0] DEBUG - Disconnecting RakNet Session (0.0.0.0/0.0.0.0:19132 => /100.100.100.100:33330) due to TIMED_OUT
The player tries to join the server again after a minute. The IP is the same, the port is different:
2023-05-13 08:18:49.094 [Bedrock Listener - #0] DEBUG - [/100.100.100.100:44193] <-> Received first data
2023-05-13 08:18:50.153 [Bedrock Listener - #0] INFO - [/100.100.100.100:44193|Vogy] <-> Upstream has connected (protocol=567 version=1.19.60)
An important detail: my server does not have XBOX authorization, so I made a simple plugin (nothing else) that prohibits connection to the proxy if a player with the same nickname is already connected to it.
private void onPlayerAuth(PlayerAuthenticatedEvent event) {
var nick = event.getLoginData().getDisplayName().toLowerCase();
for (var player : getProxy().getPlayers().values()) {
if (player.getName().toLowerCase().equals(nick)) {
event.setCancelled();
event.setCancelReason("Player with your nickname is already on the server!");
return;
}
}
}
So, when the player [/100.100.100.100:44193|Vogy] tries to join the server again, he gets kicked with the message "Player with your nickname is already on the server!" over and over.
The old connection [/100.100.100.100:33330|Vogy] is stuck in the proxy list forever even though the 'old' player has been timed out and left the server.
I didn't mention, I tried to debug everything about the old connection, maybe this will help:
private void onPlayerAuth(PlayerAuthenticatedEvent event) {
var nick = event.getLoginData().getDisplayName().toLowerCase();
for (var player : getProxy().getPlayers().values()) {
if (player.getName().toLowerCase().equals(nick)) {
event.setCancelled();
event.setCancelReason("Player with your nickname is already on the server!");
// DEBUG LOGGING
String where = "unknown";
if (player.getConnectingServer() != null) {
where = "pending [" + player.getConnectingServer().getServerName() + "]";
} else if (player.getServerInfo() != null) {
where = player.getServerInfo().getServerName();
}
getLogger().warn("Player {} tried to connect but this nickname is already connected to: {}, connected client address: {}", player.getName(), where, player.getAddress().toString());
getLogger().warn("Pending servers: " + player.getPendingServers().size());
getLogger().warn("oldplayer.getConnection().isConnected(): " + player.getConnection().isConnected());
getLogger().warn("oldplayer.getConnection().isLogging(): " + player.getConnection().isLogging());
getLogger().warn("oldplayer.getConnection().isSubClient(): " + player.getConnection().isSubClient());
getLogger().warn("getPeer().isConnected(): " + player.getConnection().getPeer().isConnected());
getLogger().warn("getPeer().isConnecting(): " + player.getConnection().getPeer().isConnecting());
getLogger().warn("getPeer().isSplitScreen(): " + player.getConnection().getPeer().isSplitScreen());
getLogger().warn("getPeer().isSharable(): " + player.getConnection().getPeer().isSharable());
Channel channel = player.getConnection().getPeer().getChannel();
getLogger().warn("getPeer().getChannel().isRegistered(): " + channel.isRegistered());
getLogger().warn("getPeer().getChannel().isActive(): " + channel.isActive());
getLogger().warn("getPeer().getChannel().isOpen(): " + channel.isOpen());
getLogger().warn("getPeer().getChannel().isWritable(): " + channel.isWritable());
return;
}
}
}
Describe the bug Some players are not disconnected properly and their instance is stuck in PlayerManager forever. I'll show an example of a random buggy player.
A player with a bad connection or glitched client joins the server.
After 10 seconds, the player got timed out somehow (maybe it's a client bug). Notice it does not say "Upstream has disconnected: disconnect.timeout", only this
The player tries to join the server again after a minute. The IP is the same, the port is different:
An important detail: my server does not have XBOX authorization, so I made a simple plugin (nothing else) that prohibits connection to the proxy if a player with the same nickname is already connected to it.
So, when the player
[/100.100.100.100:44193|Vogy]
tries to join the server again, he gets kicked with the message "Player with your nickname is already on the server!" over and over. The old connection[/100.100.100.100:33330|Vogy]
is stuck in the proxy list forever even though the 'old' player has been timed out and left the server.I didn't mention, I tried to debug everything about the old connection, maybe this will help:
The logs with debug about the old connection:
Only 1 proxy instance and only 1 downstream server is used.
Platform Information:
network_mode: host
is used (it doesn't matter, I think?)