Пример #1
0
        public static void DoBehaviorForPawn(JobDriver_Wait driver)
        {
            var hunter = driver.pawn;

            if (!AllowToolController.Instance.PartyHuntSetting || !AllowToolUtility.PartyHuntIsEnabled(hunter))
            {
                return;
            }
            var verb = hunter.TryGetAttackVerb(null, !hunter.IsColonist);

            if (hunter.Faction != null && driver.job.def == JobDefOf.Wait_Combat && AllowToolUtility.PawnCapableOfViolence(hunter) && !hunter.stances.FullBodyBusy)
            {
                // fire at target
                if (hunter.drafter.FireAtWill)
                {
                    // fudge melee range for easier target acquisition
                    var weaponRange = verb.verbProps.IsMeleeAttack ? 2 : verb.verbProps.range;
                    var target      = TryFindHuntingTarget(hunter, verb.verbProps.minRange, weaponRange, HuntingTargetAttackFilter);
                    if (target != null)
                    {
                        hunter.TryStartAttack(target);
                        ResetAutoUndraftTimer(hunter.drafter);
                    }
                }
                // finish off targets. Wait for everyone to finish firing to avoid catching stray bullets
                if (!hunter.stances.FullBodyBusy && AllowToolController.Instance.PartyHuntFinishSetting && !AnyHuntingPartyMembersInCombat(hunter, MaxPartyMemberDistance))
                {
                    // try mark a downed animal
                    var target = TryFindHuntingTarget(hunter, 0, MaxFinishOffDistance, HuntingTargetFinishFilter);
                    if (target != null)
                    {
                        target.ToggleDesignation(AllowToolDefOf.FinishOffDesignation, true);
                    }
                    // query work giver for finish off job in range
                    var job = WorkGiver_FinishOff.CreateInstance().TryGetJobInRange(hunter, MaxFinishOffDistance);
                    if (job != null)
                    {
                        hunter.jobs.StartJob(job, JobCondition.Ongoing, null, true);
                        // return to starting position
                        hunter.jobs.jobQueue.EnqueueFirst(new Job(JobDefOf.Goto, hunter.Position));
                    }
                }
            }
        }
Пример #2
0
 private static bool AnyHuntingPartyMembersInCombat(Pawn centerPawn, float maxPartyMemberDistance)
 {
     return(centerPawn.Map.mapPawns.FreeColonists.Where(p => AllowToolUtility.PartyHuntIsEnabled(p) && centerPawn.Position.DistanceTo(p.Position) <= maxPartyMemberDistance
                                                        ).Any(p => p.stances.FullBodyBusy));
 }