diff --git a/bukkit/src/main/java/org/geysermc/floodgate/PacketHandler.java b/bukkit/src/main/java/org/geysermc/floodgate/PacketHandler.java index 48503617..260fcb5d 100644 --- a/bukkit/src/main/java/org/geysermc/floodgate/PacketHandler.java +++ b/bukkit/src/main/java/org/geysermc/floodgate/PacketHandler.java @@ -79,12 +79,12 @@ public class PacketHandler extends SimpleChannelInboundHandler { if (bungee = (data.length == 6 || data.length == 7)) { setValue(packet, hostField, data[0] + '\0' + - bedrockData.getIp() + '\0' + fPlayer.getJavaUniqueId() + + bedrockData.getIp() + '\0' + fPlayer.getBedrockId() + (data.length == 7 ? '\0' + data[6] : "") ); } else { // Use a spoofedUUID for initUUID (just like Bungeecord) - setValue(networkManager, "spoofedUUID", fPlayer.getJavaUniqueId()); + setValue(networkManager, "spoofedUUID", fPlayer.getBedrockId()); // Use the player his IP for stuff instead of Geyser his IP SocketAddress newAddress = new InetSocketAddress( bedrockData.getIp(), @@ -92,14 +92,14 @@ public class PacketHandler extends SimpleChannelInboundHandler { ); setValue(networkManager, getFieldOfType(networkManagerClass, SocketAddress.class, false), newAddress); } - plugin.getLogger().info("Added " + fPlayer.getJavaUsername() + " " + fPlayer.getJavaUniqueId()); + plugin.getLogger().info("Added " + fPlayer.getJavaUsername() + " " + fPlayer.getBedrockId()); } else if (isLogin) { if (!bungee) { // we have to fake the offline player cycle Object loginListener = packetListenerField.get(networkManager); // Set the player his GameProfile - Object gameProfile = gameProfileConstructor.newInstance(fPlayer.getJavaUniqueId(), fPlayer.getJavaUsername()); + Object gameProfile = gameProfileConstructor.newInstance(fPlayer.getBedrockId(), fPlayer.getJavaUsername()); setValue(loginListener, gameProfileField, gameProfile); initUUIDMethod.invoke(loginListener); // LoginListener#initUUID diff --git a/bungee/src/main/java/org/geysermc/floodgate/BungeePlugin.java b/bungee/src/main/java/org/geysermc/floodgate/BungeePlugin.java index b15f2bbe..f4353729 100644 --- a/bungee/src/main/java/org/geysermc/floodgate/BungeePlugin.java +++ b/bungee/src/main/java/org/geysermc/floodgate/BungeePlugin.java @@ -94,10 +94,10 @@ public class BungeePlugin extends Plugin implements Listener { } FloodgatePlayer player = result.getFloodgatePlayer(); - FloodgateAPI.addEncryptedData(player.getJavaUniqueId(), result.getHandshakeData()[2] + '\0' + result.getHandshakeData()[3]); + FloodgateAPI.addEncryptedData(player.getBedrockId(), result.getHandshakeData()[2] + '\0' + result.getHandshakeData()[3]); event.getConnection().setOnlineMode(false); - event.getConnection().setUniqueId(player.getJavaUniqueId()); + event.getConnection().setUniqueId(player.getBedrockId()); ReflectionUtil.setValue(event.getConnection(), "name", player.getJavaUsername()); Object channelWrapper = ReflectionUtil.getValue(event.getConnection(), "ch"); @@ -121,8 +121,8 @@ public class BungeePlugin extends Plugin implements Listener { public void onPlayerDisconnect(PlayerDisconnectEvent event) { FloodgatePlayer player = FloodgateAPI.getPlayerByConnection(event.getPlayer().getPendingConnection()); if (player != null) { - FloodgateAPI.players.remove(player.getJavaUniqueId()); - FloodgateAPI.removeEncryptedData(player.getJavaUniqueId()); + FloodgateAPI.players.remove(player.getBedrockId()); + FloodgateAPI.removeEncryptedData(player.getBedrockId()); System.out.println("Removed " + player.getUsername() + " " + event.getPlayer().getUniqueId()); } } diff --git a/common/src/main/java/org/geysermc/floodgate/AbstractFloodgateAPI.java b/common/src/main/java/org/geysermc/floodgate/AbstractFloodgateAPI.java index 8add34f1..5725fecc 100644 --- a/common/src/main/java/org/geysermc/floodgate/AbstractFloodgateAPI.java +++ b/common/src/main/java/org/geysermc/floodgate/AbstractFloodgateAPI.java @@ -17,18 +17,20 @@ abstract class AbstractFloodgateAPI { } /** - * Method to determine if the given online player is a bedrock player - * @param uuid The uuid of the online player - * @return true if the given online player is a Bedrock player + * Method to determine if the given player is a Bedrock player + * @param uuid The uuid of the player + * @return true if the given player is a Bedrock player */ public static boolean isBedrockPlayer(UUID uuid) { - return players.containsKey(uuid); + return uuid.version() == 3; } /** - * Create a valid Java player uuid of a xuid + * Method to determine if the given player is a Java player + * @param uuid The uuid of the player + * @return true if the given player is a Bedrock player */ - public static UUID createJavaPlayerId(long xuid) { - return new UUID(0, xuid); + public static boolean isJavaPlayer(UUID uuid) { + return uuid.version() == 4; } } diff --git a/common/src/main/java/org/geysermc/floodgate/FloodgatePlayer.java b/common/src/main/java/org/geysermc/floodgate/FloodgatePlayer.java index 2273b9f0..7f6a4398 100644 --- a/common/src/main/java/org/geysermc/floodgate/FloodgatePlayer.java +++ b/common/src/main/java/org/geysermc/floodgate/FloodgatePlayer.java @@ -21,9 +21,9 @@ public class FloodgatePlayer { */ private String javaUsername; /** - * The Xbox Unique Identifier + * The Unique Identifier of the Bedrock client. */ - private String xuid; + private UUID bedrockId; /** * The operation system of the bedrock client */ @@ -32,18 +32,13 @@ public class FloodgatePlayer { * The language code of the bedrock client */ private String languageCode; - /** - * The Java UUID used to identify the bedrock client - */ - private UUID javaUniqueId; FloodgatePlayer(BedrockData data) { version = data.getVersion(); username = data.getUsername(); javaUsername = "*" + data.getUsername().substring(0, Math.min(data.getUsername().length(), 15)); - xuid = data.getXuid(); + bedrockId = data.getBedrockId(); deviceOS = DeviceOS.getById(data.getDeviceId()); languageCode = data.getLanguageCode(); - javaUniqueId = AbstractFloodgateAPI.createJavaPlayerId(Long.parseLong(data.getXuid())); } } diff --git a/common/src/main/java/org/geysermc/floodgate/HandshakeHandler.java b/common/src/main/java/org/geysermc/floodgate/HandshakeHandler.java index 2cb71ebe..ce47769c 100644 --- a/common/src/main/java/org/geysermc/floodgate/HandshakeHandler.java +++ b/common/src/main/java/org/geysermc/floodgate/HandshakeHandler.java @@ -41,7 +41,7 @@ public class HandshakeHandler { } FloodgatePlayer player = new FloodgatePlayer(bedrockData); - AbstractFloodgateAPI.players.put(player.getJavaUniqueId(), player); + AbstractFloodgateAPI.players.put(player.getBedrockId(), player); return new HandshakeResult(ResultType.SUCCESS, data, bedrockData, player); } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) { e.printStackTrace(); diff --git a/velocity/src/main/java/org/geysermc/floodgate/VelocityPlugin.java b/velocity/src/main/java/org/geysermc/floodgate/VelocityPlugin.java index 8076a515..696e0434 100644 --- a/velocity/src/main/java/org/geysermc/floodgate/VelocityPlugin.java +++ b/velocity/src/main/java/org/geysermc/floodgate/VelocityPlugin.java @@ -105,9 +105,9 @@ public class VelocityPlugin { } FloodgatePlayer player = result.getFloodgatePlayer(); - FloodgateAPI.addEncryptedData(player.getJavaUniqueId(), result.getHandshakeData()[2] + '\0' + result.getHandshakeData()[3]); + FloodgateAPI.addEncryptedData(player.getBedrockId(), result.getHandshakeData()[2] + '\0' + result.getHandshakeData()[3]); playerCache.put(event.getConnection(), player); - logger.info("Added " + player.getJavaUsername() + " " + player.getJavaUniqueId()); + logger.info("Added " + player.getJavaUsername() + " " + player.getBedrockId()); } catch (Exception e) { e.printStackTrace(); } finally { @@ -159,7 +159,7 @@ public class VelocityPlugin { FloodgatePlayer player = playerCache.getIfPresent(event.getConnection()); if (player != null) { playerCache.invalidate(event.getConnection()); - event.setGameProfile(new GameProfile(player.getJavaUniqueId(), player.getJavaUsername(), new ArrayList<>())); + event.setGameProfile(new GameProfile(player.getBedrockId(), player.getJavaUsername(), new ArrayList<>())); } }