示例#1
0
        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);
            }
        }
示例#2
0
        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);
                }
            }
        }