mirror of
https://github.com/smartcmd/MinecraftConsoles.git
synced 2026-08-20 09:57:09 +00:00
fix: preserve legacy host xuid (base xuid + 0) for existing world compatibility
- Add legacy embedded host XUID helper (base + 0). - When Minecraft.Client is hosting, force only the first host player to use legacy host XUID. - Keep name-based XUID for non-host players. - Prevent old singleplayer/hosted worlds from losing/mismatching host player data.
This commit is contained in:
parent
f8cbd4f844
commit
a0f75679c1
|
|
@ -1040,7 +1040,15 @@ shared_ptr<MultiplayerLocalPlayer> 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);
|
||||
|
|
|
|||
|
|
@ -528,6 +528,13 @@ shared_ptr<ServerPlayer> 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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in a new issue