private bool BuildWorldPath() { this.TemporaryWorldPath.Clear(); if (this.LastHighlightedWorldPosition == WorldPosition.Invalid) { return(false); } if (base.IsTransferable(WorldCursor.HighlightedWorldPosition)) { return(false); } if ((!base.PathfindingService.IsTileStopable(this.LastHighlightedWorldPosition, base.PathfindingContext, (PathfindingFlags)0, null) || !base.PathfindingService.IsTilePassable(this.LastHighlightedWorldPosition, base.PathfindingContext, (PathfindingFlags)0, null) || this.OtherEmpireCreepingNodeAtPosition(this.Army.Empire, this.LastHighlightedWorldPosition)) && base.PathfindingService.IsTransitionPassable(this.GarrisonPosition, this.LastHighlightedWorldPosition, base.PathfindingContext, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreOtherEmpireDistrict | PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnorePOI | PathfindingFlags.IgnoreSieges | PathfindingFlags.IgnoreKaijuGarrisons, null)) { return(true); } PathfindingFlags pathfindingFlags = PathfindingFlags.IgnoreArmies; District district = base.WorldPositionningService.GetDistrict(this.GarrisonPosition); if (district != null && (district.Type == DistrictType.Center || district.Type == DistrictType.Extension) && district.City != null && district.City.BesiegingEmpireIndex != -1) { pathfindingFlags &= ~PathfindingFlags.IgnoreArmies; } Army army = null; if (this.LastHighlightedWorldPosition != WorldPosition.Invalid) { army = base.WorldPositionningService.GetArmyAtPosition(this.LastHighlightedWorldPosition); } bool flag = base.VisibilityService.IsWorldPositionDetectedFor(this.LastHighlightedWorldPosition, this.Army.Empire) || (army != null && !army.IsCamouflaged); bool flag2 = base.WorldPositionningService.GetDistance(this.GarrisonPosition, this.LastHighlightedWorldPosition) <= this.Army.LineOfSightVisionRange; if (flag && flag2) { pathfindingFlags &= ~PathfindingFlags.IgnoreArmies; } PathfindingResult pathfindingResult = base.PathfindingService.FindPath(base.PathfindingContext, this.GarrisonPosition, this.LastHighlightedWorldPosition, PathfindingManager.RequestMode.Default, null, pathfindingFlags, null); if (base.WorldPositionningService != null && pathfindingResult != null && this.LastHighlightedWorldPosition != WorldPosition.Invalid) { if (!base.PathfindingService.IsTileStopable(this.LastHighlightedWorldPosition, base.PathfindingContext, (PathfindingFlags)0, null)) { WorldPosition lastHighlightedWorldPosition = this.LastHighlightedWorldPosition; WorldPosition position = pathfindingResult.GetCompletePath().Last <WorldPosition>(); bool flag3 = base.WorldPositionningService.IsWaterTile(lastHighlightedWorldPosition); bool flag4 = base.WorldPositionningService.IsWaterTile(position); if (flag3 != flag4) { World world = (base.GameService.Game as global::Game).World; List <WorldPosition> neighbours = lastHighlightedWorldPosition.GetNeighbours(world.WorldParameters); List <WorldPosition> list = new List <WorldPosition>(); for (int i = 0; i < neighbours.Count; i++) { if (base.WorldPositionningService.IsWaterTile(neighbours[i]) == flag3 && !base.WorldPositionningService.HasRidge(neighbours[i]) && base.PathfindingService.IsTileStopable(neighbours[i], base.PathfindingContext, (PathfindingFlags)0, null)) { list.Add(neighbours[i]); } } if (list.Count > 0) { PathfindingResult pathfindingResult2 = null; float num = float.MaxValue; for (int j = 0; j < list.Count; j++) { PathfindingResult pathfindingResult3 = base.PathfindingService.FindPath(base.PathfindingContext, this.GarrisonPosition, list[j], PathfindingManager.RequestMode.Default, null, pathfindingFlags, null); if (pathfindingResult3 != null && pathfindingResult3.GetCost() < num) { num = pathfindingResult3.GetCost(); pathfindingResult2 = pathfindingResult3; } } if (pathfindingResult2 != null) { pathfindingResult = pathfindingResult2; } } } } else if (this.OtherEmpireCreepingNodeAtPosition(this.Army.Empire, this.LastHighlightedWorldPosition)) { List <WorldPosition> list2 = pathfindingResult.GetCompletePath().ToList <WorldPosition>(); if (list2.Count > 0) { list2.RemoveAt(list2.Count - 1); PathfindingResult pathfindingResult4 = base.PathfindingService.FindPath(base.PathfindingContext, this.GarrisonPosition, list2.Last <WorldPosition>(), PathfindingManager.RequestMode.Default, null, pathfindingFlags, null); if (pathfindingResult4 != null) { pathfindingResult = pathfindingResult4; this.TemporaryWorldPath.Build(pathfindingResult, this.WorldArmy.Army.GetPropertyValue(SimulationProperties.MovementRatio), int.MaxValue, false); return(true); } } } } if (pathfindingResult == null) { return(base.PathfindingService.IsTransitionPassable(this.GarrisonPosition, this.LastHighlightedWorldPosition, base.PathfindingContext, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreOtherEmpireDistrict | PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnorePOI | PathfindingFlags.IgnoreSieges | PathfindingFlags.IgnoreKaijuGarrisons, null)); } Army army2 = this.WorldArmy.Army; this.TemporaryWorldPath.Build(pathfindingResult, army2.GetPropertyValue(SimulationProperties.MovementRatio), int.MaxValue, false); return(true); }