protected virtual void eventsManager_RoundStart(object sender, RoundStartedEventArgs e) { if (game.IsStarted) { game.Rounds.Add(new Round()); } }
protected override void HandleRoundStart(object sender, RoundStartedEventArgs e) { if (_playerTeamCount > 8 && !_isMatchEnded && !IsGamePaused) { IsMatchStarted = true; } if (!IsMatchStarted) { return; } UpdateTeams(); _isRoundOffiallyEndedOccured = false; // Reset until both scores > 0 // Sometimes parser scores are reseted at the end of the match, check the actual demo scores too if (Parser.CTScore == 0 && Parser.TScore == 0 && Demo.ScoreTeamCt < 16 && Demo.ScoreTeamT < 16) { Demo.ResetStats(false); InitMatch(); } CreateNewRound(); if (Demo.ScoreTeamCt + Demo.ScoreTeamT == 15) { IsHalfMatch = true; } if (!IsOvertime) { return; } _playerTeamCount = 0; }
protected override void HandleRoundStart(object sender, RoundStartedEventArgs e) { _roundStartedCount++; // Beginning of the first round of the game if (Parser.TScore == 0 && Parser.CTScore == 0) { AddTeams(); } // Check for the first LO3 if (!IsOvertime && !_firstLo3Occured && !IsHalfMatch && _roundStartedCount == 3) { _firstLo3Occured = true; IsMatchStarted = true; } // Check for the LO3 occured after the first LO3 (there are 4 round_start events) if (_firstLo3Occured && _roundStartedCount >= 4) { IsMatchStarted = true; } if (_isLastRoundFinal) { _isLastRoundFinal = false; } if (!IsMatchStarted) { return; } CreateNewRound(); }
void RoundStarted_Event(object sender, RoundStartedEventArgs e) { if (!MatchData.Rounds.Any()) { parser.PlayerKilled += PlayerKilled_Event; parser.WeaponFired += WeaponFired_Event; parser.SmokeNadeStarted += SmokeNadeStarted_Event; parser.SmokeNadeEnded += SmokeNadeEnded_Event; parser.DecoyNadeStarted += DecoyNadeStarted_Event; parser.DecoyNadeEnded += DecoyNadeEnded_Event; parser.FireNadeStarted += FireNadeStarted_Event; parser.FireNadeEnded += FireNadeEnded_Event; parser.FlashNadeExploded += FlashNadeExploded_Event; parser.ExplosiveNadeExploded += ExplosiveNadeExploded_Event; parser.NadeReachedTarget += NadeReachedTarget_Event; parser.BombBeginPlant += BombBeginPlant_Event; parser.BombAbortPlant += BombAbortPlant_Event; parser.BombPlanted += BombPlanted_Event; parser.BombDefused += BombDefused_Event; parser.BombExploded += BombExploded_Event; parser.BombBeginDefuse += BombBeginDefuse_Event; parser.BombAbortDefuse += BombAbortDefuse_Event; } MatchData.Rounds.Add(new Round { RoundNumber = MatchData.Rounds.Count() + 1 }); parser.Participants.Where(i => i.Name != "GOTV").ToList().ForEach(i => CurrentRound.Players.Add(i.SteamID, new Models.RoundPlayer { Player = MatchData.Players[i.SteamID] })); }
protected override void HandleRoundStart(object sender, RoundStartedEventArgs e) { if (_playerTeamCount > 8) { IsMatchStarted = true; } if (!IsMatchStarted) { return; } _isRoundOffiallyEndedOccured = false; // Reset until both scores > 0 if (Parser.CTScore == 0 && Parser.TScore == 0) { Demo.ResetStats(false); RoundCount = 0; AddTeams(); } CreateNewRound(); if (Demo.ScoreTeam1 + Demo.ScoreTeam2 == 15) { IsHalfMatch = true; } if (!IsOvertime) { return; } _playerTeamCount = 0; }
protected override void HandleRoundStart(object sender, RoundStartedEventArgs e) { if (!IsMatchStarted) { return; } _suicideCount = 0; IsLastRoundHalf = false; // Check players count to prevent missing players who was connected after the match started event if (Demo.Players.Count < 10) { // Add all players to our ObservableCollection of PlayerExtended foreach (DemoInfo.Player player in Parser.PlayingParticipants) { // don't add bot and already known players if (player.SteamID != 0 && Demo.Players.FirstOrDefault(p => p.SteamId == player.SteamID) == null) { Player pl = new Player { SteamId = player.SteamID, Name = player.Name, Side = player.Team.ToSide() }; Application.Current.Dispatcher.Invoke(delegate { Demo.Players.Add(pl); pl.TeamName = pl.Side == Side.CounterTerrorist ? Demo.TeamCT.Name : Demo.TeamT.Name; }); } } } CreateNewRound(); }
protected override void HandleRoundStart(object sender, RoundStartedEventArgs e) { if (!IsMatchStarted) { return; } if (IsSwapTeamRequired && CurrentRound.Number == 1) { IsSwapTeamRequired = false; } // Detect teams name only during first half if (CurrentRound.Number < 15) { if (!string.IsNullOrEmpty(Parser.CTClanName)) { Demo.TeamCT.Name = Parser.CTClanName; } if (!string.IsNullOrEmpty(Parser.TClanName)) { Demo.TeamT.Name = Parser.TClanName; } } CreateNewRound(); }
private static void Match_RoundStarted(object sender, RoundStartedEventArgs e) { var match = (Match)sender; foreach (Player player in match.Players) { _server.Router.DistributePackage(new RoundStartedPackage(e.RoundNumber, Router.ServerWildcard, player.Uid)); } }
/// <summary> /// Starts the round. /// </summary> /// <param name="direction">The direction.</param> public void StartRound(Vector direction) { GameManager.Current.LogMessage( string.Format("Started round with ball direction {0}", direction), Tracer.Debug); var eventArgs = new RoundStartedEventArgs(direction); this.RoundStarted(this, eventArgs); }
private static void Parser_RoundStart(object sender, RoundStartedEventArgs e) { if (!_matchStarted) { return; } _currentRound = new Round(); _currentRoundNumber++; _currentRound.RoundNumber = _currentRoundNumber; }
private void HandleRoundStarted(object sender, RoundStartedEventArgs e) { if (!myHasMatchStarted) { return; } ProcessNewPlayers(); myKillsThisRound.Clear(); }
private void HandleRoundStart(object sender, RoundStartedEventArgs e) { RoundStartEvent newEvent = new RoundStartEvent() { TimeLimit = e.TimeLimit, FragLimit = e.FragLimit, Objective = e.Objective, }; CurrentTick.Events.Add(newEvent); }
private void Parser_RoundStart(object sender, RoundStartedEventArgs e) { // Record the start of a new round if (matchStarted) { this.currentRound = new Round(); this.currentRoundNumber++; this.currentRound.RoundNumber = this.currentRoundNumber; Debug.WriteLine("Start round " + this.currentRound.RoundNumber); } }
void demoParser_RoundStart(object sender, RoundStartedEventArgs e) { Dispatcher.Invoke(new Action(() => { if (Double.IsNaN(demoParser.CurrentTime)) { return; } this.textblockContent.Text += "Round started " + TimeSpan.FromSeconds(demoParser.CurrentTime).ToString(@"hh\:mm\:ss") + Environment.NewLine; this.scrollViewer.ScrollToBottom(); } )); }
private void Parser_RoundStart(object sender, RoundStartedEventArgs e) { if (e.TimeLimit < 999) { hasStarted = true; foreach (var player in parser.Participants) { if (player == null) { continue; } demo.Players.Add(player.SteamID); } stats.Demos.Add(demo); } }
private static void Parser_RoundStart(object sender, RoundStartedEventArgs e) { if (!_matchStarted) { return; } _results = _results ?? new Result(_demoFileName); _currentRound = new Round(); _currentRoundNumber++; _currentRound.RoundNumber = _currentRoundNumber; _participants = _parser.Participants.ToList(); }
protected override void HandleRoundStart(object sender, RoundStartedEventArgs e) { // Match is really ongoing after a LO3 if (!IsOvertime && _matchStartedCount > 1) { IsMatchStarted = true; } if (!IsMatchStarted) { return; } IsFreezetime = true; CreateNewRound(); }
private static void _dp_RoundStart(object sender, RoundStartedEventArgs e) { dp_round = _dp.TScore + _dp.CTScore; if (DemoStats.ContainsKey(dp_round)) { DemoStats.Remove(dp_round); } PlayerStats[] roundStats = new PlayerStats[_dp.PlayingParticipants.Count()]; int i = 0; foreach (Player p in _dp.PlayingParticipants) { roundStats[i++] = new PlayerStats(p.Name, p.SteamID.ToString(), p.AdditionaInformations.Kills, p.AdditionaInformations.Assists, p.AdditionaInformations.Deaths); } DemoStats.Add(dp_round, roundStats); }
protected override void HandleRoundStart(object sender, RoundStartedEventArgs e) { // Match is really ongoing after a LO3 if (!IsOvertime && _matchStartedCount > 1) { IsMatchStarted = true; } if (Parser.CTScore == 0 && Parser.TScore == 0 && CurrentRound.Number > 15) { IsMatchStarted = false; } if (!IsMatchStarted) { return; } IsFreezetime = true; CreateNewRound(); }
/// <summary> /// Starts the round. Gets called from the RoundStarted event of the game controller /// </summary> /// <param name="sender">The sender.</param> /// <param name="args">The <see cref="RoundStartedEventArgs"/> instance containing the event data.</param> private void StartRound(object sender, RoundStartedEventArgs args) { this.ballAnimationTaskQueue = this.CalculateBallAnimationTasks( this.CurrentGame.CurrentWindow, this.CurrentGame.CurrentBallPosition, args.Direction); this.CurrentGame.CurrentRoundScore = CalculateRoundScore(this.ballAnimationTaskQueue); if (this.ballAnimationTaskQueue.Count > 0) { var firstTask = this.ballAnimationTaskQueue.Dequeue(); var viewModel = this.gameWindowViewModels.FirstOrDefault(x => x.Window.Id == firstTask.Window.Id); if (viewModel != null) { viewModel.BallAnimationTask = firstTask; this.CurrentGame.CurrentPlayer.CurrentPlayerState = Player.PlayerState.BallMoving; } } }
protected override void HandleRoundStart(object sender, RoundStartedEventArgs e) { if (!IsMatchStarted) { return; } // Check players count to prevent missing players who was connected after the match started event if (Demo.Players.Count < 10) { // Add all players to our ObservableCollection of PlayerExtended foreach (Player player in Parser.PlayingParticipants) { // don't add bot and already known players if (player.SteamID != 0 && Demo.Players.FirstOrDefault(p => p.SteamId == player.SteamID) == null) { PlayerExtended pl = new PlayerExtended { SteamId = player.SteamID, Name = player.Name, Team = player.Team }; Application.Current.Dispatcher.Invoke(delegate { Demo.Players.Add(pl); if (pl.Team == Team.CounterTerrorist) { Demo.PlayersTeam1.Add(pl); } else { Demo.PlayersTeam2.Add(pl); } }); } } } CreateNewRound(); }
/// <summary> /// Apply the specified rawEvent to the parser. /// </summary> /// <param name="rawEvent">The raw event.</param> /// <param name="parser">The parser to mutate.</param> public static void Apply(GameEvent rawEvent, DemoParser parser) { var descriptors = parser.GEH_Descriptors; var blindPlayers = parser.GEH_BlindPlayers; if (descriptors == null) { return; } Dictionary <string, object> data; var eventDescriptor = descriptors[rawEvent.EventId]; if (parser.Players.Count == 0 && eventDescriptor.Name != "player_connect") { return; } if (eventDescriptor.Name == "round_start") { data = MapData(eventDescriptor, rawEvent); RoundStartedEventArgs rs = new RoundStartedEventArgs() { TimeLimit = (int)data["timelimit"], FragLimit = (int)data["fraglimit"], Objective = (string)data["objective"] }; parser.RaiseRoundStart(rs); } if (eventDescriptor.Name == "cs_win_panel_match") { parser.RaiseWinPanelMatch(); } if (eventDescriptor.Name == "round_announce_final") { parser.RaiseRoundFinal(); } if (eventDescriptor.Name == "round_announce_last_round_half") { parser.RaiseLastRoundHalf(); } if (eventDescriptor.Name == "round_end") { data = MapData(eventDescriptor, rawEvent); Team t = Team.Spectate; int winner = (int)data ["winner"]; if (winner == parser.tID) { t = Team.Terrorist; } else if (winner == parser.ctID) { t = Team.CounterTerrorist; } RoundEndedEventArgs roundEnd = new RoundEndedEventArgs() { Reason = (RoundEndReason)data["reason"], Winner = t, Message = (string)data["message"], }; parser.RaiseRoundEnd(roundEnd); } if (eventDescriptor.Name == "round_officially_ended") { parser.RaiseRoundOfficiallyEnd(); } if (eventDescriptor.Name == "round_mvp") { data = MapData(eventDescriptor, rawEvent); RoundMVPEventArgs roundMVPArgs = new RoundMVPEventArgs(); roundMVPArgs.Player = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; roundMVPArgs.Reason = (RoundMVPReason)data["reason"]; parser.RaiseRoundMVP(roundMVPArgs); } if (eventDescriptor.Name == "bot_takeover") { data = MapData(eventDescriptor, rawEvent); BotTakeOverEventArgs botTakeOverArgs = new BotTakeOverEventArgs(); botTakeOverArgs.Taker = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; parser.RaiseBotTakeOver(botTakeOverArgs); } if (eventDescriptor.Name == "begin_new_match") { parser.RaiseMatchStarted(); } if (eventDescriptor.Name == "round_announce_match_start") { parser.RaiseRoundAnnounceMatchStarted(); } if (eventDescriptor.Name == "round_freeze_end") { parser.RaiseFreezetimeEnded(); } //if (eventDescriptor.Name != "player_footstep" && eventDescriptor.Name != "weapon_fire" && eventDescriptor.Name != "player_jump") { // Console.WriteLine (eventDescriptor.Name); //} switch (eventDescriptor.Name) { case "weapon_fire": data = MapData(eventDescriptor, rawEvent); WeaponFiredEventArgs fire = new WeaponFiredEventArgs(); fire.Shooter = parser.Players.ContainsKey((int)data ["userid"]) ? parser.Players [(int)data ["userid"]] : null; fire.Weapon = new Equipment((string)data ["weapon"]); if (fire.Shooter != null && fire.Weapon.Class != EquipmentClass.Grenade) { fire.Weapon = fire.Shooter.ActiveWeapon; } parser.RaiseWeaponFired(fire); break; case "player_death": data = MapData(eventDescriptor, rawEvent); PlayerKilledEventArgs kill = new PlayerKilledEventArgs(); kill.Victim = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; kill.Killer = parser.Players.ContainsKey((int)data["attacker"]) ? parser.Players[(int)data["attacker"]] : null; kill.Assister = parser.Players.ContainsKey((int)data["assister"]) ? parser.Players[(int)data["assister"]] : null; kill.Headshot = (bool)data["headshot"]; kill.Weapon = new Equipment((string)data["weapon"], (string)data["weapon_itemid"]); if (kill.Killer != null && kill.Weapon.Class != EquipmentClass.Grenade && kill.Weapon.Weapon != EquipmentElement.Revolver && kill.Killer.Weapons.Any() && kill.Weapon.Weapon != EquipmentElement.World) { #if DEBUG if (kill.Weapon.Weapon != kill.Killer.ActiveWeapon.Weapon) { throw new InvalidDataException(); } #endif kill.Weapon = kill.Killer.ActiveWeapon; } kill.PenetratedObjects = (int)data["penetrated"]; parser.RaisePlayerKilled(kill); break; case "player_hurt": data = MapData(eventDescriptor, rawEvent); PlayerHurtEventArgs hurt = new PlayerHurtEventArgs(); hurt.Player = parser.Players.ContainsKey((int)data ["userid"]) ? parser.Players [(int)data ["userid"]] : null; hurt.Attacker = parser.Players.ContainsKey((int)data ["attacker"]) ? parser.Players [(int)data ["attacker"]] : null; hurt.Health = (int)data ["health"]; hurt.Armor = (int)data ["armor"]; hurt.HealthDamage = (int)data ["dmg_health"]; hurt.ArmorDamage = (int)data ["dmg_armor"]; hurt.Hitgroup = (Hitgroup)((int)data ["hitgroup"]); hurt.Weapon = new Equipment((string)data ["weapon"], ""); if (hurt.Attacker != null && hurt.Weapon.Class != EquipmentClass.Grenade && hurt.Attacker.Weapons.Any()) { hurt.Weapon = hurt.Attacker.ActiveWeapon; } parser.RaisePlayerHurt(hurt); break; #region Nades case "player_blind": data = MapData(eventDescriptor, rawEvent); if (parser.Players.ContainsKey((int)data["userid"])) { blindPlayers.Add(parser.Players[(int)data["userid"]]); } break; case "flashbang_detonate": var args = FillNadeEvent <FlashEventArgs>(MapData(eventDescriptor, rawEvent), parser); args.FlashedPlayers = blindPlayers.ToArray(); parser.RaiseFlashExploded(args); blindPlayers.Clear(); break; case "hegrenade_detonate": parser.RaiseGrenadeExploded(FillNadeEvent <GrenadeEventArgs>(MapData(eventDescriptor, rawEvent), parser)); break; case "decoy_started": parser.RaiseDecoyStart(FillNadeEvent <DecoyEventArgs>(MapData(eventDescriptor, rawEvent), parser)); break; case "decoy_detonate": parser.RaiseDecoyEnd(FillNadeEvent <DecoyEventArgs>(MapData(eventDescriptor, rawEvent), parser)); break; case "smokegrenade_detonate": parser.RaiseSmokeStart(FillNadeEvent <SmokeEventArgs>(MapData(eventDescriptor, rawEvent), parser)); break; case "smokegrenade_expired": parser.RaiseSmokeEnd(FillNadeEvent <SmokeEventArgs>(MapData(eventDescriptor, rawEvent), parser)); break; case "inferno_startburn": parser.RaiseFireStart(FillNadeEvent <FireEventArgs>(MapData(eventDescriptor, rawEvent), parser)); break; case "inferno_expire": parser.RaiseFireEnd(FillNadeEvent <FireEventArgs>(MapData(eventDescriptor, rawEvent), parser)); break; #endregion case "player_connect": data = MapData(eventDescriptor, rawEvent); PlayerInfo player = new PlayerInfo(); player.UserID = (int)data ["userid"]; player.Name = (string)data ["name"]; player.GUID = (string)data ["networkid"]; player.XUID = player.GUID == "BOT" ? 0 : GetCommunityID(player.GUID); //player.IsFakePlayer = (bool)data["bot"]; int index = (int)data["index"]; parser.RawPlayers[index] = player; break; case "player_disconnect": data = MapData(eventDescriptor, rawEvent); PlayerDisconnectEventArgs disconnect = new PlayerDisconnectEventArgs(); disconnect.Player = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; parser.RaisePlayerDisconnect(disconnect); int toDelete = (int)data["userid"]; for (int i = 0; i < parser.RawPlayers.Length; i++) { if (parser.RawPlayers[i] != null && parser.RawPlayers[i].UserID == toDelete) { parser.RawPlayers[i] = null; break; } } if (parser.Players.ContainsKey(toDelete)) { parser.Players.Remove(toDelete); } break; case "player_team": data = MapData(eventDescriptor, rawEvent); PlayerTeamEventArgs playerTeamEvent = new PlayerTeamEventArgs(); Team t = Team.Spectate; int team = (int)data["team"]; if (team == parser.tID) { t = Team.Terrorist; } else if (team == parser.ctID) { t = Team.CounterTerrorist; } playerTeamEvent.NewTeam = t; t = Team.Spectate; team = (int)data["oldteam"]; if (team == parser.tID) { t = Team.Terrorist; } else if (team == parser.ctID) { t = Team.CounterTerrorist; } playerTeamEvent.OldTeam = t; playerTeamEvent.Swapped = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; playerTeamEvent.IsBot = (bool)data["isbot"]; playerTeamEvent.Silent = (bool)data["silent"]; parser.RaisePlayerTeam(playerTeamEvent); break; case "bomb_beginplant": //When the bomb is starting to get planted case "bomb_abortplant": //When the bomb planter stops planting the bomb case "bomb_planted": //When the bomb has been planted case "bomb_defused": //When the bomb has been defused case "bomb_exploded": //When the bomb has exploded data = MapData(eventDescriptor, rawEvent); var bombEventArgs = new BombEventArgs(); bombEventArgs.Player = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; int site = (int)data["site"]; if (site == parser.bombsiteAIndex) { bombEventArgs.Site = 'A'; } else if (site == parser.bombsiteBIndex) { bombEventArgs.Site = 'B'; } else { var relevantTrigger = parser.triggers.Single(a => a.Index == site); if (relevantTrigger.Contains(parser.bombsiteACenter)) { //planted at A. bombEventArgs.Site = 'A'; parser.bombsiteAIndex = site; } else { //planted at B. bombEventArgs.Site = 'B'; parser.bombsiteBIndex = site; } } switch (eventDescriptor.Name) { case "bomb_beginplant": parser.RaiseBombBeginPlant(bombEventArgs); break; case "bomb_abortplant": parser.RaiseBombAbortPlant(bombEventArgs); break; case "bomb_planted": parser.RaiseBombPlanted(bombEventArgs); break; case "bomb_defused": parser.RaiseBombDefused(bombEventArgs); break; case "bomb_exploded": parser.RaiseBombExploded(bombEventArgs); break; } break; case "bomb_begindefuse": data = MapData(eventDescriptor, rawEvent); var e = new BombDefuseEventArgs(); e.Player = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; e.HasKit = (bool)data["haskit"]; parser.RaiseBombBeginDefuse(e); break; case "bomb_abortdefuse": data = MapData(eventDescriptor, rawEvent); var e2 = new BombDefuseEventArgs(); e2.Player = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; e2.HasKit = e2.Player.HasDefuseKit; parser.RaiseBombAbortDefuse(e2); break; } }
/// <summary> /// Raises the <see cref="E:RoundStarted" /> event. /// </summary> /// <param name="args">The <see cref="RoundStartedEventArgs"/> instance containing the event data.</param> private void OnRoundStarted(RoundStartedEventArgs args) { this.RoundStarted(this, args); }
/// <summary> /// Starts the round. /// </summary> /// <param name="directionX">The direction x where user clicked to start the ball.</param> /// <param name="directionY">The direction y where user clicked to start the ball.</param> public void StartRound(double directionX, double directionY) { var args = new RoundStartedEventArgs(new Vector(directionX, directionY)); ThreadContext.InvokeOnUiThread(() => this.OnRoundStarted(args)); }
protected override void HandleRoundStart(object sender, RoundStartedEventArgs e) { if (_playerTeamCount > 8 && !_isMatchEnded) { IsMatchStarted = true; } if (!IsMatchStarted) { return; } _isRoundOffiallyEndedOccured = false; // Detect new OT for FaceIt demos if (_isFaceit && IsOvertime && _isFinalRound) { Application.Current.Dispatcher.Invoke(delegate { Demo.Overtimes.Add(CurrentOvertime); }); CurrentOvertime = new Overtime { Number = ++OvertimeCount }; IsHalfMatch = false; } _isFinalRound = false; // First OT detection for FaceIt demos if (Parser.CTScore + Parser.TScore == 30) { IsOvertime = true; CurrentOvertime = new Overtime { Number = ++OvertimeCount }; } // Reset until both scores > 0 // Sometimes parser scores are reseted at the end of the match, check the actual demo scores too if (Parser.CTScore == 0 && Parser.TScore == 0 && Demo.ScoreTeam1 < 16 && Demo.ScoreTeam2 < 16) { Demo.ResetStats(false); RoundCount = 0; AddTeams(); } CreateNewRound(); if (Demo.ScoreTeam1 + Demo.ScoreTeam2 == 15) { IsHalfMatch = true; } if (!IsOvertime) { return; } _playerTeamCount = 0; }
/// <summary> /// Called when the server sends the round start callback. /// </summary> /// <param name="sender">The sender.</param> /// <param name="args">The <see cref="RoundStartedEventArgs"/> instance containing the event data.</param> public void OnRoundStarted(object sender, RoundStartedEventArgs args) { this.RoundStarted(this, args); }
private void CurrentDemoParser_RoundStart(object sender, RoundStartedEventArgs e) { SteamController.LogToConsole(e.Objective + " round started. " + e.TimeLimit + " second(s) to round end"); }
/// <summary> /// Apply the specified rawEvent to the parser. /// </summary> /// <param name="rawEvent">The raw event.</param> /// <param name="parser">The parser to mutate.</param> public static void Apply(GameEvent rawEvent, DemoParser parser) { var descriptors = parser.GEH_Descriptors; var blindPlayers = parser.GEH_BlindPlayers; if (descriptors == null) { return; } Dictionary <string, object> data; var eventDescriptor = descriptors[rawEvent.EventId]; if (parser.Players.Count == 0 && eventDescriptor.Name != "player_connect") { return; } if (eventDescriptor.Name == "round_start") { data = MapData(eventDescriptor, rawEvent); RoundStartedEventArgs rs = new RoundStartedEventArgs() { TimeLimit = (int)data["timelimit"], FragLimit = (int)data["fraglimit"], Objective = (string)data["objective"] }; parser.RaiseRoundStart(rs); } if (eventDescriptor.Name == "cs_win_panel_match") { parser.RaiseWinPanelMatch(); } if (eventDescriptor.Name == "round_announce_final") { parser.RaiseRoundFinal(); } if (eventDescriptor.Name == "round_announce_last_round_half") { parser.RaiseLastRoundHalf(); } if (eventDescriptor.Name == "round_end") { data = MapData(eventDescriptor, rawEvent); Team t = Team.Spectate; int winner = (int)data ["winner"]; if (winner == parser.tID) { t = Team.Terrorist; } else if (winner == parser.ctID) { t = Team.CounterTerrorist; } RoundEndedEventArgs roundEnd = new RoundEndedEventArgs() { Reason = (RoundEndReason)data["reason"], Winner = t, Message = (string)data["message"], }; parser.RaiseRoundEnd(roundEnd); } if (eventDescriptor.Name == "round_officially_ended") { parser.RaiseRoundOfficiallyEnd(); } if (eventDescriptor.Name == "round_mvp") { data = MapData(eventDescriptor, rawEvent); RoundMVPEventArgs roundMVPArgs = new RoundMVPEventArgs(); roundMVPArgs.Player = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; roundMVPArgs.Reason = (RoundMVPReason)data["reason"]; parser.RaiseRoundMVP(roundMVPArgs); } if (eventDescriptor.Name == "bot_takeover") { data = MapData(eventDescriptor, rawEvent); BotTakeOverEventArgs botTakeOverArgs = new BotTakeOverEventArgs(); botTakeOverArgs.Taker = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; parser.RaiseBotTakeOver(botTakeOverArgs); } if (eventDescriptor.Name == "begin_new_match") { parser.RaiseMatchStarted(); } if (eventDescriptor.Name == "round_announce_match_start") { parser.RaiseRoundAnnounceMatchStarted(); } if (eventDescriptor.Name == "round_freeze_end") { parser.RaiseFreezetimeEnded(); } //if (eventDescriptor.Name != "player_footstep" && eventDescriptor.Name != "weapon_fire" && eventDescriptor.Name != "player_jump") { // Console.WriteLine (eventDescriptor.Name); //} switch (eventDescriptor.Name) { case "weapon_fire": data = MapData(eventDescriptor, rawEvent); WeaponFiredEventArgs fire = new WeaponFiredEventArgs(); fire.Shooter = parser.Players.ContainsKey((int)data ["userid"]) ? parser.Players [(int)data ["userid"]] : null; if (fire.Shooter != null && fire.Shooter.ActiveWeapon != null) { fire.Weapon = fire.Shooter.ActiveWeapon; } else { // should not happen but we never know fire.Weapon = new Equipment((string)data["weapon"]); } // Workaround to detect who throw molo / inc if (fire.Weapon.Weapon == EquipmentElement.Molotov || fire.Weapon.Weapon == EquipmentElement.Incendiary) { parser.LastPlayerIdsThrownFire.Enqueue((int)data["userid"]); } parser.RaiseWeaponFired(fire); break; case "player_death": data = MapData(eventDescriptor, rawEvent); PlayerKilledEventArgs kill = new PlayerKilledEventArgs(); kill.Victim = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; kill.Killer = parser.Players.ContainsKey((int)data["attacker"]) ? parser.Players[(int)data["attacker"]] : null; kill.Assister = parser.Players.ContainsKey((int)data["assister"]) ? parser.Players[(int)data["assister"]] : null; kill.Headshot = (bool)data["headshot"]; kill.Weapon = new Equipment((string)data["weapon"], (string)data["weapon_itemid"]); if (kill.Killer != null && kill.Killer.ActiveWeapon != null) { // in case of grenade kills, killer's active weapon is not his grenade at this state if (kill.Weapon == null || (kill.Weapon != null && kill.Weapon.Class != EquipmentClass.Grenade)) { kill.Weapon = kill.Killer.ActiveWeapon; kill.Weapon.SkinID = (string)data["weapon_itemid"]; } } kill.PenetratedObjects = (int)data["penetrated"]; parser.RaisePlayerKilled(kill); break; case "player_hurt": data = MapData(eventDescriptor, rawEvent); PlayerHurtEventArgs hurt = new PlayerHurtEventArgs(); hurt.Player = parser.Players.ContainsKey((int)data ["userid"]) ? parser.Players [(int)data ["userid"]] : null; hurt.Attacker = parser.Players.ContainsKey((int)data ["attacker"]) ? parser.Players [(int)data ["attacker"]] : null; hurt.Health = (int)data ["health"]; hurt.Armor = (int)data ["armor"]; hurt.HealthDamage = (int)data ["dmg_health"]; hurt.ArmorDamage = (int)data ["dmg_armor"]; hurt.Hitgroup = (Hitgroup)((int)data ["hitgroup"]); hurt.Weapon = new Equipment((string)data["weapon"]); if (hurt.Attacker != null && hurt.Attacker.ActiveWeapon != null) { // in case of grenade attacks, attacker's active weapon is not his grenade at this state if (hurt.Weapon == null || (hurt.Weapon != null && hurt.Weapon.Class != EquipmentClass.Grenade)) { hurt.Weapon = hurt.Attacker.ActiveWeapon; } } parser.RaisePlayerHurt(hurt); break; #region Nades case "player_blind": // BOT are ignored (thrower or not) data = MapData(eventDescriptor, rawEvent); if (parser.Players.ContainsKey((int)data["userid"])) { Player p = parser.Players[(int)data["userid"]]; if (data.ContainsKey("attacker") && parser.Players.ContainsKey((int)data["attacker"])) { Player attacker = parser.Players[(int)data["attacker"]]; PlayerBlindEventArgs ev = new PlayerBlindEventArgs { Player = p, Duration = (float)data["blind_duration"], Attacker = attacker, }; blindPlayers.Add(p); parser.RaisePlayerBlind(ev); } } break; case "flashbang_detonate": var args = FillNadeEvent <FlashEventArgs>(MapData(eventDescriptor, rawEvent), parser); args.FlashedPlayers = blindPlayers.ToArray(); parser.RaiseFlashExploded(args); blindPlayers.Clear(); break; case "hegrenade_detonate": parser.RaiseGrenadeExploded(FillNadeEvent <GrenadeEventArgs>(MapData(eventDescriptor, rawEvent), parser)); break; case "decoy_started": parser.RaiseDecoyStart(FillNadeEvent <DecoyEventArgs>(MapData(eventDescriptor, rawEvent), parser)); break; case "decoy_detonate": parser.RaiseDecoyEnd(FillNadeEvent <DecoyEventArgs>(MapData(eventDescriptor, rawEvent), parser)); break; case "smokegrenade_detonate": parser.RaiseSmokeStart(FillNadeEvent <SmokeEventArgs>(MapData(eventDescriptor, rawEvent), parser)); break; case "smokegrenade_expired": parser.RaiseSmokeEnd(FillNadeEvent <SmokeEventArgs>(MapData(eventDescriptor, rawEvent), parser)); break; case "inferno_startburn": var fireData = MapData(eventDescriptor, rawEvent); // molotov / inc events doesn't contains thrower, this is a hack to retrieve it // WARNING: This hack is not 100% accurated since if a molotov never burn, the ids will be incorrect // 1. when a molo / inc is thrown (weapon_fire events), we add the userid to the queue // 2. when this event (inferno_startburn) occurs we retrieve the last userid from this queue (LastPlayerIdsThrownFire) // 3. we add the userid to the queue LastPlayerIdsStartFire to retrieve the player at the next inferno_expire event if (!fireData.ContainsKey("userid") && parser.LastPlayerIdsThrownFire.Count > 0) { int throwerId = parser.LastPlayerIdsThrownFire.Dequeue(); fireData.Add("userid", throwerId); // add this id to the queue to be able to detect it when the inferno_expire event occurs parser.LastPlayerIdsStartFire.Enqueue(throwerId); } parser.RaiseFireStart(FillNadeEvent <FireEventArgs>(fireData, parser)); break; case "inferno_expire": var fireEndData = MapData(eventDescriptor, rawEvent); if (!fireEndData.ContainsKey("userid") && parser.LastPlayerIdsStartFire.Count > 0) { fireEndData.Add("userid", parser.LastPlayerIdsStartFire.Dequeue()); } parser.RaiseFireEnd(FillNadeEvent <FireEventArgs>(fireEndData, parser)); break; #endregion case "player_connect": data = MapData(eventDescriptor, rawEvent); PlayerInfo player = new PlayerInfo(); player.UserID = (int)data ["userid"]; player.Name = (string)data ["name"]; player.GUID = (string)data ["networkid"]; player.XUID = player.GUID == "BOT" ? 0 : GetCommunityID(player.GUID); //player.IsFakePlayer = (bool)data["bot"]; int index = (int)data["index"]; parser.RawPlayers[index] = player; break; case "player_disconnect": data = MapData(eventDescriptor, rawEvent); PlayerDisconnectEventArgs disconnect = new PlayerDisconnectEventArgs { Reason = (string)data["reason"], }; disconnect.Player = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; parser.RaisePlayerDisconnect(disconnect); int toDelete = (int)data["userid"]; for (int i = 0; i < parser.RawPlayers.Length; i++) { if (parser.RawPlayers[i] != null && parser.RawPlayers[i].UserID == toDelete) { parser.RawPlayers[i] = null; break; } } if (parser.Players.ContainsKey(toDelete)) { parser.Players.Remove(toDelete); } break; case "player_team": data = MapData(eventDescriptor, rawEvent); PlayerTeamEventArgs playerTeamEvent = new PlayerTeamEventArgs(); Team t = Team.Spectate; int team = (int)data["team"]; if (team == parser.tID) { t = Team.Terrorist; } else if (team == parser.ctID) { t = Team.CounterTerrorist; } playerTeamEvent.NewTeam = t; t = Team.Spectate; team = (int)data["oldteam"]; if (team == parser.tID) { t = Team.Terrorist; } else if (team == parser.ctID) { t = Team.CounterTerrorist; } playerTeamEvent.OldTeam = t; playerTeamEvent.Swapped = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; playerTeamEvent.IsBot = (bool)data["isbot"]; playerTeamEvent.Silent = (bool)data["silent"]; parser.RaisePlayerTeam(playerTeamEvent); break; case "bomb_beginplant": //When the bomb is starting to get planted case "bomb_abortplant": //When the bomb planter stops planting the bomb case "bomb_planted": //When the bomb has been planted case "bomb_defused": //When the bomb has been defused case "bomb_exploded": //When the bomb has exploded data = MapData(eventDescriptor, rawEvent); var bombEventArgs = new BombEventArgs(); bombEventArgs.Player = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; int site = (int)data["site"]; if (site == parser.bombsiteAIndex) { bombEventArgs.Site = 'A'; } else if (site == parser.bombsiteBIndex) { bombEventArgs.Site = 'B'; } else { var relevantTrigger = parser.triggers.Single(a => a.Index == site); if (relevantTrigger.Contains(parser.bombsiteACenter)) { //planted at A. bombEventArgs.Site = 'A'; parser.bombsiteAIndex = site; } else { //planted at B. bombEventArgs.Site = 'B'; parser.bombsiteBIndex = site; } } switch (eventDescriptor.Name) { case "bomb_beginplant": parser.RaiseBombBeginPlant(bombEventArgs); break; case "bomb_abortplant": parser.RaiseBombAbortPlant(bombEventArgs); break; case "bomb_planted": parser.RaiseBombPlanted(bombEventArgs); break; case "bomb_defused": parser.RaiseBombDefused(bombEventArgs); break; case "bomb_exploded": parser.RaiseBombExploded(bombEventArgs); break; } break; case "bomb_begindefuse": data = MapData(eventDescriptor, rawEvent); var e = new BombDefuseEventArgs(); e.Player = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; e.HasKit = (bool)data["haskit"]; parser.RaiseBombBeginDefuse(e); break; case "bomb_abortdefuse": data = MapData(eventDescriptor, rawEvent); var e2 = new BombDefuseEventArgs(); e2.Player = parser.Players.ContainsKey((int)data["userid"]) ? parser.Players[(int)data["userid"]] : null; e2.HasKit = e2.Player.HasDefuseKit; parser.RaiseBombAbortDefuse(e2); break; } }
void HandleRoundStart(object sender, RoundStartedEventArgs e) { foreach (var player in parser.PlayingParticipants) { var p = GetParticipant(player); } var CurrentRound = new RoundEventMap(Datastore); CurrentRound.CTScore = parser.CTScore; CurrentRound.TScore = parser.TScore; CurrentRound.Maps = new Dictionary <string, EventMap>() { { "TFlashes", TFlashes }, { "CTFlashes", CTFlashes }, { "CTSmokes", CTSmokes }, { "TSmokes", TSmokes }, { "CTHEs", CTNades }, { "THEs", TNades }, { "BothTeamsFire", Fire }, { "TKillOrigin", TKillOrigin }, { "CTKillOrigin", CTKillOrigin }, { "TDeathPosition", TDeathPosition }, { "CTDeathPosition", CTDeathPosition }, { "THoldingPosition", THoldingPosition }, { "CTHoldingPosition", CTHoldingPosition }, { "TGoodFlashes", TGoodFlashes }, { "CTGoodFlashes", CTGoodFlashes }, { "TBadFlashes", TBadFlashes }, { "CTBadFlashes", CTBadFlashes }, }; CurrentRound.Kills = Kills; analysis.Rounds.Add(CurrentRound); if (!analysis.IsFinished) { analysis.Progress = (double)parser.CurrentTick / parser.Header.PlaybackFrames; } if (OnRoundAnalysisFinished != null) { OnRoundAnalysisFinished(analysis); } Datastore.Save(analysis); roundNum++; TFlashes = new EventMap(); CTFlashes = new EventMap(); CTSmokes = new EventMap(); TSmokes = new EventMap(); CTNades = new EventMap(); TNades = new EventMap(); Fire = new EventMap(); TKillOrigin = new EventMap(); CTKillOrigin = new EventMap(); TDeathPosition = new EventMap(); CTDeathPosition = new EventMap(); CTHoldingPosition = new EventMap(); THoldingPosition = new EventMap(); CTGoodFlashes = new EventMap(); TGoodFlashes = new EventMap(); CTBadFlashes = new EventMap(); TBadFlashes = new EventMap(); Kills = new KillMap(); }