示例#1
0
        private bool UpdateWallBreakingTroops(SmartEntity entity, TargetingController.OnTargetingDone onTroopTargetingDone)
        {
            if (!entity.TroopComp.UpdateWallAttackerTroop)
            {
                return(false);
            }
            entity.TroopComp.UpdateWallAttackerTroop = false;
            if (entity.ShooterComp.Target == null)
            {
                return(false);
            }
            HealthComponent healthComp = entity.ShooterComp.Target.HealthComp;

            if (healthComp == null || healthComp.IsDead())
            {
                return(false);
            }
            if (entity.ShooterComp.AttackFSM.IsAttacking && entity.SecondaryTargetsComp.CurrentAlternateTarget != null && entity.SecondaryTargetsComp.ObstacleTarget == null)
            {
                entity.ShooterComp.AttackFSM.StopAttacking(true);
                bool flag  = false;
                bool flag2 = Service.PathingManager.RestartPathing(entity, out flag, false);
                if (flag2 && flag)
                {
                    SmartEntity primaryTarget = this.shooterController.GetPrimaryTarget(entity.ShooterComp);
                    onTroopTargetingDone(entity);
                    this.shooterController.StopSearch(entity.ShooterComp);
                    this.OnPathingComplete(entity, entity.SecondaryTargetsComp, entity.StateComp, entity.ShooterComp, primaryTarget);
                }
                return(true);
            }
            return(false);
        }
示例#2
0
        private bool UpdateNode(SmartEntity entity, TargetingController.OnTargetingDone onTroopTargetingDone, bool updateWallBreakingTroops)
        {
            if (entity.StateComp.CurState == EntityState.Disable)
            {
                return(false);
            }
            bool flag = false;

            if (updateWallBreakingTroops)
            {
                return(this.UpdateWallBreakingTroops(entity, onTroopTargetingDone));
            }
            if (!GameUtils.IsEligibleToFindTarget(entity.ShooterComp))
            {
                return(false);
            }
            ShooterComponent shooterComp = entity.ShooterComp;

            if (!shooterComp.Searching && !shooterComp.ReevaluateTarget)
            {
                return(false);
            }
            bool flag2;

            if (shooterComp.Searching)
            {
                if (shooterComp.TargetingDelayAmount > 0)
                {
                    shooterComp.TargetingDelayAmount--;
                    return(false);
                }
                flag2 = this.FindTargetForTroopNode(entity, false);
            }
            else
            {
                flag2 = this.FindTargetForTroopNode(entity, true);
            }
            shooterComp.ReevaluateTarget = false;
            if (!flag2)
            {
                return(false);
            }
            if (!shooterComp.Searching)
            {
                shooterComp.AttackFSM.StopAttacking(true);
            }
            SmartEntity primaryTarget = this.shooterController.GetPrimaryTarget(entity.ShooterComp);

            if (primaryTarget.TransformComp == null)
            {
                return(false);
            }
            flag = false;
            TroopComponent     troopComp   = entity.TroopComp;
            ITroopDeployableVO troopType   = troopComp.TroopType;
            IShooterVO         shooterVO   = shooterComp.ShooterVO;
            uint            maxAttackRange = this.pathingManager.GetMaxAttackRange(entity, primaryTarget);
            PathTroopParams troopParams    = new PathTroopParams
            {
                TroopWidth            = entity.SizeComp.Width,
                DPS                   = shooterVO.DPS,
                MinRange              = shooterVO.MinAttackRange,
                MaxRange              = maxAttackRange,
                MaxSpeed              = troopComp.SpeedVO.MaxSpeed,
                PathSearchWidth       = troopType.PathSearchWidth,
                IsMelee               = shooterComp.IsMelee,
                IsOverWall            = shooterComp.ShooterVO.OverWalls,
                IsHealer              = TroopController.IsEntityHealer(entity),
                SupportRange          = troopType.SupportFollowDistance,
                CrushesWalls          = TroopController.CanEntityCrushWalls(entity),
                ProjectileType        = shooterVO.ProjectileType,
                IsTargetShield        = GameUtils.IsEntityShieldGenerator(primaryTarget),
                TargetInRangeModifier = troopType.TargetInRangeModifier
            };
            PathBoardParams boardParams = new PathBoardParams
            {
                IgnoreWall   = TroopController.CanEntityIgnoreWalls(entity),
                Destructible = entity.TeamComp.CanDestructBuildings()
            };
            bool flag3 = this.pathingManager.StartPathing(entity, primaryTarget, entity.TransformComp, true, out flag, -1, troopParams, boardParams, false, false);

            if (!flag3)
            {
                onTroopTargetingDone(entity);
                this.shooterController.StopSearch(shooterComp);
                return(true);
            }
            if (!flag)
            {
                GameUtils.UpdateMinimumFrameCountForNextTargeting(shooterComp);
                return(false);
            }
            this.RandomizeTargetingDelay(shooterComp);
            onTroopTargetingDone(entity);
            this.shooterController.StopSearch(shooterComp);
            this.OnPathingComplete(entity, entity.SecondaryTargetsComp, entity.StateComp, shooterComp, primaryTarget);
            return(true);
        }
示例#3
0
 public void UpdateNodes <T>(NodeList <T> troopNodeList, ref int numTroopTargetingDone, TargetingController.OnTargetingDone onTroopTargetingDone, bool updateWallBreakingTroops) where T : Node <T>, new()
 {
     if (!this.IsReachedMaxTargetingLimit(ref numTroopTargetingDone))
     {
         for (T t = troopNodeList.Tail; t != null; t = t.Previous)
         {
             SmartEntity entity = (SmartEntity)t.Entity;
             if (this.UpdateNode(entity, onTroopTargetingDone, updateWallBreakingTroops))
             {
                 numTroopTargetingDone++;
                 if (this.IsReachedMaxTargetingLimit(ref numTroopTargetingDone))
                 {
                     break;
                 }
             }
         }
     }
 }