private FormationAI.BehaviorSide DetermineGatheringSide() { IEnumerable <SiegeLane> source = TeamAISiegeComponent.SiegeLanes.Where <SiegeLane>((Func <SiegeLane, bool>)(sl => sl.LaneSide != this.behaviorSide && sl.LaneState != SiegeLane.LaneStateEnum.Conceited)); if (!source.Any <SiegeLane>()) { return(this.behaviorSide); } int nearestSafeSideDistance = source.Min <SiegeLane>((Func <SiegeLane, int>)(pgl => SiegeQuerySystem.SideDistance(1 << (int)(this.behaviorSide & (FormationAI.BehaviorSide) 31), 1 << (int)(pgl.LaneSide & (FormationAI.BehaviorSide) 31)))); return(source.Where <SiegeLane>((Func <SiegeLane, bool>)(pgl => SiegeQuerySystem.SideDistance(1 << (int)(this.behaviorSide & (FormationAI.BehaviorSide) 31), 1 << (int)(pgl.LaneSide & (FormationAI.BehaviorSide) 31)) == nearestSafeSideDistance)).MinBy <SiegeLane, float>((Func <SiegeLane, float>)(pgl => pgl.DefenderOrigin.GetGroundVec3().DistanceSquared(this.formation.QuerySystem.MedianPosition.GetGroundVec3()))).LaneSide); }
private FormationAI.BehaviorSide DetermineGatheringSide() { this.DetermineMostImportantInvadingEnemyFormation(); if (this._targetEnemyFormation == null) { if (this._behaviourState == BehaviorEliminateEnemyInsideCastle.BehaviourState.Attacking) { this._behaviourState = BehaviorEliminateEnemyInsideCastle.BehaviourState.UnSet; } return(this.behaviorSide); } int connectedSides = TeamAISiegeComponent.QuerySystem.DeterminePositionAssociatedSide(this._targetEnemyFormation.QuerySystem.MedianPosition.GetNavMeshVec3()); IEnumerable <SiegeLane> source1 = TeamAISiegeComponent.SiegeLanes.Where <SiegeLane>((Func <SiegeLane, bool>)(sl => sl.LaneState != SiegeLane.LaneStateEnum.Conceited && !SiegeQuerySystem.AreSidesRelated(sl.LaneSide, connectedSides))); FormationAI.BehaviorSide behaviorSide = this.behaviorSide; if (source1.Any <SiegeLane>()) { if (source1.Count <SiegeLane>() > 1) { int leastDangerousLaneState = source1.Min <SiegeLane>((Func <SiegeLane, int>)(pgl => (int)pgl.LaneState)); IEnumerable <SiegeLane> source2 = source1.Where <SiegeLane>((Func <SiegeLane, bool>)(pgl => pgl.LaneState == (SiegeLane.LaneStateEnum)leastDangerousLaneState)); behaviorSide = source2.Count <SiegeLane>() <= 1 ? source2.First <SiegeLane>().LaneSide : source2.MinBy <SiegeLane, int>((Func <SiegeLane, int>)(ldl => SiegeQuerySystem.SideDistance(1 << connectedSides, 1 << (int)(ldl.LaneSide & (FormationAI.BehaviorSide) 31)))).LaneSide; } else { behaviorSide = source1.First <SiegeLane>().LaneSide; } } return(behaviorSide); }