Exemple #1
0
        public static Toil JumpToCarryToNextContainerIfPossible(Toil carryToContainerToil, TargetIndex primaryTargetInd)
        {
            Toil toil = new Toil();

            toil.initAction = delegate
            {
                Pawn actor  = toil.actor;
                Job  curJob = actor.jobs.curJob;
                if (actor.carryTracker.CarriedThing == null)
                {
                    return;
                }
                if (curJob.targetQueueB != null && curJob.targetQueueB.Count > 0)
                {
                    Thing             primaryTarget = curJob.GetTarget(primaryTargetInd).Thing;
                    bool              hasSpareItems = actor.carryTracker.CarriedThing.stackCount > GenConstruct.AmountNeededByOf((IConstructible)primaryTarget, actor.carryTracker.CarriedThing.def);
                    Predicate <Thing> validator     = (Thing th) => GenConstruct.CanConstruct(th, actor, false, false) && ((IConstructible)th).MaterialsNeeded().Any((ThingDefCountClass need) => need.thingDef == actor.carryTracker.CarriedThing.def) && (th == primaryTarget || hasSpareItems);
                    Thing             nextTarget    = GenClosest.ClosestThing_Global_Reachable(actor.Position, actor.Map, from targ in curJob.targetQueueB
                                                                                               select targ.Thing, PathEndMode.Touch, TraverseParms.For(actor, Danger.Deadly, TraverseMode.ByPawn, false), 99999f, validator, null);
                    if (nextTarget != null)
                    {
                        curJob.targetQueueB.RemoveAll((LocalTargetInfo targ) => targ.Thing == nextTarget);
                        curJob.targetB = nextTarget;
                        actor.jobs.curDriver.JumpToToil(carryToContainerToil);
                    }
                }
            };
            return(toil);
        }
Exemple #2
0
        public static void JumpToCarryToNextContainerIfPossible_Prefix(ref Toil __result, Toil carryToContainerToil, TargetIndex primaryTargetInd)
        {
            Toil toil = new Toil();

            toil.initAction = delegate()
            {
                Pawn actor  = toil.actor;
                Job  curJob = actor.jobs.curJob;
                if (actor.carryTracker.CarriedThing != null)
                {
                    LocalTargetInfo target;
                    if (curJob.targetQueueB != null && curJob.targetQueueB.Count > 0 && actor.RaceProps.Animal)
                    {
                        target = curJob.GetTarget(primaryTargetInd);
                        Thing             primaryTarget2 = target.Thing;
                        bool              hasSpareItems2 = actor.carryTracker.CarriedThing.stackCount > GenConstruct.AmountNeededByOf((IConstructible)(object)(IConstructible)primaryTarget2, actor.carryTracker.CarriedThing.def);
                        Predicate <Thing> predicate      = (Thing th) => ReservationUtility.CanReserve(actor, primaryTarget2, 1, -1, (ReservationLayerDef)null, false) && GenCollection.Any <ThingDefCountClass>(((IConstructible)th).MaterialsNeeded(), (Predicate <ThingDefCountClass>)((ThingDefCountClass need) => need.thingDef == actor.carryTracker.CarriedThing.def)) && ((th == primaryTarget2) | hasSpareItems2);
                        Thing             nextTarget2    = GenClosest.ClosestThing_Global_Reachable(actor.Position, actor.Map, curJob.targetQueueB.Select(delegate(LocalTargetInfo targ)
                        {
                            //IL_0000: Unknown result type (might be due to invalid IL or missing references)
                            //IL_0001: Unknown result type (might be due to invalid IL or missing references)
                            LocalTargetInfo val2 = targ;
                            return(val2.Thing);
                        }), (PathEndMode)2, TraverseParms.For(actor, (Danger)3, (TraverseMode)0, false), 99999f, predicate, (Func <Thing, float>)null);
                        if (nextTarget2 != null)
                        {
                            curJob.targetQueueB.RemoveAll((LocalTargetInfo targ) => targ.Thing == nextTarget2);
                            curJob.targetB = nextTarget2;
                            actor.jobs.curDriver.JumpToToil(carryToContainerToil);
                        }
                    }
                    if (curJob.targetQueueB != null && curJob.targetQueueB.Count > 0 && !actor.RaceProps.Animal)
                    {
                        target = curJob.GetTarget(primaryTargetInd);
                        Thing             primaryTarget = target.Thing;
                        bool              hasSpareItems = actor.carryTracker.CarriedThing.stackCount > GenConstruct.AmountNeededByOf((IConstructible)(object)(IConstructible)primaryTarget, actor.carryTracker.CarriedThing.def);
                        Predicate <Thing> predicate2    = (Thing th) => GenConstruct.CanConstruct(th, actor, false, false) && GenCollection.Any <ThingDefCountClass>(((IConstructible)th).MaterialsNeeded(), (Predicate <ThingDefCountClass>)((ThingDefCountClass need) => need.thingDef == actor.carryTracker.CarriedThing.def)) && ((th == primaryTarget) | hasSpareItems);
                        Thing             nextTarget    = GenClosest.ClosestThing_Global_Reachable(actor.Position, actor.Map, curJob.targetQueueB.Select(delegate(LocalTargetInfo targ)
                        {
                            //IL_0000: Unknown result type (might be due to invalid IL or missing references)
                            //IL_0001: Unknown result type (might be due to invalid IL or missing references)
                            LocalTargetInfo val = targ;
                            return(val.Thing);
                        }), (PathEndMode)2, TraverseParms.For(actor, (Danger)3, (TraverseMode)0, false), 99999f, predicate2, (Func <Thing, float>)null);
                        if (nextTarget != null)
                        {
                            curJob.targetQueueB.RemoveAll((LocalTargetInfo targ) => targ.Thing == nextTarget);
                            curJob.targetB = nextTarget;
                            actor.jobs.curDriver.JumpToToil(carryToContainerToil);
                        }
                    }
                }
            };
            __result = toil;
        }
Exemple #3
0
        public void FindAvailableFrames(Pawn pawn)
        {
            // find all unfinished frames
            availableFrames = Find.ListerThings.AllThings.FindAll(unfinishedFrame => unfinishedFrame is Frame);

            // needed to avoid null references if availableFrames == 0
            if (availableFrames.Count() > 0)
            {
                // frame belong to colony, can be built, has required materials
                availableFrames = availableFrames.Where(unfinishedFrame => unfinishedFrame.Faction == pawn.Faction && GenConstruct.CanConstruct(unfinishedFrame, pawn) && (unfinishedFrame as Frame).MaterialsNeeded().Count == 0);
            }
        }
        public override Job JobOnThing(Pawn pawn, Thing t)
        {
            if (t.Faction != pawn.Faction)
            {
                return(null);
            }
            Blueprint blueprint = t as Blueprint;

            if (blueprint == null)
            {
                return(null);
            }
            Thing thingToIgnore = GenConstruct.MiniToInstallOrBuildingToReinstall(blueprint);
            Thing thing         = blueprint.FirstBlockingThing(pawn, thingToIgnore, false);

            if (thing != null)
            {
                if (thing.def.category == ThingCategory.Plant)
                {
                    // SINGLE CHANGE FROM VANILLA WorkGiver, make designation instead of immediate cutting plants
                    //return new Job(JobDefOf.CutPlant, thing);

                    if (Find.DesignationManager.DesignationOn(thing, DesignationDefOf.CutPlant) == null && Find.DesignationManager.DesignationOn(thing, DesignationDefOf.HarvestPlant) == null)
                    {
                        Find.DesignationManager.AddDesignation(new Designation(thing, DesignationDefOf.CutPlant));
                    }
                    return(null);
                }
                else if (thing.def.category == ThingCategory.Item)
                {
                    if (thing.def.EverHaulable)
                    {
                        return(HaulAIUtility.HaulAsideJobFor(pawn, thing));
                    }
                    Log.ErrorOnce(string.Concat(new object[]
                    {
                        "Never haulable ",
                        thing,
                        " blocking ",
                        t,
                        " at ",
                        t.Position
                    }), 6429262);
                }
                return(null);
            }
            if (!GenConstruct.CanConstruct(blueprint, pawn))
            {
                return(null);
            }
            Job job = this.DeconstructExistingEdificeJob(pawn, blueprint);

            if (job != null)
            {
                return(job);
            }
            Job job2 = base.ResourceDeliverJobFor(pawn, blueprint);

            if (job2 != null)
            {
                return(job2);
            }
            Job job3 = this.NoCostFrameMakeJobFor(pawn, blueprint);

            if (job3 != null)
            {
                return(job3);
            }
            return(null);
        }
        private static bool IsNewValidNearbyNeeder(Thing t, HashSet <Thing> nearbyNeeders, IConstructible constructible, Pawn pawn)
        {
            if (!(t is IConstructible) || t == constructible || t is Blueprint_Install || t.Faction != pawn.Faction || t.IsForbidden(pawn) || nearbyNeeders.Contains(t) || !GenConstruct.CanConstruct(t, pawn, checkSkills: false))
            {
                return(false);
            }

            return(true);
        }