diff options
Diffstat (limited to 'Minecraft.Client/Minecraft.cpp')
| -rw-r--r-- | Minecraft.Client/Minecraft.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/Minecraft.Client/Minecraft.cpp b/Minecraft.Client/Minecraft.cpp index b87745f0..7ae206cf 100644 --- a/Minecraft.Client/Minecraft.cpp +++ b/Minecraft.Client/Minecraft.cpp @@ -52,6 +52,7 @@ #include "..\Minecraft.World\net.minecraft.world.level.dimension.h" #include "..\Minecraft.World\net.minecraft.world.item.h" #include "..\Minecraft.World\Minecraft.World.h" +#include "Windows64\Windows64_Xuid.h" #include "ClientConnection.h" #include "..\Minecraft.World\HellRandomLevelSource.h" #include "..\Minecraft.World\net.minecraft.world.entity.animal.h" @@ -1038,6 +1039,19 @@ shared_ptr<MultiplayerLocalPlayer> Minecraft::createExtraLocalPlayer(int idx, co PlayerUID playerXUIDOnline = INVALID_XUID; ProfileManager.GetXUID(idx,&playerXUIDOffline,false); ProfileManager.GetXUID(idx,&playerXUIDOnline,true); +#ifdef _WINDOWS64 + // Compatibility rule for Win64 id migration + // host keeps legacy host XUID, non-host uses persistent uid.dat XUID. + INetworkPlayer *localNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(idx); + if(localNetworkPlayer != NULL && localNetworkPlayer->IsHost()) + { + playerXUIDOffline = Win64Xuid::GetLegacyEmbeddedHostXuid(); + } + else + { + playerXUIDOffline = Win64Xuid::ResolvePersistentXuid(); + } +#endif localplayers[idx]->setXuid(playerXUIDOffline); localplayers[idx]->setOnlineXuid(playerXUIDOnline); localplayers[idx]->setIsGuest(ProfileManager.IsGuest(idx)); @@ -4299,6 +4313,19 @@ void Minecraft::setLevel(MultiPlayerLevel *level, int message /*=-1*/, shared_pt playerXUIDOnline.setForAdhoc(); } #endif +#ifdef _WINDOWS64 + // On Windows, the implementation has been changed to use a per-client pseudo XUID based on `uid.dat`. + // To maintain player data compatibility with existing worlds, the world host (the first player) will use the previous embedded pseudo XUID. + INetworkPlayer *localNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(iPrimaryPlayer); + if(localNetworkPlayer != NULL && localNetworkPlayer->IsHost()) + { + playerXUIDOffline = Win64Xuid::GetLegacyEmbeddedHostXuid(); + } + else + { + playerXUIDOffline = Win64Xuid::ResolvePersistentXuid(); + } +#endif player->setXuid(playerXUIDOffline); player->setOnlineXuid(playerXUIDOnline); @@ -4481,6 +4508,18 @@ void Minecraft::respawnPlayer(int iPad, int dimension, int newEntityId) PlayerUID playerXUIDOnline = INVALID_XUID; ProfileManager.GetXUID(iTempPad,&playerXUIDOffline,false); ProfileManager.GetXUID(iTempPad,&playerXUIDOnline,true); +#ifdef _WINDOWS64 + // Same compatibility rule as create/init paths. + INetworkPlayer *localNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(iTempPad); + if(localNetworkPlayer != NULL && localNetworkPlayer->IsHost()) + { + playerXUIDOffline = Win64Xuid::GetLegacyEmbeddedHostXuid(); + } + else + { + playerXUIDOffline = Win64Xuid::ResolvePersistentXuid(); + } +#endif player->setXuid(playerXUIDOffline); player->setOnlineXuid(playerXUIDOnline); player->setIsGuest( ProfileManager.IsGuest(iTempPad) ); |
