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); }
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); }
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; } } } } }