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);
    }
Ejemplo n.º 2
0
 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;
             }
         }
     }
 }
Ejemplo n.º 3
0
    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);
        }
    }