public override void Tick()
 {
     base.Tick();
     if (this.count++ > 1)
     {
         this.count = 0;
         List <Lord> lords    = base.Map.lordManager.lords;
         IntVec3     position = base.Position;
         checked
         {
             for (int i = 0; i < lords.Count; i++)
             {
                 Lord lord = lords[i];
                 if (lord.LordJob is LordJob_TradeWithColony)
                 {
                     FieldInfo field  = lord.LordJob.GetType().GetField("chillSpot", BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                     IntVec3   intVec = (IntVec3)field.GetValue(lord.LordJob);
                     if (intVec.x != position.x || intVec.y != position.y || intVec.z != position.z)
                     {
                         field.SetValue(lord.LordJob, position);
                     }
                     LordToil curLordToil = lord.CurLordToil;
                     if (curLordToil is LordToil_Travel)
                     {
                         LordToil_Travel lordToil_Travel = (LordToil_Travel)curLordToil;
                         if (lordToil_Travel.FlagLoc != position)
                         {
                             lordToil_Travel.SetDestination(position);
                             lordToil_Travel.UpdateAllDuties();
                         }
                     }
                     else if (curLordToil is LordToil_DefendPoint)
                     {
                         LordToil_DefendPoint lordToil_DefendPoint = (LordToil_DefendPoint)curLordToil;
                         if (lordToil_DefendPoint.FlagLoc != position)
                         {
                             lordToil_DefendPoint.SetDefendPoint(position);
                             lordToil_DefendPoint.UpdateAllDuties();
                         }
                     }
                     foreach (Pawn current in lord.ownedPawns)
                     {
                         if (current.RaceProps.Animal)
                         {
                             if (current.needs != null && current.needs.food != null && current.needs.food.CurLevel <= current.needs.food.MaxLevel)
                             {
                                 current.needs.food.CurLevel = current.needs.food.MaxLevel;
                             }
                         }
                     }
                 }
             }
         }
     }
 }
        public override void DoAction(Transition trans)
        {
            Lord    lord = trans.target.lord;
            IntVec3 targetDestination = (lord.LordJob as LordJob_MiningCoBase).targetDestination;
            bool    needNewExitSpot   = false;
            bool    isEdgeCell        = targetDestination.InBounds(lord.Map) &&
                                        ((targetDestination.x == 0) ||
                                         (targetDestination.x == lord.Map.Size.x - 1) ||
                                         (targetDestination.z == 0) ||
                                         (targetDestination.z == lord.Map.Size.z - 1));

            if (isEdgeCell == false)
            {
                needNewExitSpot = true;
            }
            else
            {
                foreach (Pawn pawn in lord.ownedPawns)
                {
                    if (pawn.CanReach(targetDestination, PathEndMode.OnCell, Danger.Some) == false)
                    {
                        needNewExitSpot = true;
                        break;
                    }
                }
            }

            IntVec3 newTargetDestination = targetDestination;

            if (needNewExitSpot)
            {
                if (Expedition.TryFindRandomExitSpot(lord.Map, lord.ownedPawns.RandomElement().Position, out newTargetDestination) == false)
                {
                    newTargetDestination = CellFinder.RandomEdgeCell(lord.Map);
                }
            }
            (lord.LordJob as LordJob_MiningCoBase).targetDestination = newTargetDestination;
            // Refresh lord toil destination anyway as it may have been initialized with an invalid vector (case of a fallback).
            LordToil_Travel travelToil = trans.target as LordToil_Travel;

            if (travelToil != null)
            {
                travelToil.SetDestination(newTargetDestination);
            }
            LordToil_EscortDownedPawn escortToil = trans.target as LordToil_EscortDownedPawn;

            if (escortToil != null)
            {
                escortToil.SetDestination(newTargetDestination);
            }
        }
Exemple #3
0
        static bool Prefix(Transition trans)
        {
            LordToil_Travel lordToil_Travel = (LordToil_Travel)trans.target;

            if (!lordToil_Travel.HasDestination())
            {
                Pawn pawn = lordToil_Travel.lord.ownedPawns.RandomElement();
                if (!CellFinderExtended.TryFindRandomPawnExitCell(pawn, out IntVec3 result))
                {
                    RCellFinderExtended.TryFindRandomPawnEntryCell(out result, pawn.Map, pawn.kindDef, 0f);
                }
                lordToil_Travel.SetDestination(result);
            }
            return(false);
        }