예제 #1
0
 private void OnGameStop(object sender, EventArgs e)
 {
     BroadcastHubController.CurrentLeagueState = "None";
     GameInfoPage.ClearPlayers();
     BroadcastHubController.ToTick.Remove(this);
     OnBaronDespawn();
     OnElderDespawn();
     EmbedIOServer.socketServer.SendEventToAllAsync(new HeartbeatEvent(gameState.stateData));
     EmbedIOServer.socketServer.SendEventToAllAsync(new GameEnd());
     Logging.Info("Game ended");
 }
예제 #2
0
        public void UpdateTeams(List <Player> newData, List <OCRTeam> teamData)
        {
            var bluePlayers = newData.Where(p => p.team == "ORDER").ToList();
            var redPlayers  = newData.Where(p => p.team != "ORDER").ToList();

            //Init data on first run
            bool firstRun = false;

            if (blueTeam == null)
            {
                blueTeam = new Team(0, bluePlayers);
                firstRun = true;
            }

            if (redTeam == null)
            {
                redTeam  = new Team(1, redPlayers);
                firstRun = true;
            }

            if (firstRun)
            {
                Logging.Info("Init Team data");
                blueTeam.UpdateIDs();
                redTeam.UpdateIDs();

                GameInfoPage.InitPlayers(blueTeam);
                GameInfoPage.InitPlayers(redTeam);

                return;
            }

            //Iterate through each player
            var Players = GetAllPlayers();

            for (int i = 0; i < Players.Count; i++)
            {
                var p = Players.ElementAt(i);

                //Determine if the player has died during baron
                Player newP = newData.Where(p2 => p2.summonerName.Equals(p.summonerName, StringComparison.Ordinal)).FirstOrDefault();
                if (newP == null)
                {
                    return;
                }
                Team playerTeam = (newP.team == "ORDER") ? blueTeam : redTeam;
                if (playerTeam.hasBaron && newP.isDead && !p.diedDuringBaron)
                {
                    p.diedDuringBaron = true;
                    var pvmList = (newP.team == "ORDER") ? PlayerViewModel.BluePlayers : PlayerViewModel.RedPlayers;
                    pvmList.Single(pvm => pvm.PlayerName == p.summonerName).HasBaron = false;
                }


                //Level up Events
                if (p.level < 6 && newP.level >= 6)
                {
                    controller.OnLevelUp(new LevelUpEventArgs(p.id, 6));
                }
                else if (p.level < 11 && newP.level >= 11)
                {
                    controller.OnLevelUp(new LevelUpEventArgs(p.id, 11));
                }
                else if (p.level < 16 && newP.level >= 16)
                {
                    controller.OnLevelUp(new LevelUpEventArgs(p.id, 16));
                }

                //New item Events
                var newItems = newP.items.ToList().Where(i => !p.items.ToList().Any(l => i.itemID == l.itemID));
                newItems = newItems.Where(i => DataDragon.Instance.FullIDs.Contains(i.itemID));

                newItems.ToList().ForEach(newI => controller.OnItemCompleted(new ItemCompletedEventArgs(p.id, DataDragon.Instance.GetItemById(newI.itemID))));


                //Update old information
                p.UpdateInfo(newP);
            }

            //Only incase OCR is being used. Make sure OCR is actually returning data
            if (ActiveSettings.current.UseOCR && teamData != null && teamData.Count != 0)
            {
                //Do not add redundant or incorrect gold values
                var  goldDiff         = Math.Abs(teamData.ElementAt(0).Gold - teamData.ElementAt(1).Gold);
                bool shouldUpdateGold = ((stateData.blueGold != teamData.ElementAt(0).Gold || stateData.redGold != teamData.ElementAt(1).Gold) &&
                                         goldDiff < 25000 &&
                                         (Math.Abs(goldDiff - lastGoldDifference) >= 500)) ||
                                        stateData.gameTime - lastGoldUpdate >= 30;



                //Team Updates
                GetBothTeams().ForEach(t =>
                {
                    //Update Gold Data
                    if (shouldUpdateGold)
                    {
                        var ocrData = teamData.Single((t2) => t2.Id == t.id);
                        t.gold      = ocrData.Gold;
                        t.goldHistory.Add(stateData.gameTime, t.gold);

                        //Update State Data
                        if (t.id == 0)
                        {
                            stateData.blueGold = t.gold;
                            Logging.Verbose($"Updating gold data. Data points for current game: {t.goldHistory.Count}");
                        }
                        else
                        {
                            stateData.redGold = t.gold;
                        }

                        lastGoldDifference = goldDiff;
                        lastGoldUpdate     = stateData.gameTime;
                    }

                    //Determine if the team still has baron
                    if (t.hasBaron && t.players.All((p) => p.diedDuringBaron))
                    {
                        t.hasBaron = false;
                        SetObjectiveData(backEndData.baron, stateData.baron, 0);
                        controller.OnBaronDespawn();
                        Logging.Verbose("All Players died during baron");
                    }

                    //Determine if the team still has elder
                    if (t.hasElder && t.players.All(p => p.diedDuringElder))
                    {
                        t.hasElder = false;
                        SetObjectiveData(backEndData.dragon, stateData.dragon, 0);
                        controller.OnElderDespawn();
                        Logging.Verbose("All Players died during elder");
                    }
                });
            }
        }