private bool TransferUnits(GameEntityGUID destinationGuid) { AIData_Army aidata = this.aiDataRepository.GetAIData <AIData_Army>(base.AIDataArmyGUID); if (aidata.Army.IsInEncounter || aidata.Army.IsLocked) { Diagnostics.LogWarning("[AICommanderMission_RegroupArmyAt] Transfer source IsInEncounter or IsLocked"); return(false); } IGameEntity gameEntity; if (!this.gameEntityRepositoryService.TryGetValue(destinationGuid, out gameEntity)) { Diagnostics.LogWarning("[AICommanderMission_RegroupArmyAt] Destination Guid is not valid"); return(false); } IGarrison garrison = gameEntity as IGarrison; if (garrison == null) { Diagnostics.LogWarning("[AICommanderMission_RegroupArmyAt] Destination Guid is not a Garrison"); return(false); } if (garrison.IsInEncounter) { Diagnostics.LogWarning("[AICommanderMission_RegroupArmyAt] Transfer destination IsInEncounter"); return(false); } if (garrison is Army) { Army army = garrison as Army; if (army.IsLocked) { Diagnostics.LogWarning("[AICommanderMission_RegroupArmyAt] Transfer destination IsLocked"); return(false); } if (this.worldPositionningService.GetDistance(aidata.Army.WorldPosition, army.WorldPosition) != 1 || !this.pathfindingService.IsTransitionPassable(aidata.Army.WorldPosition, army.WorldPosition, aidata.Army, (PathfindingFlags)0, null)) { Diagnostics.LogWarning("[AICommanderMission_RegroupArmyAt] Transfer destination is not valid"); return(false); } } GameEntityGUID[] array = null; this.ClampUnitToGarrison(garrison, this.UnitGuids, out array); if (array != null && array.Length != 0) { OrderTransferUnits order = new OrderTransferUnits(base.Commander.Empire.Index, base.AIDataArmyGUID, destinationGuid, array, false); base.Commander.Empire.PlayerControllers.Server.PostOrder(order, out this.currentTicket, new EventHandler <TicketRaisedEventArgs>(this.OrderTransferUnitToArmyTicketRaised)); if (aidata.CommanderMission != this) { Diagnostics.LogWarning("LOCKING: [AICommanderMission_RegroupArmyAt] Strange desynchronization between the actual Army CommanderMission and the current CommanderMission"); } aidata.UnassignCommanderMission(); return(true); } return(false); }
public override void Execute(Army army, global::PlayerController playerController, out Ticket ticket, EventHandler <TicketRaisedEventArgs> ticketRaisedEventHandler, params object[] parameters) { ticket = null; if (parameters.Length != 0) { City city = parameters[0] as City; if (city != null) { Diagnostics.Log("Teleporting to {0}", new object[] { city.Name }); OrderTeleportArmyToCity orderTeleportArmyToCity = new OrderTeleportArmyToCity(army.Empire.Index, army.GUID, city.GUID); orderTeleportArmyToCity.ArmyActionCooldownDuration = base.ComputeCooldownDuration(army); Diagnostics.Assert(playerController != null); playerController.PostOrder(orderTeleportArmyToCity, out ticket, ticketRaisedEventHandler); return; } Army army2 = parameters[0] as Army; if (army2 != null) { GameEntityGUID[] array = parameters[1] as GameEntityGUID[]; if (array != null) { Diagnostics.Log("Transferring units to {0} by teleport.", new object[] { army2.Name }); OrderTransferUnits order = new OrderTransferUnits(army.Empire.Index, army.GUID, army2.GUID, array, true); Diagnostics.Assert(playerController != null); playerController.PostOrder(order, out ticket, ticketRaisedEventHandler); IEventService service = Services.GetService <IEventService>(); if (service != null) { EventUnitsTeleported eventToNotify = new EventUnitsTeleported(army.Empire, array.Length); service.Notify(eventToNotify); } return; } } } }
private bool TransferTo(Army army, WorldPosition worldPosition, List <GameEntityGUID> units, IWorldPositionningService worldPositionningService, global::PlayerController playerController, out Ticket ticket, EventHandler <TicketRaisedEventArgs> ticketRaisedEventHandler) { Region region = worldPositionningService.GetRegion(worldPosition); GameEntityGUID gameEntityGUID = GameEntityGUID.Zero; ticket = null; if (region.MinorEmpire != null) { BarbarianCouncil agency = region.MinorEmpire.GetAgency <BarbarianCouncil>(); if (agency != null) { Village villageAt = agency.GetVillageAt(worldPosition); if (villageAt != null) { gameEntityGUID = villageAt.GUID; } } } if (region.City != null && region.City.Camp != null && gameEntityGUID == GameEntityGUID.Zero && region.City.Camp.WorldPosition == worldPosition) { gameEntityGUID = region.City.Camp.GUID; } if (region.City != null && gameEntityGUID == GameEntityGUID.Zero) { gameEntityGUID = region.City.GUID; } if (region.Kaiju != null && region.Kaiju.KaijuGarrison != null && gameEntityGUID == GameEntityGUID.Zero && DepartmentOfScience.IsTechnologyResearched(army.Empire, "TechnologyDefinitionMimics1") && region.Kaiju.KaijuGarrison.WorldPosition == worldPosition) { gameEntityGUID = region.Kaiju.KaijuGarrison.GUID; } if (gameEntityGUID != GameEntityGUID.Zero) { OrderTransferUnits order = new OrderTransferUnits(army.Empire.Index, army.GUID, gameEntityGUID, units.ToArray(), false); playerController.PostOrder(order, out ticket, ticketRaisedEventHandler); return(true); } return(false); }
protected override bool TryComputeArmyMissionParameter() { if (this.RegionTarget == null) { base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail; return(false); } base.ArmyMissionParameters.Clear(); if (base.AIDataArmyGUID == GameEntityGUID.Zero) { return(false); } this.POI = this.SelectPOI(); if (this.POI == null) { base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail; return(false); } AICommander_Victory comm = base.Commander as AICommander_Victory; if (comm == null) { return(false); } Army army = this.aiDataRepository.GetAIData <AIData_Army>(base.AIDataArmyGUID).Army; int num = army.StandardUnits.Count((Unit x) => x.UnitDesign.Name.ToString().Contains(comm.VictoryDesign)); float propertyValue = army.GetPropertyValue(SimulationProperties.Movement); if (propertyValue <= 0.01f) { base.State = TickableState.NoTick; return(false); } if (num > 5 || this.worldPositionningService.IsWaterTile(army.WorldPosition)) { return(base.TryCreateArmyMission("VisitQuestRuinFinal", new List <object> { this.RegionTarget.Index, this.POI })); } if (num == 0) { return(base.TryCreateArmyMission("MajorFactionWarRoaming", new List <object> { this.RegionTarget.Index, true })); } if (num <= 0 || army.StandardUnits.Count - num <= 0) { List <AICommanderMission> list = comm.Missions.FindAll((AICommanderMission x) => x is AICommanderMission_VictoryRuinFinal && x.AIDataArmyGUID.IsValid); List <Army> list2 = new List <Army>(); Func <Unit, bool> < > 9__4; foreach (AICommanderMission aicommanderMission in list) { Army army2 = this.aiDataRepository.GetAIData <AIData_Army>(aicommanderMission.AIDataArmyGUID).Army; if (army2 != army) { IEnumerable <Unit> standardUnits = army2.StandardUnits; Func <Unit, bool> selector; if ((selector = < > 9__4) == null) { selector = (< > 9__4 = ((Unit y) => y.UnitDesign.Name.ToString().Contains(comm.VictoryDesign))); } int num2 = standardUnits.Count(selector); if (num2 > 0 && num2 < 6) { list2.Add(army2); } } } int num3 = (int)base.Commander.Empire.GetPropertyValue(SimulationProperties.ArmyUnitSlot); Predicate <Unit> < > 9__5; foreach (Army army3 in list2) { if (this.worldPositionningService.GetDistance(army.WorldPosition, army3.WorldPosition) == 1 && this.worldPositionningService.IsWaterTile(army.WorldPosition) == this.worldPositionningService.IsWaterTile(army3.WorldPosition) && this.pathfindingService.IsTransitionPassable(army.WorldPosition, army3.WorldPosition, army, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreFogOfWar, null)) { float propertyValue2 = army3.GetPropertyValue(SimulationProperties.Movement); if ((propertyValue > propertyValue2 || (propertyValue == propertyValue2 && army.GUID < army3.GUID) || (army.StandardUnits.Count >= num3 && propertyValue > 0.01f)) && army3.StandardUnits.Count < num3) { List <Unit> list3 = army.StandardUnits.ToList <Unit>(); Predicate <Unit> match; if ((match = < > 9__5) == null) { match = (< > 9__5 = ((Unit z) => z.UnitDesign.Name.ToString().Contains(comm.VictoryDesign))); } List <Unit> list4 = list3.FindAll(match); int num4 = list4.Count - 1; while (num4 >= 0 && list4.Count + army3.StandardUnits.Count > num3) { list4.RemoveAt(num4); num4--; } OrderTransferUnits order = new OrderTransferUnits(base.Commander.Empire.Index, army.GUID, army3.GUID, list4.ConvertAll <GameEntityGUID>((Unit unit) => unit.GUID).ToArray(), false); Ticket ticket; base.Commander.Empire.PlayerControllers.Server.PostOrder(order, out ticket, new EventHandler <TicketRaisedEventArgs>(this.OrderTransferUnitToArmyTicketRaised)); return(true); } if (army.StandardUnits.Count < num3) { return(base.TryCreateArmyMission("ELCPWait", new List <object>())); } } } int num5 = int.MaxValue; Army army4 = null; foreach (Army army5 in list2) { int distance = this.worldPositionningService.GetDistance(army.WorldPosition, army5.WorldPosition); if (distance < num5) { num5 = distance; army4 = army5; } } if (army4 != null && army4.GUID > army.GUID && army4.GetPropertyValue(SimulationProperties.Movement) > 0.01f) { army4 = null; } if (army4 != null) { return(base.TryCreateArmyMission("ReachTarget", new List <object> { army4 })); } return(base.TryCreateArmyMission("ELCPWait", new List <object>())); } if (army.IsInEncounter || army.IsLocked) { return(base.TryCreateArmyMission("ELCPWait", new List <object>())); } WorldPosition validArmySpawningPosition = AILayer_ArmyRecruitment.GetValidArmySpawningPosition(army, this.worldPositionningService, this.pathfindingService); if (!validArmySpawningPosition.IsValid) { return(base.TryCreateArmyMission("MajorFactionWarRoaming", new List <object> { this.RegionTarget.Index, true })); } List <Unit> list5 = army.StandardUnits.ToList <Unit>().FindAll((Unit x) => !x.UnitDesign.Name.ToString().Contains(comm.VictoryDesign)); OrderTransferGarrisonToNewArmy order2 = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, army.GUID, list5.ConvertAll <GameEntityGUID>((Unit unit) => unit.GUID).ToArray(), validArmySpawningPosition, StaticString.Empty, false, true, true); Ticket ticket2; base.Commander.Empire.PlayerControllers.Server.PostOrder(order2, out ticket2, new EventHandler <TicketRaisedEventArgs>(this.OrderSplitUnit)); return(true); }
protected override State Execute(AIBehaviorTree aiBehaviorTree, params object[] parameters) { Army army; if (base.GetArmyUnlessLocked(aiBehaviorTree, "$Army", out army) != AIArmyMission.AIArmyMissionErrorCode.None) { return(State.Failure); } if (this.currentTicket != null) { if (!this.currentTicket.Raised) { return(State.Running); } bool flag = this.currentTicket.PostOrderResponse == PostOrderResponse.PreprocessHasFailed || this.currentTicket.PostOrderResponse == PostOrderResponse.AuthenticationHasFailed; this.currentTicket = null; if (flag) { aiBehaviorTree.ErrorCode = 1; return(State.Failure); } return(State.Success); } else if (this.heroTicket != null) { if (!this.heroTicket.Raised) { return(State.Running); } if (this.heroTicket.PostOrderResponse != PostOrderResponse.Processed) { aiBehaviorTree.ErrorCode = 36; return(State.Failure); } this.heroTicket = null; return(State.Running); } else { if (!aiBehaviorTree.Variables.ContainsKey(this.DestinationVarName)) { aiBehaviorTree.LogError("{0} not set", new object[] { this.DestinationVarName }); return(State.Failure); } WorldPosition worldPosition = (WorldPosition)aiBehaviorTree.Variables[this.DestinationVarName]; if (!worldPosition.IsValid) { aiBehaviorTree.LogError("Destination is invalid.", new object[0]); aiBehaviorTree.ErrorCode = 2; return(State.Failure); } List <GameEntityGUID> list = new List <GameEntityGUID>(); foreach (Unit unit in army.StandardUnits) { list.Add(unit.GUID); } if (list.Count == 0) { return(State.Success); } bool flag2 = army.Hero != null; IGameService service = Services.GetService <IGameService>(); Diagnostics.Assert(service != null); IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>(); Diagnostics.Assert(service2 != null); IPathfindingService service3 = service.Game.Services.GetService <IPathfindingService>(); Diagnostics.Assert(service3 != null); City city = service2.GetRegion(worldPosition).City; if (city != null) { District district = service2.GetDistrict(worldPosition); if (district != null) { GameEntityGUID destinationGuid = GameEntityGUID.Zero; if (city.Camp != null && city.Camp.ContainsDistrict(district.GUID)) { destinationGuid = city.Camp.GUID; } else if (District.IsACityTile(district)) { destinationGuid = city.GUID; } if (destinationGuid.IsValid) { if (flag2) { if (!District.IsACityTile(district) || city.Hero != null) { this.UnassignHero(army); return(State.Running); } list.Add(army.Hero.GUID); } OrderTransferUnits order = new OrderTransferUnits(army.Empire.Index, army.GUID, destinationGuid, list.ToArray(), false); aiBehaviorTree.AICommander.Empire.PlayerControllers.AI.PostOrder(order, out this.currentTicket, null); return(State.Running); } } } Army armyAtPosition = service2.GetArmyAtPosition(worldPosition); if (armyAtPosition != null) { if (flag2) { if (armyAtPosition.Hero != null) { this.UnassignHero(army); return(State.Running); } list.Add(army.Hero.GUID); } OrderTransferUnits order2 = new OrderTransferUnits(army.Empire.Index, army.GUID, armyAtPosition.GUID, list.ToArray(), false); aiBehaviorTree.AICommander.Empire.PlayerControllers.AI.PostOrder(order2, out this.currentTicket, null); return(State.Running); } if (service3.IsTileStopable(worldPosition, army, (PathfindingFlags)0, null)) { OrderTransferGarrisonToNewArmy order3 = new OrderTransferGarrisonToNewArmy(army.Empire.Index, army.GUID, list.ToArray(), worldPosition, StaticString.Empty, false, true, true); aiBehaviorTree.AICommander.Empire.PlayerControllers.AI.PostOrder(order3, out this.currentTicket, null); return(State.Running); } aiBehaviorTree.LogError("No valid destination found.", new object[0]); aiBehaviorTree.ErrorCode = 2; return(State.Failure); } }