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); }
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)); }