/// <summary> /// Update the score board when a player is killed. /// </summary> /// <param name="e"></param> public void UpdateScoreBoardPlayerKilled(PlayerKilledEventArgs e) { if (!AllPlayers.ContainsKey(e.Killer.Name)) { AllPlayers.Add(e.Killer.Name, new PlayerScoreboard(e.Killer.Name)); } if (!AllPlayers.ContainsKey(e.Victim.Name)) { AllPlayers.Add(e.Victim.Name, new PlayerScoreboard(e.Victim.Name)); } if (e.Assister != null && !AllPlayers.ContainsKey(e.Assister.Name)) { AllPlayers.Add(e.Assister.Name, new PlayerScoreboard(e.Assister.Name)); } if (e.Assister != null) { AllPlayers[e.Assister.Name].Assists++; } if (e.Headshot) { AllPlayers[e.Killer.Name].EnemyKilledWithHS(); } else { AllPlayers[e.Killer.Name].EnemyKilledNoHS(); } AllPlayers[e.Victim.Name].Deaths++; }
private void Parser_PlayerKilled(object sender, PlayerKilledEventArgs e) { if (matchStarted && e.Killer.SteamID != 0 && e.DeathPerson.SteamID != 0) { // Record each kill Kill kill = new Kill(this.results.Players[e.Killer.SteamID], this.results.Players[e.DeathPerson.SteamID], e.Headshot, e.Weapon.Weapon.ToString()); if (e.Assister != null) { kill.Assister = this.results.Players[e.Assister.SteamID]; kill.Assister.Assists.Add(kill); } kill.PenetratedObjects = e.PenetratedObjects; this.results.Players[e.Killer.SteamID].Kills.Add(kill); // Record the corresponding death for the killed player this.results.Players[e.DeathPerson.SteamID].Deaths.Add(kill); // Record if this is a teamkill if (e.Killer.Team == e.DeathPerson.Team) { results.Players[e.Killer.SteamID].Teamkills.Add(kill); } Debug.WriteLine(kill.ToString()); } }
private void HandlePlayerKilled(object sender, PlayerKilledEventArgs e) { if (e.Victim == null) { return; } Weapon weapon = new Weapon() { Equipment = (Models.EquipmentElement)((int)e.Weapon.Weapon), OriginalString = e.Weapon.OriginalString, AmmoInMagazine = (short)e.Weapon.AmmoInMagazine, AmmoType = (short)e.Weapon.AmmoType, }; PlayerKilledEvent newEvent = new PlayerKilledEvent() { Weapon = weapon, VictimSteamID = e.Victim.SteamID, KillerSteamID = e.Killer?.SteamID, AssisterSteamID = e.Assister?.SteamID, PenetratedObjects = e.PenetratedObjects, Headshot = e.Headshot, AssistedFlash = e.AssistedFlash, }; CurrentTick.Events.Add(newEvent); }
void demoParser_PlayerKilled(object sender, PlayerKilledEventArgs e) { Dispatcher.Invoke(new Action(() => { this.textblockContent.Text += String.Format("{0}{4} killed {1} with {2} {3}", e.Killer.Name, e.Victim.Name, e.Weapon.OriginalString, (e.Headshot) ? "(headshot)" : "", (e.Assist != null) ? " + " + e.Assist.Name : "") + Environment.NewLine; this.scrollViewer.ScrollToBottom(); } )); }
/// <summary> /// Returns a string with the important details of a kill, ready for CSV files /// <remarks>Order is: Victim,Killer,Assist, Weapon, Headshot </remarks> /// </summary> /// <param name="args">the kill event</param> /// <returns>formatted string</returns> public static string ToCSVString(this PlayerKilledEventArgs args) { string assist = ""; if (args.Assister != null) { assist = args.Assister.Name.CleanInput(); } return(String.Format("{0},{1},{2},{3},{4}", args.Victim.Name.CleanInput(), args.Killer.Name.CleanInput(), assist, args.Weapon.Weapon, args.Headshot)); }
private void OnPlayerKilled(object sender, PlayerKilledEventArgs arguments) { if (!_MatchStarted || arguments.Killer == null || arguments.Victim == null) { return; } var killerStats = GetPlayerStats(arguments.Killer); var victimStats = GetPlayerStats(arguments.Victim); killerStats.OnRoundKill(); victimStats.Deaths++; }
private void HandlePlayerKilled(object sender, PlayerKilledEventArgs e) { if (!myHasMatchStarted) { return; } // Race condition in DemoInfo library: // Sometimes PlayerKilledEventArgs.Killer is defined while adding +1 to the player's kills, but null when setting the multiple kill stats // --> Copy killer and victim here to ensure we don't run into inconsistencies if (e.Killer == null || e.Victim == null) { return; } var killer = e.Killer.Copy(); var victim = e.Victim.Copy(); if (!killer.IsBot()) { EnsurePlayerRegistered(killer.SteamID); var killerWithStats = Match.PlayerResults.Single(x => x.SteamID == killer.SteamID); if (IsSuicide(killer, victim)) { killerWithStats.Kills -= 1; killerWithStats.Deaths += 1; return; } if (victim.IsBot()) { killerWithStats.Kills += 1; AddKillToMultipleKillTracking(killer); return; } EnsurePlayerRegistered(victim.SteamID); var victimWithStats = Match.PlayerResults.Single(x => x.SteamID == victim.SteamID); if (IsTeamkill(killer, victim)) { killerWithStats.Kills -= 1; victimWithStats.Deaths += 1; return; } killerWithStats.Kills += 1; victimWithStats.Deaths += 1; AddKillToMultipleKillTracking(killer); } }
void PlayerKilled_Event(object sender, PlayerKilledEventArgs e) { if (MatchData.Players[e.DeathPerson.SteamID].Team == 0) { CurrentRound.Team1.PlayersKilled += 1; CurrentRound.Team2.PlayersDead += 1; } else { CurrentRound.Team2.PlayersKilled += 1; CurrentRound.Team1.PlayersDead += 1; } }
internal PlayerKilled AssemblePlayerKilled(PlayerKilledEventArgs pke) { return(new PlayerKilled { GameeventType = "player_killed", Actor = AssemblePlayer(pke.Killer), Victim = AssemblePlayer(pke.Victim), Assister = AssemblePlayerDetailed(pke.Assister), Headshot = pke.Headshot, Penetrated = pke.PenetratedObjects, Weapon = AssembleWeapon(pke.Weapon) }); }
void HandlePlayerKilled(object sender, PlayerKilledEventArgs e) { this.Text = ( String.Format( "{0} ({1}hp) got killed by {2} ({3}hp) with an {4} ({5})", e.DeathPerson.Name, e.DeathPerson.HP, e.Killer.Name, e.Killer.HP, e.Weapon.Weapon.ToString(), e.Headshot ? "headshot" : "bodyshot" ) ); }
public static bool BackStabbing(PlayerKilledEventArgs e) { Vector PositionVictim = e.Victim.Position; Vector PositionKiller = e.Killer.Position; float VictimLookX = e.Victim.ViewDirectionX; float VictimLookY = e.Victim.ViewDirectionY; Console.WriteLine("Looking towards {0} {1}", VictimLookX, VictimLookY); Vector DirectionVictimKiller = new Vector(PositionKiller.X - PositionVictim.X, PositionKiller.Y - PositionVictim.Y, PositionKiller.Z - PositionVictim.Z); float dotprod = VictimLookX * DirectionVictimKiller.X + VictimLookY * DirectionVictimKiller.Y; return(dotprod < 0); }
private static void Parser_PlayerKilled(object sender, PlayerKilledEventArgs e) { if (!_matchStarted) { return; } var killTime = GetRoundDuration(); var tick = _parser.CurrentTick - _rountTickTimeStart; if (e.Killer != null && e.Killer.SteamID != 0 && e.Victim != null && e.Victim.SteamID != 0) { var kill = new Kill(_results.Players[e.Killer.SteamID], _results.Players[e.Victim.SteamID], e.Headshot, EquipmentMapper.Map(e.Weapon.Weapon), _currentRoundNumber, e.Killer.SteamID == e.Victim.SteamID, killTime, e.PenetratedObjects, e.AssistedFlash, tick); if (e.Assister != null) { kill.Assister = _results.Players[e.Assister.SteamID]; kill.Assister.Assists.Add(kill); } _results.Players[e.Killer.SteamID].Kills.Add(kill); _results.Players[e.Victim.SteamID].Deaths.Add(kill); if (e.Killer.Team == e.Victim.Team) { _results.Players[e.Killer.SteamID].Teamkills.Add(kill); } } // suicide if (e.Killer == null && e.Victim != null && e.Victim.SteamID != 0) { var kill = new Kill(null, _results.Players[e.Victim.SteamID], e.Headshot, EquipmentMapper.Map(e.Weapon.Weapon), _currentRoundNumber, true, killTime, e.PenetratedObjects, e.AssistedFlash, tick); if (e.Assister != null) { kill.Assister = _results.Players[e.Assister.SteamID]; kill.Assister.Assists.Add(kill); } _results.Players[e.Victim.SteamID].Deaths.Add(kill); } }
protected virtual void eventsManager_PlayerKilled(object sender, PlayerKilledEventArgs e) { if (game.IsStarted) { Frag frag = new Frag(); frag.Killer = game.GetPlayer(e.Killer.SteamID); frag.Victim = game.GetPlayer(e.Victim.SteamID); frag.Assist = (e.Assist != null) ? game.GetPlayer(e.Assist.SteamID) : null; frag.Headshot = e.Headshot; frag.Penetrated = (e.PenetratedObjects > 0) ? true : false; frag.Weapon = e.Weapon.OriginalString; game.Rounds.Last().Frags.Add(frag); game.GetPlayer(e.Killer.SteamID).Frags.Add(frag); game.Frags.Add(frag); } }
private void Parser_PlayerKilled(object sender, PlayerKilledEventArgs e) { if (!hasStarted || e.Victim == null) { return; //Kill without victim?! } stats.Kills.Add(new Kill { DemoId = demo.Id, Round = parser.CTScore + parser.TScore, AssisterSteamId = e.Assister?.SteamID, KillerSteamId = e.Killer?.SteamID, KillerVelocity = e.Killer != null ? (Vector3?)(new Vector3(e.Killer.Velocity.X, e.Killer.Velocity.Y, e.Killer.Velocity.Z)) : null, KillerTeam = e.Killer?.Team, PenetratedObjects = e.PenetratedObjects, VictimSteamId = e.Victim.SteamID, VictimTeam = e.Victim.Team, VictimVelocity = new Vector3(e.Victim.Velocity.X, e.Victim.Velocity.Y, e.Victim.Velocity.Z), Weapon = e.Weapon }); }
private static void Parser_PlayerKilled(object sender, PlayerKilledEventArgs e) { if (_matchStarted && e.Killer != null && e.Killer.SteamID != 0 && e.Victim != null && e.Victim.SteamID != 0) { var kill = new Kill(_results.Players[e.Killer.SteamID], _results.Players[e.Victim.SteamID], e.Headshot, e.Weapon.Weapon.ToString()); if (e.Assister != null) { kill.Assister = _results.Players[e.Assister.SteamID]; kill.Assister.Assists.Add(kill); } _results.Players[e.Killer.SteamID].Kills.Add(kill); _results.Players[e.Victim.SteamID].Deaths.Add(kill); if (e.Killer.Team == e.Victim.Team) { _results.Players[e.Killer.SteamID].Teamkills.Add(kill); } } }
void HandlePlayerKilled(object sender, PlayerKilledEventArgs e) { if (e.Killer == null || e.DeathPerson == null) { return; } if (e.Killer.Team == Team.CounterTerrorist) { CTKillOrigin.AddPoint(MapPoint(e.Killer)); } else { TKillOrigin.AddPoint(MapPoint(e.Killer)); } if (e.DeathPerson.Team == Team.CounterTerrorist) { CTDeathPosition.AddPoint(MapPoint(e.DeathPerson)); } else { TDeathPosition.AddPoint(MapPoint(e.DeathPerson)); } Kills.AddPoint(new Kill() { Headshot = e.Headshot ? 1 : 0, Weapon = e.Weapon.Weapon.ToString(), KillerPosition = e.Killer != null && e.Killer.IsAlive ? MapPoint(e.Killer) : null, VictimPosition = e.DeathPerson != null && e.DeathPerson.IsAlive ? MapPoint(e.DeathPerson) : null, KillerTeam = e.Killer != null ? (int)e.Killer.Team : -1, VictimTeam = e.DeathPerson != null ? (int)e.DeathPerson.Team : -1, }); afterFirstKill = true; }
/// <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; } }
protected new void HandlePlayerKilled(object sender, PlayerKilledEventArgs e) { if (!IsMatchStarted || IsFreezetime || e.Victim == null) { return; } Weapon weapon = Weapon.WeaponList.FirstOrDefault(w => w.Element == e.Weapon.Weapon); if (weapon == null) { return; } Player killed = Demo.Players.FirstOrDefault(player => player.SteamId == e.Victim.SteamID); Player killer = null; KillEvent killEvent = new KillEvent(Parser.IngameTick, Parser.CurrentTime) { KillerSteamId = e.Killer?.SteamID ?? 0, KillerName = e.Killer?.Name ?? "World", KillerSide = e.Killer?.Team.ToSide() ?? Side.None, Weapon = weapon, KillerVelocityX = e.Killer?.Velocity.X ?? 0, KillerVelocityY = e.Killer?.Velocity.Y ?? 0, KillerVelocityZ = e.Killer?.Velocity.Z ?? 0, KilledSteamId = e.Victim.SteamID, KilledName = e.Victim.Name, KilledSide = e.Victim.Team.ToSide(), RoundNumber = CurrentRound.Number, IsKillerCrouching = e.Killer?.IsDucking ?? false, IsHeadshot = e.Headshot, Point = new KillHeatmapPoint { KillerX = e.Killer?.Position.X ?? 0, KillerY = e.Killer?.Position.Y ?? 0, VictimX = e.Victim.Position.X, VictimY = e.Victim.Position.Y } }; if (!killed.RoundsLifetime.ContainsKey(CurrentRound.Number)) { killed.RoundsLifetime[CurrentRound.Number] = ((Parser.IngameTick - CurrentRound.Tick) / Parser.TickRate); } else { killed.RoundsLifetime[CurrentRound.Number] += ((Parser.IngameTick - CurrentRound.Tick) / Parser.TickRate); } bool killerIsBot = e.Killer != null && e.Killer.SteamID == 0; bool victimIsBot = e.Victim.SteamID == 0; bool assisterIsBot = e.Assister != null && e.Assister.SteamID == 0; if (e.Killer != null) { killer = Demo.Players.FirstOrDefault(player => player.SteamId == e.Killer.SteamID); } if (killer != null) { if (e.Victim.SteamID != killer.SteamId) { if (!killer.RoundsMoneyEarned.ContainsKey(CurrentRound.Number)) { killer.RoundsMoneyEarned[CurrentRound.Number] = weapon.KillAward; } else { killer.RoundsMoneyEarned[CurrentRound.Number] += weapon.KillAward; } } else { // Player suicide, hack to detect pause forced during a match // Happended during the match SK vs VP on train during Atlanta 2017 // All players are killed and the game is paused (freeze time) if (++_suicideCount == 6) { BackupToLastRound(); } return; } killEvent.KillerIsControllingBot = e.Killer.SteamID != 0 && killer.IsControllingBot; ProcessTradeKill(killEvent); } if (killed != null) { // suicide, probably because he missed the jump from upper B on train :) if (e.Killer == null) { killed.SuicideCount++; } killEvent.KilledIsControllingBot = e.Victim.SteamID != 0 && killed.IsControllingBot; } // Human killed human if (!killerIsBot && !victimIsBot) { if (killer != null && killed != null) { killed.IsAlive = false; // TK if (e.Killer.Team == e.Victim.Team) { killer.Kills.Add(killEvent); killed.Deaths.Add(killEvent); } else { // Regular kill if (!killer.IsControllingBot) { killer.Kills.Add(killEvent); } if (!killed.IsControllingBot) { killed.Deaths.Add(killEvent); } } } } // Human killed a bot if (!killerIsBot && victimIsBot) { killer?.Kills.Add(killEvent); } // A bot killed a human if (killerIsBot && !victimIsBot) { // TK or not we add a death to the human killed?.Deaths.Add(killEvent); } // Add assist if there was one if (e.Assister != null && !assisterIsBot && e.Assister.Team != e.Victim.Team) { Player assister = Demo.Players.FirstOrDefault(player => player.SteamId == e.Assister.SteamID); if (assister != null) { killEvent.AssisterSteamId = e.Assister.SteamID; killEvent.AssisterName = e.Assister.Name; killEvent.AssisterIsControllingBot = e.Assister.SteamID != 0 && assister.IsControllingBot; assister.Assists.Add(killEvent); } } // If the killer isn't a bot we can update individual kill, open and entry kills if (e.Killer != null && e.Killer.Team != e.Victim.Team && killer != null && !killer.IsControllingBot) { if (!KillsThisRound.ContainsKey(e.Killer)) { KillsThisRound[e.Killer] = 0; } KillsThisRound[e.Killer]++; ProcessOpenAndEntryKills(killEvent); } ProcessClutches(); CurrentRound.Kills.Add(killEvent); Demo.Kills.Add(killEvent); if (AnalyzePlayersPosition) { PositionPoint positionPoint = new PositionPoint { X = e.Victim.Position.X, Y = e.Victim.Position.Y, PlayerSteamId = e.Killer?.SteamID ?? 0, PlayerName = e.Killer?.Name ?? string.Empty, Team = e.Killer?.Team.ToSide() ?? Side.None, Event = killEvent, RoundNumber = CurrentRound.Number }; Demo.PositionPoints.Add(positionPoint); } }
protected override void HandlePlayerKilled(object sender, PlayerKilledEventArgs e) { if (!IsMatchStarted) { return; } if (e.Killer == null || e.Victim == null) { return; } KillEvent killEvent = new KillEvent(Parser.IngameTick) { Weapon = new Weapon(e.Weapon) }; bool killerIsBot = false; bool victimIsBot = false; bool assisterIsBot = false; if (e.Killer.SteamID == 0) { killerIsBot = true; } if (e.Victim.SteamID == 0) { victimIsBot = true; } if (e.Assister != null && e.Assister.SteamID == 0) { assisterIsBot = true; } // Human killed human if (!killerIsBot && !victimIsBot) { killEvent.DeathPerson = Demo.Players.FirstOrDefault(player => player.SteamId == e.Victim.SteamID); if (killEvent.DeathPerson != null) { killEvent.DeathPerson.IsAlive = false; } killEvent.Killer = Demo.Players.FirstOrDefault(player => player.SteamId == e.Killer.SteamID); if (killEvent.DeathPerson != null && killEvent.Killer != null) { // TK if (killEvent.Killer.Team == killEvent.DeathPerson.Team) { killEvent.Killer.TeamKillCount++; killEvent.Killer.KillsCount--; if (killEvent.Killer.HeadshotCount > 0) { killEvent.Killer.HeadshotCount--; } killEvent.DeathPerson.DeathCount++; } else { // Regular kill if (!killEvent.Killer.IsControllingBot) { killEvent.Killer.KillsCount++; if (e.Headshot) { killEvent.Killer.HeadshotCount++; } } if (!killEvent.DeathPerson.IsControllingBot) { killEvent.DeathPerson.DeathCount++; } } } } // Human killed a bot if (!killerIsBot && victimIsBot) { killEvent.Killer = Demo.Players.FirstOrDefault(player => player.SteamId == e.Killer.SteamID); if (killEvent.Killer != null) { // TK if (killEvent.Killer.Team == e.Victim.Team) { killEvent.Killer.TeamKillCount++; killEvent.Killer.KillsCount--; } else { // Regular kill if (!killEvent.Killer.IsControllingBot) { killEvent.Killer.KillsCount++; if (e.Headshot) { killEvent.Killer.HeadshotCount++; } } } } } // A bot killed a human if (killerIsBot && !victimIsBot) { killEvent.DeathPerson = Demo.Players.FirstOrDefault(player => player.SteamId == e.Victim.SteamID); // TK or not we add a death to the human if (killEvent.DeathPerson != null) { killEvent.DeathPerson.DeathCount++; } } // Add assist if there was one if (e.Assister != null && !assisterIsBot && e.Assister.Team != e.Victim.Team) { killEvent.Assister = Demo.Players.FirstOrDefault(player => player.SteamId == e.Assister.SteamID); if (killEvent.Assister != null) { killEvent.Assister.AssistCount++; } } // If the killer isn't a bot we can update individual kill, open and entry kills if (killEvent.Killer != null && !killEvent.Killer.IsControllingBot) { if (!KillsThisRound.ContainsKey(e.Killer)) { KillsThisRound[e.Killer] = 0; } KillsThisRound[e.Killer]++; ProcessOpenAndEntryKills(killEvent); } ProcessClutches(); if (AnalyzeHeatmapPoint) { killEvent.Point = new HeatmapPoint { X = e.Victim.Position.X, Y = e.Victim.Position.Y, Round = CurrentRound, Player = killEvent.Killer, Team = e.Killer.Team }; } Demo.Kills.Add(killEvent); CurrentRound.Kills.Add(killEvent); if (AnalyzePlayersPosition) { PositionPoint positionPoint = new PositionPoint { X = e.Victim.Position.X, Y = e.Victim.Position.Y, Player = Demo.Players.First(p => p.SteamId == e.Killer.SteamID), Team = e.Killer.Team, Event = killEvent, Round = CurrentRound }; Demo.PositionsPoint.Add(positionPoint); } }
protected override void HandlePlayerKilled(object sender, PlayerKilledEventArgs e) { if (!IsMatchStarted) { return; } if (e.Killer == null || e.Victim == null) { return; } KillEvent killEvent = new KillEvent(Parser.IngameTick) { Weapon = new Weapon(e.Weapon), Killer = Demo.Players.FirstOrDefault(p => p.SteamId == e.Killer.SteamID), DeathPerson = Demo.Players.FirstOrDefault(p => p.SteamId == e.Victim.SteamID) }; if (killEvent.Killer != null) { killEvent.Killer.KillsCount++; if (e.Headshot) { killEvent.Killer.HeadshotCount++; } } if (killEvent.DeathPerson != null) { killEvent.DeathPerson.DeathCount++; killEvent.DeathPerson.IsAlive = false; } if (e.Assister != null) { killEvent.Assister = Demo.Players.FirstOrDefault(p => p.SteamId == e.Assister.SteamID); if (killEvent.Assister != null) { killEvent.Assister.AssistCount++; } } if (!KillsThisRound.ContainsKey(e.Killer)) { KillsThisRound[e.Killer] = 0; } KillsThisRound[e.Killer]++; // TK if (killEvent.Killer != null && killEvent.DeathPerson != null) { if (killEvent.Killer.Team == killEvent.DeathPerson.Team) { killEvent.Killer.KillsCount--; killEvent.Killer.TeamKillCount++; } } ProcessClutches(); ProcessOpenAndEntryKills(killEvent); ProcessPlayersRating(); if (AnalyzeHeatmapPoint) { killEvent.Point = new HeatmapPoint { X = e.Victim.Position.X, Y = e.Victim.Position.Y, Round = CurrentRound, Player = killEvent.Killer, Team = e.Killer.Team }; } CurrentRound.Kills.Add(killEvent); Demo.Kills.Add(killEvent); if (AnalyzePlayersPosition) { PositionPoint positionPoint = new PositionPoint { X = e.Victim.Position.X, Y = e.Victim.Position.Y, Player = Demo.Players.First(p => p.SteamId == e.Killer.SteamID), Team = e.Killer.Team, Event = killEvent, Round = CurrentRound }; Demo.PositionsPoint.Add(positionPoint); } }
static void rconClient_PlayerKilled(object sender, PlayerKilledEventArgs e) { if (e.Attacker == null) { Log.Info("PlayerKilled - Attacker: N/A - Victim: " + e.Victim.Name + " - Weapon: " + e.Weapon + " - Headshot: " + e.Headshot.ToString()); } else { Log.Info("PlayerKilled - Attacker: " + e.Attacker.Name + " - Victim: " + e.Victim.Name + " - Weapon: " + e.Weapon + " - Headshot: " + e.Headshot.ToString()); } }
private void HandlePlayerKilled(object sender, PlayerKilledEventArgs eventArgs) { Messages.Add("You were killed"); Messages.Add($"This was death number: {eventArgs.NumberOfDeaths}"); }
protected new void HandlePlayerKilled(object sender, PlayerKilledEventArgs e) { if (!IsMatchStarted || e.Victim == null) { return; } Weapon weapon = Weapon.WeaponList.FirstOrDefault(w => w.Element == e.Weapon.Weapon); if (weapon == null) { return; } Player killed = Demo.Players.FirstOrDefault(player => player.SteamId == e.Victim.SteamID); Player killer = null; KillEvent killEvent = new KillEvent(Parser.IngameTick, Parser.CurrentTime) { KillerSteamId = e.Killer?.SteamID ?? 0, KillerName = e.Killer?.Name ?? "World", KillerSide = e.Killer?.Team.ToSide() ?? Side.None, Weapon = weapon, KillerVelocityX = e.Killer?.Velocity.X ?? 0, KillerVelocityY = e.Killer?.Velocity.Y ?? 0, KillerVelocityZ = e.Killer?.Velocity.Z ?? 0, KilledSteamId = e.Victim.SteamID, KilledName = e.Victim.Name, KilledSide = e.Victim.Team.ToSide(), RoundNumber = CurrentRound.Number, IsKillerCrouching = e.Killer?.IsDucking ?? false, IsHeadshot = e.Headshot, Point = new KillHeatmapPoint { KillerX = e.Killer?.Position.X ?? 0, KillerY = e.Killer?.Position.Y ?? 0, VictimX = e.Victim.Position.X, VictimY = e.Victim.Position.Y } }; bool killerIsBot = e.Killer != null && e.Killer.SteamID == 0; bool victimIsBot = e.Victim.SteamID == 0; bool assisterIsBot = e.Assister != null && e.Assister.SteamID == 0; if (e.Killer != null) { killer = Demo.Players.FirstOrDefault(player => player.SteamId == e.Killer.SteamID); } if (killer != null) { if (e.Victim.SteamID != killer.SteamId) { if (!killer.RoundsMoneyEarned.ContainsKey(CurrentRound.Number)) { killer.RoundsMoneyEarned[CurrentRound.Number] = weapon.KillAward; } else { killer.RoundsMoneyEarned[CurrentRound.Number] += weapon.KillAward; } } ProcessTradeKill(killEvent); } // Human killed human if (!killerIsBot && !victimIsBot) { if (killer != null && killed != null) { killed.IsAlive = false; // TK if (e.Killer.Team == e.Victim.Team) { killer.Kills.Add(killEvent); killed.Deaths.Add(killEvent); } else { // Regular kill if (!killer.IsControllingBot) { killer.Kills.Add(killEvent); } if (!killed.IsControllingBot) { killed.Deaths.Add(killEvent); } } } } // Human killed a bot if (!killerIsBot && victimIsBot) { killer?.Kills.Add(killEvent); } // A bot killed a human if (killerIsBot && !victimIsBot) { // TK or not we add a death to the human killed?.Deaths.Add(killEvent); } // Add assist if there was one if (e.Assister != null && !assisterIsBot && e.Assister.Team != e.Victim.Team) { Player assister = Demo.Players.FirstOrDefault(player => player.SteamId == e.Assister.SteamID); if (assister != null) { killEvent.AssisterSteamId = e.Assister.SteamID; killEvent.AssisterName = e.Assister.Name; assister.Assists.Add(killEvent); } } // If the killer isn't a bot we can update individual kill, open and entry kills if (e.Killer != null && e.Killer.Team != e.Victim.Team && killer != null && !killer.IsControllingBot) { if (!KillsThisRound.ContainsKey(e.Killer)) { KillsThisRound[e.Killer] = 0; } KillsThisRound[e.Killer]++; ProcessOpenAndEntryKills(killEvent); } ProcessClutches(); CurrentRound.Kills.Add(killEvent); Demo.Kills.Add(killEvent); if (AnalyzePlayersPosition) { PositionPoint positionPoint = new PositionPoint { X = e.Victim.Position.X, Y = e.Victim.Position.Y, PlayerSteamId = e.Killer?.SteamID ?? 0, PlayerName = e.Killer?.Name ?? string.Empty, Team = e.Killer?.Team.ToSide() ?? Side.None, Event = killEvent, RoundNumber = CurrentRound.Number }; Demo.PositionPoints.Add(positionPoint); } }
public bool TryApplyMessage(ProtoBuf.IExtensible message, DemoParser parser) { if (message is CSVCMsg_GameEventList) { gameEventdescriptors.Clear(); foreach (var d in ((CSVCMsg_GameEventList)message).descriptors) { gameEventdescriptors[d.eventid] = d; } return(true); } if (gameEventdescriptors.Count == 0) { return(false); } var rawEvent = message as CSVCMsg_GameEvent; if (rawEvent == null) { return(false); } var eventDescriptor = gameEventdescriptors[rawEvent.eventid]; switch (eventDescriptor.name) { case "round_announce_match_start": parser.EventsManager.RaiseMatchStarted(); break; case "round_start": parser.EventsManager.RaiseRoundStart(); break; case "round_mvp": MapData(eventDescriptor, rawEvent); if (parser.players.ContainsKey((int)data["userid"])) { RoundMvpEventArgs mvp = new RoundMvpEventArgs(); mvp.Player = parser.players[(int)data["userid"]]; mvp.Reason = (int)data["reason"]; parser.EventsManager.RaiseRoundMvp(mvp); } break; case "round_end": if (parser.teams.Count > 2) { MapData(eventDescriptor, rawEvent); RoundEndedEventArgs arg = new RoundEndedEventArgs(); arg.Team = parser.teams[(int)data["winner"]]; arg.Reason = (int)data["reason"]; if ((string)data["message"] != null) { arg.Message = (string)data["message"]; } parser.EventsManager.RaiseRoundEnd(arg); } break; case "round_freeze_end": break; case "round_officially_ended": parser.EventsManager.RaiseRoundOfficiallyEnded(); break; case "cs_win_panel_match": parser.EventsManager.RaiseMatchEnded(); break; case "player_connect": //TODO throw event break; case "player_disconnect": //TODO throw event break; case "player_chat": MapData(eventDescriptor, rawEvent); if (parser.players.ContainsKey((int)data["userid"])) { PlayerChatEventArgs chat = new PlayerChatEventArgs(); chat.Player = parser.players[(int)data["userid"]]; chat.TeamOnly = (bool)data["teamonly"]; chat.Message = (string)data["text"]; parser.EventsManager.RaisePlayerChat(chat); } break; case "player_death": MapData(eventDescriptor, rawEvent); if (parser.players.ContainsKey((int)data["userid"]) && parser.players.ContainsKey((int)data["attacker"])) { string weapon_itemid = (string)data.GetValueOrDefault <string, object>("weapon_itemid", string.Empty); PlayerKilledEventArgs kill = new PlayerKilledEventArgs(); kill.Victim = parser.players[(int)data["userid"]]; kill.Killer = parser.players[(int)data["attacker"]]; kill.Headshot = (bool)data["headshot"]; kill.Weapon = new Equipment((string)data["weapon"], weapon_itemid); kill.PenetratedObjects = (int)data["penetrated"]; if (parser.players.ContainsKey((int)data["assister"])) { kill.Assist = parser.players[(int)data["assister"]]; } parser.EventsManager.RaisePlayerKilled(kill); } break; #region Bomb case "bomb_planted": //When the bomb has been planted MapData(eventDescriptor, rawEvent); BombEventArgs bombEventArgs = new BombEventArgs(); bombEventArgs.Player = parser.players[(int)data["userid"]]; bombEventArgs.BombSite = (int)data["site"]; //entity index of the bombsite. parser.EventsManager.RaiseBombPlanted(bombEventArgs); break; case "bomb_defused": //When the bomb has been defused MapData(eventDescriptor, rawEvent); BombEventArgs bombEventArg = new BombEventArgs(); bombEventArg.Player = parser.players[(int)data["userid"]]; bombEventArg.BombSite = (int)data["site"]; //entity index of the bombsite. parser.EventsManager.RaiseBombDefused(bombEventArg); break; case "bomb_exploded": //When the bomb has exploded MapData(eventDescriptor, rawEvent); BombEventArgs bombEvent = new BombEventArgs(); bombEvent.Player = parser.players[(int)data["userid"]]; bombEvent.BombSite = (int)data["site"]; //entity index of the bombsite. parser.EventsManager.RaiseBombExploded(bombEvent); break; #endregion #region Nades /*case "player_blind": * MapData (eventDescriptor, rawEvent); * if (parser.Players.ContainsKey((int)data["userid"] - 2)) * blindPlayers.Add(parser.Players[(int)data["userid"] - 2]); * break;*/ case "flashbang_detonate": MapData(eventDescriptor, rawEvent); parser.EventsManager.RaiseFlashExploded(FillNadeEvent <FlashEventArgs>(data, parser)); break; case "hegrenade_detonate": MapData(eventDescriptor, rawEvent); parser.EventsManager.RaiseGrenadeExploded(FillNadeEvent <GrenadeEventArgs>(data, parser)); break; case "decoy_started": MapData(eventDescriptor, rawEvent); parser.EventsManager.RaiseDecoyStart(FillNadeEvent <DecoyEventArgs>(data, parser)); break; case "decoy_detonate": MapData(eventDescriptor, rawEvent); parser.EventsManager.RaiseDecoyEnd(FillNadeEvent <DecoyEventArgs>(data, parser)); break; case "smokegrenade_detonate": MapData(eventDescriptor, rawEvent); parser.EventsManager.RaiseSmokeStart(FillNadeEvent <SmokeEventArgs>(data, parser)); break; case "smokegrenade_expired": MapData(eventDescriptor, rawEvent); parser.EventsManager.RaiseSmokeEnd(FillNadeEvent <SmokeEventArgs>(data, parser)); break; case "inferno_startburn": MapData(eventDescriptor, rawEvent); parser.EventsManager.RaiseFireStart(FillNadeEvent <FireEventArgs>(data, parser)); break; case "inferno_expire": MapData(eventDescriptor, rawEvent); parser.EventsManager.RaiseFireEnd(FillNadeEvent <FireEventArgs>(data, parser)); break; #endregion } return(true); }
private void CurrentDemoParser_PlayerKilled(object sender, PlayerKilledEventArgs e) { SteamController.LogToConsole((e.Killer != null ? e.Killer.Name : "Nobody") + (e.Assister != null ? " and " + e.Assister.Name : "") + " killed " + (e.Victim != null ? e.Victim.Name : "nobody")); }
/// <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; } }
public static void Apply(GameEvent rawEvent, DemoParser parser) { var descriptors = parser.GEH_Descriptors; var blindPlayers = parser.GEH_BlindPlayers; if (descriptors == null) { return; } var eventDescriptor = descriptors[rawEvent.EventId]; if (parser.Players.Count == 0 && eventDescriptor.Name != "player_connect") { return; } if (eventDescriptor.Name == "round_start") { parser.RaiseRoundStart(); } if (eventDescriptor.Name == "begin_new_match") { parser.RaiseMatchStarted(); } Dictionary <string, object> data; 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.DeathPerson = 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.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.Killer.Weapons.Count() != 0) { #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; #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.IsFakePlayer = (bool)data["bot"]; int index = (int)data["index"]; parser.RawPlayers[index] = player; break; case "player_disconnect": data = MapData(eventDescriptor, rawEvent); 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; } } parser.Players.Remove(toDelete); 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.IsInside(parser.bombsiteACenter)) { //planted at A. bombEventArgs.Site = 'A'; parser.bombsiteAIndex = site; } else if (relevantTrigger.IsInside(parser.bombsiteBCenter)) { //planted at B. bombEventArgs.Site = 'B'; parser.bombsiteBIndex = site; } else { throw new InvalidDataException("Was the bomb planted at C? Neither A nor B is inside the bombsite"); } } 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; } }