private static bool CanEvadeFromInterselectPointHead(ProjectilesInfo projectile) { var interselectPointRange = projectile.CurrentPoint.GetDistanceTo(projectile.EndPoint); var safeDistance = Tick.Self.Radius + projectile.Radius; var evadeVector = new Vector(projectile.EndPoint) - new Vector(Tick.Self.GetPositionPoint()); evadeVector.Negate(); evadeVector.Normalize(); evadeVector = safeDistance * evadeVector; var safePoint = projectile.EndPoint + evadeVector; //VisualClientHelper.Circle(safePoint.X,safePoint.Y, 5, 1,0,0); var distanceToEscape = Tick.Self.GetDistanceTo(safePoint.X, safePoint.Y); var wizardSpeed = 3 * UnitHelper.GetSpeedBonusFactorFromSkillsAndAuras(); var projectilesToInterselectTicks = Math.Abs(interselectPointRange / projectile.Speed); var escapeTicks = Math.Abs(distanceToEscape / wizardSpeed); //DebugTrace.ConsoleWriteLite($"{projectilesToInterselectTicks.ToString("N3")} / {escapeTicks.ToString("N3")}"); return(escapeTicks <= projectilesToInterselectTicks); }
//Есть ли нормаль к вектору private static bool IsInterselectByNormal(ProjectilesInfo projectileInfo, out Point2D normalInterselectionPoint) { var p1 = projectileInfo.StartPoint; var p2 = projectileInfo.EndPoint; var me = new Vector(Tick.Self.X, Tick.Self.Y); var xy1 = new Vector(p1.X, p1.Y); var xy2 = new Vector(p2.X, p2.Y); var v0 = me - xy1; var v2 = xy2 - xy1; var scalar = (v0 * v2) / (v2 * v2); normalInterselectionPoint = p1 + scalar * v2; var isInterselect = scalar > 0 && scalar < 1; return(isInterselect); }
private static bool CanEvadeFromInterselectPoint(ProjectilesInfo projectile, Point2D interselectPoint) { var interselectPointRange = projectile.CurrentPoint.GetDistanceTo(interselectPoint); var interselectMyRange = Tick.Self.GetDistanceTo(interselectPoint.X, interselectPoint.Y); var distanceToEscape = Tick.Self.Radius + projectile.Radius - interselectMyRange; if (distanceToEscape < 0) { return(true); } var wizardSpeed = 3 * UnitHelper.GetSpeedBonusFactorFromSkillsAndAuras(); var projectilesToInterselectTicks = Math.Abs(/*(int)*/ (interselectPointRange / projectile.Speed)); var escapeTicks = Math.Abs(/*(int)*/ (distanceToEscape / wizardSpeed)); //DebugTrace.ConsoleWriteLite($"{projectilesToInterselectTicks.ToString("N3")} / {escapeTicks.ToString("N3")}"); return(escapeTicks <= projectilesToInterselectTicks); }
//Есть ли пересечение по радиусу конца выстрела? //Считаем что есть если мы в зоне поражения радиуса конца выстрела + буфер private static bool IsInterselectByHead(ProjectilesInfo projectileInfo, double additionalDangerZone) { return(Tick.Self.GetDistanceTo(projectileInfo.EndPoint.X, projectileInfo.EndPoint.Y) - Tick.Self.Radius - projectileInfo.Radius - additionalDangerZone <= 0); }