コード例 #1
0
        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();
        }
コード例 #2
0
        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);
                            }
                        }
                    }
                }
            }
        }
コード例 #3
0
        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();
        }