/// <summary> /// Callback method for when a player leaves our scene. /// </summary> /// <param name="data">The generic client packet data.</param> private void OnPlayerLeaveScene(GenericClientData data) { var id = data.Id; Logger.Get().Info(this, $"Player {id} left scene"); if (!_playerData.TryGetValue(id, out var playerData)) { Logger.Get().Warn(this, $"Could not find player data for player with ID {id}"); return; } // Recycle corresponding player _playerManager.RecyclePlayer(id); playerData.IsInLocalScene = false; foreach (Transform child in playerData.PlayerObject.transform) { foreach (Transform grandChild in child) { Object.Destroy(grandChild.gameObject); } } try { PlayerLeaveSceneEvent?.Invoke(playerData); } catch (Exception e) { Logger.Get().Warn(this, $"Exception thrown while invoking PlayerLeaveScene event, {e.GetType()}, {e.Message}, {e.StackTrace}"); } }
/// <summary> /// Callback method for when a player leaves a scene. /// </summary> /// <param name="id">The ID of the player.</param> private void OnClientLeaveScene(ushort id) { if (!_playerData.TryGetValue(id, out var playerData)) { Logger.Get().Warn(this, $"Received LeaveScene data from {id}, but player is not in mapping"); return; } var sceneName = playerData.CurrentScene; if (sceneName.Length == 0) { Logger.Get().Info(this, $"Received LeaveScene data from ID {id}, but there was no last scene registered"); return; } Logger.Get().Info(this, $"Received LeaveScene data from ID {id}, last scene: {sceneName}"); playerData.CurrentScene = ""; foreach (var idPlayerDataPair in _playerData.GetCopy()) { // Skip source player if (idPlayerDataPair.Key == id) { continue; } var otherPlayerData = idPlayerDataPair.Value; // Send the packet to all clients on the scene that the player left // to indicate that this client has left their scene if (otherPlayerData.CurrentScene.Equals(sceneName)) { Logger.Get().Info(this, $"Sending leave scene packet to {idPlayerDataPair.Key}"); _netServer.GetUpdateManagerForClient(idPlayerDataPair.Key)?.AddPlayerLeaveSceneData(id); } } try { PlayerLeaveSceneEvent?.Invoke(playerData); } catch (Exception e) { Logger.Get().Warn(this, $"Exception thrown while invoking PlayerLeaveScene event, {e.GetType()}, {e.Message}, {e.StackTrace}"); } }