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);
 }
示例#3
0
 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);
             });