private int SortFunc(Units enemy1, Units enemy2)
        {
            if (!(enemy1 != null) || !(enemy2 != null) || !enemy1.isLive || !enemy2.isLive)
            {
                return(0);
            }
            Units home = MapManager.Instance.GetHome((TeamType)this.m_Owner.teamType);

            if (home == null)
            {
                return(0);
            }
            float num  = UnitFeature.DistanceToTargetSqr(home.mTransform, enemy1.mTransform);
            float num2 = UnitFeature.DistanceToTargetSqr(home.mTransform, enemy2.mTransform);

            if (num < num2)
            {
                return(-1);
            }
            if (num == num2)
            {
                return(0);
            }
            return(1);
        }
예제 #2
0
    public static void FilterTargetsRef(Units self, ref List <Units> targets, FindType findType, object param)
    {
        if (targets != null && targets.Count > 0)
        {
            switch (findType)
            {
            case FindType.FirstIndex:
            {
                int num = (int)param;
                for (int i = 0; i < targets.Count; i++)
                {
                    if (i > num)
                    {
                        targets.RemoveAt(i);
                        i--;
                    }
                }
                break;
            }

            case FindType.Distance:
            {
                float num2 = (float)param * (float)param;
                for (int j = 0; j < targets.Count; j++)
                {
                    float num3 = UnitFeature.DistanceToTargetSqr(self.mTransform, targets[j].mTransform);
                    if (num3 > num2)
                    {
                        targets.RemoveAt(j);
                        j--;
                    }
                }
                break;
            }

            case FindType.Blood:
            {
                float num4 = (float)param;
                for (int k = 0; k < targets.Count; k++)
                {
                    if (targets[k].hp > targets[k].hp_max * num4)
                    {
                        targets.RemoveAt(k);
                        k--;
                    }
                }
                break;
            }
            }
        }
    }
        public static bool IfChooseTarget(Units owner, Units target, bool isKillTarget = false, float range = 0f)
        {
            if (target == null || !target.isLive || !TeamManager.CanAttack(owner, target) || !target.CanBeSelected || target.isBuilding || target.isItem || (target.isMonster && target.teamType == 2) || !owner.CanBeSelected)
            {
                return(false);
            }
            if (!isKillTarget && target.isHero && UnitFeature.DistanceToTarget(owner.transform, target.transform) > owner.warning_range)
            {
                return(false);
            }
            Units home = MapManager.Instance.GetHome((TeamType)target.teamType);

            if (home == null)
            {
                return(true);
            }
            if (owner.MeiHuo.IsInState)
            {
                return(true);
            }
            if (range != 0f && !HeroTargetingSystem.IsInrange(owner.mTransform.position, target.mTransform.position, range))
            {
                return(false);
            }
            bool        arg_10E_0 = !StrategyManager.Instance.IsAuto() && owner.isPlayer;
            UtilCounter counter   = UtilManager.Instance.GetCounter(UtilType.Tower);

            if (counter != null)
            {
                TowerCounter towerCounter          = counter as TowerCounter;
                Units        towerOfLowestPriority = towerCounter.GetTowerOfLowestPriority(owner);
                if (towerOfLowestPriority != null)
                {
                    float num  = UnitFeature.DistanceToTargetSqr(owner.transform, towerOfLowestPriority.transform);
                    float num2 = UnitFeature.DistanceToTargetSqr(owner.transform, target.transform);
                    if (num2 > num)
                    {
                        return(false);
                    }
                }
            }
            bool flag = StrategyManager.Instance.IsHomeRecovery((TeamType)target.teamType);

            if (flag)
            {
                Vector3 recoveryPos = StrategyManager.Instance.GetRecoveryPos((TeamType)target.teamType);
                if (HeroTargetingSystem.IsInrange(target.transform.position, recoveryPos, 3f))
                {
                    return(false);
                }
            }
            Units nearestEnemyTowerOfTarget = TargetSelectHelper.GetNearestEnemyTowerOfTarget(target);

            if (nearestEnemyTowerOfTarget != null)
            {
                float attackRange = nearestEnemyTowerOfTarget.GetAttackRange(owner);
                if (HeroTargetingSystem.IsInrange(target.transform.position, nearestEnemyTowerOfTarget.transform.position, attackRange))
                {
                    float num3 = UnitFeature.DistanceToTarget(target, nearestEnemyTowerOfTarget);
                    if (owner.GetAttackRange(target) + num3 > attackRange && !HeroTargetingSystem.IsInrange(owner.transform.position, nearestEnemyTowerOfTarget.transform.position, attackRange))
                    {
                        return(true);
                    }
                    Units attackTarget = nearestEnemyTowerOfTarget.GetAttackTarget();
                    if (attackTarget != null && attackTarget == owner)
                    {
                        return(false);
                    }
                    List <Units> allians = TargetSelectHelper.GetAllians(nearestEnemyTowerOfTarget, attackRange, TargetTag.Monster, false);
                    return(allians != null && allians.Count > 1 && !target.isHero);
                }
            }
            return(true);
        }
예제 #4
0
    public static void SortTargets(Units self, SortType sortType, ref List <Units> target_units)
    {
        if (target_units != null && target_units.Count > 1)
        {
            switch (sortType)
            {
            case SortType.Hatred:
                target_units.Sort(delegate(Units a, Units b)
                {
                    if (a.unique_id == b.unique_id)
                    {
                        return(0);
                    }
                    int targetHatredValue  = self.GetTargetHatredValue(a);
                    int targetHatredValue2 = self.GetTargetHatredValue(b);
                    int result             = -1;
                    if (targetHatredValue > targetHatredValue2)
                    {
                        result = -1;
                    }
                    else if (targetHatredValue < targetHatredValue2)
                    {
                        result = 1;
                    }
                    return(result);
                });
                break;

            case SortType.Distance:
                target_units.Sort(delegate(Units a, Units b)
                {
                    if (a.unique_id == b.unique_id)
                    {
                        return(0);
                    }
                    float num = 0f;
                    if (a != null)
                    {
                        num = UnitFeature.DistanceToTargetSqr(self.mTransform, a.mTransform);
                    }
                    float num2 = 0f;
                    if (b != null)
                    {
                        num2 = UnitFeature.DistanceToTargetSqr(self.mTransform, b.mTransform);
                    }
                    int result = -1;
                    if (num > num2)
                    {
                        result = 1;
                    }
                    else if (num < num2)
                    {
                        result = -1;
                    }
                    return(result);
                });
                break;

            case SortType.Blood:
                target_units.Sort(delegate(Units a, Units b)
                {
                    if (a.unique_id == b.unique_id)
                    {
                        return(0);
                    }
                    float hp   = a.hp;
                    float hp2  = b.hp;
                    int result = -1;
                    if (hp > hp2)
                    {
                        result = 1;
                    }
                    else if (hp < hp2)
                    {
                        result = -1;
                    }
                    return(result);
                });
                break;

            case SortType.Magic:
                target_units.Sort(delegate(Units a, Units b)
                {
                    if (a.unique_id == b.unique_id)
                    {
                        return(0);
                    }
                    float mp   = a.mp;
                    float mp2  = b.mp;
                    int result = -1;
                    if (mp > mp2)
                    {
                        result = 1;
                    }
                    else if (mp < mp2)
                    {
                        result = -1;
                    }
                    return(result);
                });
                break;

            case SortType.Prority:
                target_units.Sort(delegate(Units a, Units b)
                {
                    if (a.unique_id == b.unique_id)
                    {
                        return(0);
                    }
                    int targetPorityValue  = self.GetTargetPorityValue(a);
                    int targetPorityValue2 = self.GetTargetPorityValue(b);
                    int result             = -1;
                    if (targetPorityValue > targetPorityValue2)
                    {
                        result = -1;
                    }
                    else if (targetPorityValue < targetPorityValue2)
                    {
                        result = 1;
                    }
                    return(result);
                });
                break;
            }
        }
    }