public static float GetIntersectDistance(Spell spell, Vector2 start, Vector2 end) { if (spell == null) { return(float.MaxValue); } Vector3 start3D = new Vector3(start.X, start.Y, 0); Vector2 walkDir = (end - start); Vector3 walkDir3D = new Vector3(walkDir.X, walkDir.Y, 0); Ray heroPath = new Ray(start3D, walkDir3D); if (spell.spellType == SpellType.Line) { Vector2 intersection; bool hasIntersection = spell.LineIntersectLinearSpellEx(start, end, out intersection); if (hasIntersection) { return(start.LSDistance(intersection)); } } else if (spell.spellType == SpellType.Circular) { if (end.InSkillShot(spell, ObjectCache.myHeroCache.boundingRadius) == false) { Vector2 intersection1, intersection2; MathUtils.FindLineCircleIntersections(spell.endPos, spell.radius, start, end, out intersection1, out intersection2); if (intersection1.X != float.NaN && MathUtils.isPointOnLineSegment(intersection1, start, end)) { return(start.LSDistance(intersection1)); } else if (intersection2.X != float.NaN && MathUtils.isPointOnLineSegment(intersection2, start, end)) { return(start.LSDistance(intersection2)); } } } return(float.MaxValue); }
public static float GetIntersectDistance(Spell spell, Vector2 start, Vector2 end) { if (spell == null) return float.MaxValue; Vector3 start3D = new Vector3(start.X, start.Y, 0); Vector2 walkDir = (end - start); Vector3 walkDir3D = new Vector3(walkDir.X, walkDir.Y, 0); Ray heroPath = new Ray(start3D, walkDir3D); if (spell.spellType == SpellType.Line) { Vector2 intersection; bool hasIntersection = spell.LineIntersectLinearSpellEx(start, end, out intersection); if (hasIntersection) { return start.Distance(intersection); } } else if (spell.spellType == SpellType.Circular) { if (end.InSkillShot(spell, ObjectCache.myHeroCache.boundingRadius) == false) { Vector2 intersection1, intersection2; MathUtils.FindLineCircleIntersections(spell.endPos, spell.radius, start, end, out intersection1, out intersection2); if (intersection1.X != float.NaN && MathUtils.isPointOnLineSegment(intersection1, start, end)) { return start.Distance(intersection1); } else if (intersection2.X != float.NaN && MathUtils.isPointOnLineSegment(intersection2, start, end)) { return start.Distance(intersection2); } } } return float.MaxValue; }