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
}