public async Task RemovePlayer(IConnection connection, Player player) { using (var alock = await Data.Synchronizer.SetStateAsync(ModuleState.Writing)) { var playerInfo = Data.ConnectionDic[connection.Id]; if (!playerInfo.PlayerDic.ContainsKey(player.Id)) { throw new PlayerRemovalException("Player " + player.Name + " does not belog to this connection!"); } if (player.IsMain) { log.Warn("failed to remove player " + player); throw new PlayerRemovalException("Main player can't be removed!"); } Data.RemovePlayer(player); playerInfo.PlayerDic.Remove(player.Id); await BroadcastMessage(Messages.PlayerRemoved(player)); log.Info("player removed " + player); } }
public override async Task HandleDisconnect(IConnection client) { using (var alock = await Data.Synchronizer.SetStateAsync(ModuleState.Writing)) { if (Data.IsSynchronized(client)) { var players = Data.ConnectionDic[client.Id].Players; Data.ConnectionDic.Remove(client.Id); List <Task> tasks = new List <Task>(); foreach (var p in players) { Data.RemovePlayer(p); tasks.Add(BroadcastMessage(Messages.PlayerRemoved(p))); } await Task.WhenAll(tasks); } } }