Пример #1
0
 protected virtual void eventsManager_RoundStart(object sender, RoundStartedEventArgs e)
 {
     if (game.IsStarted)
     {
         game.Rounds.Add(new Round());
     }
 }
Пример #2
0
        protected override void HandleRoundStart(object sender, RoundStartedEventArgs e)
        {
            if (_playerTeamCount > 8 && !_isMatchEnded && !IsGamePaused)
            {
                IsMatchStarted = true;
            }
            if (!IsMatchStarted)
            {
                return;
            }
            UpdateTeams();
            _isRoundOffiallyEndedOccured = false;

            // Reset until both scores > 0
            // Sometimes parser scores are reseted at the end of the match, check the actual demo scores too
            if (Parser.CTScore == 0 && Parser.TScore == 0 && Demo.ScoreTeamCt < 16 && Demo.ScoreTeamT < 16)
            {
                Demo.ResetStats(false);
                InitMatch();
            }

            CreateNewRound();

            if (Demo.ScoreTeamCt + Demo.ScoreTeamT == 15)
            {
                IsHalfMatch = true;
            }

            if (!IsOvertime)
            {
                return;
            }

            _playerTeamCount = 0;
        }
Пример #3
0
        protected override void HandleRoundStart(object sender, RoundStartedEventArgs e)
        {
            _roundStartedCount++;

            // Beginning of the first round of the game
            if (Parser.TScore == 0 && Parser.CTScore == 0)
            {
                AddTeams();
            }

            // Check for the first LO3
            if (!IsOvertime && !_firstLo3Occured && !IsHalfMatch && _roundStartedCount == 3)
            {
                _firstLo3Occured = true;
                IsMatchStarted   = true;
            }

            // Check for the LO3 occured after the first LO3 (there are 4 round_start events)
            if (_firstLo3Occured && _roundStartedCount >= 4)
            {
                IsMatchStarted = true;
            }

            if (_isLastRoundFinal)
            {
                _isLastRoundFinal = false;
            }

            if (!IsMatchStarted)
            {
                return;
            }

            CreateNewRound();
        }
Пример #4
0
        void RoundStarted_Event(object sender, RoundStartedEventArgs e)
        {
            if (!MatchData.Rounds.Any())
            {
                parser.PlayerKilled          += PlayerKilled_Event;
                parser.WeaponFired           += WeaponFired_Event;
                parser.SmokeNadeStarted      += SmokeNadeStarted_Event;
                parser.SmokeNadeEnded        += SmokeNadeEnded_Event;
                parser.DecoyNadeStarted      += DecoyNadeStarted_Event;
                parser.DecoyNadeEnded        += DecoyNadeEnded_Event;
                parser.FireNadeStarted       += FireNadeStarted_Event;
                parser.FireNadeEnded         += FireNadeEnded_Event;
                parser.FlashNadeExploded     += FlashNadeExploded_Event;
                parser.ExplosiveNadeExploded += ExplosiveNadeExploded_Event;
                parser.NadeReachedTarget     += NadeReachedTarget_Event;
                parser.BombBeginPlant        += BombBeginPlant_Event;
                parser.BombAbortPlant        += BombAbortPlant_Event;
                parser.BombPlanted           += BombPlanted_Event;
                parser.BombDefused           += BombDefused_Event;
                parser.BombExploded          += BombExploded_Event;
                parser.BombBeginDefuse       += BombBeginDefuse_Event;
                parser.BombAbortDefuse       += BombAbortDefuse_Event;
            }

            MatchData.Rounds.Add(new Round {
                RoundNumber = MatchData.Rounds.Count() + 1
            });
            parser.Participants.Where(i => i.Name != "GOTV").ToList().ForEach(i => CurrentRound.Players.Add(i.SteamID, new Models.RoundPlayer {
                Player = MatchData.Players[i.SteamID]
            }));
        }
Пример #5
0
        protected override void HandleRoundStart(object sender, RoundStartedEventArgs e)
        {
            if (_playerTeamCount > 8)
            {
                IsMatchStarted = true;
            }
            if (!IsMatchStarted)
            {
                return;
            }
            _isRoundOffiallyEndedOccured = false;

            // Reset until both scores > 0
            if (Parser.CTScore == 0 && Parser.TScore == 0)
            {
                Demo.ResetStats(false);
                RoundCount = 0;
                AddTeams();
            }

            CreateNewRound();

            if (Demo.ScoreTeam1 + Demo.ScoreTeam2 == 15)
            {
                IsHalfMatch = true;
            }

            if (!IsOvertime)
            {
                return;
            }

            _playerTeamCount = 0;
        }
Пример #6
0
        protected override void HandleRoundStart(object sender, RoundStartedEventArgs e)
        {
            if (!IsMatchStarted)
            {
                return;
            }

            _suicideCount   = 0;
            IsLastRoundHalf = false;
            // Check players count to prevent missing players who was connected after the match started event
            if (Demo.Players.Count < 10)
            {
                // Add all players to our ObservableCollection of PlayerExtended
                foreach (DemoInfo.Player player in Parser.PlayingParticipants)
                {
                    // don't add bot and already known players
                    if (player.SteamID != 0 && Demo.Players.FirstOrDefault(p => p.SteamId == player.SteamID) == null)
                    {
                        Player pl = new Player
                        {
                            SteamId = player.SteamID,
                            Name    = player.Name,
                            Side    = player.Team.ToSide()
                        };
                        Application.Current.Dispatcher.Invoke(delegate
                        {
                            Demo.Players.Add(pl);
                            pl.TeamName = pl.Side == Side.CounterTerrorist ? Demo.TeamCT.Name : Demo.TeamT.Name;
                        });
                    }
                }
            }

            CreateNewRound();
        }
Пример #7
0
        protected override void HandleRoundStart(object sender, RoundStartedEventArgs e)
        {
            if (!IsMatchStarted)
            {
                return;
            }

            if (IsSwapTeamRequired && CurrentRound.Number == 1)
            {
                IsSwapTeamRequired = false;
            }

            // Detect teams name only during first half
            if (CurrentRound.Number < 15)
            {
                if (!string.IsNullOrEmpty(Parser.CTClanName))
                {
                    Demo.TeamCT.Name = Parser.CTClanName;
                }
                if (!string.IsNullOrEmpty(Parser.TClanName))
                {
                    Demo.TeamT.Name = Parser.TClanName;
                }
            }

            CreateNewRound();
        }
Пример #8
0
        private static void Match_RoundStarted(object sender, RoundStartedEventArgs e)
        {
            var match = (Match)sender;

            foreach (Player player in match.Players)
            {
                _server.Router.DistributePackage(new RoundStartedPackage(e.RoundNumber, Router.ServerWildcard, player.Uid));
            }
        }
        /// <summary>
        /// Starts the round.
        /// </summary>
        /// <param name="direction">The direction.</param>
        public void StartRound(Vector direction)
        {
            GameManager.Current.LogMessage(
                string.Format("Started round with ball direction {0}", direction),
                Tracer.Debug);
            var eventArgs = new RoundStartedEventArgs(direction);

            this.RoundStarted(this, eventArgs);
        }
Пример #10
0
        private static void Parser_RoundStart(object sender, RoundStartedEventArgs e)
        {
            if (!_matchStarted)
            {
                return;
            }

            _currentRound = new Round();
            _currentRoundNumber++;
            _currentRound.RoundNumber = _currentRoundNumber;
        }
Пример #11
0
        private void HandleRoundStarted(object sender, RoundStartedEventArgs e)
        {
            if (!myHasMatchStarted)
            {
                return;
            }

            ProcessNewPlayers();

            myKillsThisRound.Clear();
        }
Пример #12
0
        private void HandleRoundStart(object sender, RoundStartedEventArgs e)
        {
            RoundStartEvent newEvent = new RoundStartEvent()
            {
                TimeLimit = e.TimeLimit,
                FragLimit = e.FragLimit,
                Objective = e.Objective,
            };

            CurrentTick.Events.Add(newEvent);
        }
        private void Parser_RoundStart(object sender, RoundStartedEventArgs e)
        {
            // Record the start of a new round
            if (matchStarted)
            {
                this.currentRound = new Round();
                this.currentRoundNumber++;
                this.currentRound.RoundNumber = this.currentRoundNumber;

                Debug.WriteLine("Start round " + this.currentRound.RoundNumber);
            }
        }
Пример #14
0
        void demoParser_RoundStart(object sender, RoundStartedEventArgs e)
        {
            Dispatcher.Invoke(new Action(() =>
            {
                if (Double.IsNaN(demoParser.CurrentTime))
                {
                    return;
                }

                this.textblockContent.Text += "Round started " + TimeSpan.FromSeconds(demoParser.CurrentTime).ToString(@"hh\:mm\:ss") + Environment.NewLine;
                this.scrollViewer.ScrollToBottom();
            }
                                         ));
        }
Пример #15
0
 private void Parser_RoundStart(object sender, RoundStartedEventArgs e)
 {
     if (e.TimeLimit < 999)
     {
         hasStarted = true;
         foreach (var player in parser.Participants)
         {
             if (player == null)
             {
                 continue;
             }
             demo.Players.Add(player.SteamID);
         }
         stats.Demos.Add(demo);
     }
 }
Пример #16
0
        private static void Parser_RoundStart(object sender, RoundStartedEventArgs e)
        {
            if (!_matchStarted)
            {
                return;
            }

            _results = _results ?? new Result(_demoFileName);

            _currentRound = new Round();

            _currentRoundNumber++;
            _currentRound.RoundNumber = _currentRoundNumber;

            _participants = _parser.Participants.ToList();
        }
Пример #17
0
        protected override void HandleRoundStart(object sender, RoundStartedEventArgs e)
        {
            // Match is really ongoing after a LO3
            if (!IsOvertime && _matchStartedCount > 1)
            {
                IsMatchStarted = true;
            }
            if (!IsMatchStarted)
            {
                return;
            }

            IsFreezetime = true;

            CreateNewRound();
        }
Пример #18
0
        private static void _dp_RoundStart(object sender, RoundStartedEventArgs e)
        {
            dp_round = _dp.TScore + _dp.CTScore;
            if (DemoStats.ContainsKey(dp_round))
            {
                DemoStats.Remove(dp_round);
            }

            PlayerStats[] roundStats = new PlayerStats[_dp.PlayingParticipants.Count()];
            int           i          = 0;

            foreach (Player p in _dp.PlayingParticipants)
            {
                roundStats[i++] = new PlayerStats(p.Name, p.SteamID.ToString(), p.AdditionaInformations.Kills, p.AdditionaInformations.Assists, p.AdditionaInformations.Deaths);
            }
            DemoStats.Add(dp_round, roundStats);
        }
Пример #19
0
        protected override void HandleRoundStart(object sender, RoundStartedEventArgs e)
        {
            // Match is really ongoing after a LO3
            if (!IsOvertime && _matchStartedCount > 1)
            {
                IsMatchStarted = true;
            }
            if (Parser.CTScore == 0 && Parser.TScore == 0 && CurrentRound.Number > 15)
            {
                IsMatchStarted = false;
            }
            if (!IsMatchStarted)
            {
                return;
            }

            IsFreezetime = true;
            CreateNewRound();
        }
Пример #20
0
        /// <summary>
        /// Starts the round. Gets called from the RoundStarted event of the game controller
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="args">The <see cref="RoundStartedEventArgs"/> instance containing the event data.</param>
        private void StartRound(object sender, RoundStartedEventArgs args)
        {
            this.ballAnimationTaskQueue = this.CalculateBallAnimationTasks(
                this.CurrentGame.CurrentWindow,
                this.CurrentGame.CurrentBallPosition,
                args.Direction);

            this.CurrentGame.CurrentRoundScore = CalculateRoundScore(this.ballAnimationTaskQueue);

            if (this.ballAnimationTaskQueue.Count > 0)
            {
                var firstTask = this.ballAnimationTaskQueue.Dequeue();
                var viewModel = this.gameWindowViewModels.FirstOrDefault(x => x.Window.Id == firstTask.Window.Id);
                if (viewModel != null)
                {
                    viewModel.BallAnimationTask = firstTask;
                    this.CurrentGame.CurrentPlayer.CurrentPlayerState = Player.PlayerState.BallMoving;
                }
            }
        }
Пример #21
0
 protected override void HandleRoundStart(object sender, RoundStartedEventArgs e)
 {
     if (!IsMatchStarted)
     {
         return;
     }
     // Check players count to prevent missing players who was connected after the match started event
     if (Demo.Players.Count < 10)
     {
         // Add all players to our ObservableCollection of PlayerExtended
         foreach (Player player in Parser.PlayingParticipants)
         {
             // don't add bot and already known players
             if (player.SteamID != 0 && Demo.Players.FirstOrDefault(p => p.SteamId == player.SteamID) == null)
             {
                 PlayerExtended pl = new PlayerExtended
                 {
                     SteamId = player.SteamID,
                     Name    = player.Name,
                     Team    = player.Team
                 };
                 Application.Current.Dispatcher.Invoke(delegate
                 {
                     Demo.Players.Add(pl);
                     if (pl.Team == Team.CounterTerrorist)
                     {
                         Demo.PlayersTeam1.Add(pl);
                     }
                     else
                     {
                         Demo.PlayersTeam2.Add(pl);
                     }
                 });
             }
         }
     }
     CreateNewRound();
 }
Пример #22
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;
            }
        }
Пример #23
0
 /// <summary>
 /// Raises the <see cref="E:RoundStarted" /> event.
 /// </summary>
 /// <param name="args">The <see cref="RoundStartedEventArgs"/> instance containing the event data.</param>
 private void OnRoundStarted(RoundStartedEventArgs args)
 {
     this.RoundStarted(this, args);
 }
Пример #24
0
        /// <summary>
        /// Starts the round.
        /// </summary>
        /// <param name="directionX">The direction x where user clicked to start the ball.</param>
        /// <param name="directionY">The direction y where user clicked to start the ball.</param>
        public void StartRound(double directionX, double directionY)
        {
            var args = new RoundStartedEventArgs(new Vector(directionX, directionY));

            ThreadContext.InvokeOnUiThread(() => this.OnRoundStarted(args));
        }
Пример #25
0
        protected override void HandleRoundStart(object sender, RoundStartedEventArgs e)
        {
            if (_playerTeamCount > 8 && !_isMatchEnded)
            {
                IsMatchStarted = true;
            }
            if (!IsMatchStarted)
            {
                return;
            }
            _isRoundOffiallyEndedOccured = false;

            // Detect new OT for FaceIt demos
            if (_isFaceit && IsOvertime && _isFinalRound)
            {
                Application.Current.Dispatcher.Invoke(delegate
                {
                    Demo.Overtimes.Add(CurrentOvertime);
                });
                CurrentOvertime = new Overtime
                {
                    Number = ++OvertimeCount
                };
                IsHalfMatch = false;
            }
            _isFinalRound = false;

            // First OT detection for FaceIt demos
            if (Parser.CTScore + Parser.TScore == 30)
            {
                IsOvertime      = true;
                CurrentOvertime = new Overtime
                {
                    Number = ++OvertimeCount
                };
            }

            // Reset until both scores > 0
            // Sometimes parser scores are reseted at the end of the match, check the actual demo scores too
            if (Parser.CTScore == 0 && Parser.TScore == 0 &&
                Demo.ScoreTeam1 < 16 && Demo.ScoreTeam2 < 16)
            {
                Demo.ResetStats(false);
                RoundCount = 0;
                AddTeams();
            }

            CreateNewRound();

            if (Demo.ScoreTeam1 + Demo.ScoreTeam2 == 15)
            {
                IsHalfMatch = true;
            }

            if (!IsOvertime)
            {
                return;
            }

            _playerTeamCount = 0;
        }
Пример #26
0
 /// <summary>
 /// Called when the server sends the round start callback.
 /// </summary>
 /// <param name="sender">The sender.</param>
 /// <param name="args">The <see cref="RoundStartedEventArgs"/> instance containing the event data.</param>
 public void OnRoundStarted(object sender, RoundStartedEventArgs args)
 {
     this.RoundStarted(this, args);
 }
Пример #27
0
 private void CurrentDemoParser_RoundStart(object sender, RoundStartedEventArgs e)
 {
     SteamController.LogToConsole(e.Objective + " round started. " + e.TimeLimit + " second(s) to round end");
 }
Пример #28
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;
            }
        }
Пример #29
0
        void HandleRoundStart(object sender, RoundStartedEventArgs e)
        {
            foreach (var player in parser.PlayingParticipants)
            {
                var p = GetParticipant(player);
            }



            var CurrentRound = new RoundEventMap(Datastore);

            CurrentRound.CTScore = parser.CTScore;
            CurrentRound.TScore  = parser.TScore;
            CurrentRound.Maps    = new Dictionary <string, EventMap>()
            {
                { "TFlashes", TFlashes },
                { "CTFlashes", CTFlashes },
                { "CTSmokes", CTSmokes },
                { "TSmokes", TSmokes },
                { "CTHEs", CTNades },
                { "THEs", TNades },
                { "BothTeamsFire", Fire },
                { "TKillOrigin", TKillOrigin },
                { "CTKillOrigin", CTKillOrigin },
                { "TDeathPosition", TDeathPosition },
                { "CTDeathPosition", CTDeathPosition },
                { "THoldingPosition", THoldingPosition },
                { "CTHoldingPosition", CTHoldingPosition },
                { "TGoodFlashes", TGoodFlashes },
                { "CTGoodFlashes", CTGoodFlashes },
                { "TBadFlashes", TBadFlashes },
                { "CTBadFlashes", CTBadFlashes },
            };

            CurrentRound.Kills = Kills;


            analysis.Rounds.Add(CurrentRound);

            if (!analysis.IsFinished)
            {
                analysis.Progress = (double)parser.CurrentTick / parser.Header.PlaybackFrames;
            }

            if (OnRoundAnalysisFinished != null)
            {
                OnRoundAnalysisFinished(analysis);
            }
            Datastore.Save(analysis);

            roundNum++;

            TFlashes          = new EventMap();
            CTFlashes         = new EventMap();
            CTSmokes          = new EventMap();
            TSmokes           = new EventMap();
            CTNades           = new EventMap();
            TNades            = new EventMap();
            Fire              = new EventMap();
            TKillOrigin       = new EventMap();
            CTKillOrigin      = new EventMap();
            TDeathPosition    = new EventMap();
            CTDeathPosition   = new EventMap();
            CTHoldingPosition = new EventMap();
            THoldingPosition  = new EventMap();
            CTGoodFlashes     = new EventMap();
            TGoodFlashes      = new EventMap();
            CTBadFlashes      = new EventMap();
            TBadFlashes       = new EventMap();

            Kills = new KillMap();
        }