Class Profileable.PlayerProfileable

All Implemented Interfaces:
Profileable
Enclosing interface:
Profileable

@Internal public static final class Profileable.PlayerProfileable extends TimedCacheableProfileable

Bedrock Players

We need to support hybrid server software like Geyser that has their own way of calculating the UUID. This will be problematic for Bedrock players as their UUID system is completely different. To obtain a Bedrock player's Floodgate UUID (whether the server is offline/online):
  1. Strip the username prefix (a dot by default.)
  2. Go to www.cxkes.me and search their username.
  3. You'll see that Bedrock players use an XUID which is their unique Xbox Live account ID.
  4. For the UUID, you need to take their XUID in the HEX format not DEC.
  5. Now their fake UUID (or more specifically Floodgate UUID) will be their XUID with leading zeros to fill the rest of the UUID characters.
So for example, a player named Martinacasas234 with XUID 2535442111844868 (DEC):

     XUID (HEX):                    0009 01F89E6CD204
     UUID:       00000000-0000-0000-0009-01f89e6cd204
 
Alternatively, you could get the calculated UUID directly from mcprofile.io. This is also mentioned in Geyser's FAQ. Trying to look up this UUID from Mojang's API or other third-party Java Edition online lookup tools will not work, obviously.

Note that their skin texture URL still follow the textures.minecraft.net URL.

These services themselves don't make a direct API request to Xbox/Microsoft services since this specific information (converting gamertag -> XUID) is a lengthy process. You can read more about it in this StackOverflow question and this den.dev blog post. The client iself is sending the XUID to the server along with the gamertag, which means we would need to add direct support for Geyser:

               io.netty
                   ↓
     CloudburstMC's packet encoder
                   ↓
     Geyser's UpstreamPacketHandler#handle(LoginPacket)Geyser's LoginEncryptionUtilsCloudburstMC's EncryptionUtils#validateChainCloudburstMC's ChainValidationResult#identityClaims
 



China's NetEase

This is unrelated to Minecraft: China Edition. For Java edition, NetEase (company associated with contributing to Minecraft: China Edition development) has its own authentication system instead of Mojang's Yggdrasil and its own private Forge mod for handling GameProfiles. The GameProfile in the server doesn't seem to contain any texture URL but it seems like the mod itself handles the skin by sending a request (private information) and retrieving the skin directly from the client itself using the username/UUID only. Their UUID implementation is custom and the algorithm is private information.


Solution?

So the solution to all of this would be to make use of the newer PlayerProfile when available and defaulting back to the provided GameProfile from the CraftBukkit instance directly using a system property.
  • Constructor Details

    • PlayerProfileable

      public PlayerProfileable(org.bukkit.OfflinePlayer player)
  • Method Details