private void HandleSpecialMessages(Talker.SpringEventArgs e) { try { if (string.IsNullOrEmpty(e.Text) || !e.Text.StartsWith("SPRINGIE:")) { return; } var text = e.Text.Substring(9); if (!gamePrivateMessages.ContainsKey(text)) { gamePrivateMessages.Add(text, new HashSet <byte>()); } gamePrivateMessages[text].Add(e.PlayerNumber); if (text.StartsWith("READY:")) { var name = text.Substring(6); var entry = Context.ActualPlayers.FirstOrDefault(x => x.Name == name); if (entry != null) { entry.IsIngameReady = true; } } if (gamePrivateMessages[text].Count() != Context.LobbyStartContext.Players.Count() / 2 + 1) { return; // only accept messages if count matches N/2+1 exactly } if (text == "FORCE") { ForceStart(); } Context.OutputExtras.Add(text); } catch (Exception ex) { Trace.TraceError("Error while processing '{0}' :{1}", e.Text, ex); } }
private void HandleSpecialMessages(Talker.SpringEventArgs e) { try { if (string.IsNullOrEmpty(e.Text) || !e.Text.StartsWith("SPRINGIE:")) { return; } int count; if (!gamePrivateMessages.TryGetValue(e.Text, out count)) { count = 0; } count++; gamePrivateMessages[e.Text] = count; if (count != 2) { return; // only send if count matches 2 exactly } var text = e.Text.Substring(9); if (text.StartsWith("READY:")) { var name = text.Substring(6); var entry = Context.ActualPlayers.FirstOrDefault(x => x.Name == name); if (entry != null) { entry.IsIngameReady = true; } } if (text == "FORCE") { ForceStart(); } Context.OutputExtras.Add(text); } catch (Exception ex) { Trace.TraceError("Error while processing '{0}' :{1}", e.Text, ex); } }
private void HandleSpecialMessages(Talker.SpringEventArgs e) { try { if (string.IsNullOrEmpty(e.Text) || !e.Text.StartsWith("SPRINGIE:")) { return; } int count; if (!gamePrivateMessages.TryGetValue(e.Text, out count)) { count = 0; } count++; gamePrivateMessages[e.Text] = count; if (count != 2) { return; // only send if count matches 2 exactly } var text = e.Text.Substring(9); if (text.StartsWith("READY:")) { var name = text.Substring(6); BattlePlayerResult entry; if (statsPlayers.TryGetValue(name, out entry)) { entry.IsIngameReady = true; } } if (text == "FORCE") { ForceStart(); } statsData.Add(text); } catch (Exception ex) { Trace.TraceError("Error while processing '{0}' :{1}", e.Text, ex); } }
private void AddToLogs(Talker.SpringEventArgs e) { try { if (string.IsNullOrEmpty(e.Text) || string.IsNullOrEmpty(e.PlayerName)) { return; } var s = "CHATLOG:" + e.PlayerName + " "; switch (e.Param) { case Talker.TO_EVERYONE: s = s + "<PUBLIC> "; break; case Talker.TO_ALLIES: s = s + "<ALLY> "; break; case Talker.TO_SPECTATORS: s = s + "<SPEC> "; break; default: s = s + "<PRIV> "; break; } s = s + e.Text; Context.OutputExtras.Add(s); } catch (Exception ex) { Trace.TraceError("Error while processing '{0}' :{1}", e.Text, ex); } }
private void talker_SpringEvent(object sender, Talker.SpringEventArgs e) { try { switch (e.EventType) { case Talker.SpringEventType.PLAYER_JOINED: var entry = Context?.GetOrAddPlayer(e.PlayerName); if (entry != null) { entry.IsIngame = true; } PlayerJoined?.Invoke(this, new SpringLogEventArgs(e.PlayerName)); break; case Talker.SpringEventType.PLAYER_LEFT: entry = Context?.GetOrAddPlayer(e.PlayerName); if (entry != null) { entry.IsIngame = false; entry.QuitTime = (int)DateTime.UtcNow.Subtract(Context.IngameStartTime ?? Context.StartTime).TotalSeconds; } if (e.Param == 0) { PlayerDisconnected?.Invoke(this, new SpringLogEventArgs(e.PlayerName)); } PlayerLeft?.Invoke(this, new SpringLogEventArgs(e.PlayerName)); break; case Talker.SpringEventType.GAME_LUAMSG: HandleSpecialMessages(e); break; case Talker.SpringEventType.PLAYER_CHAT: if (e.Param == 255) { HandleSpecialMessages(e); } else { AddToLogs(e); } if ((PlayerSaid != null) && !string.IsNullOrEmpty(e.PlayerName)) { SpringChatLocation location = SpringChatLocation.Private; if (((e.Param == Talker.TO_EVERYONE) || (e.Param == Talker.TO_EVERYONE_LEGACY))) { location = SpringChatLocation.Public; } if (e.Param == Talker.TO_ALLIES) { location = SpringChatLocation.Allies; } if (e.Param == Talker.TO_SPECTATORS) { location = SpringChatLocation.Spectators; } PlayerSaid(this, new SpringChatEventArgs(e.PlayerName, e.Text, location)); } break; case Talker.SpringEventType.PLAYER_DEFEATED: MarkPlayerDead(e.PlayerName, true); if (PlayerLost != null) { PlayerLost(this, new SpringLogEventArgs(e.PlayerName)); } break; case Talker.SpringEventType.SERVER_GAMEOVER: if (!Context.GameEndedOk) // server gameover runs multiple times { foreach (var p in Context.ActualPlayers) { if (!p.IsIngame && !p.IsSpectator) { MarkPlayerDead(p.Name, true); } p.IsIngame = false; } // set victory team for all allied with currently alive if (e.winningAllyTeams.Length > 0) { foreach (var ally in e.winningAllyTeams) { foreach (var p in Context.ActualPlayers.Where(x => !x.IsSpectator && (x.AllyNumber == ally))) { p.IsVictoryTeam = true; } } } else // Fallback, shouldn't happen { foreach (var p in Context.ActualPlayers.Where(x => !x.IsSpectator && (x.LoseTime == null))) { foreach (var q in Context.ActualPlayers.Where(x => !x.IsSpectator && (x.AllyNumber == p.AllyNumber))) { q.IsVictoryTeam = true; } } } if (Context.IngameStartTime != null) { Context.GameEndedOk = true; Context.Duration = (int)DateTime.UtcNow.Subtract(Context.IngameStartTime ?? Context.StartTime).TotalSeconds; GameOver?.Invoke(this, new SpringLogEventArgs(e.PlayerName)); } else { Trace.TraceWarning("recieved GAMEOVER before STARTPLAYING!"); } Task.Delay(10000).ContinueWith(x => ExitGame()); } break; case Talker.SpringEventType.PLAYER_READY: if (e.Param == 1) { entry = Context.GetOrAddPlayer(e.PlayerName); if (entry != null) { entry.IsIngameReady = true; } } break; case Talker.SpringEventType.SERVER_STARTPLAYING: Context.ReplayName = e.ReplayFileName; Context.EngineBattleID = e.GameID; Context.IngameStartTime = DateTime.UtcNow; Context.PlayersUnreadyOnStart = Context.ActualPlayers.Where(x => !x.IsSpectator && !(x.IsIngameReady && x.IsIngame)).Select(x => x.Name).ToList(); foreach (var p in Context.ActualPlayers.Where(x => !x.IsSpectator)) { p.IsIngameReady = true; } process.PriorityClass = ProcessPriorityClass.High; BattleStarted(this, Context); break; case Talker.SpringEventType.SERVER_QUIT: if (LobbyStartContext != null) { foreach (var p in Context.ActualPlayers) { p.IsIngame = false; } } //if (GameOver != null) GameOver(this, new SpringLogEventArgs(e.PlayerName)); break; } } catch (Exception ex) { Trace.TraceError("Error processing spring message:{0}", ex); } }
private void talker_SpringEvent(object sender, Talker.SpringEventArgs e) { //this.client.Say(TasClient.SayPlace.Battle, "",string.Format("type:{0} param:{1} player:{2}-{3} text:{4}",e.EventType.ToString(), e.Param,e.PlayerNumber, e.PlayerName, e.Text),false); try { switch (e.EventType) { case Talker.SpringEventType.PLAYER_JOINED: if (StartContext != null) { foreach (var p in StartContext.Players.Where(x => x.Name == e.PlayerName)) { connectedPlayers[p.Name] = true; p.IsIngame = true; } } if (PlayerJoined != null) { PlayerJoined(this, new SpringLogEventArgs(e.PlayerName)); } break; case Talker.SpringEventType.PLAYER_LEFT: if (StartContext != null) { foreach (var p in StartContext.Players.Where(x => x.Name == e.PlayerName)) { connectedPlayers[p.Name] = false; p.IsIngame = false; } } if (e.Param == 0 && PlayerDisconnected != null) { PlayerDisconnected(this, new SpringLogEventArgs(e.PlayerName)); } if (PlayerLeft != null) { PlayerLeft(this, new SpringLogEventArgs(e.PlayerName)); } break; case Talker.SpringEventType.GAME_LUAMSG: HandleSpecialMessages(e); break; case Talker.SpringEventType.PLAYER_CHAT: if (e.Param == 255) { HandleSpecialMessages(e); } // only public chat if (PlayerSaid != null && (e.Param == Talker.TO_EVERYONE || e.Param == Talker.TO_EVERYONE_LEGACY) && !string.IsNullOrEmpty(e.PlayerName)) { PlayerSaid(this, new SpringLogEventArgs(e.PlayerName, e.Text)); } break; case Talker.SpringEventType.PLAYER_DEFEATED: StatsMarkDead(e.PlayerName, true); if (PlayerLost != null) { PlayerLost(this, new SpringLogEventArgs(e.PlayerName)); } break; case Talker.SpringEventType.SERVER_GAMEOVER: if (StartContext != null) { foreach (var p in StartContext.Players) { p.IsIngame = false; } } IsBattleOver = true; if (battleResult.IngameStartTime != null) { gameEndedOk = true; battleResult.Duration = (int)DateTime.UtcNow.Subtract(battleResult.IngameStartTime ?? battleResult.StartTime).TotalSeconds; if (GameOver != null) { GameOver(this, new SpringLogEventArgs(e.PlayerName)); } } else { //gameover before gamestart client.Say(TasClient.SayPlace.Battle, "", "DEBUG: recieved GAMEOVER before STARTPLAYING!", true); } break; case Talker.SpringEventType.PLAYER_READY: if (e.Param == 1) { statsPlayers[e.PlayerName].IsIngameReady = true; } break; case Talker.SpringEventType.SERVER_STARTPLAYING: battleResult.IngameStartTime = DateTime.UtcNow; foreach (var p in statsPlayers) { p.Value.IsIngameReady = true; } foreach (var p in StartContext.Players) { bool state; if (!connectedPlayers.TryGetValue(p.Name, out state) || !state) { p.IsIngame = false; } } BattleStarted(this, EventArgs.Empty); break; case Talker.SpringEventType.SERVER_QUIT: if (StartContext != null) { foreach (var p in StartContext.Players) { p.IsIngame = false; } } IsBattleOver = true; //Program.main.AutoHost.SayBattle("dbg quit "); //if (GameOver != null) GameOver(this, new SpringLogEventArgs(e.PlayerName)); break; } } catch (Exception ex) { Trace.TraceError("Error processing spring message:{0}", ex); } }