Update to latest Geyser changes; clean up

This commit is contained in:
Camotoy 2021-11-12 09:26:49 -05:00
parent e76c822442
commit 1f9f2e1eb5
No known key found for this signature in database
GPG key ID: 7EEFB66FE798081F
3 changed files with 12 additions and 30 deletions

View file

@ -25,13 +25,11 @@
package org.geysermc.connect; package org.geysermc.connect;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.nukkitx.protocol.bedrock.*; import com.nukkitx.protocol.bedrock.*;
import io.netty.channel.DefaultEventLoopGroup; import io.netty.channel.DefaultEventLoopGroup;
import io.netty.util.concurrent.DefaultThreadFactory; import io.netty.util.concurrent.DefaultThreadFactory;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import lombok.Getter; import lombok.Getter;
import lombok.Setter;
import org.geysermc.connect.storage.DisabledStorageManager; import org.geysermc.connect.storage.DisabledStorageManager;
import org.geysermc.connect.utils.Server; import org.geysermc.connect.utils.Server;
import org.geysermc.connect.utils.ServerCategory; import org.geysermc.connect.utils.ServerCategory;
@ -49,7 +47,6 @@ import java.net.InetSocketAddress;
import java.util.*; import java.util.*;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class MasterServer { public class MasterServer {
@ -69,15 +66,7 @@ public class MasterServer {
private final ScheduledExecutorService generalThreadPool; private final ScheduledExecutorService generalThreadPool;
@Getter @Getter
private final Map<String, Player> players = new HashMap<>(); private final List<Player> players = new ObjectArrayList<>();
/**
* Players that are transferring and are expected to rejoin on the Geyser side.
*/
@Getter
private final Cache<String, Player> transferringPlayers = CacheBuilder.newBuilder()
.expireAfterWrite(1, TimeUnit.MINUTES)
.build();
@Getter @Getter
private GeyserProxyBootstrap geyserProxy; private GeyserProxyBootstrap geyserProxy;
@ -88,10 +77,6 @@ public class MasterServer {
@Getter @Getter
private AbstractStorageManager storageManager; private AbstractStorageManager storageManager;
@Setter
@Getter
private long lastDisconnectTime = 0L;
@Getter @Getter
private final DefaultEventLoopGroup eventLoopGroup = new DefaultEventLoopGroup(new DefaultThreadFactory("Geyser player thread")); private final DefaultEventLoopGroup eventLoopGroup = new DefaultEventLoopGroup(new DefaultThreadFactory("Geyser player thread"));
@ -110,7 +95,8 @@ public class MasterServer {
logger.setDebug(geyserConnectConfig.isDebugMode()); 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 // Start a timer to keep the thread running
Timer timer = new Timer(); Timer timer = new Timer();
@ -156,10 +142,7 @@ public class MasterServer {
@Override @Override
public BedrockPong onQuery(InetSocketAddress address) { public BedrockPong onQuery(InetSocketAddress address) {
int playerCount = players.size(); int playerCount = players.size() + GeyserConnector.getInstance().getSessionManager().size();
if (GeyserConnector.getInstance() != null) {
playerCount += GeyserConnector.getInstance().getPlayers().size();
}
String subMotd = geyserConnectConfig.getSubmotd(); String subMotd = geyserConnectConfig.getSubmotd();
if (subMotd == null || subMotd.isEmpty()) { if (subMotd == null || subMotd.isEmpty()) {

View file

@ -60,7 +60,7 @@ import org.geysermc.cumulus.response.SimpleFormResponse;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.security.interfaces.ECPublicKey; import java.security.interfaces.ECPublicKey;
import java.util.ArrayList; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.TimeUnit; 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.getLogger().info(player.getAuthData().getName() + " has disconnected from the master server (" + reason + ")");
masterServer.getStorageManager().saveServers(player); masterServer.getStorageManager().saveServers(player);
if (player.getCurrentServer() != null && !player.getCurrentServer().isBedrock()) { masterServer.getPlayers().remove(player);
masterServer.getTransferringPlayers().put(player.getAuthData().getXboxUUID(), player);
}
masterServer.getPlayers().remove(player.getAuthData().getXboxUUID(), player);
} }
} }
@ -181,7 +178,7 @@ public class PacketHandler implements BedrockPacketHandler {
// Create a new player and add it to the players list // Create a new player and add it to the players list
player = new Player(authData, session); player = new Player(authData, session);
masterServer.getPlayers().put(player.getAuthData().getXboxUUID(), player); masterServer.getPlayers().add(player);
// Store the full client data // Store the full client data
player.setClientData(OBJECT_MAPPER.convertValue(OBJECT_MAPPER.readTree(skinData.getPayload().toBytes()), BedrockClientData.class)); 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 // This is to fix a bug in the client where it doesn't load form images
UpdateAttributesPacket updateAttributesPacket = new UpdateAttributesPacket(); UpdateAttributesPacket updateAttributesPacket = new UpdateAttributesPacket();
updateAttributesPacket.setRuntimeEntityId(1); updateAttributesPacket.setRuntimeEntityId(1);
List<AttributeData> attributes = new ArrayList<>(); List<AttributeData> attributes = Collections.singletonList(GeyserAttributeType.EXPERIENCE_LEVEL.getAttribute(0f));
attributes.add(GeyserAttributeType.EXPERIENCE_LEVEL.getAttribute(0f));
updateAttributesPacket.setAttributes(attributes); updateAttributesPacket.setAttributes(attributes);
// Doesn't work 100% of the time but fixes it most of the time // Doesn't work 100% of the time but fixes it most of the time

View file

@ -230,6 +230,9 @@ public class Player {
} else { } else {
GeyserProxySession geyserSession = new GeyserProxySession(GeyserConnector.getInstance(), session, MasterServer.getInstance().getEventLoopGroup().next()); GeyserProxySession geyserSession = new GeyserProxySession(GeyserConnector.getInstance(), session, MasterServer.getInstance().getEventLoopGroup().next());
session.setPacketHandler(new UpstreamPacketHandler(GeyserConnector.getInstance(), geyserSession)); 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()); geyserSession.getUpstream().getSession().setPacketCodec(session.getPacketCodec());