public async Task Process(JoinBattle join) { if (!IsLoggedIn) { return; } if (MyBattle != null) { await Respond("You are already in other battle"); return; } Battle battle; if (state.Battles.TryGetValue(join.BattleID, out battle)) { if (battle.IsPassworded && battle.Password != join.Password) { await Respond("Invalid password"); return; } var ubs = new UserBattleStatus(Name, User); if (battle.Users.Values.Count(x => !x.IsSpectator) >= battle.MaxPlayers) { ubs.IsSpectator = true; } battle.Users[Name] = ubs; MyBattle = battle; await state.Broadcast(state.ConnectedUsers.Values, new JoinedBattle() { BattleID = battle.BattleID, User = Name }); await RecalcSpectators(battle); await state.Broadcast(battle.Users.Keys.Where(x => x != Name), battle.Users[Name].ToUpdateBattleStatus());// send my UBS to others in battle foreach (var u in battle.Users.Values.Select(x => x.ToUpdateBattleStatus()).ToList()) { await SendCommand(u); // send other's status to self } foreach (var u in battle.Bots.Values.Select(x => x.ToUpdateBotStatus()).ToList()) { await SendCommand(u); } foreach (var u in battle.Rectangles) { await SendCommand(new SetRectangle() { Number = u.Key, Rectangle = u.Value }); } await SendCommand(new SetModOptions() { Options = battle.ModOptions }); } }
async Task Process(JoinBattle join) { if (!IsLoggedIn) { return; } if (MyBattle != null) { await Respond("You are already in other battle"); return; } Battle battle; if (state.Battles.TryGetValue(join.BattleID, out battle)) { if (battle.IsPassworded && battle.Password != join.Password) { await Respond("Invalid password"); return; } battle.Users[Name] = new UserBattleStatus(Name, User); MyBattle = battle; await Broadcast(state.Clients.Values, new JoinedBattle() { BattleID = battle.BattleID, User = Name }, Name); await RecalcSpectators(battle); foreach (var u in battle.Users.Values.Select(x => x.ToUpdateBattleStatus()).ToList()) { await SendCommand(u); } foreach (var u in battle.Bots.Values.Select(x => x.ToUpdateBotStatus()).ToList()) { await SendCommand(u); } foreach (var u in battle.Rectangles) { await SendCommand(new SetRectangle() { Number = u.Key, Rectangle = u.Value }); } await SendCommand(new SetModOptions() { Options = battle.ModOptions }); } }
public async Task Process(JoinBattle join) { if (!IsLoggedIn) { return; } ServerBattle battle; if (server.Battles.TryGetValue(join.BattleID, out battle)) { await battle.ProcessPlayerJoin(this, join.Password); } }