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); }
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; }
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(); }
/// <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()); }
/// <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; } }
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); } }
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; }