UPdate
This commit is contained in:
@@ -301,6 +301,17 @@ namespace Hallucinate.UI
|
||||
_spawnedCharacters.Remove(player);
|
||||
}
|
||||
|
||||
// Logic Reassign Leader (Logical)
|
||||
if (runner.IsServer && PlayerDataManager.Instance != null && PlayerDataManager.Instance.Leader == player)
|
||||
{
|
||||
var nextLeader = runner.ActivePlayers.FirstOrDefault();
|
||||
if (nextLeader != PlayerRef.None)
|
||||
{
|
||||
PlayerDataManager.Instance.Leader = nextLeader;
|
||||
Debug.Log($"[BasicSpawner] Leader left. New logical leader: {nextLeader}");
|
||||
}
|
||||
}
|
||||
|
||||
if (runner.IsServer && player == runner.LocalPlayer)
|
||||
{
|
||||
runner.Shutdown();
|
||||
@@ -319,6 +330,13 @@ namespace Hallucinate.UI
|
||||
return;
|
||||
}
|
||||
|
||||
// Nếu đang trong quá trình Host Migration, đừng quay về menu
|
||||
if (shutdownReason == ShutdownReason.HostMigration)
|
||||
{
|
||||
Debug.Log("[BasicSpawner] Shutdown due to Host Migration. Waiting for recovery...");
|
||||
return;
|
||||
}
|
||||
|
||||
if (UIManager.Instance != null)
|
||||
{
|
||||
UIManager.Instance.OnBackToMenu();
|
||||
@@ -354,7 +372,34 @@ namespace Hallucinate.UI
|
||||
public void OnObjectExitAOI(NetworkRunner runner, NetworkObject obj, PlayerRef player) { }
|
||||
public void OnObjectEnterAOI(NetworkRunner runner, NetworkObject obj, PlayerRef player) { }
|
||||
public void OnCustomAuthenticationResponse(NetworkRunner runner, Dictionary<string, object> data) { }
|
||||
public void OnHostMigration(NetworkRunner runner, HostMigrationToken hostMigrationToken) { }
|
||||
|
||||
public async void OnHostMigration(NetworkRunner runner, HostMigrationToken hostMigrationToken)
|
||||
{
|
||||
Debug.Log("[BasicSpawner] OnHostMigration triggered!");
|
||||
|
||||
// 1. Shutdown existing runner properly
|
||||
await runner.Shutdown(false);
|
||||
|
||||
// 2. Create new runner
|
||||
await EnsureRunnerExists();
|
||||
|
||||
// 3. Restart as new Host/Server using the migration token
|
||||
var result = await _runner.StartGame(new StartGameArgs()
|
||||
{
|
||||
HostMigrationToken = hostMigrationToken,
|
||||
SceneManager = gameObject.GetComponent<NetworkSceneManagerDefault>() ?? gameObject.AddComponent<NetworkSceneManagerDefault>()
|
||||
});
|
||||
|
||||
if (result.Ok)
|
||||
{
|
||||
Debug.Log("[BasicSpawner] Host Migration SUCCESSFUL");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError($"[BasicSpawner] Host Migration FAILED: {result.ShutdownReason}");
|
||||
UIManager.Instance?.OnBackToMenu();
|
||||
}
|
||||
}
|
||||
|
||||
public void OnSceneLoadDone(NetworkRunner runner)
|
||||
{
|
||||
|
||||
@@ -16,12 +16,19 @@ public class PlayerDataManager : NetworkBehaviour
|
||||
|
||||
[Networked]
|
||||
public NetworkDictionary<PlayerRef, _PlayerMetaData> Players => default;
|
||||
|
||||
[Networked]
|
||||
public PlayerRef Leader { get; set; }
|
||||
|
||||
public event Action<PlayerRef, string> OnChatMessageReceived;
|
||||
|
||||
public override void Spawned()
|
||||
{
|
||||
Instance = this;
|
||||
if (Object.HasStateAuthority)
|
||||
{
|
||||
Leader = Runner.LocalPlayer;
|
||||
}
|
||||
}
|
||||
|
||||
public override void Despawned(NetworkRunner runner, bool hasState)
|
||||
@@ -29,6 +36,15 @@ public class PlayerDataManager : NetworkBehaviour
|
||||
if (Instance == this) Instance = null;
|
||||
}
|
||||
|
||||
[Rpc(RpcSources.All, RpcTargets.StateAuthority)]
|
||||
public void RPC_TransferLeader(PlayerRef newLeader)
|
||||
{
|
||||
if (Players.ContainsKey(newLeader))
|
||||
{
|
||||
Leader = newLeader;
|
||||
}
|
||||
}
|
||||
|
||||
[Rpc(RpcSources.All, RpcTargets.StateAuthority)]
|
||||
public void RPC_UpdatePlayerMetaData(PlayerRef playerRef, _PlayerMetaData metaData)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user