// Token: 0x0600000A RID: 10 RVA: 0x000029D9 File Offset: 0x00000BD9 protected override IEnumerable <Toil> MakeNewToils() { this.FailOn(delegate { if (job.ignoreDesignations) { return(false); } var victim = Victim; if (victim != null && !victim.Dead && Map.designationManager.DesignationOn(victim, DesignationDefOf.Hunt) == null) { return(true); } return(false); }); yield return(new Toil { initAction = delegate { jobStartTick = Find.TickManager.TicksGame; } }); yield return(Toils_Combat.TrySetJobToUseAttackVerb(TargetIndex.A)); var startCollectCorpse = StartCollectCorpseToil(); var gotoCastPos = MarvsGotoCastPosition(TargetIndex.A, true) .JumpIfDespawnedOrNull(TargetIndex.A, startCollectCorpse) .FailOn(() => Find.TickManager.TicksGame > jobStartTick + 5000); yield return(gotoCastPos); var moveIfCannotHit = MarvsJumpIfTargetNotHittable(TargetIndex.A, gotoCastPos); yield return(moveIfCannotHit); yield return(MarvsJumpIfTargetDownedDistant(TargetIndex.A, gotoCastPos)); yield return(Toils_Combat.CastVerb(TargetIndex.A, false) .JumpIfDespawnedOrNull(TargetIndex.A, startCollectCorpse) .FailOn(() => Find.TickManager.TicksGame > jobStartTick + 5000)); yield return(Toils_Jump.JumpIfTargetDespawnedOrNull(TargetIndex.A, startCollectCorpse)); yield return(Toils_Jump.Jump(moveIfCannotHit)); yield return(startCollectCorpse); yield return(Toils_Goto.GotoCell(TargetIndex.A, PathEndMode.ClosestTouch) .FailOnDespawnedNullOrForbidden(TargetIndex.A).FailOnSomeonePhysicallyInteracting(TargetIndex.A)); yield return(Toils_Haul.StartCarryThing(TargetIndex.A)); var carryToCell = Toils_Haul.CarryHauledThingToCell(TargetIndex.B); yield return(carryToCell); yield return(Toils_Haul.PlaceHauledThingInCell(TargetIndex.B, carryToCell, true)); }
protected override IEnumerable <Toil> MakeNewToils() { this.FailOn(delegate { if (!job.ignoreDesignations) { Pawn victim = Victim; if (victim != null && !victim.Dead && Map.designationManager.DesignationOn(victim, DesignationDefOf.Hunt) == null) { return(true); } } return(false); }); yield return(Toils_Reserve.Reserve(VictimInd, 1)); var init = new Toil(); init.initAction = delegate { jobStartTick = Find.TickManager.TicksGame; }; yield return(init); yield return(Toils_Combat.TrySetJobToUseAttackVerb(TargetIndex.A)); var comp = (pawn.equipment != null && pawn.equipment.Primary != null) ? pawn.equipment.Primary.TryGetComp <CompAmmoUser>() : null; var startCollectCorpse = StartCollectCorpseToil(); var gotoCastPos = GotoCastPosition(VictimInd, true).JumpIfDespawnedOrNull(VictimInd, startCollectCorpse).FailOn(() => Find.TickManager.TicksGame > jobStartTick + MaxHuntTicks); yield return(gotoCastPos); //var moveIfCannotHit = Toils_Jump.JumpIfTargetNotHittable(VictimInd, gotoCastPos); var moveIfCannotHit = Toils_Jump.JumpIf(gotoCastPos, delegate { var verb = pawn.CurJob.verbToUse; var optimalRange = HuntRangePerBodysize(Victim.RaceProps.baseBodySize, Victim.RaceProps.executionRange, verb.verbProps.range); if (pawn.Position.DistanceTo(Victim.Position) > optimalRange) { return(true); } return(!verb.CanHitTarget(Victim)); }); yield return(moveIfCannotHit); yield return(Toils_Jump.JumpIfTargetDespawnedOrNull(VictimInd, startCollectCorpse)); var startExecuteDowned = Toils_Goto.GotoThing(VictimInd, PathEndMode.Touch).JumpIfDespawnedOrNull(VictimInd, startCollectCorpse); yield return(Toils_Jump.JumpIf(startExecuteDowned, () => Victim.Downed && Victim.RaceProps.executionRange <= 2)); yield return(Toils_Jump.JumpIfTargetDowned(VictimInd, gotoCastPos)); yield return(Toils_Combat.CastVerb(VictimInd, false).JumpIfDespawnedOrNull(VictimInd, startCollectCorpse) .FailOn(() => { if (Find.TickManager.TicksGame <= jobStartTick + MaxHuntTicks) { if (comp == null || comp.HasAndUsesAmmoOrMagazine) { return false; } } return true; })); yield return(Toils_Jump.Jump(moveIfCannotHit)); // Execute downed animal - adapted from JobDriver_Slaughter yield return(startExecuteDowned); yield return(Toils_General.WaitWith(VictimInd, 180, true).JumpIfDespawnedOrNull(VictimInd, startCollectCorpse)); yield return(new Toil { initAction = delegate { ExecutionUtility.DoExecutionByCut(pawn, Victim); }, defaultCompleteMode = ToilCompleteMode.Instant }); // Haul corpse to stockpile yield return(startCollectCorpse); yield return(Toils_Goto.GotoCell(VictimInd, PathEndMode.ClosestTouch).FailOnDespawnedNullOrForbidden(VictimInd).FailOnSomeonePhysicallyInteracting(VictimInd)); yield return(Toils_Haul.StartCarryThing(VictimInd)); var carryToCell = Toils_Haul.CarryHauledThingToCell(StoreCellInd); yield return(carryToCell); yield return(Toils_Haul.PlaceHauledThingInCell(StoreCellInd, carryToCell, true)); }
protected override IEnumerable <Toil> MakeNewToils() { this.FailOn(delegate() { if (!this.job.ignoreDesignations) { Pawn victim = this.Victim; if (victim != null && !victim.Dead && base.Map.designationManager.DesignationOn(victim, DesignationDefOf.Hunt) == null) { return(true); } } return(false); }); yield return(new Toil { initAction = delegate() { this.jobStartTick = Find.TickManager.TicksGame; } }); yield return(Toils_Combat.TrySetJobToUseAttackVerb(TargetIndex.A)); Toil startCollectCorpseLabel = Toils_General.Label(); Toil slaughterLabel = Toils_General.Label(); Toil gotoCastPos = Toils_Combat.GotoCastPosition(TargetIndex.A, true, 0.95f).JumpIfDespawnedOrNull(TargetIndex.A, startCollectCorpseLabel).FailOn(() => Find.TickManager.TicksGame > this.jobStartTick + 5000); yield return(gotoCastPos); Toil slaughterIfPossible = Toils_Jump.JumpIf(slaughterLabel, delegate { Pawn victim = this.Victim; return((victim.RaceProps.DeathActionWorker == null || !victim.RaceProps.DeathActionWorker.DangerousInMelee) && victim.Downed); }); yield return(slaughterIfPossible); yield return(Toils_Jump.JumpIfTargetNotHittable(TargetIndex.A, gotoCastPos)); yield return(Toils_Combat.CastVerb(TargetIndex.A, false).JumpIfDespawnedOrNull(TargetIndex.A, startCollectCorpseLabel).FailOn(() => Find.TickManager.TicksGame > this.jobStartTick + 5000)); yield return(Toils_Jump.JumpIfTargetDespawnedOrNull(TargetIndex.A, startCollectCorpseLabel)); yield return(Toils_Jump.Jump(slaughterIfPossible)); yield return(slaughterLabel); yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch).FailOnMobile(TargetIndex.A)); yield return(Toils_General.WaitWith(TargetIndex.A, 180, true, false).FailOnMobile(TargetIndex.A)); yield return(Toils_General.Do(delegate { if (this.Victim.Dead) { return; } ExecutionUtility.DoExecutionByCut(this.pawn, this.Victim); this.pawn.records.Increment(RecordDefOf.AnimalsSlaughtered); if (this.pawn.InMentalState) { this.pawn.MentalState.Notify_SlaughteredAnimal(); } })); yield return(Toils_Jump.Jump(startCollectCorpseLabel)); yield return(startCollectCorpseLabel); yield return(this.StartCollectCorpseToil()); yield return(Toils_Goto.GotoCell(TargetIndex.A, PathEndMode.ClosestTouch).FailOnDespawnedNullOrForbidden(TargetIndex.A).FailOnSomeonePhysicallyInteracting(TargetIndex.A)); yield return(Toils_Haul.StartCarryThing(TargetIndex.A, false, false, false)); Toil carryToCell = Toils_Haul.CarryHauledThingToCell(TargetIndex.B); yield return(carryToCell); yield return(Toils_Haul.PlaceHauledThingInCell(TargetIndex.B, carryToCell, true)); yield break; }
public bool MoveNext() { uint num = (uint)this.$PC; this.$PC = -1; switch (num) { case 0u: { this.FailOn(delegate() { if (!this.job.ignoreDesignations) { Pawn victim = base.Victim; if (victim != null && !victim.Dead && base.Map.designationManager.DesignationOn(victim, DesignationDefOf.Hunt) == null) { return(true); } } return(false); }); Toil init = new Toil(); init.initAction = delegate() { this.jobStartTick = Find.TickManager.TicksGame; }; this.$current = init; if (!this.$disposing) { this.$PC = 1; } return(true); } case 1u: this.$current = Toils_Combat.TrySetJobToUseAttackVerb(TargetIndex.A); if (!this.$disposing) { this.$PC = 2; } return(true); case 2u: startCollectCorpseLabel = Toils_General.Label(); slaughterLabel = Toils_General.Label(); gotoCastPos = Toils_Combat.GotoCastPosition(TargetIndex.A, true, 0.95f).JumpIfDespawnedOrNull(TargetIndex.A, startCollectCorpseLabel).FailOn(() => Find.TickManager.TicksGame > this.jobStartTick + 5000); this.$current = gotoCastPos; if (!this.$disposing) { this.$PC = 3; } return(true); case 3u: slaughterIfPossible = Toils_Jump.JumpIf(slaughterLabel, delegate { Pawn victim = base.Victim; return((victim.RaceProps.DeathActionWorker == null || !victim.RaceProps.DeathActionWorker.DangerousInMelee) && victim.Downed); }); this.$current = slaughterIfPossible; if (!this.$disposing) { this.$PC = 4; } return(true); case 4u: this.$current = Toils_Jump.JumpIfTargetNotHittable(TargetIndex.A, gotoCastPos); if (!this.$disposing) { this.$PC = 5; } return(true); case 5u: this.$current = Toils_Combat.CastVerb(TargetIndex.A, false).JumpIfDespawnedOrNull(TargetIndex.A, startCollectCorpseLabel).FailOn(() => Find.TickManager.TicksGame > this.jobStartTick + 5000); if (!this.$disposing) { this.$PC = 6; } return(true); case 6u: this.$current = Toils_Jump.JumpIfTargetDespawnedOrNull(TargetIndex.A, startCollectCorpseLabel); if (!this.$disposing) { this.$PC = 7; } return(true); case 7u: this.$current = Toils_Jump.Jump(slaughterIfPossible); if (!this.$disposing) { this.$PC = 8; } return(true); case 8u: this.$current = slaughterLabel; if (!this.$disposing) { this.$PC = 9; } return(true); case 9u: this.$current = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch).FailOnMobile(TargetIndex.A); if (!this.$disposing) { this.$PC = 10; } return(true); case 10u: this.$current = Toils_General.WaitWith(TargetIndex.A, 180, true, false).FailOnMobile(TargetIndex.A); if (!this.$disposing) { this.$PC = 11; } return(true); case 11u: this.$current = Toils_General.Do(delegate { if (base.Victim.Dead) { return; } ExecutionUtility.DoExecutionByCut(this.pawn, base.Victim); this.pawn.records.Increment(RecordDefOf.AnimalsSlaughtered); if (this.pawn.InMentalState) { this.pawn.MentalState.Notify_SlaughteredAnimal(); } }); if (!this.$disposing) { this.$PC = 12; } return(true); case 12u: this.$current = Toils_Jump.Jump(startCollectCorpseLabel); if (!this.$disposing) { this.$PC = 13; } return(true); case 13u: this.$current = startCollectCorpseLabel; if (!this.$disposing) { this.$PC = 14; } return(true); case 14u: this.$current = base.StartCollectCorpseToil(); if (!this.$disposing) { this.$PC = 15; } return(true); case 15u: this.$current = Toils_Goto.GotoCell(TargetIndex.A, PathEndMode.ClosestTouch).FailOnDespawnedNullOrForbidden(TargetIndex.A).FailOnSomeonePhysicallyInteracting(TargetIndex.A); if (!this.$disposing) { this.$PC = 16; } return(true); case 16u: this.$current = Toils_Haul.StartCarryThing(TargetIndex.A, false, false, false); if (!this.$disposing) { this.$PC = 17; } return(true); case 17u: carryToCell = Toils_Haul.CarryHauledThingToCell(TargetIndex.B); this.$current = carryToCell; if (!this.$disposing) { this.$PC = 18; } return(true); case 18u: this.$current = Toils_Haul.PlaceHauledThingInCell(TargetIndex.B, carryToCell, true); if (!this.$disposing) { this.$PC = 19; } return(true); case 19u: this.$PC = -1; break; } return(false); }
protected override IEnumerable <Toil> MakeNewToils() { Toil startJobToil = new Toil(); startJobToil.initAction = delegate { jobStartTick = Find.TickManager.TicksGame; }; yield return(startJobToil); yield return(Toils_Combat.TrySetJobToUseAttackVerb(TargetIndex.A)); Toil startCollectCorpseLabel = Toils_General.Label(); Toil slaughterLabel = Toils_General.Label(); Toil meleeLabel = Toils_General.Label(); Toil checkTargetToil = new Toil(); checkTargetToil.initAction = delegate { targetCheckTick = Find.TickManager.TicksGame; //if (pawn.equipment.Primary == null || pawn.equipment.Primary.def.IsMeleeWeapon) // pawn.jobs.curDriver.JumpToToil(meleeLabel); }; yield return(checkTargetToil); //Toil gotoCastPos = Toils_Combat.GotoCastPosition(TargetIndex.A, true, 0.95f).JumpIfDespawnedOrNull(TargetIndex.A, startCollectCorpseLabel).FailOn(() => Find.TickManager.TicksGame > jobStartTick + 5000); Toil gotoCastPos = Toils_Combat.GotoCastPosition(TargetIndex.A, true, 4.0f) .JumpIfDespawnedOrNull(TargetIndex.A, startCollectCorpseLabel) .JumpIf(() => Find.TickManager.TicksGame > targetCheckTick + targetCheckInterval, checkTargetToil); yield return(gotoCastPos); Toil selectAttack = new Toil(); selectAttack.initAction = delegate { if (pawn.CanReachImmediate(TargetA, PathEndMode.Touch)) { pawn.jobs.curDriver.JumpToToil(meleeLabel); } else if (Victim.Downed) { if (Victim.AnimalOrWildMan()) { pawn.jobs.curDriver.JumpToToil(slaughterLabel); } else { pawn.jobs.curDriver.JumpToToil(meleeLabel); } } }; yield return(selectAttack); // Ranged attack yield return(Toils_Jump.JumpIfTargetNotHittable(TargetIndex.A, checkTargetToil)); yield return(Toils_Combat.CastVerb(TargetIndex.A, canHitNonTargetPawns: false).JumpIfDespawnedOrNull(TargetIndex.A, startCollectCorpseLabel).FailOn(() => Find.TickManager.TicksGame > jobStartTick + 5000)); yield return(Toils_Jump.JumpIfTargetDespawnedOrNull(TargetIndex.A, startCollectCorpseLabel)); yield return(Toils_Jump.Jump(selectAttack)); // Melee yield return(meleeLabel); yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch).JumpIf(() => Find.TickManager.TicksGame > targetCheckTick + targetCheckInterval, checkTargetToil)); //yield return Toils_Goto.GotoCell(TargetIndex.A, PathEndMode.OnCell).JumpIf(() => Find.TickManager.TicksGame > targetCheckTick + targetCheckInterval, checkTargetToil); Toil meleeAttack = new Toil(); meleeAttack.tickAction = delegate { if (Victim == null || !Victim.Spawned || Victim.IsForbidden(pawn) || !pawn.CanReachImmediate(TargetA, PathEndMode.Touch)) { pawn.jobs.curDriver.JumpToToil(checkTargetToil); } else if (Victim.Downed && Victim.AnimalOrWildMan()) { pawn.jobs.curDriver.JumpToToil(slaughterLabel); } pawn.pather.StopDead(); pawn.meleeVerbs.TryMeleeAttack(Victim); }; meleeAttack.activeSkill = () => SkillDefOf.Melee; meleeAttack.defaultCompleteMode = ToilCompleteMode.Never; yield return(meleeAttack); yield return(Toils_Jump.JumpIfCannotTouch(TargetIndex.A, PathEndMode.Touch, checkTargetToil)); // Slaughter target yield return(slaughterLabel); yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch).FailOnMobile(TargetIndex.A)); yield return(Toils_General.WaitWith(TargetIndex.A, 180, useProgressBar: true).FailOnMobile(TargetIndex.A)); yield return(Toils_General.Do(delegate { if (!Victim.Dead) { ExecutionUtility.DoExecutionByCut(pawn, Victim); pawn.records.Increment(RecordDefOf.AnimalsSlaughtered); if (pawn.InMentalState) { pawn.MentalState.Notify_SlaughteredAnimal(); } } })); yield return(Toils_Jump.Jump(startCollectCorpseLabel)); yield return(startCollectCorpseLabel); //yield return Toils_Misc.ThrowColonistAttackingMote(TargetIndex.A); //yield return Toils_Combat.FollowAndMeleeAttack(TargetIndex.A, delegate //{ // Thing thing = job.GetTarget(TargetIndex.A).Thing; // Pawn p; // if (job.reactingToMeleeThreat && (p = thing as Pawn) != null && !p.Awake()) // { // EndJobWith(JobCondition.InterruptForced); // } // else if (pawn.meleeVerbs.TryMeleeAttack(thing, job.verbToUse) && pawn.CurJob != null && pawn.jobs.curDriver == this) // { // numMeleeAttacksMade++; // if (numMeleeAttacksMade >= job.maxNumMeleeAttacks) // { // EndJobWith(JobCondition.Succeeded); // } // } //}).FailOnDespawnedOrNull(TargetIndex.A); }