Exemplo n.º 1
0
        public static bool IsUsableCarrier(Pawn p, Pawn forPawn, bool allowColonists)
        {
            if (p == forPawn)
            {
                return(true);
            }
            int result;

            if (!p.DestroyedOrNull() && p.Spawned && !p.inventory.UnloadEverything && forPawn.CanReach(p, PathEndMode.Touch, Danger.Deadly, false, TraverseMode.ByPawn))
            {
                if (allowColonists && p.IsColonist)
                {
                    return(true);
                }
                if ((p.RaceProps.packAnimal || p.HostFaction == Faction.OfPlayer) && !p.IsBurning() && !p.Downed)
                {
                    result = ((!MassUtility.IsOverEncumbered(p)) ? 1 : 0);
                    goto IL_009b;
                }
                result = 0;
                goto IL_009b;
            }
            return(false);

IL_009b:
            return((byte)result != 0);
        }
 private Toil FindCarrier()
 {
     return(new Toil
     {
         initAction = delegate()
         {
             Pawn pawn = this.FindBestCarrier(true);
             if (pawn == null)
             {
                 bool flag = this.pawn.GetLord() == this.job.lord;
                 if (flag && !MassUtility.IsOverEncumbered(this.pawn))
                 {
                     pawn = this.pawn;
                 }
                 else
                 {
                     pawn = this.FindBestCarrier(false);
                     if (pawn == null)
                     {
                         if (flag)
                         {
                             pawn = this.pawn;
                         }
                         else
                         {
                             IEnumerable <Pawn> source = from x in this.job.lord.ownedPawns
                                                         where JobDriver_PrepareCaravan_GatherItems.IsUsableCarrier(x, this.pawn, true)
                                                         select x;
                             if (!source.Any <Pawn>())
                             {
                                 base.EndJobWith(JobCondition.Incompletable);
                                 return;
                             }
                             pawn = source.RandomElement <Pawn>();
                         }
                     }
                 }
             }
             this.job.SetTarget(TargetIndex.B, pawn);
         }
     });
 }
        private Toil FindCarrier()
        {
            Toil toil = new Toil();

            toil.initAction = delegate
            {
                Pawn pawn = FindBestCarrier(onlyAnimals: true);
                if (pawn == null)
                {
                    bool flag = base.pawn.GetLord() == job.lord;
                    if (flag && !MassUtility.IsOverEncumbered(base.pawn))
                    {
                        pawn = base.pawn;
                    }
                    else
                    {
                        pawn = FindBestCarrier(onlyAnimals: false);
                        if (pawn == null)
                        {
                            if (flag)
                            {
                                pawn = base.pawn;
                            }
                            else
                            {
                                IEnumerable <Pawn> source = from x in job.lord.ownedPawns
                                                            where IsUsableCarrier(x, base.pawn, allowColonists: true)
                                                            select x;
                                if (!source.Any())
                                {
                                    EndJobWith(JobCondition.Incompletable);
                                    return;
                                }
                                pawn = source.RandomElement();
                            }
                        }
                    }
                }
                job.SetTarget(TargetIndex.B, pawn);
            };
            return(toil);
        }
Exemplo n.º 4
0
        private Toil FindCarrier()
        {
            Toil toil = new Toil();

            toil.initAction = delegate
            {
                Pawn pawn = this.FindBestCarrier(true);
                if (pawn == null)
                {
                    bool flag = base.pawn.GetLord() == base.job.lord;
                    if (flag && !MassUtility.IsOverEncumbered(base.pawn))
                    {
                        pawn = base.pawn;
                    }
                    else
                    {
                        pawn = this.FindBestCarrier(false);
                        if (pawn == null)
                        {
                            if (!flag)
                            {
                                IEnumerable <Pawn> source = from x in base.job.lord.ownedPawns
                                                            where JobDriver_PrepareCaravan_GatherItems.IsUsableCarrier(x, base.pawn, true)
                                                            select x;
                                if (source.Any())
                                {
                                    pawn = source.RandomElement();
                                    goto IL_00aa;
                                }
                                base.EndJobWith(JobCondition.Incompletable);
                                return;
                            }
                            pawn = base.pawn;
                        }
                    }
                }
                goto IL_00aa;
IL_00aa:
                base.job.SetTarget(TargetIndex.B, pawn);
            };
            return(toil);
        }
 public static bool IsUsableCarrier(Pawn p, Pawn forPawn, bool allowColonists)
 {
     if (!p.IsFormingCaravan())
     {
         return(false);
     }
     if (p == forPawn)
     {
         return(true);
     }
     if (p.DestroyedOrNull() || !p.Spawned || p.inventory.UnloadEverything || !forPawn.CanReach(p, PathEndMode.Touch, Danger.Deadly))
     {
         return(false);
     }
     if (allowColonists && p.IsColonist)
     {
         return(true);
     }
     if ((p.RaceProps.packAnimal || p.HostFaction == Faction.OfPlayer) && !p.IsBurning() && !p.Downed)
     {
         return(!MassUtility.IsOverEncumbered(p));
     }
     return(false);
 }
 public static bool IsUsableCarrier(Pawn p, Pawn forPawn, bool allowColonists)
 {
     return(p.IsFormingCaravan() && (p == forPawn || (!p.DestroyedOrNull() && p.Spawned && !p.inventory.UnloadEverything && forPawn.CanReach(p, PathEndMode.Touch, Danger.Deadly, false, TraverseMode.ByPawn) && ((allowColonists && p.IsColonist) || ((p.RaceProps.packAnimal || p.HostFaction == Faction.OfPlayer) && !p.IsBurning() && !p.Downed && !MassUtility.IsOverEncumbered(p))))));
 }
        public static Pawn GetPawnToFollow(Pawn forPawn)
        {
            if (!forPawn.RaceProps.packAnimal || forPawn.inventory.UnloadEverything || MassUtility.IsOverEncumbered(forPawn))
            {
                return(null);
            }
            Lord lord = forPawn.GetLord();

            if (lord == null)
            {
                return(null);
            }
            List <Pawn> ownedPawns = lord.ownedPawns;

            for (int i = 0; i < ownedPawns.Count; i++)
            {
                Pawn pawn = ownedPawns[i];
                if (pawn != forPawn && CaravanUtility.IsOwner(pawn, forPawn.Faction) && pawn.CurJob != null && pawn.CurJob.def == JobDefOf.PrepareCaravan_GatherItems && forPawn.CanReach(pawn, PathEndMode.Touch, Danger.Deadly) && ((JobDriver_PrepareCaravan_GatherItems)pawn.jobs.curDriver).Carrier == forPawn)
                {
                    return(pawn);
                }
            }
            Pawn pawn2 = null;

            for (int j = 0; j < ownedPawns.Count; j++)
            {
                Pawn pawn3 = ownedPawns[j];
                if (pawn3 != forPawn && CaravanUtility.IsOwner(pawn3, forPawn.Faction) && pawn3.CurJob != null && pawn3.CurJob.def == JobDefOf.PrepareCaravan_GatherItems && forPawn.CanReach(pawn3, PathEndMode.Touch, Danger.Deadly) && (pawn2 == null || forPawn.Position.DistanceToSquared(pawn3.Position) < forPawn.Position.DistanceToSquared(pawn2.Position)))
                {
                    pawn2 = pawn3;
                }
            }
            return(pawn2);
        }