protected override IEnumerable <Toil> MakeNewToils() { yield return(Toils_General.DoAtomic(delegate { Pawn pawn = job.targetA.Thing as Pawn; //if (pawn != null && pawn.Downed && base.pawn.mindState.duty != null && base.pawn.mindState.duty.attackDownedIfStarving && base.pawn.Starving()) //{ job.killIncappedTarget = true; //} })); 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); //} InteractionUtility.TryGetRandomVerbForSocialFight(base.pawn, out Verb verb); if (BeatDecider.shouldStopBeating(base.pawn, base.TargetA.Thing as Pawn)) { EndJobWith(JobCondition.Succeeded); } else { pawn.meleeVerbs.TryMeleeAttack(thing, verb); } }).FailOnDespawnedOrNull(TargetIndex.A));
public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false) { if (t.Map.designationManager.DesignationOn(t, BeatingsDefsOf.designationDef) == null) { return(false); } if (!pawn.CanReserve(t, 1, -1, null, forced)) { return(false); } if (BeatDecider.shouldStopBeating(pawn, t as Pawn)) { return(false); } return(true); }
public static Action GetAttackAction(Pawn pawn, LocalTargetInfo target, out string failStr) { failStr = ""; if (!pawn.IsColonistPlayerControlled) { failStr = "CannotOrderNonControlledLower".Translate(); } else if (target.IsValid && !pawn.CanReach(target, PathEndMode.Touch, Danger.Deadly)) { failStr = "NoPath".Translate(); } else if (pawn.WorkTagIsDisabled(WorkTags.Violent)) { failStr = "IsIncapableOfViolenceLower".Translate(pawn.LabelShort, pawn); } else if (pawn.meleeVerbs.TryGetMeleeVerb(target.Thing) == null) { failStr = "Incapable".Translate(); } else if (pawn == target.Thing) { failStr = "CannotAttackSelf".Translate(); } else { Pawn target2; if ((target2 = (target.Thing as Pawn)) == null || (!pawn.InSameExtraFaction(target2, ExtraFactionType.HomeFaction) && !pawn.InSameExtraFaction(target2, ExtraFactionType.MiniFaction))) { return(delegate { if (!BeatDecider.shouldStopBeating(pawn, target2) && InteractionUtility.TryGetRandomVerbForSocialFight(pawn, out Verb verb)) { Job job = JobMaker.MakeJob(jobDef, target.Thing as Pawn); //job.maxNumMeleeAttacks = 1; job.killIncappedTarget = true; Pawn pawn2 = target.Thing as Pawn; //job.verbToUse = verb; pawn.jobs.TryTakeOrderedJob(job); } //Job job = JobMaker.MakeJob(JobDefOf.AttackMelee, target); //pawn.jobs.TryTakeOrderedJob(job); });