void CreateSlave(List <UserBattleStatus> team, List <UserBattleStatus> spectators) { var eloTopTwo = team.OrderByDescending(x => x.LobbyUser.EffectiveElo).Take(2).ToList(); var title = string.Format("QuickMatch {0} {1} vs {2}", tas.MyBattle.QueueName, eloTopTwo[0], eloTopTwo[1]); var exited = false; var slave = Program.main.SpawnAutoHost(ah.config, new SpawnConfig(tas.UserName) { Engine = tas.MyBattle.EngineVersion, Mod = tas.MyBattle.ModName, Map = tas.MyBattle.MapName, Title = title, MaxPlayers = ah.config.MaxPlayers }); slave.spring.SpringExited += (sender, args) => { exited = true; CheckAutoCloseSlave(exited, slave); }; // remove after spring exits //slave.tas.MyBattleStarted += (sender, args) => slave.tas.ChangeLock(true); // lock running game slave.tas.BattleUserLeft += (sender, args) => { if (args.BattleID == slave.tas.MyBattleID) { CheckAutoCloseSlave(exited, slave); } }; slave.tas.BattleUserStatusChanged += (sender, args) => CheckAutoCloseSlave(exited, slave); slave.tas.BattleOpened += (sender, args) => new Thread(() => { Thread.Sleep(200); foreach (var u in team) { tas.ForceJoinBattle(u.Name, slave.tas.MyBattleID); } if (spectators != null) { foreach (var s in spectators) { tas.ForceJoinBattle(s.Name, slave.tas.MyBattleID); } } Thread.Sleep(4000); SlaveStartSpring(slave, team); ah.ComMap(TasSayEventArgs.Default, new string[] { }); }).Start(); slave.Start(); }
void tas_Said(object sender, TasSayEventArgs e) { if (e.UserName.Contains("Nightwatch")) { return; } if (e.Place == SayPlace.User) { if (e.Text.StartsWith("!move")) { var db = new ZkDataContext(); var acc = db.Accounts.Find(tas.ExistingUsers[e.UserName].AccountID); if (acc.IsZeroKAdmin) { var parts = e.Text.Split(' '); if (parts.Length != 3) { tas.Say(SayPlace.User, e.UserName, "!move [from] [to]", false); } else { var from = tas.ExistingBattles.Values.FirstOrDefault(x => x.Founder.Name == parts[1]); var to = tas.ExistingBattles.Values.FirstOrDefault(x => x.Founder.Name == parts[2]); if (from != null && to != null) { foreach (var b in from.Users.Values) { if (!b.LobbyUser.IsInGame && b.Name != from.Founder.Name) { tas.ForceJoinBattle(b.Name, to.BattleID); } } } else { tas.Say(SayPlace.User, e.UserName, "Not a valid battle host name", false); } } } } // split players evenly into two games by median elo -> expand to specify proportion to shunt? // TODO: split players and specs separately else if (e.Text.StartsWith("!splitplayers")) { var db = new ZkDataContext(); var acc = db.Accounts.Find(tas.ExistingUsers[e.UserName].AccountID); if (acc.IsZeroKAdmin) { var parts = e.Text.Split(' '); if (parts.Length != 3) { tas.Say(SayPlace.User, e.UserName, "!splitplayers [from] [to]", false); } else { var from = tas.ExistingBattles.Values.FirstOrDefault(x => x.Founder.Name == parts[1]); var to = tas.ExistingBattles.Values.FirstOrDefault(x => x.Founder.Name == parts[2]); if (from != null && to != null) { var list = from.Users.Values.Where(x => !x.LobbyUser.IsInGame && x.Name != from.Founder.Name && !x.IsSpectator).OrderBy(x => x.LobbyUser.EffectiveElo); var toMove = list.Take(list.Count() / 2); foreach (var b in toMove) { tas.ForceJoinBattle(b.Name, to.BattleID); } } else { tas.Say(SayPlace.User, e.UserName, "Not a valid battle host name", false); } } } } } }
public void AcceptChallenge() { if (missedDefenseFactionID == Challenge.OwnerFactionID) { missedDefenseCount = 0; missedDefenseFactionID = 0; } Battle emptyHost = tas.ExistingBattles.Values.FirstOrDefault( x => !x.IsInGame && x.Founder.Name.TrimNumbers() == pwHostName && x.Users.All(y => y.IsSpectator || y.Name == x.Founder.Name)); if (emptyHost != null) { var targetHost = emptyHost.Founder.Name; RunningBattles[targetHost] = Challenge; tas.Say(TasClient.SayPlace.User, targetHost, "!map " + Challenge.Map, false); Thread.Sleep(500); foreach (string x in Challenge.Attackers) { tas.ForceJoinBattle(x, emptyHost.BattleID); } foreach (string x in Challenge.Defenders) { tas.ForceJoinBattle(x, emptyHost.BattleID); } // move spectators to battle var pwSpec = FindPwSpecHost(); var bat = tas.ExistingBattles.Values.FirstOrDefault(x => x.Founder.Name == pwSpec); if (bat != null) { foreach (var b in bat.Users.Where(x => x.Name != pwSpec)) { tas.ForceJoinBattle(b.Name, targetHost); } } var text = string.Format("Battle for planet {0} starts on spring://@join_player:{1} Roster: {2} vs {3}", Challenge.Name, targetHost, string.Join(",", Challenge.Attackers), string.Join(",", Challenge.Defenders)); foreach (var fac in factions) { tas.Say(TasClient.SayPlace.Channel, fac.Shortcut, text, true); } Utils.StartAsync(() => { Thread.Sleep(6000); tas.Say(TasClient.SayPlace.User, targetHost, "!balance", false); Thread.Sleep(1000); tas.Say(TasClient.SayPlace.User, targetHost, "!endvote", false); tas.Say(TasClient.SayPlace.User, targetHost, "!forcestart", false); }); } else { foreach (var c in factions) { tas.Say(TasClient.SayPlace.Channel, c.Shortcut, "Battle could not start - no autohost found", true); } } AttackerSideCounter++; ResetAttackOptions(); }