protected override IEnumerable <Toil> MakeNewToils() { //this.FailOnDespawnedNullOrForbidden(TargetIndex.A); this.FailOn(delegate { return(pawn == Victim); }); this.FailOn(delegate { return(BloodMaster.CurBloodPoints == 0); }); this.FailOnAggroMentalState(TargetIndex.A); yield return(Toils_Reserve.Reserve(TargetIndex.A)); var newDomitor = GetActor(); var toil = newDomitor?.Faction == TargetA.Thing?.Faction ? Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch) : Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch); Toil gotoToil = toil; yield return(gotoToil); Toil grappleToil = new Toil() { initAction = delegate { MoteMaker.MakeColonistActionOverlay(newDomitor, ThingDefOf.Mote_ColonistAttacking); workLeft = BaseFeedTime; Pawn victim = TargetA.Thing as Pawn; if (victim != null) { if (newDomitor.InAggroMentalState || victim.InAggroMentalState || victim.Faction != newDomitor.Faction) { int grappleBonus = newDomitor is PawnTemporary ? 100 : 0; if (!JecsTools.GrappleUtility.TryGrapple(newDomitor, victim, grappleBonus)) { this.EndJobWith(JobCondition.Incompletable); PawnUtility.ForceWait(newDomitor, (int)(BaseFeedTime * 0.15f)); return; } } if (newDomitor.IsVampire()) { //VampireBiteUtility.MakeNew(GetActor(), GetActor()); //Actor opens their own wound. victim.stances.stunner.StunFor((int)BaseFeedTime, newDomitor); } } } }; yield return(grappleToil); Toil feedToil = new Toil() { tickAction = delegate { //try //{ if (TargetA.Thing is Pawn victim && victim.Spawned && !victim.Dead) { workLeft--; VampireWitnessUtility.HandleWitnessesOf(this.job.def, newDomitor, victim); // if (victim?.needs?.mood?.thoughts?.memories != null) // { // var victimThoughtDef = VampDefOf.ROMV_IDrankVitae; // Thought_Memory victimThought = null; // if (victimThoughtDef != null) victimThought = (Thought_Memory)ThoughtMaker.MakeThought(victimThoughtDef); // if (victimThought != null) // { // victim.needs.mood.thoughts.memories.TryGainMemory(victimThought); // } // } if (workLeft <= 0f) { if (newDomitor?.VampComp() is CompVampire v && v.IsVampire && newDomitor.Faction == Faction.OfPlayer) { MoteMaker.ThrowText(newDomitor.DrawPos, newDomitor.Map, "XP +" + 15); v.XP += 15; } workLeft = BaseFeedTime; MoteMaker.MakeColonistActionOverlay(newDomitor, ThingDefOf.Mote_ColonistAttacking); if (!victim.IsGhoul()) { CompThrall.InitializeGhoul(newDomitor); } else { CompThrall.ThrallData.TryAdjustBondStage(newDomitor, 1); } BloodMaster.TransferBloodTo(1, BloodThrall, true, true); GhoulUtility.GiveVitaeEffects(victim, newDomitor); //VampireBiteUtility.CleanBite(GetActor(), GetActor()); this.ReadyForNextToil(); } }
public static IEnumerable <Toil> MakeFeedToils(JobDef job, JobDriver thisDriver, Pawn actor, LocalTargetInfo TargetA, ThoughtDef victimThoughtDef, ThoughtDef actorThoughtDef, float workLeft, Action effect, Func <Pawn, Pawn, bool> stopCondition, bool needsGrapple = true, bool cleansWound = true, bool neverGiveUp = false) { yield return(Toils_Reserve.Reserve(TargetIndex.A)); Toil gotoToil = actor?.Faction == TargetA.Thing?.Faction && (!actor.InAggroMentalState && !((Pawn)TargetA.Thing).InAggroMentalState) ? Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch) : Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.Touch); yield return(gotoToil); Toil grappleToil = new Toil() { initAction = delegate { MoteMaker.MakeColonistActionOverlay(actor, ThingDefOf.Mote_ColonistAttacking); workLeft = BaseFeedTime; Pawn victim = TargetA.Thing as Pawn; if (victim != null) { // if (!AllowFeeding(actor, victim)) // { // actor.jobs.EndCurrentJob(JobCondition.Incompletable); // } if (actor.InAggroMentalState || victim.InAggroMentalState || victim.Faction != actor.Faction) { if (needsGrapple) { int grappleBonus = actor is PawnTemporary ? 100 : 0; if (!JecsTools.GrappleUtility.TryGrapple(actor, victim, grappleBonus)) { thisDriver.EndJobWith(JobCondition.Incompletable); PawnUtility.ForceWait(actor, (int)(BaseFeedTime * 0.15f)); return; } } } if (actor.IsVampire()) { VampireBiteUtility.MakeNew(actor, victim); } victim.stances.stunner.StunFor((int)BaseFeedTime, actor); } } }; yield return(grappleToil); Toil feedToil = new Toil() { tickAction = delegate { //try //{ if (TargetA.Thing is Pawn victim && victim.Spawned && !victim.Dead) { workLeft--; VampireWitnessUtility.HandleWitnessesOf(job, actor, victim); if (victim?.needs?.mood?.thoughts?.memories != null) { Thought_Memory victimThought = null; if (victimThoughtDef != null) { victimThought = (Thought_Memory)ThoughtMaker.MakeThought(victimThoughtDef); } if (victimThought != null) { victim.needs.mood.thoughts.memories.TryGainMemory(victimThought); } } if (actor?.needs?.mood?.thoughts?.memories != null) { Thought_Memory actorThought = null; if (actorThoughtDef != null) { actorThought = (Thought_Memory)ThoughtMaker.MakeThought(actorThoughtDef); } if (actorThought != null) { actor.needs.mood.thoughts.memories.TryGainMemory(actorThought); } } if (workLeft <= 0f) { if (actor?.VampComp() is CompVampire v && v.IsVampire && actor.Faction == Faction.OfPlayer) { MoteMaker.ThrowText(actor.DrawPos, actor.Map, "XP +" + 15); v.XP += 15; workLeft = BaseFeedTime; MoteMaker.MakeColonistActionOverlay(actor, ThingDefOf.Mote_ColonistAttacking); } effect(); if (victim != null && !victim.Dead && needsGrapple) { int victimBonus = (victim.VampComp() is CompVampire victimVampComp) ? -victimVampComp.Generation + 14 : 0; int actorBonus = 0; if (actor?.VampComp() is CompVampire v2 && v2.IsVampire) { actorBonus = -v2.Generation + 14; } if (!JecsTools.GrappleUtility.TryGrapple(actor, victim, actorBonus, victimBonus)) { thisDriver.EndJobWith(JobCondition.Incompletable); } } if (!stopCondition(actor, victim)) { thisDriver.ReadyForNextToil(); if (actor.IsVampire() && cleansWound) { VampireBiteUtility.CleanBite(actor, victim); } } else { if (victim != null && !victim.Dead) { victim.stances.stunner.StunFor((int)BaseFeedTime, actor); PawnUtility.ForceWait((Pawn)TargetA.Thing, (int)BaseFeedTime, actor); } } } }