forked from EnsageSharp/Ensage.Common
/
TargetSelector.cs
127 lines (120 loc) · 4.97 KB
/
TargetSelector.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// <copyright file="TargetSelector.cs" company="EnsageSharp">
// Copyright (c) 2015 EnsageSharp.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see http://www.gnu.org/licenses/
// </copyright>
namespace Ensage.Common
{
using System;
using System.Linq;
using Ensage.Common.Extensions;
/// <summary>
/// Class used to find targets based on conditions
/// </summary>
public class TargetSelector
{
#region Public Methods and Operators
/// <summary>
/// Find enemy hero that takes least hits to kill
/// </summary>
/// <param name="source">Source hero</param>
/// <param name="bonusRange"></param>
/// <returns></returns>
public static Hero BestAutoAttackTarget(Hero source, float bonusRange = 0)
{
var attackRange = source.GetAttackRange();
var enemyHeroes =
ObjectMgr.GetEntities<Hero>()
.Where(
x =>
x.Team == source.GetEnemyTeam() && !x.IsIllusion && x.IsAlive && x.IsVisible
&& x.Distance2D(source) <= (attackRange + x.HullRadius + bonusRange + source.HullRadius + 50));
var aaDmg = source.MinimumDamage + source.BonusDamage;
Hero bestTarget = null;
var lastHitsToKill = 0f;
foreach (var enemyHero in enemyHeroes)
{
var takenDmg = enemyHero.DamageTaken(aaDmg, DamageType.Physical, source, false);
var hitsToKill = enemyHero.Health / takenDmg;
if (bestTarget != null && !(lastHitsToKill > hitsToKill))
{
continue;
}
bestTarget = enemyHero;
lastHitsToKill = hitsToKill;
}
return bestTarget;
}
/// <summary>
/// Finds target closest to mouse in specified range
/// </summary>
/// <param name="source"></param>
/// <param name="range"></param>
/// <returns></returns>
public static Hero ClosestToMouse(Hero source, float range = 1000)
{
var mousePosition = Game.MousePosition;
var enemyHeroes =
ObjectMgr.GetEntities<Hero>()
.Where(
x =>
x.Team == source.GetEnemyTeam() && !x.IsIllusion && x.IsAlive && x.IsVisible
&& x.Distance2D(mousePosition) <= range);
Hero closestHero = null;
foreach (var enemyHero in enemyHeroes)
{
if (closestHero == null || closestHero.Distance2D(mousePosition) > enemyHero.Distance2D(mousePosition))
{
closestHero = enemyHero;
}
}
return closestHero;
}
/// <summary>
/// Checks for lowest hp creep in attack range
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
public static Unit GetLowestHPCreep(Hero source)
{
try
{
var attackRange = source.GetAttackRange();
var lowestHp =
ObjectMgr.GetEntities<Unit>()
.Where(
x =>
(x.ClassID == ClassID.CDOTA_BaseNPC_Tower || x.ClassID == ClassID.CDOTA_BaseNPC_Creep_Lane
|| x.ClassID == ClassID.CDOTA_BaseNPC_Creep
|| x.ClassID == ClassID.CDOTA_BaseNPC_Creep_Neutral
|| x.ClassID == ClassID.CDOTA_BaseNPC_Creep_Siege
|| x.ClassID == ClassID.CDOTA_BaseNPC_Additive
|| x.ClassID == ClassID.CDOTA_BaseNPC_Barracks
|| x.ClassID == ClassID.CDOTA_BaseNPC_Building
|| x.ClassID == ClassID.CDOTA_BaseNPC_Creature) && x.IsAlive && x.IsVisible
&& x.Team != source.Team && x.Distance2D(source) < (attackRange + 100))
.OrderBy(creep => creep.Health)
.DefaultIfEmpty(null)
.FirstOrDefault();
return lowestHp;
}
catch (Exception)
{
//no
}
return null;
}
#endregion
}
}