public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            if ((t is Building_ShellfishTrap) == false)
            {
                return(false);
            }
            Building_ShellfishTrap crabPot = t as Building_ShellfishTrap;

            if (crabPot.IsBurning() || crabPot.IsForbidden(pawn))
            {
                return(false);
            }
            if (pawn.Dead || pawn.Downed || pawn.IsBurning())
            {
                return(false);
            }
            if (pawn.CanReserveAndReach(crabPot, this.PathEndMode, Danger.Some) == false)
            {
                return(false);
            }
            if (crabPot.GetDirectlyHeldThings().Count == 0)
            {
                return(false);
            }

            if (forced)
            {
                return(true);
            }
            return(Find.TickManager.TicksGame > (crabPot.LastOpenTick + 2500 * crabPot.OpenFrequency));
        }
        public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            Job job = new Job();
            Building_ShellfishTrap crabPot = t as Building_ShellfishTrap;

            job = new Job(ResourceBank.JobDefOf.JobDef_EmptyCrabPot);
            job.SetTarget(JobDriver_UnloadCrabPot.CrabPotIndex, crabPot);
            return(job);
        }
Пример #3
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            Building_ShellfishTrap crabPot = this.job.GetTarget(CrabPotIndex).Thing as Building_ShellfishTrap;
            Pawn actor = this.pawn;

            Toil unloadProcess = new Toil()
            {
                initAction = () =>
                {
                    storemode = crabPot.StoreMode;
                },
                defaultDuration     = BaseUnloadDuration,
                defaultCompleteMode = ToilCompleteMode.Delay,
                activeSkill         = (() => SkillDefOf.Animals)
            }
            .FailOnDespawnedNullOrForbidden(CrabPotIndex)
            .FailOnBurningImmobile(CrabPotIndex)
            .FailOnThingHavingDesignation(CrabPotIndex, DesignationDefOf.Uninstall)
            .FailOnCannotTouch(CrabPotIndex, PathEndMode.Touch)
            .WithProgressBarToilDelay(CrabPotIndex);

            Toil unloadPot = new Toil()
            {
                initAction = () =>
                {
                    //Log.Message("unloadPot");
                    AddFinishAction(DropStuff);

                    crabPot.LastOpenTick = Find.TickManager.TicksGame;

                    var items = crabPot.GetDirectlyHeldThings();

                    //Log.Message("items");
                    //foreach(var item in items)
                    //{
                    //    Log.Message(item.def.defName + " " + item.stackCount);
                    //}

                    //Log.Message("unloading");
                    while (!MassUtility.IsOverEncumbered(pawn) && items.Count > 0)
                    {
                        int count = Math.Min(MassUtility.CountToPickUpUntilOverEncumbered(actor, items[0]), items[0].stackCount);

                        //Log.Message(count + " " + items[0].stackCount + MassUtility.CountToPickUpUntilOverEncumbered(actor, items[0]));

                        if (items.TryTransferToContainer(items[0], pawn.inventory.innerContainer, count, out Thing resultingItem, false) > 0)
                        {
                            if (!resultingItem.Destroyed && resultingItem.stackCount > 0)
                            {
                                LoadedFish.Add(resultingItem);
                            }
                        }
                    }

                    items.TryDropAll(pawn.Position, pawn.Map, ThingPlaceMode.Near);

                    //actor.jobs.EndCurrentJob(JobCondition.Succeeded);
                },
                defaultCompleteMode = ToilCompleteMode.Instant
            };

            this.FailOnDespawnedNullOrForbidden(CrabPotIndex);
            this.FailOnBurningImmobile(CrabPotIndex);
            this.FailOnThingHavingDesignation(CrabPotIndex, DesignationDefOf.Uninstall);
            yield return(Toils_Goto.GotoThing(CrabPotIndex, PathEndMode.Touch)
                         .FailOnDespawnedNullOrForbidden(CrabPotIndex)
                         .FailOnBurningImmobile(CrabPotIndex)
                         .FailOnThingHavingDesignation(CrabPotIndex, DesignationDefOf.Uninstall));

            yield return(unloadProcess);

            yield return(unloadPot);

            //todo: repeatetive haul
            Toil finishAndStartHaul = FinishAndStartHaul();

            yield return(finishAndStartHaul);

            yield return(Toils_Misc.TakeItemFromInventoryToCarrier(pawn, HaulableInd));

            yield return(Toils_Reserve.Reserve(StoreCellInd));

            Toil carryToCell = Toils_Haul.CarryHauledThingToCell(StoreCellInd);

            yield return(carryToCell);

            yield return(Toils_Haul.PlaceHauledThingInCell(StoreCellInd, carryToCell, storageMode: true, tryStoreInSameStorageIfSpotCantHoldWholeStack: true));

            yield return(Toils_Jump.JumpIf(finishAndStartHaul, () => LoadedFish.Count > 0));
        }