/// <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());
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 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();
     }
                                  ));
 }
Ejemplo n.º 5
0
    /// <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));
    }
Ejemplo n.º 6
0
        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++;
        }
Ejemplo n.º 7
0
        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);
            }
        }
Ejemplo n.º 8
0
 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;
     }
 }
Ejemplo n.º 9
0
 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)
     });
 }
Ejemplo n.º 10
0
 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"
             )
         );
 }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
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);
            }
        }
Ejemplo n.º 13
0
        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);
            }
        }
Ejemplo n.º 14
0
 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
     });
 }
Ejemplo n.º 15
0
        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);
                }
            }
        }
Ejemplo n.º 16
0
        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;
        }
Ejemplo n.º 17
0
        /// <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;
            }
        }
Ejemplo n.º 18
0
        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);
            }
        }
Ejemplo n.º 19
0
        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);
            }
        }
Ejemplo n.º 20
0
        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);
            }
        }
Ejemplo n.º 21
0
 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());
     }
 }
Ejemplo n.º 22
0
 private void HandlePlayerKilled(object sender, PlayerKilledEventArgs eventArgs)
 {
     Messages.Add("You were killed");
     Messages.Add($"This was death number: {eventArgs.NumberOfDeaths}");
 }
Ejemplo n.º 23
0
        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);
            }
        }
Ejemplo n.º 24
0
        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);
        }
Ejemplo n.º 25
0
 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"));
 }
Ejemplo n.º 26
0
        /// <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;
            }
        }
Ejemplo n.º 27
0
        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;
            }
        }