private Job TryGetAttackNearbyEnemyJob(Pawn pawn) { if (pawn.WorkTagIsDisabled(WorkTags.Violent)) { return(null); } bool isMeleeAttack = pawn.CurrentEffectiveVerb.IsMeleeAttack; float maxDist = 8f; if (!isMeleeAttack) { maxDist = Mathf.Clamp(pawn.CurrentEffectiveVerb.verbProps.range * 0.66f, 2f, 20f); } Thing thing = (Thing)AttackTargetFinder.BestAttackTarget(pawn, TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedLOSToNonPawns | TargetScanFlags.NeedReachableIfCantHitFromMyPos | TargetScanFlags.NeedThreat | TargetScanFlags.NeedAutoTargetable, null, 0f, maxDist); if (thing == null) { return(null); } if (isMeleeAttack || pawn.CanReachImmediate(thing, PathEndMode.Touch)) { return(JobMaker.MakeJob(JobDefOf.AttackMelee, thing)); } Verb verb = pawn.TryGetAttackVerb(thing, !pawn.IsColonist); if (verb == null || verb.ApparelPreventsShooting(pawn.Position, thing)) { return(null); } Job job = JobMaker.MakeJob(JobDefOf.AttackStatic, thing); job.maxNumStaticAttacks = 2; job.expiryInterval = 2000; job.endIfCantShootTargetFromCurPos = true; return(job); }