From 1f9f2e1eb573a4e3ff91707f0b3a475cae1e436b Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Fri, 12 Nov 2021 09:26:49 -0500 Subject: [PATCH] Update to latest Geyser changes; clean up --- .../org/geysermc/connect/MasterServer.java | 27 ++++--------------- .../org/geysermc/connect/PacketHandler.java | 12 +++------ .../org/geysermc/connect/utils/Player.java | 3 +++ 3 files changed, 12 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/geysermc/connect/MasterServer.java b/src/main/java/org/geysermc/connect/MasterServer.java index 052c658..2d82041 100644 --- a/src/main/java/org/geysermc/connect/MasterServer.java +++ b/src/main/java/org/geysermc/connect/MasterServer.java @@ -25,13 +25,11 @@ package org.geysermc.connect; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import com.nukkitx.protocol.bedrock.*; import io.netty.channel.DefaultEventLoopGroup; import io.netty.util.concurrent.DefaultThreadFactory; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.Getter; -import lombok.Setter; import org.geysermc.connect.storage.DisabledStorageManager; import org.geysermc.connect.utils.Server; import org.geysermc.connect.utils.ServerCategory; @@ -49,7 +47,6 @@ import java.net.InetSocketAddress; import java.util.*; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; public class MasterServer { @@ -69,15 +66,7 @@ public class MasterServer { private final ScheduledExecutorService generalThreadPool; @Getter - private final Map players = new HashMap<>(); - - /** - * Players that are transferring and are expected to rejoin on the Geyser side. - */ - @Getter - private final Cache transferringPlayers = CacheBuilder.newBuilder() - .expireAfterWrite(1, TimeUnit.MINUTES) - .build(); + private final List players = new ObjectArrayList<>(); @Getter private GeyserProxyBootstrap geyserProxy; @@ -88,10 +77,6 @@ public class MasterServer { @Getter private AbstractStorageManager storageManager; - @Setter - @Getter - private long lastDisconnectTime = 0L; - @Getter private final DefaultEventLoopGroup eventLoopGroup = new DefaultEventLoopGroup(new DefaultThreadFactory("Geyser player thread")); @@ -110,7 +95,8 @@ public class MasterServer { logger.setDebug(geyserConnectConfig.isDebugMode()); - this.generalThreadPool = Executors.newScheduledThreadPool(32); + // As this is only used for fixing the form image bug, we don't need to handle many threads + this.generalThreadPool = Executors.newSingleThreadScheduledExecutor(); // Start a timer to keep the thread running Timer timer = new Timer(); @@ -156,10 +142,7 @@ public class MasterServer { @Override public BedrockPong onQuery(InetSocketAddress address) { - int playerCount = players.size(); - if (GeyserConnector.getInstance() != null) { - playerCount += GeyserConnector.getInstance().getPlayers().size(); - } + int playerCount = players.size() + GeyserConnector.getInstance().getSessionManager().size(); String subMotd = geyserConnectConfig.getSubmotd(); if (subMotd == null || subMotd.isEmpty()) { diff --git a/src/main/java/org/geysermc/connect/PacketHandler.java b/src/main/java/org/geysermc/connect/PacketHandler.java index 4a092bf..9202dda 100644 --- a/src/main/java/org/geysermc/connect/PacketHandler.java +++ b/src/main/java/org/geysermc/connect/PacketHandler.java @@ -60,7 +60,7 @@ import org.geysermc.cumulus.response.SimpleFormResponse; import java.io.File; import java.io.IOException; import java.security.interfaces.ECPublicKey; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -86,10 +86,7 @@ public class PacketHandler implements BedrockPacketHandler { masterServer.getLogger().info(player.getAuthData().getName() + " has disconnected from the master server (" + reason + ")"); masterServer.getStorageManager().saveServers(player); - if (player.getCurrentServer() != null && !player.getCurrentServer().isBedrock()) { - masterServer.getTransferringPlayers().put(player.getAuthData().getXboxUUID(), player); - } - masterServer.getPlayers().remove(player.getAuthData().getXboxUUID(), player); + masterServer.getPlayers().remove(player); } } @@ -181,7 +178,7 @@ public class PacketHandler implements BedrockPacketHandler { // Create a new player and add it to the players list player = new Player(authData, session); - masterServer.getPlayers().put(player.getAuthData().getXboxUUID(), player); + masterServer.getPlayers().add(player); // Store the full client data player.setClientData(OBJECT_MAPPER.convertValue(OBJECT_MAPPER.readTree(skinData.getPayload().toBytes()), BedrockClientData.class)); @@ -358,8 +355,7 @@ public class PacketHandler implements BedrockPacketHandler { // This is to fix a bug in the client where it doesn't load form images UpdateAttributesPacket updateAttributesPacket = new UpdateAttributesPacket(); updateAttributesPacket.setRuntimeEntityId(1); - List attributes = new ArrayList<>(); - attributes.add(GeyserAttributeType.EXPERIENCE_LEVEL.getAttribute(0f)); + List attributes = Collections.singletonList(GeyserAttributeType.EXPERIENCE_LEVEL.getAttribute(0f)); updateAttributesPacket.setAttributes(attributes); // Doesn't work 100% of the time but fixes it most of the time diff --git a/src/main/java/org/geysermc/connect/utils/Player.java b/src/main/java/org/geysermc/connect/utils/Player.java index f703b2b..4ec8a0d 100644 --- a/src/main/java/org/geysermc/connect/utils/Player.java +++ b/src/main/java/org/geysermc/connect/utils/Player.java @@ -230,6 +230,9 @@ public class Player { } else { GeyserProxySession geyserSession = new GeyserProxySession(GeyserConnector.getInstance(), session, MasterServer.getInstance().getEventLoopGroup().next()); session.setPacketHandler(new UpstreamPacketHandler(GeyserConnector.getInstance(), geyserSession)); + // The player will be tracked from Geyser from here + MasterServer.getInstance().getPlayers().remove(this); + GeyserConnector.getInstance().getSessionManager().addPendingSession(geyserSession); geyserSession.getUpstream().getSession().setPacketCodec(session.getPacketCodec());