public static HitChance GetHitChance(SpellSlot spellslot, float range, SkillShotType type, float delay, float speed, float radius, Vector3 fromPoint, Obj_AI_Base target) { // CAN'T MOVE SPELLS /////////////////////////////////////////////////////////////////////////////////// if (UnitTracker.GetSpecialSpellEndTime(target) > 0 || target.HasBuff("recall") || (UnitTracker.GetLastStopMoveTime(target) < 0.1d && target.IsRooted)) { return(HitChance.High); } // PREPARE MATH /////////////////////////////////////////////////////////////////////////////////// var tempHitchance = HitChance.Low; var lastWaypiont = target.RealPath().Last(); var distanceUnitToWaypoint = lastWaypiont.Distance(target.ServerPosition); var distanceFromToUnit = fromPoint.Distance(target.ServerPosition); var distanceFromToWaypoint = lastWaypiont.Distance(fromPoint); var getAngle = GetAngle(fromPoint, target); float speedDelay = distanceFromToUnit / speed; if (Math.Abs(speed - float.MaxValue) < float.Epsilon) { speedDelay = 0; } float totalDelay = speedDelay + delay; float moveArea = target.MoveSpeed * totalDelay; float fixRange = moveArea * 0.4f; float pathMinLen = 900 + +moveArea; double angleMove = 31; if (radius > 70) { angleMove++; } else if (radius <= 60) { angleMove--; } if (delay < 0.3) { angleMove++; } if (UnitTracker.GetLastNewPathTime(target) < 0.1d) { tempHitchance = HitChance.High; pathMinLen = 700f + moveArea; angleMove += 1.5; fixRange = moveArea * 0.3f; } if (type == SkillShotType.Circular) { fixRange -= radius / 2; } // FIX RANGE /////////////////////////////////////////////////////////////////////////////////// if (distanceFromToWaypoint <= distanceFromToUnit) { if (distanceFromToUnit > range - fixRange) { tempHitchance = HitChance.Medium; // return tempHitchance; } } else if (distanceUnitToWaypoint > 350) { angleMove += 1.5; } // SPAM CLICK /////////////////////////////////////////////////////////////////////////////////// if (UnitTracker.PathCalc(target)) { //OktwCommon.debug("PRED: SPAM CLICK"); if (distanceFromToUnit < range - fixRange) { tempHitchance = HitChance.High; } else { tempHitchance = HitChance.Medium; } // return tempHitchance; } // SPAM POSITION /////////////////////////////////////////////////////////////////////////////////// if (UnitTracker.SpamSamePlace(target)) { //OktwCommon.debug("PRED: SPAM POSITION"); return(HitChance.High); } // SPECIAL CASES /////////////////////////////////////////////////////////////////////////////////// if (distanceFromToUnit < 250) { //OktwCommon.debug("PRED: SPECIAL CASES NEAR"); return(HitChance.High); } else if (target.MoveSpeed < 250) { //OktwCommon.debug("PRED: SPECIAL CASES SLOW"); return(HitChance.High); } else if (distanceFromToWaypoint < 250) { //OktwCommon.debug("PRED: SPECIAL CASES ON WAY"); return(HitChance.High); } // LONG CLICK DETECTION /////////////////////////////////////////////////////////////////////////////////// if (distanceUnitToWaypoint > pathMinLen) { //OktwCommon.debug("PRED: LONG CLICK DETECTION"); return(HitChance.High); } // RUN IN LANE DETECTION /////////////////////////////////////////////////////////////////////////////////// if (getAngle < angleMove && distanceUnitToWaypoint > 260) { //OktwCommon.debug(GetAngle(input.From, target) + " PRED: ANGLE " + angleMove + " DIS " + distanceUnitToWaypoint); return(HitChance.High); } // CIRCLE NEW PATH /////////////////////////////////////////////////////////////////////////////////// if (type == SkillShotType.Circular) { if (UnitTracker.GetLastNewPathTime(target) < 0.1d && distanceUnitToWaypoint > fixRange) { //OktwCommon.debug("PRED: CIRCLE NEW PATH"); return(HitChance.High); } } // LOW HP DETECTION /////////////////////////////////////////////////////////////////////////////////// if (target.HealthPercent < 20 || ObjectManager.Player.HealthPercent < 20) { tempHitchance = HitChance.Medium; // return HitChance.Medium; } // STOP LOGIC /////////////////////////////////////////////////////////////////////////////////// if (target.RealPath().LastOrDefault() != target.ServerPosition) { if ((UnitTracker.GetLastAutoAttackTime(target) < 0.1 || UnitTracker.GetLastStopMoveTime(target) < 0.1) && totalDelay < 0.6) { //OktwCommon.debug("PRED: STOP LOGIC WINDING"); tempHitchance = HitChance.Medium; } else if (UnitTracker.GetLastStopMoveTime(target) < 0.5) { tempHitchance = HitChance.Medium; } else { //OktwCommon.debug("PRED: STOP LOGIC"); tempHitchance = HitChance.Medium; } return(tempHitchance); } //Program.debug("PRED: NO DETECTION"); return(tempHitchance); }