private void OnPlayerLeaveScene(ClientPlayerLeaveScenePacket packet) { // Destroy corresponding player _playerManager.DestroyPlayer(packet.Id); Logger.Info(this, $"Player {packet.Id} left scene, destroying player"); }
private void OnClientLeaveScene(ushort id, ServerPlayerLeaveScenePacket packet) { if (!_playerData.TryGetValue(id, out var playerData)) { Logger.Warn(this, $"Received LeaveScene packet from {id}, but player is not in mapping"); return; } var sceneName = playerData.CurrentScene; if (sceneName.Length == 0) { Logger.Info(this, $"Received LeaveScene packet from ID {id}, but there was no last scene registered"); return; } Logger.Info(this, $"Received LeaveScene packet from ID {id}, last scene: {sceneName}"); playerData.CurrentScene = ""; // Create a PlayerLeaveScene packet containing the ID // of the player leaving the scene var leaveScenePacket = new ClientPlayerLeaveScenePacket { Id = id }; leaveScenePacket.CreatePacket(); 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.Info(this, $"Sending leave scene packet to {idPlayerDataPair.Key}"); _netServer.SendTcp(idPlayerDataPair.Key, leaveScenePacket); } } }