BoringHeroes.ScreenReader.UpdateEverythingOptimized C# (CSharp) Метод

UpdateEverythingOptimized() публичный статический Метод

public static UpdateEverythingOptimized ( CurrentGameState state ) : void
state BoringHeroes.GameLogic.CurrentGameState
Результат void
        public static void UpdateEverythingOptimized(CurrentGameState state)
        {
            Bitmap src;
            Bitmap sourceImage;
            Bitmap croppedImage;
            Bitmap grayScale;
            Bitmap thresholded;
            ControlInput.SendKey(Keys.Space);
            ShouldBringToFront = false;
            while (true)
            {
                #region HPCheck

                try
                {
                    ControlInput.BringHeroesToFront();
                    src = GrabScreenGDI(gameScreen);
                    sourceImage = ChangePixelFormat(src, PixelFormat.Format24bppRgb);
                    Tools.Cropper.Rectangle = new Rectangle(200, 970, 265, 30);
                    croppedImage = Tools.Cropper.Apply(sourceImage);
                    Tools.ColorFilter.Red = new IntRange(50, 255);
                    Tools.ColorFilter.Green = new IntRange(50, 255);
                    Tools.ColorFilter.Blue = new IntRange(0, 50);
                    Tools.ColorFilter.ApplyInPlace(croppedImage);
                    grayScale = Grayscale.CommonAlgorithms.BT709.Apply(croppedImage);
                    Tools.Thresholder.ThresholdValue = 1;
                    Tools.Thresholder.ApplyInPlace(grayScale);
                    thresholded = Tools.GSToRgb.Apply(grayScale);

                    var bc = new BlobCounter();
                    bc.ProcessImage(thresholded);
                    var blobs = bc.GetObjectsInformation().ToList();
                    state.Me.HeroHP = 0;
                    try
                    {
                        blobs =
                            blobs.Where(o => o.Rectangle.Width > 1 && o.Rectangle.Height > 5)
                                .OrderBy(o => o.Rectangle.Width)
                                .ToList();
                        var i = 0;
                        foreach (var blob in blobs)
                        {
                            state.Me.HeroHP = (blob.Rectangle.Width/220f*100f);
                        }
                    }
                    catch (Exception e)
                    {
                    }

                    #endregion

                    if (state.Me.HeroHP <= 0) break;

                    #region UnitCheck

                    var unitPoints = new List<System.Drawing.Point>();
                    try
                    {
                        if (ShouldBringToFront) ControlInput.BringHeroesToFront();
                        Tools.Cropper.Rectangle = new Rectangle(0, 100, 1920, 740);
                        croppedImage = Tools.Cropper.Apply(sourceImage);
                        Tools.HSLFiltering.Hue = new IntRange(0, 3);
                        Tools.HSLFiltering.Saturation = new Range(0.8f, 1);
                        Tools.HSLFiltering.Luminance = new Range(0, 0.4f);
                        Tools.HSLFiltering.ApplyInPlace(croppedImage);
                        grayScale = Grayscale.CommonAlgorithms.BT709.Apply(croppedImage);
                        Tools.Thresholder.ThresholdValue = 1;
                        Tools.Thresholder.ApplyInPlace(grayScale);
                        Tools.HLengthSmoothing.MaxGapSize = 2;
                        Tools.VLengthSmoothing.MaxGapSize = 2;
                        Tools.HLengthSmoothing.ApplyInPlace(grayScale);
                        Tools.VLengthSmoothing.ApplyInPlace(grayScale);
                        thresholded = Tools.GSToRgb.Apply(grayScale);
                        bc.ProcessImage(thresholded);
                        blobs = bc.GetObjectsInformation().ToList();

                        blobs =
                            blobs.Where(
                                o =>
                                    !o.Rectangle.IntersectsWith(state.GameMode.MinimapRectangle) &&
                                    o.Rectangle.Width > 8 &&
                                    o.Rectangle.Width < 50 && o.Rectangle.Height >= 2 && o.Rectangle.Height < 4)
                                .ToList();
                        var i = 0;
                        foreach (var blob in blobs)
                        {
                            unitPoints.Add(new System.Drawing.Point((int) (blob.CenterOfGravity.X),
                                (int) (100 + blob.CenterOfGravity.Y)));
                        }
                    }
                    catch (Exception e)
                    {
                    }
                    state.EnemyCreepsNearby = unitPoints.ToArray();

                    unitPoints.Clear();
                    if (ShouldBringToFront) ControlInput.BringHeroesToFront();
                    try
                    {
                        Tools.Cropper.Rectangle = new Rectangle(0, 100, 1920, 740);
                        croppedImage = Tools.Cropper.Apply(sourceImage);
                        Tools.HSLFiltering.Hue = new IntRange(113, 122);
                        Tools.HSLFiltering.Saturation = new Range(0.8f, 1);
                        Tools.HSLFiltering.Luminance = new Range(0, 0.4f);
                        Tools.HSLFiltering.ApplyInPlace(croppedImage);

                        grayScale = Grayscale.CommonAlgorithms.BT709.Apply(croppedImage);
                        Tools.Thresholder.ThresholdValue = 1;
                        Tools.Thresholder.ApplyInPlace(grayScale);
                        Tools.HLengthSmoothing.MaxGapSize = 2;
                        Tools.VLengthSmoothing.MaxGapSize = 2;
                        Tools.HLengthSmoothing.ApplyInPlace(grayScale);
                        Tools.VLengthSmoothing.ApplyInPlace(grayScale);
                        thresholded = Tools.GSToRgb.Apply(grayScale);

                        bc = new BlobCounter();
                        bc.ProcessImage(thresholded);
                        //thresholded.Save("./images/unitdebug.png");
                        blobs = bc.GetObjectsInformation().ToList();

                        blobs =
                            blobs.Where(
                                o =>
                                    !o.Rectangle.IntersectsWith(state.GameMode.MinimapRectangle) &&
                                    o.Rectangle.Width > 8 &&
                                    o.Rectangle.Width < 50 && o.Rectangle.Height >= 2 && o.Rectangle.Height < 4)
                                .ToList();
                        var i = 0;
                        foreach (var blob in blobs)
                        {
                            unitPoints.Add(new System.Drawing.Point((int) (blob.CenterOfGravity.X - 12),
                                (int) (100 + blob.CenterOfGravity.Y)));
                        }
                    }
                    catch (Exception e)
                    {
                    }
                    state.FriendlyCreepsNearby = unitPoints.ToArray();

                    #endregion

                    #region TowerCheck

                    unitPoints = new List<System.Drawing.Point>();
                    try
                    {
                        //TickNow("unitSearchStart", dt);
                        if (ShouldBringToFront) ControlInput.BringHeroesToFront();
                        Tools.Cropper.Rectangle = new Rectangle(0, 100, 1920, 540);
                        croppedImage = Tools.Cropper.Apply(sourceImage);
                        Tools.HSLFiltering.Hue = new IntRange(36, 40);
                        Tools.HSLFiltering.Saturation = new Range(0.3f, 0.5f);
                        Tools.HSLFiltering.Luminance = new Range(0.3f, 0.55f);
                        Tools.HSLFiltering.ApplyInPlace(croppedImage);
                        grayScale = Grayscale.CommonAlgorithms.BT709.Apply(croppedImage);
                        Tools.Thresholder.ThresholdValue = 1;
                        Tools.Thresholder.ApplyInPlace(grayScale);
                        Tools.HLengthSmoothing.MaxGapSize = 6;
                        Tools.HLengthSmoothing.ApplyInPlace(grayScale);
                        thresholded = Tools.GSToRgb.Apply(grayScale);

                        bc.ProcessImage(thresholded);
                        blobs = bc.GetObjectsInformation().ToList();

                        blobs =
                            blobs.Where(
                                o =>
                                    !o.Rectangle.IntersectsWith(state.GameMode.MinimapRectangle) &&
                                    o.Rectangle.Width > 20 &&
                                    o.Rectangle.Width < 180 && o.Rectangle.Height > 6 && o.Rectangle.Height < 16)
                                .ToList();
                        var i = 0;
                        foreach (var blob in blobs)
                        {
                            var rc = new Rectangle(blob.Rectangle.X, blob.Rectangle.Y + 80, blob.Rectangle.Width,
                                blob.Rectangle.Height + 20);

                            Tools.Cropper.Rectangle = rc;
                            var cut = Tools.Cropper.Apply(sourceImage);
                            var res = Tools.TemplateMatcher.ProcessImage(cut, templateTower);
                            foreach (var r in res)
                            {
                                unitPoints.Add(new System.Drawing.Point(rc.X - 12, 100 + rc.Y + 350));
                            }
                        }
                    }
                    catch (Exception e)
                    {
                    }
                    state.TowersFound = unitPoints.ToArray();

                    #endregion

                    #region Hero Check

                    heroPoints[0].Clear();
                    heroPoints[1].Clear();
                    try
                    {
                        heroPoints[2].Clear();
                        if (ShouldBringToFront) ControlInput.BringHeroesToFront();
                        Tools.Cropper.Rectangle = new Rectangle(0, 100, 1920, 740);
                        croppedImage = Tools.Cropper.Apply(sourceImage);

                        grayScale = Grayscale.CommonAlgorithms.BT709.Apply(croppedImage);
                        Tools.Thresholder.ThresholdValue = 128;
                        Tools.Thresholder.ApplyInPlace(grayScale);

                        thresholded = Tools.GSToRgb.Apply(grayScale);
                        Tools.TemplateMatcher.SimilarityThreshold = 0.9f;

                        bc.ProcessImage(thresholded);
                        blobs = bc.GetObjectsInformation().ToList();
                        blobs =
                            blobs.Where(
                                o =>
                                    o.Rectangle.Width > 115 && o.Rectangle.Width < 130 && o.Rectangle.Height < 20 &&
                                    o.Rectangle.Height > 10).ToList();
                        var i = 0;
                        foreach (var blob in blobs)
                        {
                            var rect = blob.Rectangle;
                            rect.Offset(0, 100);
                            Tools.Cropper.Rectangle = blob.Rectangle;
                            var matches1 = Tools.TemplateMatcher.ProcessImage(Tools.Cropper.Apply(croppedImage),
                                templateMe);

                            if (matches1.Length > 1)
                            {
                                state.Me.HeroScreenPosition = new System.Drawing.Point((int) blob.CenterOfGravity.X,
                                    (int) blob.CenterOfGravity.Y + 250);
                                //state.Me.HeroHP = (float) (matches1.Length/120.0*100.0);
                                heroPoints[0].Add(
                                    new OnScreenHero(
                                        new System.Drawing.Point((int) blob.CenterOfGravity.X,
                                            (int) blob.CenterOfGravity.Y + 200),
                                        matches1.Length));
                                continue;
                            }
                            var matches2 = Tools.TemplateMatcher.ProcessImage(Tools.Cropper.Apply(croppedImage),
                                templateEnemy);

                            if (matches2.Length > 1)
                            {
                                heroPoints[1].Add(
                                    new OnScreenHero(
                                        new System.Drawing.Point((int) blob.CenterOfGravity.X,
                                            (int) blob.CenterOfGravity.Y + 200),
                                        matches2.Length));
                                continue;
                            }
                            var matches3 = Tools.TemplateMatcher.ProcessImage(Tools.Cropper.Apply(croppedImage),
                                templateFriend);
                            if (matches3.Length > 1)
                            {
                                heroPoints[2].Add(
                                    new OnScreenHero(
                                        new System.Drawing.Point((int) blob.CenterOfGravity.X,
                                            (int) blob.CenterOfGravity.Y + 200),
                                        matches3.Length));
                            }
                        }
                        state.FriendlyHeroes = heroPoints[2].ToArray();
                        state.EnemyHeroes = heroPoints[1].ToArray();
                    }
                    catch (Exception e)
                    {
                    }

                    #endregion

                    #region UpdateMinimap

                    var debugPoints = new List<System.Drawing.Point>();
                    try
                    {
                        Tools.Cropper.Rectangle = state.GameMode.MinimapRectangle;
                        Tools.ColorFilter.Red = new IntRange(180, 255);
                        Tools.ColorFilter.Green = new IntRange(180, 255);
                        Tools.ColorFilter.Blue = new IntRange(180, 255);
                        croppedImage = Tools.Cropper.Apply(sourceImage);
                        Tools.ColorFilter.ApplyInPlace(croppedImage);
                        croppedImage.Save("./debug/hsl.png");
                        grayScale = Grayscale.CommonAlgorithms.BT709.Apply(croppedImage);
                        Tools.Thresholder.ThresholdValue = 1;
                        Tools.Thresholder.ApplyInPlace(grayScale);
                        thresholded = Tools.GSToRgb.Apply(grayScale);

                        bc.ProcessImage(thresholded);
                        blobs = bc.GetObjectsInformation().ToList();

                        blobs = blobs.Where(o => o.Rectangle.Width > 4 && o.Rectangle.Width < 11
                                                 && o.Rectangle.Height > 4 && o.Rectangle.Height < 11).ToList();
                        Point? cam = null;
                        Point[] cams = {new Point()};
                        for (var j = 0; j < blobs.Count; j++)
                        {
                            cam = FindCamera(blobs[j].CenterOfGravity, blobs);
                            if (cam != null)
                            {
                                break;
                            }
                        }

                        foreach (var c in cams)
                        {
                            debugPoints.Add(new System.Drawing.Point((int) c.X, (int) c.Y));
                        }
                        if (cam.HasValue)
                            state.Me.HeroMinimapPosition = new System.Drawing.Point(
                                (int) (cam.Value.X + state.GameMode.MinimapRectangle.X),
                                (int) (cam.Value.Y + state.GameMode.MinimapRectangle.Y));
                    }
                    catch (Exception e)
                    {
                    }

                    #endregion

                    if (!state.IsPlayerSafe) break;

                    #region Check Mounted

                    if (ShouldBringToFront) ControlInput.BringHeroesToFront();
                    try
                    {
                        Tools.Cropper.Rectangle = new Rectangle(0, 700, 70, 250);
                        croppedImage = Tools.Cropper.Apply(sourceImage);

                        Tools.TemplateMatcher.SimilarityThreshold = 0.9f;

                        var matches1 = Tools.TemplateMatcher.ProcessImage(croppedImage, templateMounted);

                        if (matches1.Length > 0)
                        {
                            state.Me.IsMounted = true;
                        }
                        state.Me.IsMounted = false;
                    }
                    catch (Exception e)
                    {
                    }

                    #endregion

                    #region Has talents?

                    var canLevel = false;
                    try
                    {
                        if (ShouldBringToFront) ControlInput.BringHeroesToFront();
                        Tools.Cropper.Rectangle = new Rectangle(70, 1020, 105, 30);
                        croppedImage = Tools.Cropper.Apply(sourceImage);

                        Tools.TemplateMatcher.SimilarityThreshold = 0.9f;

                        var matches1 = Tools.TemplateMatcher.ProcessImage(croppedImage, templateHasTalents);

                        if (matches1.Length > 0)
                        {
                            canLevel = true;
                        }
                    }
                    catch (Exception e)
                    {
                    }
                    state.Me.CanLevelTalents = canLevel;

                    #endregion

                    if (!state.Me.CanLevelTalents) break;

                    #region Talent Scan

                    /*
                    try
                    {
                        Tools.Cropper.Rectangle = new Rectangle(48, 800, 390, 70);
                        croppedImage = Tools.Cropper.Apply(sourceImage);
                        state.Me.CharacterLevel = 1;
                        var patternFinder = new ExhaustiveTemplateMatching(0.9f);

                        var matches = patternFinder.ProcessImage(croppedImage, templateTalents4);
                        if (matches.Length == 1)
                        {
                            state.Me.CharacterLevel = 4;
                            return;
                        }
                        matches = patternFinder.ProcessImage(croppedImage, templateTalents7);
                        if (matches.Length == 1)
                        {
                            state.Me.CharacterLevel = 7;
                            return;
                        }
                        matches = patternFinder.ProcessImage(croppedImage, templateTalents10);
                        if (matches.Length == 1)
                        {
                            state.Me.CharacterLevel = 10;
                            return;
                        }
                        matches = patternFinder.ProcessImage(croppedImage, templateTalents13);
                        if (matches.Length == 1)
                        {
                            state.Me.CharacterLevel = 13;
                            return;
                        }
                        matches = patternFinder.ProcessImage(croppedImage, templateTalents16);
                        if (matches.Length == 1)
                        {
                            state.Me.CharacterLevel = 16;
                            return;
                        }
                        matches = patternFinder.ProcessImage(croppedImage, templateTalents20);
                        if (matches.Length == 1)
                        {
                            state.Me.CharacterLevel = 20;
                        }
                    }
                    catch (Exception e)
                    {
                    }
                    */

                    #endregion
                }
                catch (Exception e)
                {
                }
                break;
            }

            #region Dispose EVERYTHING

            #endregion
        }