static void OnPlayerRemoved(ref PlayerRemoveMsg msg, MyNetworkClient sender)
        {
            var playerId = new MyPlayer.PlayerId(msg.ClientSteamId, msg.PlayerSerialId);
            Debug.Assert(Sync.Players.m_players.ContainsKey(playerId));

            if (msg.ClientSteamId == Sync.MyId)
                Sync.Players.RaiseLocalPlayerRemoved(msg.PlayerSerialId);

            Sync.Players.RemovePlayerFromDictionary(playerId);
        }
        public void RemovePlayer(MyPlayer player)
        {
            if (Sync.IsServer)
            {
                if (player.Controller.ControlledEntity != null)
                {
                    foreach (var controlEntry in m_controlledEntities)
                    {
                        if (controlEntry.Value != player.Id) continue;
                        if (controlEntry.Key == player.Controller.ControlledEntity.Entity.EntityId) continue;

                        m_controlledEntities.Remove(controlEntry.Key);
                    }
                    m_controlledEntities.ApplyRemovals();
                    player.Controller.TakeControl(null);
                }

                if (player.Character != null)
                {
                    //Dont remove character if he's sleeping in a cryo chamber
                    if (!(player.Character.Parent is Sandbox.Game.Entities.Blocks.MyCryoChamber))
                    {
                        player.Character.SyncObject.SendCloseRequest();
                    }
                }

                KillPlayer(player);

                if (player.IsLocalPlayer())
                   RaiseLocalPlayerRemoved(player.Id.SerialId);
                if (PlayerRemoved != null)
                    PlayerRemoved(player.Id);

                player.CloseRespawnShip();

                var msg = new PlayerRemoveMsg();
                msg.ClientSteamId = player.Id.SteamId;
                msg.PlayerSerialId = player.Id.SerialId;
                Sync.Layer.SendMessageToAll(ref msg, MyTransportMessageEnum.Success);

                RemovePlayerFromDictionary(player.Id);
            }
            else
            {
                Debug.Assert(player.IsLocalPlayer(), "Client can only remove local players!");
                if (player.IsRemotePlayer()) return;

                var msg = new PlayerRemoveMsg();
                msg.ClientSteamId = player.Id.SteamId;
                msg.PlayerSerialId = player.Id.SerialId;
                Sync.Layer.SendMessageToServer(ref msg, MyTransportMessageEnum.Request);
            }
        }
        static void OnPlayerRemoveRequest(ref PlayerRemoveMsg msg, MyNetworkClient sender)
        {
            Debug.Assert(msg.ClientSteamId == sender.SteamUserId, "A client requests removal of different client's player. That's not allowed!");
            if (msg.ClientSteamId != sender.SteamUserId) return;

            var player = Sync.Players.TryGetPlayerById(new PlayerId(msg.ClientSteamId, msg.PlayerSerialId));
            Debug.Assert(player != null, "Could not find a player to remove!");
            if (player == null) return;

            Sync.Players.RemovePlayer(player);
        }
        public void RemovePlayer(MyPlayer player, bool removeCharacter = true)
        {
            if (Sync.IsServer)
            {
                if (removeCharacter && player.Character != null)
                {
                    //Dont remove character if he's sleeping in a cryo chamber
                    if (!(player.Character.Parent is Sandbox.Game.Entities.Blocks.MyCryoChamber))
                    {
                        player.Character.SyncObject.SendCloseRequest();
                    }
                }

                KillPlayer(player);

                if (player.IsLocalPlayer)
                    RaiseLocalPlayerRemoved(player.Id.SerialId);
                if (PlayerRemoved != null)
                    PlayerRemoved(player.Id);

                RespawnComponent.AfterRemovePlayer(player);

                var msg = new PlayerRemoveMsg();
                msg.ClientSteamId = player.Id.SteamId;
                msg.PlayerSerialId = player.Id.SerialId;
                Sync.Layer.SendMessageToAll(ref msg, MyTransportMessageEnum.Success);

                RemovePlayerFromDictionary(player.Id);
            }
            else
            {
                Debug.Assert(player.IsLocalPlayer, "Client can only remove local players!");
                if (player.IsRemotePlayer) return;

                var msg = new PlayerRemoveMsg();
                msg.ClientSteamId = player.Id.SteamId;
                msg.PlayerSerialId = player.Id.SerialId;
                msg.RemoveCharacter = removeCharacter;
                Sync.Layer.SendMessageToServer(ref msg, MyTransportMessageEnum.Request);
            }
        }