コード例 #1
0
        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);
        }