1
0
mirror of https://github.com/GeyserMC/Floodgate.git synced 2025-12-19 23:09:27 +00:00

Floodgate now uses identity instead of xuid

This commit is contained in:
Tim203
2020-03-09 21:35:01 +01:00
parent 73173e2e46
commit da18e9b950
6 changed files with 24 additions and 27 deletions

View File

@@ -79,12 +79,12 @@ public class PacketHandler extends SimpleChannelInboundHandler<Object> {
if (bungee = (data.length == 6 || data.length == 7)) { if (bungee = (data.length == 6 || data.length == 7)) {
setValue(packet, hostField, data[0] + '\0' + setValue(packet, hostField, data[0] + '\0' +
bedrockData.getIp() + '\0' + fPlayer.getJavaUniqueId() + bedrockData.getIp() + '\0' + fPlayer.getBedrockId() +
(data.length == 7 ? '\0' + data[6] : "") (data.length == 7 ? '\0' + data[6] : "")
); );
} else { } else {
// Use a spoofedUUID for initUUID (just like Bungeecord) // 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 // Use the player his IP for stuff instead of Geyser his IP
SocketAddress newAddress = new InetSocketAddress( SocketAddress newAddress = new InetSocketAddress(
bedrockData.getIp(), bedrockData.getIp(),
@@ -92,14 +92,14 @@ public class PacketHandler extends SimpleChannelInboundHandler<Object> {
); );
setValue(networkManager, getFieldOfType(networkManagerClass, SocketAddress.class, false), newAddress); 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) { } else if (isLogin) {
if (!bungee) { if (!bungee) {
// we have to fake the offline player cycle // we have to fake the offline player cycle
Object loginListener = packetListenerField.get(networkManager); Object loginListener = packetListenerField.get(networkManager);
// Set the player his GameProfile // 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); setValue(loginListener, gameProfileField, gameProfile);
initUUIDMethod.invoke(loginListener); // LoginListener#initUUID initUUIDMethod.invoke(loginListener); // LoginListener#initUUID

View File

@@ -94,10 +94,10 @@ public class BungeePlugin extends Plugin implements Listener {
} }
FloodgatePlayer player = result.getFloodgatePlayer(); 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().setOnlineMode(false);
event.getConnection().setUniqueId(player.getJavaUniqueId()); event.getConnection().setUniqueId(player.getBedrockId());
ReflectionUtil.setValue(event.getConnection(), "name", player.getJavaUsername()); ReflectionUtil.setValue(event.getConnection(), "name", player.getJavaUsername());
Object channelWrapper = ReflectionUtil.getValue(event.getConnection(), "ch"); Object channelWrapper = ReflectionUtil.getValue(event.getConnection(), "ch");
@@ -121,8 +121,8 @@ public class BungeePlugin extends Plugin implements Listener {
public void onPlayerDisconnect(PlayerDisconnectEvent event) { public void onPlayerDisconnect(PlayerDisconnectEvent event) {
FloodgatePlayer player = FloodgateAPI.getPlayerByConnection(event.getPlayer().getPendingConnection()); FloodgatePlayer player = FloodgateAPI.getPlayerByConnection(event.getPlayer().getPendingConnection());
if (player != null) { if (player != null) {
FloodgateAPI.players.remove(player.getJavaUniqueId()); FloodgateAPI.players.remove(player.getBedrockId());
FloodgateAPI.removeEncryptedData(player.getJavaUniqueId()); FloodgateAPI.removeEncryptedData(player.getBedrockId());
System.out.println("Removed " + player.getUsername() + " " + event.getPlayer().getUniqueId()); System.out.println("Removed " + player.getUsername() + " " + event.getPlayer().getUniqueId());
} }
} }

View File

@@ -17,18 +17,20 @@ abstract class AbstractFloodgateAPI {
} }
/** /**
* Method to determine if the given <b>online</b> player is a bedrock player * Method to determine if the given player is a Bedrock player
* @param uuid The uuid of the <b>online</b> player * @param uuid The uuid of the player
* @return true if the given <b>online</b> player is a Bedrock player * @return true if the given player is a Bedrock player
*/ */
public static boolean isBedrockPlayer(UUID uuid) { 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) { public static boolean isJavaPlayer(UUID uuid) {
return new UUID(0, xuid); return uuid.version() == 4;
} }
} }

View File

@@ -21,9 +21,9 @@ public class FloodgatePlayer {
*/ */
private String javaUsername; 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 * The operation system of the bedrock client
*/ */
@@ -32,18 +32,13 @@ public class FloodgatePlayer {
* The language code of the bedrock client * The language code of the bedrock client
*/ */
private String languageCode; private String languageCode;
/**
* The Java UUID used to identify the bedrock client
*/
private UUID javaUniqueId;
FloodgatePlayer(BedrockData data) { FloodgatePlayer(BedrockData data) {
version = data.getVersion(); version = data.getVersion();
username = data.getUsername(); username = data.getUsername();
javaUsername = "*" + data.getUsername().substring(0, Math.min(data.getUsername().length(), 15)); javaUsername = "*" + data.getUsername().substring(0, Math.min(data.getUsername().length(), 15));
xuid = data.getXuid(); bedrockId = data.getBedrockId();
deviceOS = DeviceOS.getById(data.getDeviceId()); deviceOS = DeviceOS.getById(data.getDeviceId());
languageCode = data.getLanguageCode(); languageCode = data.getLanguageCode();
javaUniqueId = AbstractFloodgateAPI.createJavaPlayerId(Long.parseLong(data.getXuid()));
} }
} }

View File

@@ -41,7 +41,7 @@ public class HandshakeHandler {
} }
FloodgatePlayer player = new FloodgatePlayer(bedrockData); 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); return new HandshakeResult(ResultType.SUCCESS, data, bedrockData, player);
} catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) { } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace(); e.printStackTrace();

View File

@@ -105,9 +105,9 @@ public class VelocityPlugin {
} }
FloodgatePlayer player = result.getFloodgatePlayer(); 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); playerCache.put(event.getConnection(), player);
logger.info("Added " + player.getJavaUsername() + " " + player.getJavaUniqueId()); logger.info("Added " + player.getJavaUsername() + " " + player.getBedrockId());
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
@@ -159,7 +159,7 @@ public class VelocityPlugin {
FloodgatePlayer player = playerCache.getIfPresent(event.getConnection()); FloodgatePlayer player = playerCache.getIfPresent(event.getConnection());
if (player != null) { if (player != null) {
playerCache.invalidate(event.getConnection()); playerCache.invalidate(event.getConnection());
event.setGameProfile(new GameProfile(player.getJavaUniqueId(), player.getJavaUsername(), new ArrayList<>())); event.setGameProfile(new GameProfile(player.getBedrockId(), player.getJavaUsername(), new ArrayList<>()));
} }
} }