Example #1
0
        public event EventHandler <SpringLogEventArgs> GameOver; // game has ended


        public string HostGame(LobbyHostingContext startContext, string host, int port)
        {
            if (!File.Exists(paths.GetDedicatedServerPath(startContext.EngineVersion)))
            {
                throw new ApplicationException($"Dedicated server executable not found: {paths.GetDedicatedServerPath(startContext.EngineVersion)}");
            }

            Context = new SpringBattleContext();
            Context.SetForHosting(startContext, host, port, null, null);

            if (!IsRunning)
            {
                talker              = new Talker();
                talker.SpringEvent += talker_SpringEvent;
                Context.IsHosting   = true;

                scriptPath = Utils.MakePath(paths.WritableDirectory, "script_" + startContext.FounderName + ".txt").Replace('\\', '/');

                var script = ScriptGenerator.GenerateHostScript(Context, talker.LoopbackPort);
                timer.Start();

                StartDedicated(script);
                return(script);
            }
            else
            {
                Trace.TraceError("Dedicated server already running");
            }
            return(null);
        }
Example #2
0
        public string HostGame(LobbyHostingContext startContext, string host, int port, string myName, string myPassword)
        {
            if (!File.Exists(paths.GetSpringExecutablePath(startContext.EngineVersion)))
            {
                throw new ApplicationException($"Spring executable not found: {paths.GetSpringExecutablePath(startContext.EngineVersion)}");
            }

            Context = new SpringBattleContext();
            Context.SetForHosting(startContext, host, port, myName, myPassword);

            if (!IsRunning)
            {
                Context.IsHosting = true;

                scriptPath = Utils.MakePath(paths.WritableDirectory, "script_" + myName + ".txt").Replace('\\', '/');

                var script = ScriptGenerator.GenerateHostScript(Context, 0);

                StartSpring(script);
                return(script);
            }
            else
            {
                Trace.TraceError("Spring already running");
            }
            return(null);
        }
        protected override async Task OnDedicatedExited(SpringBattleContext springBattleContext)
        {
            try
            {
                StopVote();
                RunningSince = null;
                IsInGame = false;
                isZombie = true;

                var debriefingMessage = BattleResultHandler.SubmitSpringBattleResult(springBattleContext, server);
                debriefingMessage.ChatChannel = "debriefing_" + debriefingMessage.ServerBattleID;

                // join people to channel
                await
                    Task.WhenAll(
                        spring.Context.ActualPlayers.Where(x=>x.Name != null).Select(x => server.ConnectedUsers.Get(x.Name))
                            .Where(x => x != null)
                            .Select(x => x.Process(new JoinChannel() { ChannelName = debriefingMessage.ChatChannel })));


                await server.Broadcast(Users.Keys, debriefingMessage);
                await server.RemoveBattle(this);
            }
            catch (Exception ex)
            {
                Trace.TraceError("Error processing battle exited: {0}", ex);
            }
        }
 public string ConnectGame(string ip, int port, string myName, string myPassword, string engine)
 {
     Context = new SpringBattleContext();
     Context.SetForConnecting(ip, port, myName, myPassword, engine);
     var script = ScriptGenerator.GenerateConnectScript(Context);
     StartSpring(script);
     return script;
 }
Example #5
0
        public string ConnectGame(string ip, int port, string myName, string myPassword, string engine)
        {
            Context = new SpringBattleContext();
            Context.SetForConnecting(ip, port, myName, myPassword, engine);
            var script = ScriptGenerator.GenerateConnectScript(Context);

            StartSpring(script);
            return(script);
        }
 /// <summary>
 /// GEnerates script for connecting to game
 /// </summary>
 /// <returns></returns>
 public static string GenerateConnectScript(SpringBattleContext context)
 {
     var sb = new StringBuilder();
     sb.AppendLine("[GAME]");
     sb.AppendLine("{");
     sb.AppendFormat("HostIP={0};\n", context.IpAddress);
     sb.AppendFormat("HostPort={0};\n", context.Port);
     sb.AppendLine("IsHost=0;");
     sb.AppendFormat("MyPlayerName={0};\n", context.MyUserName);
     sb.AppendFormat("MyPasswd={0};\n", context.MyPassword ?? context.MyPassword);
     sb.AppendLine("}");
     return sb.ToString();
 }
Example #7
0
        /// <summary>
        /// GEnerates script for connecting to game
        /// </summary>
        /// <returns></returns>
        public static string GenerateConnectScript(SpringBattleContext context)
        {
            var sb = new StringBuilder();

            sb.AppendLine("[GAME]");
            sb.AppendLine("{");
            sb.AppendFormat("HostIP={0};\n", context.IpAddress);
            sb.AppendFormat("HostPort={0};\n", context.Port);
            sb.AppendLine("IsHost=0;");
            sb.AppendFormat("MyPlayerName={0};\n", context.MyUserName);
            sb.AppendFormat("MyPasswd={0};\n", context.MyPassword ?? context.MyPassword);
            sb.AppendLine("}");
            return(sb.ToString());
        }
Example #8
0
        /// <summary>
        /// Generates script for hosting a game
        /// </summary>
        public static string GenerateHostScript(SpringBattleContext context, int loopbackListenPort)
        {
            var previousCulture = Thread.CurrentThread.CurrentCulture;

            try {
                Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

                var script = new StringBuilder();

                script.AppendLine("[GAME]");
                script.AppendLine("{");

                script.AppendFormat("  ZkSearchTag={0};\n", Guid.NewGuid());
                script.AppendFormat("  Mapname={0};\n", context.LobbyStartContext.Map);

                script.AppendFormat("  StartPosType={0};\n", context.LobbyStartContext.IsMission ? 3 : 2);

                script.AppendFormat("  GameType={0};\n", context.LobbyStartContext.Mod);
                script.AppendFormat("  ModHash=1;\n");
                script.AppendFormat("  MapHash=1;\n");

                if (loopbackListenPort > 0)
                {
                    script.AppendFormat("  AutohostPort={0};\n", loopbackListenPort);
                }
                script.AppendLine();
                script.AppendFormat("  HostIP={0};\n", context.IpAddress);
                script.AppendFormat("  HostPort={0};\n", context.Port);
                //script.AppendFormat("  SourcePort={0};\n", 8300);
                script.AppendFormat("  IsHost=1;\n");
                script.AppendLine();

                if (!string.IsNullOrEmpty(context.MyUserName))
                {
                    script.AppendFormat("  MyPlayerName={0};\n", context.MyUserName);
                }
                if (!string.IsNullOrEmpty(context.MyPassword) || !string.IsNullOrEmpty(context.MyUserName))
                {
                    script.AppendFormat("  MyPasswd={0};\n", context.MyPassword ?? context.MyUserName);
                }

                GeneratePlayerSection(script, context);

                return(script.ToString());
            } finally {
                Thread.CurrentThread.CurrentCulture = previousCulture;
            }
        }
        /// <summary>
        /// Generates script for hosting a game
        /// </summary>
        public static string GenerateHostScript(SpringBattleContext context, int loopbackListenPort)
        {
            var previousCulture = Thread.CurrentThread.CurrentCulture;
            try {
                Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

                var script = new StringBuilder();

                script.AppendLine("[GAME]");
                script.AppendLine("{");

                script.AppendFormat("  ZkSearchTag={0};\n", Guid.NewGuid());
                script.AppendFormat("  Mapname={0};\n", context.LobbyStartContext.Map);

                script.AppendFormat("  StartPosType={0};\n", context.LobbyStartContext.IsMission ? 3 : 2);

                script.AppendFormat("  GameType={0};\n", context.LobbyStartContext.Mod);
                script.AppendFormat("  ModHash=1;\n");
                script.AppendFormat("  MapHash=1;\n");

                if (loopbackListenPort >0) script.AppendFormat("  AutohostPort={0};\n", loopbackListenPort);
                script.AppendLine();
                script.AppendFormat("  HostIP={0};\n", context.IpAddress);
                script.AppendFormat("  HostPort={0};\n", context.Port);
                //script.AppendFormat("  SourcePort={0};\n", 8300);
                script.AppendFormat("  IsHost=1;\n");
                script.AppendLine();

                if (!string.IsNullOrEmpty(context.MyUserName)) script.AppendFormat("  MyPlayerName={0};\n", context.MyUserName);
                if (!string.IsNullOrEmpty(context.MyPassword) || !string.IsNullOrEmpty(context.MyUserName)) script.AppendFormat("  MyPasswd={0};\n", context.MyPassword??context.MyUserName);

                GeneratePlayerSection(script, context);

                return script.ToString();
            } finally {
                Thread.CurrentThread.CurrentCulture = previousCulture;
            }
        }
 void spring_SpringExited(object sender, SpringBattleContext springBattleContext)
 {
     if (speechSynthesizer!=null) speechSynthesizer.SpeakAsyncCancelAll();
 }
        private static void ProcessPlanetWars(SpringBattleContext result, ZkLobbyServer.ZkLobbyServer server, SpringBattle sb, ZkDataContext db, StringBuilder text)
        {
            if (result.LobbyStartContext.Mode != AutohostMode.Planetwars || sb.PlayerCount < 2 || sb.Duration >= GlobalConst.MinDurationForPlanetwars) return;

            List<int> winnerTeams = sb.SpringBattlePlayers.Where(x => x.IsInVictoryTeam && !x.IsSpectator).Select(x => x.AllyNumber).Distinct().ToList();
            int? winNum = null;
            if (winnerTeams.Count == 1)
            {
                winNum = winnerTeams[0];
                if (winNum > 1) winNum = null;
            }

            PlanetWarsTurnHandler.EndTurn(result.LobbyStartContext.Map,
                result.OutputExtras,
                db,
                winNum,
                sb.SpringBattlePlayers.Where(x => !x.IsSpectator).Select(x => x.Account).ToList(),
                text,
                sb,
                sb.SpringBattlePlayers.Where(x => !x.IsSpectator && x.AllyNumber == 0).Select(x => x.Account).ToList(),
                server.PlanetWarsEventCreator);

            // TODO HACK Global.PlanetWarsMatchMaker.RemoveFromRunningBattles(context.AutohostName);
        }
        static void GeneratePlayerSection(StringBuilder script, SpringBattleContext setup)
        {
            // ordinary battle stuff

            var userNum = 0;
            var teamNum = 0;
            var aiNum = 0;

            foreach (var u in setup.LobbyStartContext.Players)
            {
                Dictionary<string, string> parameters = new Dictionary<string, string>();
                setup?.LobbyStartContext?.UserParameters.TryGetValue(u.Name, out parameters);

                ScriptAddUser(script, userNum, u, teamNum, parameters);

                if (!u.IsSpectator) {
                    ScriptAddTeam(script, teamNum, userNum, u.AllyID);
                    teamNum++;
                }

                foreach (var b in setup.LobbyStartContext.Bots.Where(x => x.Owner == u.Name)) {
                    ScriptAddBot(script, aiNum, teamNum, userNum, b.BotAI, b.BotName);
                    aiNum++;
                    ScriptAddTeam(script, teamNum, userNum, b.AllyID);
                    teamNum++;
                }
                userNum++;
            }

            // add unowned bots to last player
            foreach (var b in setup.LobbyStartContext.Bots.Where(x => !setup.LobbyStartContext.Players.Any(y=>y.Name == x.Owner)))
            {
                ScriptAddBot(script, aiNum, teamNum, userNum-1, b.BotAI, b.BotName);
                aiNum++;
                ScriptAddTeam(script, teamNum, userNum-1, b.AllyID);
                teamNum++;
            }


            // ALLIANCES AND START BOXES
            var startboxes = new StringBuilder();
            startboxes.Append("return { ");
            script.AppendLine();
            for (var allyNumber = 0; allyNumber < MaxAllies; allyNumber++) {
                script.AppendFormat("[ALLYTEAM{0}]\n", allyNumber);
                script.AppendLine("{");
                script.AppendLine("     NumAllies=0;");
                script.AppendLine("}");
            }

            startboxes.Append("}");
            script.AppendLine();

            script.AppendLine("  [MODOPTIONS]");
            script.AppendLine("  {");

            script.AppendFormat("    startboxes={0};\n", startboxes.ToString());


            // write final options to script
            foreach (var kvp in setup?.LobbyStartContext?.ModOptions) script.AppendFormat("    {0}={1};\n", kvp.Key, kvp.Value);

            script.AppendLine("  }");

            script.AppendLine("}");
        }
 public void RunLocalScriptGame(string script, string engine)
 {
     Context = new SpringBattleContext();
     Context.SetForSelfHosting(engine);
     StartDedicated(script);
 }
        public event EventHandler<SpringLogEventArgs> GameOver; // game has ended


        public string HostGame(LobbyHostingContext startContext, string host, int port)
        {
            if (!File.Exists(paths.GetDedicatedServerPath(startContext.EngineVersion))) throw new ApplicationException($"Dedicated server executable not found: {paths.GetDedicatedServerPath(startContext.EngineVersion)}");

            Context = new SpringBattleContext();
            Context.SetForHosting(startContext, host, port, null, null);

            if (!IsRunning)
            {
                talker = new Talker();
                talker.SpringEvent += talker_SpringEvent;
                Context.IsHosting = true;

                scriptPath = Utils.MakePath(paths.WritableDirectory, "script_" + startContext.FounderName + ".txt").Replace('\\', '/');

                var script = ScriptGenerator.GenerateHostScript(Context, talker.LoopbackPort);
                timer.Start();

                StartDedicated(script);
                return script;
            }
            else Trace.TraceError("Dedicated server already running");
            return null;
        }
        private static SpringBattle SaveSpringBattle(SpringBattleContext result, ZkDataContext db)
        {
            var sb = new SpringBattle
            {
                HostAccountID = Account.AccountByName(db, result.LobbyStartContext.FounderName)?.AccountID,
                Mode = result.LobbyStartContext.Mode,
                Duration = result.Duration,
                EngineGameID = result.EngineBattleID,
                MapResourceID = db.Resources.Single(x => x.InternalName == result.LobbyStartContext.Map).ResourceID,
                ModResourceID = db.Resources.Single(x => x.InternalName == result.LobbyStartContext.Mod).ResourceID,
                HasBots = result.LobbyStartContext.Bots.Any(),
                IsMission = result.LobbyStartContext.IsMission,
                PlayerCount = result.ActualPlayers.Count(x => !x.IsSpectator),
                StartTime = result.StartTime,
                Title = result.LobbyStartContext.Title,
                ReplayFileName = Path.GetFileName(result.ReplayName),
                EngineVersion = result.LobbyStartContext.EngineVersion,
                IsMatchMaker = result.LobbyStartContext.IsMatchMakerGame
            };
            db.SpringBattles.InsertOnSubmit(sb);

            foreach (BattlePlayerResult p in result.ActualPlayers)
            {
                var account = Account.AccountByName(db, p.Name);
                if (account != null)
                {
                    sb.SpringBattlePlayers.Add(new SpringBattlePlayer
                    {
                        Account = account,
                        AccountID = account.AccountID,
                        AllyNumber = p.AllyNumber,
                        IsInVictoryTeam = p.IsVictoryTeam,
                        IsSpectator = p.IsSpectator,
                        LoseTime = p.LoseTime
                    });
                }
            }

            db.SaveChanges();

            return db.SpringBattles.FirstOrDefault(x => x.SpringBattleID == sb.SpringBattleID); // reselect from db to get proper lazy proxies
        }
        public static BattleDebriefing SubmitSpringBattleResult(SpringBattleContext result, ZkLobbyServer.ZkLobbyServer server)
        {
            var ret = new BattleDebriefing();
            try
            {
                if (!result.GameEndedOk)
                {
                    ret.Message = "Game didn't end properly";
                    return ret;
                }
                if (result.IsCheating)
                {
                    ret.Message = "Cheats were enabled during this game";
                    return ret;
                }

                var db = new ZkDataContext();
                var text = new StringBuilder();

                var sb = SaveSpringBattle(result, db);



                ProcessExtras(result.OutputExtras, sb, db);

                if (result.LobbyStartContext.Mode == AutohostMode.Planetwars) ProcessPlanetWars(result, server, sb, db, text);


                Dictionary<int, int> orgLevels = sb.SpringBattlePlayers.Select(x => x.Account).ToDictionary(x => x.AccountID, x => x.Level);

                ProcessElos(result, server, db, sb);
                
                ret.Url = string.Format("{1}/Battles/Detail/{0}", sb.SpringBattleID, GlobalConst.BaseSiteUrl);
                ret.ServerBattleID = sb.SpringBattleID;

                server.GhostSay(
                    new Say()
                    {
                        Text =
                            string.Format("BATTLE DETAILS AND REPLAY ----> {0} <-----", ret.Url),
                        IsEmote = true,
                        Place = SayPlace.Battle,
                        User = GlobalConst.NightwatchName
                    },
                    result.LobbyStartContext.BattleID);


                foreach (var p in sb.SpringBattlePlayers.Where(x=>!x.IsSpectator))
                {
                    ret.DebriefingUsers[p.Account.Name] = new BattleDebriefing.DebriefingUser()
                    {
                        LoseTime = p.LoseTime,
                        AllyNumber = p.AllyNumber,
                        IsInVictoryTeam = p.IsInVictoryTeam,
                        EloChange = p.EloChange,
                        XpChange = p.XpChange,
                        IsLevelUp = orgLevels[p.AccountID] < p.Account.Level,
                        Awards = sb.AccountBattleAwards.Where(x=>x.AccountID == p.AccountID).Select(x=> new BattleDebriefing.DebriefingAward()
                        {
                            Value = x.Value,
                            Key = x.AwardKey,
                            Description = x.AwardDescription
                        }).ToList()
                    };
                }

                return ret;
            }
            catch (Exception ex)
            {
                var data = JsonConvert.SerializeObject(result);
                Trace.TraceError($"{ex}\nData:\n{data}");
                ret.Message = "Error processing game result: " + ex.Message;
                return ret;
            }
        }
Example #17
0
        static void GeneratePlayerSection(StringBuilder script, SpringBattleContext setup)
        {
            // ordinary battle stuff

            var userNum = 0;
            var teamNum = 0;
            var aiNum   = 0;

            foreach (var u in setup.LobbyStartContext.Players)
            {
                Dictionary <string, string> parameters = new Dictionary <string, string>();
                setup?.LobbyStartContext?.UserParameters.TryGetValue(u.Name, out parameters);

                ScriptAddUser(script, userNum, u, teamNum, parameters);

                if (!u.IsSpectator)
                {
                    ScriptAddTeam(script, teamNum, userNum, u.AllyID);
                    teamNum++;
                }

                foreach (var b in setup.LobbyStartContext.Bots.Where(x => x.Owner == u.Name))
                {
                    ScriptAddBot(script, aiNum, teamNum, userNum, b.BotAI, b.BotName);
                    aiNum++;
                    ScriptAddTeam(script, teamNum, userNum, b.AllyID);
                    teamNum++;
                }
                userNum++;
            }

            // add unowned bots to last player
            foreach (var b in setup.LobbyStartContext.Bots.Where(x => !setup.LobbyStartContext.Players.Any(y => y.Name == x.Owner)))
            {
                ScriptAddBot(script, aiNum, teamNum, userNum - 1, b.BotAI, b.BotName);
                aiNum++;
                ScriptAddTeam(script, teamNum, userNum - 1, b.AllyID);
                teamNum++;
            }


            // ALLIANCES AND START BOXES
            var startboxes = new StringBuilder();

            startboxes.Append("return { ");
            script.AppendLine();
            for (var allyNumber = 0; allyNumber < MaxAllies; allyNumber++)
            {
                script.AppendFormat("[ALLYTEAM{0}]\n", allyNumber);
                script.AppendLine("{");
                script.AppendLine("     NumAllies=0;");
                script.AppendLine("}");
            }

            startboxes.Append("}");
            script.AppendLine();

            script.AppendLine("  [MODOPTIONS]");
            script.AppendLine("  {");

            script.AppendFormat("    startboxes={0};\n", startboxes.ToString());


            // write final options to script
            foreach (var kvp in setup?.LobbyStartContext?.ModOptions)
            {
                script.AppendFormat("    {0}={1};\n", kvp.Key, kvp.Value);
            }

            script.AppendLine("  }");

            script.AppendLine("}");
        }
        private static void ProcessElos(SpringBattleContext result, ZkLobbyServer.ZkLobbyServer server, ZkDataContext db, SpringBattle sb)
        {
            bool noElo = result.OutputExtras.Any(x => x?.StartsWith("noElo", true, System.Globalization.CultureInfo.CurrentCulture) == true);

            sb.CalculateAllElo(noElo);
            foreach (var u in sb.SpringBattlePlayers.Where(x => !x.IsSpectator)) u.Account.CheckLevelUp();

            db.SaveChanges();

            try
            {
                foreach (Account a in sb.SpringBattlePlayers.Where(x => !x.IsSpectator).Select(x => x.Account)) server.PublishAccountUpdate(a);
            }
            catch (Exception ex)
            {
                Trace.TraceError("error updating extension data: {0}", ex);
            }
        }
Example #19
0
 public void RunLocalScriptGame(string script, string engine)
 {
     Context = new SpringBattleContext();
     Context.SetForSelfHosting(engine);
     StartDedicated(script);
 }
        public string HostGame(LobbyHostingContext startContext, string host, int port, string myName, string myPassword)
        {
            if (!File.Exists(paths.GetSpringExecutablePath(startContext.EngineVersion))) throw new ApplicationException($"Spring executable not found: {paths.GetSpringExecutablePath(startContext.EngineVersion)}");

            Context = new SpringBattleContext();
            Context.SetForHosting(startContext, host, port, myName, myPassword);

            if (!IsRunning)
            {
                Context.IsHosting = true;

                scriptPath = Utils.MakePath(paths.WritableDirectory, "script_" + myName + ".txt").Replace('\\', '/');

                var script = ScriptGenerator.GenerateHostScript(Context, 0);

                StartSpring(script);
                return script;
            }
            else Trace.TraceError("Spring already running");
            return null;
        }