Fix sessions still being held by Geyser when they are TransferPacket'ed to a bedrock server

This commit is contained in:
Konicai 2024-08-04 23:56:08 -05:00
parent 2d6117ac8c
commit c35bd6d56a
2 changed files with 13 additions and 12 deletions

View file

@ -68,10 +68,10 @@ public class PacketHandler extends UpstreamPacketHandler {
@Override @Override
public void onDisconnect(String reason) { public void onDisconnect(String reason) {
if (session.getAuthData() != null) { // The user has disconnected without having connected to an actual server. If they have connected to
geyserConnect.logger().info(Utils.displayName(session) + " has disconnected (" + reason + ")"); // a server (transfer packet or geyser proxy), then the original packet handler has been restored.
ServerManager.unloadServers(session); ServerManager.unloadServers(session);
} originalPacketHandler.onDisconnect(reason);
} }
@Override @Override
@ -155,12 +155,12 @@ public class PacketHandler extends UpstreamPacketHandler {
@Override @Override
public PacketSignal handle(ResourcePackClientResponsePacket packet) { public PacketSignal handle(ResourcePackClientResponsePacket packet) {
return originalPacketHandler.handle(packet); return originalPacketHandler.handle(packet); // relies on state in the original handler
} }
@Override @Override
public PacketSignal handle(ResourcePackChunkRequestPacket packet) { public PacketSignal handle(ResourcePackChunkRequestPacket packet) {
return originalPacketHandler.handle(packet); return originalPacketHandler.handle(packet); // relies on state in the original handler
} }
} }

View file

@ -84,6 +84,13 @@ public class Utils {
GeyserConnect.instance().logger().info("Sending " + Utils.displayName(session) + " to " + server.title()); GeyserConnect.instance().logger().info("Sending " + Utils.displayName(session) + " to " + server.title());
GeyserConnect.instance().logger().debug(server.toString()); GeyserConnect.instance().logger().debug(server.toString());
// Save the player's servers since we are changing packet handlers
// (and they are going to disconnect if it is a bedrock server)
ServerManager.unloadServers(session);
// Restore the original packet handler
session.getUpstream().getSession().setPacketHandler(originalPacketHandler);
if (server.bedrock()) { if (server.bedrock()) {
// Send them to the bedrock server // Send them to the bedrock server
TransferPacket transferPacket = new TransferPacket(); TransferPacket transferPacket = new TransferPacket();
@ -91,12 +98,6 @@ public class Utils {
transferPacket.setPort(server.port()); transferPacket.setPort(server.port());
session.sendUpstreamPacket(transferPacket); session.sendUpstreamPacket(transferPacket);
} else { } else {
// Save the players servers since we are changing packet handlers
ServerManager.unloadServers(session);
// Restore the original packet handler
session.getUpstream().getSession().setPacketHandler(originalPacketHandler);
// Set the remote server and un-initialize the session // Set the remote server and un-initialize the session
session.remoteServer(server); session.remoteServer(server);
session.getUpstream().setInitialized(false); session.getUpstream().setInitialized(false);