aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Minecraft.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.Client/Minecraft.cpp')
-rw-r--r--Minecraft.Client/Minecraft.cpp39
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) );