diff --git a/game/Assets/Scripts/Network/NetworkManager.cs b/game/Assets/Scripts/Network/NetworkManager.cs index fcdaefa..c245846 100644 --- a/game/Assets/Scripts/Network/NetworkManager.cs +++ b/game/Assets/Scripts/Network/NetworkManager.cs @@ -334,8 +334,8 @@ public class NetworkManager : MonoBehaviour private void OnRoomLeave(int code) { Debug.Log($"[Network] Left room (code: {code})"); + OnDisconnected?.Invoke(); // before Cleanup so listeners still have LocalPlayerName Cleanup(); - OnDisconnected?.Invoke(); } private void Cleanup() diff --git a/game/Assets/Scripts/Stats/StatsTracker.cs b/game/Assets/Scripts/Stats/StatsTracker.cs index b23d8bc..def13ff 100644 --- a/game/Assets/Scripts/Stats/StatsTracker.cs +++ b/game/Assets/Scripts/Stats/StatsTracker.cs @@ -32,6 +32,7 @@ public class StatsTracker : MonoBehaviour private Vector3 _lastPos; private bool _trackingActive; + private string _cachedName = ""; private PlayerController _pc; private Rigidbody _rb; @@ -119,6 +120,7 @@ public class StatsTracker : MonoBehaviour private void OnConnected() { + _cachedName = NetworkManager.Instance?.LocalPlayerName ?? ""; _lastPos = transform.position; _trackingActive = true; } @@ -163,9 +165,13 @@ public class StatsTracker : MonoBehaviour private void SendStats() { + // Prefer live name, fall back to cached (useful on disconnect where name is cleared) var nm = NetworkManager.Instance; - if (nm == null || string.IsNullOrEmpty(nm.LocalPlayerName)) return; - StartCoroutine(DoSendStats(nm.LocalPlayerName)); + string name = (nm != null && !string.IsNullOrEmpty(nm.LocalPlayerName)) + ? nm.LocalPlayerName + : _cachedName; + if (string.IsNullOrEmpty(name)) return; + StartCoroutine(DoSendStats(name)); } private IEnumerator DoSendStats(string playerName)