Exemplo n.º 1
0
        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);
        }