diff --git a/Minecraft.Client/Minecraft.cpp b/Minecraft.Client/Minecraft.cpp index 1a176fa1a..197d66836 100644 --- a/Minecraft.Client/Minecraft.cpp +++ b/Minecraft.Client/Minecraft.cpp @@ -1040,7 +1040,15 @@ shared_ptr Minecraft::createExtraLocalPlayer(int idx, co ProfileManager.GetXUID(idx,&playerXUIDOffline,false); ProfileManager.GetXUID(idx,&playerXUIDOnline,true); #ifdef _WINDOWS64 - playerXUIDOffline = Win64NameXuid::ResolvePersistentXuidFromName(localplayers[idx]->name); + INetworkPlayer *localNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(idx); + if(localNetworkPlayer != NULL && localNetworkPlayer->IsHost()) + { + playerXUIDOffline = Win64NameXuid::GetLegacyEmbeddedHostXuid(); + } + else + { + playerXUIDOffline = Win64NameXuid::ResolvePersistentXuidFromName(localplayers[idx]->name); + } #endif localplayers[idx]->setXuid(playerXUIDOffline); localplayers[idx]->setOnlineXuid(playerXUIDOnline); @@ -4301,7 +4309,15 @@ void Minecraft::setLevel(MultiPlayerLevel *level, int message /*=-1*/, shared_pt } #endif #ifdef _WINDOWS64 - playerXUIDOffline = Win64NameXuid::ResolvePersistentXuidFromName(player->name); + INetworkPlayer *localNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(iPrimaryPlayer); + if(localNetworkPlayer != NULL && localNetworkPlayer->IsHost()) + { + playerXUIDOffline = Win64NameXuid::GetLegacyEmbeddedHostXuid(); + } + else + { + playerXUIDOffline = Win64NameXuid::ResolvePersistentXuidFromName(player->name); + } #endif player->setXuid(playerXUIDOffline); player->setOnlineXuid(playerXUIDOnline); @@ -4486,7 +4502,15 @@ void Minecraft::respawnPlayer(int iPad, int dimension, int newEntityId) ProfileManager.GetXUID(iTempPad,&playerXUIDOffline,false); ProfileManager.GetXUID(iTempPad,&playerXUIDOnline,true); #ifdef _WINDOWS64 - playerXUIDOffline = Win64NameXuid::ResolvePersistentXuidFromName(player->name); + INetworkPlayer *localNetworkPlayer = g_NetworkManager.GetLocalPlayerByUserIndex(iTempPad); + if(localNetworkPlayer != NULL && localNetworkPlayer->IsHost()) + { + playerXUIDOffline = Win64NameXuid::GetLegacyEmbeddedHostXuid(); + } + else + { + playerXUIDOffline = Win64NameXuid::ResolvePersistentXuidFromName(player->name); + } #endif player->setXuid(playerXUIDOffline); player->setOnlineXuid(playerXUIDOnline); diff --git a/Minecraft.Client/PlayerList.cpp b/Minecraft.Client/PlayerList.cpp index 1810c152c..350cc7164 100644 --- a/Minecraft.Client/PlayerList.cpp +++ b/Minecraft.Client/PlayerList.cpp @@ -528,6 +528,13 @@ shared_ptr PlayerList::getPlayerForLogin(PendingConnection *pendin if (np != NULL) { player->setOnlineXuid(np->GetUID()); + + // Backward compatibility: when Minecraft.Client is hosting, keep the first + // host player on the legacy embedded host XUID (base + 0). + if (np->IsHost()) + { + player->setXuid(Win64NameXuid::GetLegacyEmbeddedHostXuid()); + } } } #endif diff --git a/Minecraft.Client/Windows64/Windows64_NameXuid.h b/Minecraft.Client/Windows64/Windows64_NameXuid.h index 5b3e8e1a4..2d6821d47 100644 --- a/Minecraft.Client/Windows64/Windows64_NameXuid.h +++ b/Minecraft.Client/Windows64/Windows64_NameXuid.h @@ -6,6 +6,17 @@ namespace Win64NameXuid { + inline PlayerUID GetLegacyEmbeddedBaseXuid() + { + return (PlayerUID)0xe000d45248242f2eULL; + } + + inline PlayerUID GetLegacyEmbeddedHostXuid() + { + // Legacy behavior used "embedded base + smallId"; host was always smallId 0. + return GetLegacyEmbeddedBaseXuid(); + } + /** * ## Resolves a persistent 64-bit player ID from the player's username. *