protected override IEnumerable <Toil> MakeNewToils() { this.EndOnDespawnedOrNull(MountableInd); if (TargetThingB.IsForbidden(pawn.Faction)) { this.FailOnForbidden(MountableInd); } yield return(Toils_Reserve.Reserve(MountableInd, CurJob.def.joyMaxParticipants)); Toil toil = Toils_Goto.GotoCell(DrivePathInd, PathEndMode.OnCell); toil.tickAction = delegate { if (Find.TickManager.TicksGame > startTick + CurJob.def.joyDuration) { EndJobWith(JobCondition.Succeeded); return; } JoyUtility.JoyTickCheckEnd(pawn, JoyTickFullJoyAction.EndJob, 1f); }; ThingWithComps cart = CurJob.GetTarget(MountableInd).Thing as ThingWithComps; //JumpIf already mounted yield return(Toils_Jump.JumpIf(toil, () => { if (cart.TryGetComp <CompMountable>().Driver == pawn) { return true; } return false; })); //Mount on Target yield return(Toils_Goto.GotoThing(MountableInd, PathEndMode.ClosestTouch) .FailOnDestroyedOrNull(MountableInd)); yield return(Toils_Cart.MountOn(MountableInd)); yield return(toil); yield return(new Toil { initAction = delegate { if (CurJob.targetQueueA.Count > 0) { TargetInfo targetA = CurJob.targetQueueA[0]; CurJob.targetQueueA.RemoveAt(0); CurJob.targetA = targetA; JumpToToil(toil); return; } } }); yield break; }
protected override IEnumerable <Toil> MakeNewToils() { /// //Set fail conditions /// this.FailOnDestroyedOrNull(CartInd); //Note we only fail on forbidden if the target doesn't start that way //This helps haul-aside jobs on forbidden items if (!TargetThingA.IsForbidden(pawn.Faction)) { this.FailOnForbidden(CartInd); } ThingWithComps cart = TargetThingA as ThingWithComps; if (ToolsForHaulUtility.FindStorageCell(pawn, cart) == IntVec3.Invalid) { JobFailReason.Is(ToolsForHaulUtility.NoEmptyPlaceForCart); } if (cart.TryGetComp <CompMountable>().Driver != null) { this.FailOnSomeonePhysicallyInteracting(CartInd); } /// //Define Toil /// Toil toilGoToCell = Toils_Goto.GotoCell(StoreCellInd, PathEndMode.ClosestTouch); /// //Toils Start /// //Reserve thing to be stored and storage cell yield return(Toils_Reserve.Reserve(CartInd)); yield return(Toils_Reserve.Reserve(StoreCellInd)); //JumpIf already mounted yield return(Toils_Jump.JumpIf(toilGoToCell, () => { return cart.TryGetComp <CompMountable>().Driver == pawn ? true : false; })); //Mount on Target yield return(Toils_Goto.GotoThing(CartInd, PathEndMode.ClosestTouch) .FailOnDestroyedOrNull(CartInd)); yield return(Toils_Cart.MountOn(CartInd)); //Dismount yield return(toilGoToCell); yield return(Toils_Cart.DismountAt(CartInd, StoreCellInd)); }
protected override IEnumerable <Toil> MakeNewToils() { Vehicle_Cart cart = CurJob.GetTarget(CartInd).Thing as Vehicle_Cart; /// //Set fail conditions /// this.FailOnDestroyedOrNull(CartInd); //Note we only fail on forbidden if the target doesn't start that way //This helps haul-aside jobs on forbidden items if (!TargetThingA.IsForbidden(pawn.Faction)) { this.FailOnForbidden(CartInd); } this.FailOn(() => !pawn.RaceProps.IsFlesh || !pawn.RaceProps.Humanlike); /// //Define Toil /// Toil findStoreCellForCart = Toils_Cart.FindStoreCellForCart(CartInd); Toil checkCartEmpty = Toils_Jump.JumpIf(findStoreCellForCart, () => cart.storage.Count <= 0); Toil checkStoreCellEmpty = Toils_Jump.JumpIf(findStoreCellForCart, () => CurJob.GetTargetQueue(StoreCellInd).NullOrEmpty()); Toil checkHaulableEmpty = Toils_Jump.JumpIf(checkStoreCellEmpty, () => CurJob.GetTargetQueue(HaulableInd).NullOrEmpty()); /// //Toils Start /// //Reserve thing to be stored and storage cell yield return(Toils_Reserve.Reserve(CartInd)); yield return(Toils_Reserve.ReserveQueue(HaulableInd)); yield return(Toils_Reserve.ReserveQueue(StoreCellInd)); //JumpIf already mounted yield return(Toils_Jump.JumpIf(checkHaulableEmpty, () => { if (cart.mountableComp.Driver == pawn) { return true; } return false; })); //Mount on Target yield return(Toils_Goto.GotoThing(CartInd, PathEndMode.ClosestTouch) .FailOnDestroyedOrNull(CartInd)); yield return(Toils_Cart.MountOn(CartInd)); //JumpIf checkStoreCellEmpty yield return(checkHaulableEmpty); //Collect TargetQueue { Toil extractA = Toils_Collect.Extract(HaulableInd); yield return(extractA); Toil gotoThing = Toils_Goto.GotoThing(HaulableInd, PathEndMode.ClosestTouch) .FailOnDestroyedOrNull(HaulableInd); yield return(gotoThing); yield return(Toils_Collect.CollectInCarrier(CartInd, HaulableInd)); yield return(Toils_Collect.CheckDuplicates(gotoThing, CartInd, HaulableInd)); yield return(Toils_Jump.JumpIfHaveTargetInQueue(HaulableInd, extractA)); } //JumpIf findStoreCellForCart yield return(checkStoreCellEmpty); //Drop TargetQueue { yield return(checkCartEmpty); Toil extractB = Toils_Collect.Extract(StoreCellInd); yield return(extractB); Toil gotoCell = Toils_Goto.GotoCell(StoreCellInd, PathEndMode.ClosestTouch); yield return(gotoCell); yield return(Toils_Collect.DropTheCarriedInCell(StoreCellInd, ThingPlaceMode.Direct, CartInd)); yield return(Toils_Jump.JumpIfHaveTargetInQueue(StoreCellInd, checkCartEmpty)); yield return(Toils_Collect.CheckNeedStorageCell(gotoCell, CartInd, StoreCellInd)); } yield return(findStoreCellForCart); yield return(Toils_Goto.GotoCell(StoreCellInd, PathEndMode.OnCell)); yield return(Toils_Cart.DismountAt(CartInd, StoreCellInd)); }