Exemplo n.º 1
0
        private static IEnumerable <Toil> Postfix(IEnumerable <Toil> values, JobDriver_FoodDeliver __instance)
        {
            FieldInfo efi = AccessTools.Field(typeof(JobDriver_FoodDeliver), "eatingFromInventory");
            bool      eatingFromInventory = (bool)efi.GetValue(__instance);
            FieldInfo unpd = AccessTools.Field(typeof(JobDriver_FoodDeliver), "usingNutrientPasteDispenser");
            bool      usingNutrientPasteDispenser = (bool)unpd.GetValue(__instance);
            int       numToilsBeforeGoto;

            if (eatingFromInventory)
            {
                numToilsBeforeGoto = 1;
            }
            else if (usingNutrientPasteDispenser)
            {
                numToilsBeforeGoto = 2;
            }
            else
            {
                numToilsBeforeGoto = 3;
            }

            foreach (Toil toil in HeatMealInjector.InjectHeat(values, __instance, numToilsBeforeGoto))
            {
                yield return(toil);
            }
            yield break;
        }
Exemplo n.º 2
0
 private static void Postfix(JobDriver_FoodDeliver __instance, ref string __result)
 {
     if (__instance.job.GetTarget(TargetIndex.A).Thing is Building_ReplimatTerminal &&
         (Pawn)__instance.job.targetB.Thing != null)
     {
         __result = __instance.job.def.reportString.Replace("TargetA", "ReplicatedMeal".Translate())
                    .Replace("TargetB", __instance.job.targetB.Thing.LabelShort);
     }
 }
Exemplo n.º 3
0
        public static void GetReportModified(ref string __result, JobDriver_FoodDeliver __instance)
        {
            Thing targetBuilding = __instance.job.GetTarget(TargetIndex.A).Thing;
            Pawn  deliveree      = (Pawn)__instance.job.targetB.Thing;

            if (targetBuilding is Building_NutrientPasteDispenser && deliveree != null)
            {
                __result = __instance.job.def.reportString.Replace("TargetA", targetBuilding.def.GetModExtension <NutrientPasteCustom>().customMeal.label)
                           .Replace("TargetB", deliveree.LabelShort);
            }
            //__result = base.GetReport();
        }
        static void Postfix(ref IEnumerable <Toil> __result, JobDriver_FoodDeliver __instance)
        {
            __result = new List <Toil>(__result);
            var lastToil = ((List <Toil>)__result).Last();

            lastToil.initAction = delegate
            {
                Thing thing;
                __instance.pawn.carryTracker.TryDropCarriedThing(lastToil.actor.jobs.curJob.targetC.Cell, ThingPlaceMode.Direct,
                                                                 out thing, null);
                PrisonerFoodReservation.reserve(thing, (Pawn)lastToil.actor.jobs.curJob.targetB.Thing);
            };
        }
Exemplo n.º 5
0
        internal static IEnumerable <Toil> _MakeNewToils(this JobDriver_FoodDeliver obj)
        {
            var foodThing = obj.TargetThing(FoodInd);
            var deliveree = (Pawn)obj.TargetThing(DelivereeInd);
            var dropCell  = obj.TargetCell(DeliverToInd);

            yield return(Toils_Reserve.Reserve(DelivereeInd, 1));

            if (foodThing is Building)
            {
                yield return(Toils_Reserve.Reserve(FoodInd, 1));

                yield return(Toils_Goto.GotoThing(FoodInd, PathEndMode.InteractionCell).FailOnForbidden(FoodInd));

                if (foodThing is Building_NutrientPasteDispenser)
                {
                    yield return(Toils_Ingest.TakeMealFromDispenser(FoodInd, obj.pawn));
                }
                else if (foodThing is Building_AutomatedFactory)
                {
                    yield return(Toils_FoodSynthesizer.TakeMealFromSynthesizer(FoodInd, obj.pawn));
                }
                else // Unknown building
                {
                    throw new Exception("Food target for JobDriver_FoodDeliver is a building but not Building_NutrientPasteDispenser or Building_AutomatedFactory!");
                }
            }
            else if (
                (obj.pawn.inventory != null) &&
                (obj.pawn.inventory.Contains(foodThing))
                )
            {
                yield return(Toils_Misc.TakeItemFromInventoryToCarrier(obj.pawn, FoodInd));
            }
            else
            {
                yield return(Toils_Reserve.Reserve(FoodInd, 1));

                yield return(Toils_Goto.GotoThing(FoodInd, PathEndMode.ClosestTouch));

                yield return(Toils_Ingest.PickupIngestible(FoodInd, deliveree));
            }

            var pathToTarget = new Toil();

            pathToTarget.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            pathToTarget.initAction          = new Action(() =>
            {
                var pawn = obj.pawn;
                var job  = pawn.jobs.curJob;
                pawn.pather.StartPath(job.targetC, PathEndMode.OnCell);
            }
                                                          );
            pathToTarget.FailOnDestroyedNullOrForbidden(DelivereeInd);
            pathToTarget.AddFailCondition(() =>
            {
                return
                ((deliveree.Downed) ||
                 (!deliveree.IsPrisonerOfColony) ||
                 (!deliveree.guest.ShouldBeBroughtFood));
            });
            yield return(pathToTarget);

            var dropFoodAtTarget = new Toil();

            dropFoodAtTarget.initAction = new Action(() =>
            {
                Thing resultingThing;
                obj.pawn.carrier.TryDropCarriedThing(dropCell, ThingPlaceMode.Direct, out resultingThing);
            }
                                                     );
            dropFoodAtTarget.defaultCompleteMode = ToilCompleteMode.Instant;
            yield return(dropFoodAtTarget);
        }
        internal static IEnumerable <Toil> _MakeNewToils(this JobDriver_FoodDeliver obj)
        {
            yield return(Toils_Reserve.Reserve(TargetIndex.B, 1));

            var targetThingA = obj.TargetThingA();

            if (targetThingA is Building)
            {
                yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.InteractionCell));

                if (targetThingA is Building_NutrientPasteDispenser)
                {
                    yield return(Toils_Ingest.TakeMealFromDispenser(TargetIndex.A, obj.pawn));
                }
                if (targetThingA is Building_AutomatedFactory)
                {
                    yield return(Toils_FoodSynthesizer.TakeMealFromSynthesizer(TargetIndex.A, obj.pawn));
                }
            }
            else
            {
                var deliveree = (Pawn)obj.pawn.CurJob.targetB.Thing;
                yield return(Toils_Reserve.Reserve(TargetIndex.A, 1));

                yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch));

                yield return(Toils_Ingest.PickupIngestible(TargetIndex.A, deliveree));
            }

            var pathToTarget = new Toil();

            pathToTarget.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            pathToTarget.initAction          = new Action(() =>
            {
                Pawn pawn = obj.pawn;
                Job job   = pawn.jobs.curJob;
                pawn.pather.StartPath(job.targetC, PathEndMode.OnCell);
            }
                                                          );
            pathToTarget.FailOnDestroyedNullOrForbidden(TargetIndex.B);
            pathToTarget.AddFailCondition(() =>
            {
                Pawn pawn = (Pawn)obj.pawn.jobs.curJob.targetB.Thing;
                return
                ((pawn.Downed) ||
                 (!pawn.IsPrisonerOfColony) ||
                 (!pawn.guest.ShouldBeBroughtFood));
            });
            yield return(pathToTarget);

            var dropFoodAtTarget = new Toil();

            dropFoodAtTarget.initAction = new Action(() =>
            {
                Thing resultingThing;
                obj.pawn.carrier.TryDropCarriedThing(obj.pawn.jobs.curJob.targetC.Cell, ThingPlaceMode.Direct, out resultingThing);
            }
                                                     );
            dropFoodAtTarget.defaultCompleteMode = ToilCompleteMode.Instant;
            yield return(dropFoodAtTarget);
        }