protected override IEnumerable <Toil> MakeNewToils() { if (tar == null) { foreach (var toil in base.MakeNewToils()) { yield return(toil); } } else { // Find the pawn to use the item on. Pawn other; { var corpse = tar as Corpse; other = (corpse == null) ? (Pawn)tar : corpse.InnerPawn; } this.FailOnDespawnedNullOrForbidden(itar); if (!other.Dead) { this.FailOnAggroMentalState(itar); } yield return(Toils_Reserve.Reserve(itar)); if ((pawn.inventory != null) && pawn.inventory.Contains(item)) { yield return(Toils_Misc.TakeItemFromInventoryToCarrier(pawn, iitem)); } else { yield return(Toils_Reserve.Reserve(iitem)); yield return(Toils_Goto.GotoThing(iitem, PathEndMode.ClosestTouch).FailOnForbidden(iitem)); yield return(pickup_item(pawn, item)); } yield return(Toils_Goto.GotoThing(itar, PathEndMode.Touch)); yield return(new Toil { initAction = delegate { if (!other.Dead) { PawnUtility.ForceWait(other, 60); } }, defaultCompleteMode = ToilCompleteMode.Delay, defaultDuration = 60 }); yield return(new Toil { initAction = delegate { var effective_item = item; // Drop the item if it's some kind of apparel. This is because ApparelTracker.Wear only works properly // if the apparel to wear is spawned. (I'm just assuming that DoEffect for apparel wears it, which is // true for bondage gear) if ((effective_item as Apparel) != null) { Thing dropped_thing; if (pawn.carryTracker.TryDropCarriedThing(pawn.Position, ThingPlaceMode.Near, out dropped_thing)) { effective_item = dropped_thing as Apparel; } else { Log.Error("Unable to drop " + effective_item.Label + " for use on " + other.NameStringShort + " (apparel must be dropped before use)"); effective_item = null; } } if (effective_item != null) { var eff = effective_item.TryGetComp <CompUseEffect>(); if (eff != null) { eff.DoEffect(other); } else { Log.Error("Unable to get CompUseEffect for use of " + effective_item.Label + " on " + other.NameStringShort + " by " + pawn.NameStringShort); } } }, defaultCompleteMode = ToilCompleteMode.Instant }); } }
public bool MoveNext() { uint num = (uint)this.$PC; this.$PC = -1; switch (num) { case 0u: this.$current = Toils_Misc.ThrowColonistAttackingMote(TargetIndex.A); if (!this.$disposing) { this.$PC = 1; } return(true); case 1u: { Toil init = new Toil(); init.initAction = delegate() { Pawn pawn = base.TargetThingA as Pawn; if (pawn != null) { this.startedIncapacitated = pawn.Downed; } this.pawn.pather.StopDead(); }; init.tickAction = delegate() { if (!base.TargetA.IsValid) { base.EndJobWith(JobCondition.Succeeded); } else { if (base.TargetA.HasThing) { Pawn pawn = base.TargetA.Thing as Pawn; if (base.TargetA.Thing.Destroyed || (pawn != null && !this.startedIncapacitated && pawn.Downed)) { base.EndJobWith(JobCondition.Succeeded); return; } } if (this.numAttacksMade >= this.job.maxNumStaticAttacks && !this.pawn.stances.FullBodyBusy) { base.EndJobWith(JobCondition.Succeeded); } else if (this.pawn.TryStartAttack(base.TargetA)) { this.numAttacksMade++; } else if (this.job.endIfCantShootTargetFromCurPos && !this.pawn.stances.FullBodyBusy) { Verb verb = this.pawn.TryGetAttackVerb(base.TargetA.Thing, !this.pawn.IsColonist); if (verb == null || !verb.CanHitTargetFrom(this.pawn.Position, base.TargetA)) { base.EndJobWith(JobCondition.Incompletable); } } } }; init.defaultCompleteMode = ToilCompleteMode.Never; this.$current = init; if (!this.$disposing) { this.$PC = 2; } return(true); } case 2u: this.$PC = -1; break; } return(false); }
protected override IEnumerable<Toil> MakeNewToils() { bool flag; yield return Toils_Misc.ThrowColonistAttackingMote(TargetIndex.A); Verb_UseAbility curJob = this.pawn.CurJob.verbToUse as Verb_UseAbility; if (base.TargetA.HasThing) { flag = (!base.GetActor().IsFighting() ? true : !curJob.UseAbilityProps.canCastInMelee); if (flag) { Toil toil = Toils_Combat.GotoCastPosition(TargetIndex.A, false); yield return toil; toil = null; } } if (this.Context == AbilityContext.Player) { Find.Targeter.targetingVerb = curJob; } Pawn targetPawn = null; if (this.TargetThingA != null) { targetPawn = TargetThingA as Pawn; } if (targetPawn != null) { //yield return Toils_Combat.CastVerb(TargetIndex.A, false); Toil combatToil = new Toil(); combatToil.FailOnDestroyedOrNull(TargetIndex.A); combatToil.FailOnDespawnedOrNull(TargetIndex.A); //combatToil.FailOnDowned(TargetIndex.A); //CompAbilityUserMagic comp = this.pawn.GetComp<CompAbilityUserMagic>(); this.duration = (int)((curJob.verbProps.warmupTime*60) * this.pawn.GetStatValue(StatDefOf.AimingDelayFactor, false)); //JobDriver curDriver = this.pawn.jobs.curDriver; combatToil.initAction = delegate { Verb arg_45_0 = combatToil.actor.jobs.curJob.verbToUse; LocalTargetInfo target = combatToil.actor.jobs.curJob.GetTarget(TargetIndex.A); // bool canFreeIntercept2 = false; arg_45_0.TryStartCastOn(target, false, false); }; combatToil.tickAction = delegate { this.duration--; }; combatToil.AddFinishAction(delegate { if (this.duration <= 5) { curJob.Ability.PostAbilityAttempt(); } }); //if (combatToil.actor.CurJob != this.job) //{ // curDriver.ReadyForNextToil(); //} combatToil.defaultCompleteMode = ToilCompleteMode.FinishedBusy; yield return combatToil; //Toil toil2 = new Toil() //{ // initAction = () => // { // if (curJob.UseAbilityProps.isViolent) // { // JobDriver_CastAbilityVerb.CheckForAutoAttack(this.pawn); // } // }, // defaultCompleteMode = ToilCompleteMode.Instant //}; //yield return toil2; //Toil toil1 = new Toil() //{ // initAction = () => curJob.Ability.PostAbilityAttempt(), // defaultCompleteMode = ToilCompleteMode.Instant //}; //yield return toil1; } else { if ((pawn.Position - TargetLocA).LengthHorizontal < curJob.verbProps.range) { if (TargetLocA.IsValid && TargetLocA.InBounds(pawn.Map) && !TargetLocA.Fogged(pawn.Map) && TargetLocA.Walkable(pawn.Map)) { ShootLine shootLine; bool validTarg = curJob.TryFindShootLineFromTo(pawn.Position, TargetLocA, out shootLine); if (validTarg) { yield return Toils_Combat.CastVerb(TargetIndex.A, false); //Toil toil2 = new Toil() //{ // initAction = () => // { // if (curJob.UseAbilityProps.isViolent) // { // JobDriver_CastAbilityVerb.CheckForAutoAttack(this.pawn); // } // }, // defaultCompleteMode = ToilCompleteMode.Instant //}; //yield return toil2; Toil toil1 = new Toil() { initAction = () => curJob.Ability.PostAbilityAttempt(), defaultCompleteMode = ToilCompleteMode.Instant }; yield return toil1; } else { //No LoS if (pawn.IsColonist) { Messages.Message("TM_OutOfLOS".Translate(new object[] { pawn.LabelShort }), MessageTypeDefOf.RejectInput); } } } } else { if (pawn.IsColonist) { //out of range Messages.Message("TM_OutOfRange".Translate(), MessageTypeDefOf.RejectInput); } } } }
protected override IEnumerable <Toil> MakeNewToils() { if (thing == null || building == null) { pawn.jobs.EndCurrentJob(JobCondition.InterruptForced); } bool err = false; Toil error = Toils_General.Do(delegate { Log.Error("Error in Toils_Haul.PlaceHauledThingInCell. Breaking job."); Log.Error("thingInd = " + thingInd); Log.Error("buildingInd = " + buildingInd); Log.Error("buildingCellInd = " + buildingCellInd); err = false; }); CompProperties_WeaponAvali weaponAvali = thing.TryGetComp <CompWeaponAvali>().Props; if (weaponAvali != null) { float num = 0; CompWeaponAvali compWeaponAvali = thing.TryGetComp <CompWeaponAvali>(); if (building != null && building.GetStatValue(StatDefOf.ResearchSpeedFactor, true) > 0) { num = 1.1f * pawn.GetStatValue(StatDefOf.ResearchSpeed, true); // 1.1 * 0.58 = 0.638 num *= building.GetStatValue(StatDefOf.ResearchSpeedFactor, true); // 0.638 * 1 = 0.638 ticksPerWorkPoint = ticksPerWorkPoint / num; // 60 / 0.638 = 94 if (ticksPerWorkPoint > 1 && pawn.def == ThingDefOf.Avali) { ticksPerWorkPoint = ticksPerWorkPoint / 2; } } else if (weaponAvali.hackWorkSkill != null) { num = (pawn.skills.GetSkill(weaponAvali.hackWorkSkill).Level - weaponAvali.hackMinSkillLevel) * 2; if (ticksPerWorkPoint - num > 0) { ticksPerWorkPoint = ticksPerWorkPoint - num; } else { ticksPerWorkPoint = 1; } } //Log.Message("num = " + num); //Log.Message("ticksPerWorkPoint = " + ticksPerWorkPoint); //Log.Message("workLeft = " + compWeaponAvali.workLeft); yield return(Toils_Goto.GotoThing(thingInd, PathEndMode.Touch).FailOnDespawnedNullOrForbidden(thingInd).FailOnSomeonePhysicallyInteracting(thingInd)); yield return(Toils_Haul.StartCarryThing(thingInd, false, false, false)); yield return(Toils_Misc.SetForbidden(thingInd, false)); yield return(Toils_Goto.GotoThing(buildingInd, PathEndMode.InteractionCell).FailOnDestroyedOrNull(buildingInd)); yield return(Toils_Haul.PlaceHauledThingInCell(buildingCellInd, Toils_Jump.Jump(error), false)); //IntVec3 thingPosition = thing.PositionHeld; //IntVec3 buildingPosition = building.PositionHeld; float workLeftInTicks = compWeaponAvali.workLeft * (ticksPerWorkPoint * 1.1f); Toil translate = Toils_General.Wait((int)workLeftInTicks); translate.tickAction = delegate { this.FailOnDespawnedOrNull(thingInd); this.FailOnForbidden(thingInd); this.FailOnDespawnedOrNull(buildingInd); this.FailOnForbidden(buildingInd); //else if (thing.PositionHeld != thingPosition || building.PositionHeld != buildingPosition) pawn.jobs.EndCurrentJob(JobCondition.InterruptForced); //else if (thing.IsForbidden(pawn)) pawn.jobs.EndCurrentJob(JobCondition.InterruptForced); pawn.skills.Learn(weaponAvali.hackWorkSkill, 0.11f, false); pawn.GainComfortFromCellIfPossible(); if (pawn.IsHashIntervalTick((int)ticksPerWorkPoint)) { if (!building.IsPowered()) { pawn.jobs.EndCurrentJob(JobCondition.Incompletable); } //Log.Message("workLeft = " + compWeaponAvali.workLeft); compWeaponAvali.workLeft--; } if (compWeaponAvali.workLeft <= 0) { compWeaponAvali.workLeft = 0; compWeaponAvali.EraseOwnerPawnInfo(); pawn.jobs.EndCurrentJob(JobCondition.Succeeded); } }; //Log.Message("Translate"); yield return(translate); } if (err) { yield return(error); } yield break; }
//public override bool TryMakePreToilReservations(bool errorOnFailed) //{ // if(TargetA.Thing != null) // { // return true; // } // if (pawn.Reserve(TargetA, this.job, 1, 1, null, errorOnFailed)) // { // return true; // } // return false; //} protected override IEnumerable <Toil> MakeNewToils() { yield return(Toils_Misc.ThrowColonistAttackingMote(TargetIndex.A)); this.verb = this.pawn.CurJob.verbToUse as Verb_UseAbility; if (base.TargetA.HasThing && base.TargetA.Thing is Pawn && (!pawn.Position.InHorDistOf(base.TargetA.Cell, pawn.CurJob.verbToUse.verbProps.range) || !Verb.UseAbilityProps.canCastInMelee)) { //if (!base.GetActor().IsFighting() ? true : !verb.UseAbilityProps.canCastInMelee && !this.job.endIfCantShootTargetFromCurPos) //{ Toil toil = Toils_Combat.GotoCastPosition(TargetIndex.A, false); yield return(toil); //toil = null; //} } if (this.Context == AbilityContext.Player) { Find.Targeter.targetingSource = this.verb; } Pawn targetPawn = null; if (this.TargetThingA != null) { targetPawn = TargetThingA as Pawn; } if (targetPawn != null) { //yield return Toils_Combat.CastVerb(TargetIndex.A, false); Toil combatToil = new Toil(); //combatToil.FailOnDestroyedOrNull(TargetIndex.A); //combatToil.FailOnDespawnedOrNull(TargetIndex.A); //combatToil.FailOnDowned(TargetIndex.A); //CompAbilityUserMagic comp = this.pawn.GetComp<CompAbilityUserMagic>(); //JobDriver curDriver = this.pawn.jobs.curDriver; combatToil.initAction = delegate { this.verb = combatToil.actor.jobs.curJob.verbToUse as Verb_UseAbility; if (verb != null && verb.verbProps != null) { this.duration = (int)((this.verb.verbProps.warmupTime * 60) * this.pawn.GetStatValue(StatDefOf.AimingDelayFactor, false)); if (this.pawn.RaceProps.Humanlike) { //if (this.pawn.story.traits.HasTrait(TorannMagicDefOf.Faceless)) //{ // RemoveMimicAbility(verb); //} if (this.pawn.story.traits.HasTrait(TorannMagicDefOf.TM_Psionic)) { PsionicEnergyCost(verb); } if (this.pawn.story.traits.HasTrait(TorannMagicDefOf.DeathKnight)) { HateCost(verb); } if (verb.Ability?.CooldownTicksLeft != -1) { this.EndJobWith(JobCondition.Incompletable); } } LocalTargetInfo target = combatToil.actor.jobs.curJob.GetTarget(TargetIndex.A); if (target != null) { verb.TryStartCastOn(target, false, true); } using (IEnumerator <Hediff> enumerator = this.pawn.health.hediffSet.GetHediffs <Hediff>().GetEnumerator()) { while (enumerator.MoveNext()) { Hediff rec = enumerator.Current; if (rec.def == TorannMagicDefOf.TM_PossessionHD || rec.def == TorannMagicDefOf.TM_DisguiseHD || rec.def == TorannMagicDefOf.TM_DisguiseHD_I || rec.def == TorannMagicDefOf.TM_DisguiseHD_II || rec.def == TorannMagicDefOf.TM_DisguiseHD_III) { this.pawn.health.RemoveHediff(rec); } } } } else { this.EndJobWith(JobCondition.Errored); } }; combatToil.tickAction = delegate { if (this.pawn.Downed) { EndJobWith(JobCondition.InterruptForced); } if (Find.TickManager.TicksGame % 12 == 0) { if (verb.Ability.Def == TorannMagicDefOf.TM_Artifact_TraitThief || verb.Ability.Def == TorannMagicDefOf.TM_Artifact_TraitInfuse) { float direction = Rand.Range(0, 360); TM_MoteMaker.ThrowGenericMote(ThingDef.Named("Mote_Psi_Arcane"), pawn.DrawPos, pawn.Map, Rand.Range(.1f, .4f), 0.2f, .02f, .1f, 0, Rand.Range(8, 10), direction, direction); } else { TM_MoteMaker.ThrowCastingMote(pawn.DrawPos, pawn.Map, Rand.Range(1.2f, 2f)); } } this.duration--; if (!wildCheck && this.duration <= 6) { wildCheck = true; if (this.pawn.story != null && this.pawn.story.traits != null && this.pawn.story.traits.HasTrait(TorannMagicDefOf.ChaosMage) && Rand.Chance(.1f)) { verb.Ability.PostAbilityAttempt(); TM_Action.DoWildSurge(this.pawn, this.pawn.GetComp <CompAbilityUserMagic>(), (MagicAbility)verb.Ability, (TMAbilityDef)verb.Ability.Def, TargetA); EndJobWith(JobCondition.InterruptForced); } } }; combatToil.AddFinishAction(delegate { if (this.duration <= 5 && !this.pawn.DestroyedOrNull() && !this.pawn.Dead && !this.pawn.Downed) { //ShootLine shootLine; //bool validTarg = verb.TryFindShootLineFromTo(pawn.Position, TargetLocA, out shootLine); //bool inRange = (pawn.Position - TargetLocA).LengthHorizontal < verb.verbProps.range; //if (inRange && validTarg) //{ TMAbilityDef tmad = (TMAbilityDef)(verb.Ability.Def); if (tmad != null && tmad.relationsAdjustment != 0 && targetPawn.Faction != null && targetPawn.Faction != this.pawn.Faction && !targetPawn.Faction.HostileTo(this.pawn.Faction)) { targetPawn.Faction.TryAffectGoodwillWith(this.pawn.Faction, tmad.relationsAdjustment, true, false, null, null); } verb.Ability.PostAbilityAttempt(); this.pawn.ClearReservationsForJob(this.job); //} } }); //if (combatToil.actor.CurJob != this.job) //{ // curDriver.ReadyForNextToil(); //} combatToil.defaultCompleteMode = ToilCompleteMode.FinishedBusy; this.pawn.ClearReservationsForJob(this.job); yield return(combatToil); //Toil toil2 = new Toil() //{ // initAction = () => // { // if (curJob.UseAbilityProps.isViolent) // { // JobDriver_CastAbilityVerb.CheckForAutoAttack(this.pawn); // } // }, // defaultCompleteMode = ToilCompleteMode.Instant //}; //yield return toil2; //Toil toil1 = new Toil() //{ // initAction = () => curJob.Ability.PostAbilityAttempt(), // defaultCompleteMode = ToilCompleteMode.Instant //}; //yield return toil1; } else { if (verb != null && verb.verbProps != null && (pawn.Position - TargetLocA).LengthHorizontal < verb.verbProps.range) { if (TargetLocA.IsValid && TargetLocA.InBounds(pawn.Map) && !TargetLocA.Fogged(pawn.Map)) //&& TargetLocA.Walkable(pawn.Map) { ShootLine shootLine; bool validTarg = verb.TryFindShootLineFromTo(pawn.Position, TargetLocA, out shootLine); if (validTarg) { //yield return Toils_Combat.CastVerb(TargetIndex.A, false); //Toil toil2 = new Toil() //{ // initAction = () => // { // if (curJob.UseAbilityProps.isViolent) // { // JobDriver_CastAbilityVerb.CheckForAutoAttack(this.pawn); // } // }, // defaultCompleteMode = ToilCompleteMode.Instant //}; //yield return toil2; this.duration = (int)((verb.verbProps.warmupTime * 60) * this.pawn.GetStatValue(StatDefOf.AimingDelayFactor, false)); Toil toil = new Toil(); toil.initAction = delegate { this.verb = toil.actor.jobs.curJob.verbToUse as Verb_UseAbility; if (this.pawn.RaceProps.Humanlike) { //if (this.pawn.story.traits.HasTrait(TorannMagicDefOf.Faceless)) //{ // RemoveMimicAbility(verb); //} if (this.pawn.story.traits.HasTrait(TorannMagicDefOf.TM_Psionic)) { PsionicEnergyCost(verb); } if (verb.Ability?.CooldownTicksLeft != -1) { this.EndJobWith(JobCondition.Incompletable); } } LocalTargetInfo target = toil.actor.jobs.curJob.GetTarget(TargetIndex.A); //TargetLocA; // bool canFreeIntercept2 = false; if (target != null) { verb.TryStartCastOn(target, false, canFreeIntercept2); } using (IEnumerator <Hediff> enumerator = this.pawn.health.hediffSet.GetHediffs <Hediff>().GetEnumerator()) { while (enumerator.MoveNext()) { Hediff rec = enumerator.Current; if (rec.def == TorannMagicDefOf.TM_PossessionHD || rec.def == TorannMagicDefOf.TM_DisguiseHD || rec.def == TorannMagicDefOf.TM_DisguiseHD_I || rec.def == TorannMagicDefOf.TM_DisguiseHD_II || rec.def == TorannMagicDefOf.TM_DisguiseHD_III) { this.pawn.health.RemoveHediff(rec); } } } }; toil.tickAction = delegate { if (Find.TickManager.TicksGame % 12 == 0) { TM_MoteMaker.ThrowCastingMote(pawn.DrawPos, pawn.Map, Rand.Range(1.2f, 2f)); } this.duration--; if (!wildCheck && this.duration <= 6) { wildCheck = true; if (this.pawn.story != null && this.pawn.story.traits != null && this.pawn.story.traits.HasTrait(TorannMagicDefOf.ChaosMage) && Rand.Chance(.1f)) { bool completeJob = TM_Action.DoWildSurge(this.pawn, this.pawn.GetComp <CompAbilityUserMagic>(), (MagicAbility)verb.Ability, (TMAbilityDef)verb.Ability.Def, TargetA); if (!completeJob) { verb.Ability.PostAbilityAttempt(); EndJobWith(JobCondition.InterruptForced); } } } }; toil.AddFinishAction(delegate { if (this.duration <= 5 && !this.pawn.DestroyedOrNull() && !this.pawn.Dead && !this.pawn.Downed) { verb.Ability.PostAbilityAttempt(); } this.pawn.ClearReservationsForJob(this.job); }); toil.defaultCompleteMode = ToilCompleteMode.FinishedBusy; yield return(toil); //Toil toil1 = new Toil() //{ // initAction = () => curJob.Ability.PostAbilityAttempt(), // defaultCompleteMode = ToilCompleteMode.Instant //}; //yield return toil1; } else { //No LoS if (pawn.IsColonist) { Messages.Message("TM_OutOfLOS".Translate( pawn.LabelShort ), MessageTypeDefOf.RejectInput); } pawn.ClearAllReservations(false); } } else { pawn.ClearAllReservations(false); } } else { if (pawn.IsColonist) { //out of range Messages.Message("TM_OutOfRange".Translate(), MessageTypeDefOf.RejectInput); } } } }
protected override IEnumerable <Toil> MakeNewToils() { this.FailOnDestroyedOrNull(TargetIndex.A); this.FailOnDestroyedOrNull(TargetIndex.B); if (!pawn.inventory.Contains(TargetThingB)) { yield return(Toils_Goto.GotoThing(TargetIndex.B, PathEndMode.Touch)); yield return(Toils_Haul.StartCarryThing(TargetIndex.B)); } else { yield return(Toils_Misc.TakeItemFromInventoryToCarrier(pawn, TargetIndex.B)); } var goToAltar = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.InteractionCell); yield return(goToAltar); var waitingTime = new Toil { defaultCompleteMode = ToilCompleteMode.Delay, defaultDuration = 740 }; waitingTime.WithProgressBarToilDelay(TargetIndex.A); waitingTime.initAction = delegate { report = "WaitingForCongregation".Translate(); ReligionUtility.Listeners(Lectern, Lectern.listeners); foreach (var p in Lectern.listeners) { ReligionUtility.GiveAttendJob(Lectern, p); } }; yield return(waitingTime); var preachingTime = new Toil { initAction = delegate { report = "ReadAPrayer".Translate(); //MoteMaker.MakeInteractionBubble(this.pawn, null, ThingDefOf.Mote_Speech, ReligionUtility.faith); var intDef = ReligionDefOf.WorshipInteraction; foreach (var p in Lectern.listeners) { ReligionUtility.TryWorshipInteraction(pawn, p, intDef); } }, defaultCompleteMode = ToilCompleteMode.Delay, defaultDuration = 1800 }; preachingTime.WithProgressBarToilDelay(TargetIndex.A); preachingTime.tickAction = delegate { var actor = pawn; actor.skills.Learn(SkillDefOf.Social, 0.25f); }; yield return(preachingTime); var toStoreToil = new Toil(); toStoreToil.initAction = delegate { var actor = toStoreToil.actor; var curJob = actor.jobs.curJob; StoreUtility.TryFindBestBetterStoreCellFor(curJob.targetB.Thing, actor, actor.Map, StoragePriority.Important, Faction.OfPlayer, out var foundCell); //if(!foundCell.IsValid) // StoreUtility.TryFindBestBetterStoreCellFor(curJob.targetB.Thing, actor, actor.Map, StoragePriority.Unstored, Faction.OfPlayer, out foundCell, true); //actor.carryTracker.TryStartCarry(TargetB.Thing); curJob.targetC = foundCell.IsValid ? foundCell : Lectern.Position; foreach (var p in Lectern.listeners) { p.jobs.EndCurrentJob(JobCondition.Succeeded); } }; yield return(toStoreToil); yield return(Toils_Haul.CarryHauledThingToCell(TargetIndex.C)); yield return(Toils_Haul.PlaceHauledThingInCell(TargetIndex.C, Toils_Haul.TakeToInventory(TargetIndex.C, 1), false)); AddFinishAction(() => { ReligionUtility.HeldWorshipThought(pawn); ReligionUtility.TryAddAddictionForPreacher(pawn); }); }
protected override IEnumerable <Toil> MakeNewToils() { yield return(Toils_Misc.ThrowColonistAttackingMote(TargetIndex.A)); yield return(new Toil { initAction = delegate() { if (base.TargetThingA is Pawn pawn) { this.startedIncapacitated = pawn.Downed; } this.pawn.pather.StopDead(); }, tickAction = delegate() { if (!base.TargetA.IsValid) { base.EndJobWith(JobCondition.Succeeded); return; } if (base.TargetA.HasThing) { Pawn pawn = base.TargetA.Thing as Pawn; if (base.TargetA.Thing.Destroyed || (pawn != null && !this.startedIncapacitated && pawn.Downed)) { base.EndJobWith(JobCondition.Succeeded); return; } } if (this.numAttacksMade >= this.job.maxNumStaticAttacks && !this.pawn.stances.FullBodyBusy) { base.EndJobWith(JobCondition.Succeeded); return; } if (this.TryStartAttack(base.TargetA)) { this.numAttacksMade++; } else if (!this.pawn.stances.FullBodyBusy) { Verb verb = this.job.verbToUse; if (this.job.endIfCantShootTargetFromCurPos && (verb == null || !verb.CanHitTargetFrom(this.pawn.Position, base.TargetA))) { base.EndJobWith(JobCondition.Incompletable); return; } if (this.job.endIfCantShootInMelee) { if (verb == null) { base.EndJobWith(JobCondition.Incompletable); return; } float num = verb.verbProps.EffectiveMinRange(base.TargetA, this.pawn); if ((float)this.pawn.Position.DistanceToSquared(base.TargetA.Cell) < num * num && this.pawn.Position.AdjacentTo8WayOrInside(base.TargetA.Cell)) { base.EndJobWith(JobCondition.Incompletable); return; } } } }, defaultCompleteMode = ToilCompleteMode.Never });
public Verb_UseAbility verb = new Verb_UseAbility(); // = this.pawn.CurJob.verbToUse as Verb_UseAbility; protected override IEnumerable <Toil> MakeNewToils() { yield return(Toils_Misc.ThrowColonistAttackingMote(TargetIndex.A)); this.verb = this.pawn.CurJob.verbToUse as Verb_UseAbility; if (base.TargetA.HasThing) { if (!base.GetActor().IsFighting() ? true : !verb.UseAbilityProps.canCastInMelee) { Toil toil = Toils_Combat.GotoCastPosition(TargetIndex.A, false); yield return(toil); toil = null; } } if (this.Context == AbilityContext.Player) { Find.Targeter.targetingVerb = this.verb; } Pawn targetPawn = null; if (this.TargetThingA != null) { targetPawn = TargetThingA as Pawn; } if (targetPawn != null) { //yield return Toils_Combat.CastVerb(TargetIndex.A, false); Toil combatToil = new Toil(); combatToil.FailOnDestroyedOrNull(TargetIndex.A); combatToil.FailOnDespawnedOrNull(TargetIndex.A); //combatToil.FailOnDowned(TargetIndex.A); //CompAbilityUserMagic comp = this.pawn.GetComp<CompAbilityUserMagic>(); //JobDriver curDriver = this.pawn.jobs.curDriver; combatToil.initAction = delegate { this.verb = combatToil.actor.jobs.curJob.verbToUse as Verb_UseAbility; this.duration = (int)((this.verb.verbProps.warmupTime * 60) * this.pawn.GetStatValue(StatDefOf.AimingDelayFactor, false)); if (this.pawn.RaceProps.Humanlike) { if (this.pawn.story.traits.HasTrait(TorannMagicDefOf.Faceless)) { RemoveMimicAbility(verb); } if (this.pawn.story.traits.HasTrait(TorannMagicDefOf.TM_Psionic)) { PsionicEnergyCost(verb); } } LocalTargetInfo target = combatToil.actor.jobs.curJob.GetTarget(TargetIndex.A); verb.TryStartCastOn(target, false, false); using (IEnumerator <Hediff> enumerator = this.pawn.health.hediffSet.GetHediffs <Hediff>().GetEnumerator()) { while (enumerator.MoveNext()) { Hediff rec = enumerator.Current; if (rec.def == TorannMagicDefOf.TM_PossessionHD || rec.def == TorannMagicDefOf.TM_DisguiseHD || rec.def == TorannMagicDefOf.TM_DisguiseHD_I || rec.def == TorannMagicDefOf.TM_DisguiseHD_II || rec.def == TorannMagicDefOf.TM_DisguiseHD_III) { this.pawn.health.RemoveHediff(rec); } } } }; combatToil.tickAction = delegate { if (Find.TickManager.TicksGame % 12 == 0) { TM_MoteMaker.ThrowCastingMote(pawn.DrawPos, pawn.Map, Rand.Range(1.2f, 2f)); } this.duration--; }; combatToil.AddFinishAction(delegate { if (this.duration <= 5) { verb.Ability.PostAbilityAttempt(); } }); //if (combatToil.actor.CurJob != this.job) //{ // curDriver.ReadyForNextToil(); //} combatToil.defaultCompleteMode = ToilCompleteMode.FinishedBusy; yield return(combatToil); //Toil toil2 = new Toil() //{ // initAction = () => // { // if (curJob.UseAbilityProps.isViolent) // { // JobDriver_CastAbilityVerb.CheckForAutoAttack(this.pawn); // } // }, // defaultCompleteMode = ToilCompleteMode.Instant //}; //yield return toil2; //Toil toil1 = new Toil() //{ // initAction = () => curJob.Ability.PostAbilityAttempt(), // defaultCompleteMode = ToilCompleteMode.Instant //}; //yield return toil1; } else { if ((pawn.Position - TargetLocA).LengthHorizontal < verb.verbProps.range) { if (TargetLocA.IsValid && TargetLocA.InBounds(pawn.Map) && !TargetLocA.Fogged(pawn.Map)) //&& TargetLocA.Walkable(pawn.Map) { ShootLine shootLine; bool validTarg = verb.TryFindShootLineFromTo(pawn.Position, TargetLocA, out shootLine); if (validTarg) { //yield return Toils_Combat.CastVerb(TargetIndex.A, false); //Toil toil2 = new Toil() //{ // initAction = () => // { // if (curJob.UseAbilityProps.isViolent) // { // JobDriver_CastAbilityVerb.CheckForAutoAttack(this.pawn); // } // }, // defaultCompleteMode = ToilCompleteMode.Instant //}; //yield return toil2; this.duration = (int)((verb.verbProps.warmupTime * 60) * this.pawn.GetStatValue(StatDefOf.AimingDelayFactor, false)); Toil toil = new Toil(); toil.initAction = delegate { this.verb = toil.actor.jobs.curJob.verbToUse as Verb_UseAbility; if (this.pawn.RaceProps.Humanlike) { if (this.pawn.story.traits.HasTrait(TorannMagicDefOf.Faceless)) { RemoveMimicAbility(verb); } if (this.pawn.story.traits.HasTrait(TorannMagicDefOf.TM_Psionic)) { PsionicEnergyCost(verb); } } LocalTargetInfo target = toil.actor.jobs.curJob.GetTarget(TargetIndex.A); //TargetLocA; // bool canFreeIntercept2 = false; verb.TryStartCastOn(target, false, canFreeIntercept2); using (IEnumerator <Hediff> enumerator = this.pawn.health.hediffSet.GetHediffs <Hediff>().GetEnumerator()) { while (enumerator.MoveNext()) { Hediff rec = enumerator.Current; if (rec.def == TorannMagicDefOf.TM_PossessionHD || rec.def == TorannMagicDefOf.TM_DisguiseHD || rec.def == TorannMagicDefOf.TM_DisguiseHD_I || rec.def == TorannMagicDefOf.TM_DisguiseHD_II || rec.def == TorannMagicDefOf.TM_DisguiseHD_III) { this.pawn.health.RemoveHediff(rec); } } } }; toil.tickAction = delegate { if (Find.TickManager.TicksGame % 12 == 0) { TM_MoteMaker.ThrowCastingMote(pawn.DrawPos, pawn.Map, Rand.Range(1.2f, 2f)); } this.duration--; }; toil.AddFinishAction(delegate { if (this.duration <= 5) { verb.Ability.PostAbilityAttempt(); } }); toil.defaultCompleteMode = ToilCompleteMode.FinishedBusy; yield return(toil); //Toil toil1 = new Toil() //{ // initAction = () => curJob.Ability.PostAbilityAttempt(), // defaultCompleteMode = ToilCompleteMode.Instant //}; //yield return toil1; } else { //No LoS if (pawn.IsColonist) { Messages.Message("TM_OutOfLOS".Translate(new object[] { pawn.LabelShort }), MessageTypeDefOf.RejectInput); } pawn.ClearAllReservations(false); } } else { pawn.ClearAllReservations(false); } } else { if (pawn.IsColonist) { //out of range Messages.Message("TM_OutOfRange".Translate(), MessageTypeDefOf.RejectInput); } } } }
protected override IEnumerable <Toil> MakeNewToils() { yield return(Toils_Misc.ThrowColonistAttackingMote(TargetIndex.A)); /*Error: Unable to find new state assignment for yield return*/; }
protected override IEnumerable <Toil> MakeNewToils() { if (thing == null) { pawn.jobs.EndCurrentJob(JobCondition.InterruptForced); } bool err = false; Toil error = Toils_General.Do(delegate { Log.Error("Error in Toils_Haul.PlaceHauledThingInCell. Breaking job."); Log.Error("thing = " + thing); Log.Error("building = " + building); Log.Error("buildingCell = " + buildingCell); err = true; }); CompProperties_TextThing textThing = thing.TryGetComp <CompTextThing>().Props; if (textThing != null) { float num = 0; //int workLeft = thing.TryGetComp<CompTextThing>().workLeft; CompTextThing compTextThing = thing.TryGetComp <CompTextThing>(); if (building != null && building.GetStatValue(StatDefOf.ResearchSpeedFactor, true) > 0) { num = 1.1f * pawn.GetStatValue(StatDefOf.ResearchSpeed, true); // 1.1 * 0.58 = 0.638 num *= building.GetStatValue(StatDefOf.ResearchSpeedFactor, true); // 0.638 * 1 = 0.638 ticksPerWorkPoint = ticksPerWorkPoint / num; // 60 / 0.638 = 94 } else if (textThing.workSkill != null) { num = (pawn.skills.GetSkill(textThing.workSkill).Level - textThing.minSkillLevel) * 2; if (ticksPerWorkPoint - num > 0) { ticksPerWorkPoint = ticksPerWorkPoint - num; } else { ticksPerWorkPoint = 1; } } this.FailOnForbidden(thingInd); if (building != null) { this.FailOnDespawnedOrNull(buildingInd); this.FailOnForbidden(buildingInd); } //Log.Message("num = " + num); //Log.Message("ticksPerWorkPoint = " + ticksPerWorkPoint); //Log.Message("workLeft = " + workLeft); yield return(Toils_Goto.GotoThing(thingInd, PathEndMode.Touch).FailOnDespawnedNullOrForbidden(thingInd).FailOnSomeonePhysicallyInteracting(thingInd)); yield return(Toils_Misc.SetForbidden(thingInd, false)); yield return(Toils_Haul.StartCarryThing(thingInd, false, false, false)); if (building != null) { if (buildingCell != new IntVec3(-1000, -1000, -1000)) { yield return(Toils_Goto.GotoThing(buildingInd, PathEndMode.InteractionCell).FailOnDespawnedOrNull(buildingInd)); } else { yield return(Toils_Goto.GotoThing(buildingInd, PathEndMode.OnCell).FailOnDespawnedOrNull(buildingInd)); } } if (buildingCell != new IntVec3(-1000, -1000, -1000)) { //Log.Message("buildingCell = " + buildingCell); yield return(Toils_Haul.PlaceHauledThingInCell(buildingCellInd, Toils_Jump.Jump(error), false)); } //IntVec3 thingPosition = thing.PositionHeld; //IntVec3 buildingPosition = building.PositionHeld; float workLeftInTicks = compTextThing.workLeft * (ticksPerWorkPoint * 1.1f); Toil translate = Toils_General.Wait((int)workLeftInTicks).FailOnDespawnedNullOrForbidden(thingInd).FailOnDespawnedNullOrForbidden(buildingInd);; translate.tickAction = delegate { if (textThing.workSkill != null) { pawn.skills.Learn(textThing.workSkill, 0.11f, false); } pawn.GainComfortFromCellIfPossible(); if (pawn.IsHashIntervalTick((int)ticksPerWorkPoint)) { //Log.Message("workLeft = " + compTextThing.workLeft); compTextThing.workLeft--; if (textThing.showTranslator) { if (compTextThing.translator == "") { compTextThing.translator += pawn.Name; } else { if (!compTextThing.translator.Contains(pawn.ToString())) { compTextThing.translator += pawn.Name.ToString(); compTextThing.translator += ", " + pawn.Name; } } } } if (compTextThing.workLeft <= 0) { compTextThing.workLeft = 0; thing.def.BaseMarketValue = textThing.translatedMarketValue; if (textThing.taleWhenTranslated != null) { TaleRecorder.RecordTale(textThing.taleWhenTranslated, new object[] { pawn, thing.def }); } if (textThing.thoughtWhenTranslated != null) { Thought_Memory newThought = (Thought_Memory)ThoughtMaker.MakeThought(textThing.thoughtWhenTranslated); pawn.needs.mood.thoughts.memories.TryGainMemory(newThought, null); } pawn.jobs.EndCurrentJob(JobCondition.Succeeded); } }; //Log.Message("Translate"); yield return(translate); } if (err) { yield return(error); } yield break; }
static IEnumerable <Toil> prepToils(JobDriver_Ingest driver, Toil chewToil) { if ((bool)LeatingFromInventory.GetValue(driver)) { yield return(Toils_Misc.TakeItemFromInventoryToCarrier(driver.pawn, TargetIndex.A)); } else { yield return((Toil)LReserveFood.Invoke(driver, new object[] { })); Toil gotoToPickup = Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch).FailOnDespawnedNullOrForbidden(TargetIndex.A); yield return(Toils_Jump.JumpIf(gotoToPickup, () => driver.pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))); yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch).FailOnDespawnedNullOrForbidden(TargetIndex.A)); yield return(Toils_Jump.Jump(chewToil)); yield return(gotoToPickup); yield return(Toils_Ingest.PickupIngestible(TargetIndex.A, driver.pawn)); gotoToPickup = null; } if (driver.job.takeExtraIngestibles > 0) { foreach (Toil toil in (IEnumerable <Toil>)LTakeExtraIngestibles.Invoke(driver, new object[] { })) { yield return(toil); } } if (!driver.pawn.Drafted) { yield return(reserveChewSpot(TargetIndex.A, TargetIndex.B)); Toil gotospot = gotoSpot(TargetIndex.B).FailOnDestroyedOrNull(TargetIndex.A); if (!Utility.IncapableOfCleaning(driver.pawn)) { TargetIndex filthListIndex = TargetIndex.B; TargetIndex progListIndex = TargetIndex.A; Toil FilthList = makeFilthListToil(filthListIndex); yield return(FilthList); yield return(Toils_Jump.JumpIf(gotospot, () => driver.job.GetTargetQueue(filthListIndex).NullOrEmpty())); Toil nextTarget = Toils_JobTransforms.ExtractNextTargetFromQueue(filthListIndex, true); yield return(nextTarget); yield return(Toils_Jump.JumpIf(gotospot, () => driver.job.GetTargetQueue(filthListIndex).NullOrEmpty())); yield return(Toils_Goto.GotoThing(filthListIndex, PathEndMode.Touch).JumpIfDespawnedOrNullOrForbidden(filthListIndex, nextTarget).JumpIfOutsideHomeArea(filthListIndex, nextTarget)); // if (driver.job.GetTargetQueue(progListIndex).Count == 0) { driver.job.GetTargetQueue(progListIndex).Add(new IntVec3(0, 0, 0)); } // Toil clean = makeCleanToil(progListIndex, filthListIndex, nextTarget); yield return(clean); yield return(Toils_Jump.Jump(nextTarget)); } yield return(gotospot); } yield return(Toils_Ingest.FindAdjacentEatSurface(TargetIndex.B, TargetIndex.A)); yield break; }
// Token: 0x06003B77 RID: 15223 RVA: 0x001BFC0C File Offset: 0x001BE00C protected override IEnumerable <Toil> MakeNewToils() { yield return(Toils_General.DoAtomic(delegate { Pawn pawn = this.job.targetA.Thing as Pawn; if (pawn != null && pawn.Downed && this.pawn.mindState.duty != null && this.pawn.mindState.duty.attackDownedIfStarving && this.pawn.Starving()) { this.job.killIncappedTarget = true; } })); yield return(Toils_Misc.ThrowColonistAttackingMote(TargetIndex.A)); // yield return(new Toil() { initAction = () => { Pawn actor = this.GetActor(); Vector3 drawPos = actor.DrawPos; var shootLine = new ShootLine(actor.PositionHeld, pawn.PositionHeld); Projectile projectile2 = (Projectile)GenSpawn.Spawn(ThingDef.Named("LotRD_Dragonfireblast"), shootLine.Source, actor.Map, WipeMode.Vanish); if (Rand.Value > 0.9f) { //Log.Message("Miss"); int num = Rand.Range(2, 3); int max = GenRadial.NumCellsInRadius(num); int num2 = Rand.Range(0, max); if (num2 > 0) { IntVec3 c = pawn.PositionHeld + GenRadial.RadialPattern[num2]; ProjectileHitFlags projectileHitFlags = ProjectileHitFlags.NonTargetWorld; if (Rand.Chance(0.5f)) { projectileHitFlags = ProjectileHitFlags.All; } projectile2.Launch(actor, drawPos, c, pawn, projectileHitFlags, null, null); return; } } var covers = CoverUtility.CalculateCoverGiverSet(job.targetA, actor.Position, actor.Map); covers.TryRandomElementByWeight((CoverInfo c) => c.BlockChance, out CoverInfo coverInfo); ThingDef targetCoverDef = (coverInfo.Thing == null) ? null : coverInfo.Thing.def; if (pawn != null) { projectile2.Launch(actor, drawPos + new Vector3(0, 0, 3), pawn, pawn, ProjectileHitFlags.All, null, targetCoverDef); } else { projectile2.Launch(actor, drawPos + new Vector3(0, 0, 3), shootLine.Dest, pawn, ProjectileHitFlags.All, null, targetCoverDef); } // Sends a wave outwards of flames Vector2 behindVector = pawn.Rotation.AsVector2; var behind = new IntVec3((int)behindVector.x, 0, (int)behindVector.y); int rand = Rand.Range(6, 12); //Log.Message("Pawn position: " + pawn.PositionHeld.x.ToString() + " " + pawn.PositionHeld.z.ToString()); for (int i = 0; i < rand; i++) { IntVec3 adjustment = new IntVec3((int)pawn.PositionHeld.x + (int)behind.x + i, pawn.PositionHeld.y, (int)pawn.PositionHeld.z + (int)behind.z + i); //Log.Message("Fire position: " + adjustment.x.ToString() + " " + adjustment.z.ToString()); if (!adjustment.IsValid) { continue; } Projectile projectileNew = (Projectile)GenSpawn.Spawn(ThingDef.Named("LotRD_Dragonfireblast"), shootLine.Source, actor.Map, WipeMode.Vanish); var headoffset = (actor.Rotation == Rot4.West) ? -3.75f : 3.75f; projectileNew.Launch(actor, drawPos + new Vector3(0, 0, 1.5f) + new Vector3(actor.Rotation.AsVector2.x + headoffset, 0, actor.Rotation.AsVector2.y), adjustment, pawn, ProjectileHitFlags.All, null, targetCoverDef); } } });