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); } }