protected override Job TryGiveJob(Pawn pawn)
        {
            var bestDistSq          = maxDistance * maxDistance;
            var bestThing           = (Thing)null;
            var potentialTargetsFor = pawn.Map.attackTargetsCache.GetPotentialTargetsFor(pawn);

            foreach (var target in potentialTargetsFor)
            {
                if (!target.ThreatDisabled(pawn) && AttackTargetFinder.IsAutoTargetable(target))
                {
                    var thing  = (Thing)target;
                    var distSq = thing.Position.DistanceToSquared(pawn.Position);
                    if (distSq < bestDistSq && pawn.CanReach((LocalTargetInfo)thing, PathEndMode.OnCell, Danger.Deadly, true, true))
                    {
                        bestDistSq = distSq;
                        bestThing  = thing;
                    }
                }
            }
            if (bestThing == null)
            {
                return(null);
            }
            var job = JobMaker.MakeJob(JobDefOf.Goto, (LocalTargetInfo)bestThing);

            job.checkOverrideOnExpire = true;
            job.expiryInterval        = 500;
            job.collideWithPawns      = true;
            return(job);
        }
Esempio n. 2
0
        protected LocalTargetInfo TryFindNewTarget()    // Core method
        {
            IAttackTargetSearcher attackTargetSearcher = this.TargSearcher();
            Faction  faction = attackTargetSearcher.Thing.Faction;
            float    range   = this.AttackVerb.verbProps.range;
            Building t;

            if (Rand.Value < 0.5f && this.AttackVerb.ProjectileFliesOverhead() && faction.HostileTo(Faction.OfPlayer) && base.Map.listerBuildings.allBuildingsColonist.Where(delegate(Building x)
            {
                float num = this.AttackVerb.verbProps.EffectiveMinRange(x, this);
                float num2 = (float)x.Position.DistanceToSquared(this.Position);
                return(num2 > num * num && num2 < range * range);
            }).TryRandomElement(out t))
            {
                return(t);
            }
            TargetScanFlags targetScanFlags = TargetScanFlags.NeedThreat;

            if (!this.AttackVerb.ProjectileFliesOverhead())
            {
                targetScanFlags |= TargetScanFlags.NeedLOSToAll;
                targetScanFlags |= TargetScanFlags.LOSBlockableByGas;
            }
            if (this.AttackVerb.IsIncendiary())
            {
                targetScanFlags |= TargetScanFlags.NeedNonBurning;
            }
            return((Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(attackTargetSearcher, targetScanFlags, new Predicate <Thing>(this.IsValidTarget), 0f, 9999f));
        }
Esempio n. 3
0
        protected LocalTargetInfo TryFindNewTarget()
        {
            IAttackTargetSearcher attackTargetSearcher = TargSearcher();
            Faction faction = attackTargetSearcher.Thing.Faction;
            float   range   = AttackVerb.verbProps.range;

            if (Rand.Value < 0.5f && AttackVerb.ProjectileFliesOverhead() && faction.HostileTo(Faction.OfPlayer) && base.Map.listerBuildings.allBuildingsColonist.Where(delegate(Building x)
            {
                float num = AttackVerb.verbProps.EffectiveMinRange(x, this);
                float num2 = x.Position.DistanceToSquared(base.Position);
                return(num2 > num * num && num2 < range * range);
            }).TryRandomElement(out var result))
            {
                return(result);
            }
            TargetScanFlags targetScanFlags = TargetScanFlags.NeedThreat | TargetScanFlags.NeedAutoTargetable;

            if (!AttackVerb.ProjectileFliesOverhead())
            {
                targetScanFlags |= TargetScanFlags.NeedLOSToAll;
                targetScanFlags |= TargetScanFlags.LOSBlockableByGas;
            }
            if (AttackVerb.IsIncendiary())
            {
                targetScanFlags |= TargetScanFlags.NeedNonBurning;
            }
            if (IsMortar)
            {
                targetScanFlags |= TargetScanFlags.NeedNotUnderThickRoof;
            }
            return((Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(attackTargetSearcher, targetScanFlags, IsValidTarget));
        }
Esempio n. 4
0
        // ReSharper disable once InconsistentNaming
        public static void Postfix_JobDriver_Wait_CheckForAutoAttack(JobDriver_Wait __instance)
        {
            if (__instance.pawn.Downed ||
                __instance.pawn.stances.FullBodyBusy ||
                !__instance.pawn.RaceProps.Animal ||
                !__instance.job.canUseRangedWeapon ||
                __instance.job.def != JobDefOf.Wait_Combat)
            {
                return;
            }
            var currentEffectiveVerb = __instance.pawn.CurrentEffectiveVerb;

            if (currentEffectiveVerb == null || currentEffectiveVerb.verbProps.IsMeleeAttack)
            {
                return;
            }
            var flags = TargetScanFlags.NeedLOSToAll | TargetScanFlags.NeedThreat | TargetScanFlags.NeedAutoTargetable;

            if (currentEffectiveVerb.IsIncendiary())
            {
                flags |= TargetScanFlags.NeedNonBurning;
            }
            var thing = (Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(__instance.pawn, flags);

            if (thing == null)
            {
                return;
            }
            __instance.pawn.TryStartAttack((LocalTargetInfo)thing);
            __instance.collideWithPawns = true;
        }
        protected LocalTargetInfo TryFindNewTarget()
        {
            IAttackTargetSearcher attackTargetSearcher = this.TargSearcher();
            Faction  faction  = attackTargetSearcher.Thing.Faction;
            float    range    = this.GunCompEq.PrimaryVerb.verbProps.range;
            float    minRange = this.GunCompEq.PrimaryVerb.verbProps.minRange;
            Building t;

            if (Rand.Value < 0.5f && Projectile.projectile.flyOverhead && faction.HostileTo(Faction.OfPlayer) && base.Map.listerBuildings.allBuildingsColonist.Where(delegate(Building x)
            {
                float num = (float)x.Position.DistanceToSquared(this.Position);
                return(num > minRange * minRange && num < range * range);
            }).TryRandomElement(out t))
            {
                return(t);
            }
            TargetScanFlags targetScanFlags = TargetScanFlags.NeedThreat;

            if (!Projectile.projectile.flyOverhead)
            {
                targetScanFlags |= TargetScanFlags.NeedLOSToAll;
                targetScanFlags |= TargetScanFlags.LOSBlockableByGas;
            }
            return((Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(attackTargetSearcher, targetScanFlags, new Predicate <Thing>(this.IsValidTarget), minRange, range)); // WTF B19???
        }
Esempio n. 6
0
        protected TargetInfo TryFindNewTarget()
        {
            IAttackTargetSearcher attackTargetSearcher = this.TargSearcher();
            Faction  faction  = attackTargetSearcher.Thing.Faction;
            float    range    = this.GunCompEq.PrimaryVerb.verbProps.range;
            float    minRange = this.GunCompEq.PrimaryVerb.verbProps.minRange;
            Building t;

            if (Rand.Value < 0.5f && this.GunCompEq.PrimaryVerb.verbProps.projectileDef.projectile.flyOverhead && faction.HostileTo(Faction.OfPlayer) && Find.VisibleMap.listerBuildings.allBuildingsColonist.Where(delegate(Building x)
            {
                float num = x.Position.DistanceToSquared(this.Position);
                return(num > minRange * minRange && num < range * range);
            }).TryRandomElement(out t))
            {
                return(t);
            }
            TargetScanFlags targetScanFlags = TargetScanFlags.NeedThreat;

            if (!this.GunCompEq.PrimaryVerb.verbProps.projectileDef.projectile.flyOverhead)
            {
                targetScanFlags |= TargetScanFlags.NeedLOSToAll;
            }
            if (this.GunCompEq.PrimaryVerb.verbProps.ai_IsIncendiary)
            {
                targetScanFlags |= TargetScanFlags.NeedNonBurning;
            }
            return((Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(attackTargetSearcher, new Predicate <Thing>(this.IsValidTarget),
                                                                                range, minRange, targetScanFlags));
        }
        private Job TryGetAttackNearbyEnemyJob(Pawn pawn)
        {
            if (pawn.story != null && pawn.story.WorkTagIsDisabled(WorkTags.Violent))
            {
                return(null);
            }
            bool  flag = pawn.equipment.Primary == null || pawn.equipment.Primary.def.IsMeleeWeapon;
            float num  = 8f;

            if (!flag)
            {
                num = Mathf.Clamp((float)(pawn.equipment.PrimaryEq.PrimaryVerb.verbProps.range * 0.6600000262260437), 2f, 20f);
            }
            TargetScanFlags flags   = TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedLOSToNonPawns | TargetScanFlags.NeedReachableIfCantHitFromMyPos | TargetScanFlags.NeedThreat;
            float           maxDist = num;
            Thing           thing   = (Thing)AttackTargetFinder.BestAttackTarget(pawn, flags, null, 0f, maxDist, default(IntVec3), 3.40282347E+38f, false);

            if (thing == null)
            {
                return(null);
            }
            if (!flag && !pawn.CanReachImmediate(thing, PathEndMode.Touch))
            {
                Job job = new Job(JobDefOf.AttackStatic, thing);
                job.maxNumStaticAttacks            = 2;
                job.expiryInterval                 = 2000;
                job.endIfCantShootTargetFromCurPos = true;
                return(job);
            }
            return(new Job(JobDefOf.AttackMelee, thing));
        }
 private static void JobDriver_Wait_CheckForAutoAttackPostfix(JobDriver_Wait __instance)
 {
     if (__instance.pawn.Faction != null || __instance.pawn.Downed || __instance.pawn.stances.FullBodyBusy)
     {
         return;
     }
     if ((__instance.pawn.story == null || !__instance.pawn.story.WorkTagIsDisabled(WorkTags.Violent)) && __instance.job.def == JobDefOf.Wait_Combat && (__instance.pawn.drafter == null || __instance.pawn.drafter.FireAtWill))
     {
         Verb currentEffectiveVerb = __instance.pawn.CurrentEffectiveVerb;
         if (currentEffectiveVerb != null && !currentEffectiveVerb.verbProps.IsMeleeAttack)
         {
             TargetScanFlags targetScanFlags = TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedLOSToNonPawns | TargetScanFlags.NeedThreat;
             if (currentEffectiveVerb.IsIncendiary())
             {
                 targetScanFlags |= TargetScanFlags.NeedNonBurning;
             }
             Thing thing = (Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(__instance.pawn, targetScanFlags, null, 0f, 9999f);
             if (thing != null)
             {
                 __instance.pawn.TryStartAttack(thing);
                 __instance.collideWithPawns = true;
                 return;
             }
         }
     }
     return;
 }
Esempio n. 9
0
        protected LocalTargetInfo TryFindNewTarget()
        {
            IAttackTargetSearcher attackTargetSearcher = this.TargSearcher();
            Faction  faction  = attackTargetSearcher.Thing.Faction;
            float    range    = this.GunCompEq.PrimaryVerb.verbProps.range;
            float    minRange = this.GunCompEq.PrimaryVerb.verbProps.minRange;
            Building t        = default(Building);

            if (Rand.Value < 0.5 && this.GunCompEq.PrimaryVerb.ProjectileFliesOverhead() && faction.HostileTo(Faction.OfPlayer) && base.Map.listerBuildings.allBuildingsColonist.Where(delegate(Building x)
            {
                float num = (float)x.Position.DistanceToSquared(base.Position);
                return(num > minRange * minRange && num < range * range);
            }).TryRandomElement <Building>(out t))
            {
                return(t);
            }
            TargetScanFlags targetScanFlags = TargetScanFlags.NeedThreat;

            if (!this.GunCompEq.PrimaryVerb.ProjectileFliesOverhead())
            {
                targetScanFlags |= TargetScanFlags.NeedLOSToAll;
                targetScanFlags |= TargetScanFlags.LOSBlockableByGas;
            }
            if (this.GunCompEq.PrimaryVerb.IsIncendiary())
            {
                targetScanFlags |= TargetScanFlags.NeedNonBurning;
            }
            return((Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(attackTargetSearcher, this.IsValidTarget, range, minRange, targetScanFlags));
        }
Esempio n. 10
0
        protected LocalTargetInfo TryFindNewTarget()
        {
            Thing   searcher;
            Faction faction;

            if (this.mannableComp != null && this.mannableComp.MannedNow)
            {
                searcher = this.mannableComp.ManningPawn;
                faction  = this.mannableComp.ManningPawn.Faction;
            }
            else
            {
                searcher = this;
                faction  = base.Faction;
            }
            if (this.GunCompEq.PrimaryVerb.verbProps.projectileDef.projectile.flyOverhead && faction.HostileTo(Faction.OfPlayer) && Rand.Value < 0.5f && base.Map.listerBuildings.allBuildingsColonist.Count > 0)
            {
                return(base.Map.listerBuildings.allBuildingsColonist.RandomElement <Building>());
            }
            TargetScanFlags targetScanFlags = TargetScanFlags.NeedThreat;

            if (!this.GunCompEq.PrimaryVerb.verbProps.projectileDef.projectile.flyOverhead)
            {
                targetScanFlags |= TargetScanFlags.NeedLOSToAll;
            }
            if (this.GunCompEq.PrimaryVerb.verbProps.ai_IsIncendiary)
            {
                targetScanFlags |= TargetScanFlags.NeedNonBurning;
            }
            return(AttackTargetFinder.BestShootTargetFromCurrentPosition(searcher, new Predicate <Thing>(this.IsValidTarget), this.GunCompEq.PrimaryVerb.verbProps.range, this.GunCompEq.PrimaryVerb.verbProps.minRange, targetScanFlags));
        }
Esempio n. 11
0
        private Job TryGetAttackNearbyEnemyJob(Pawn pawn)
        {
            if (pawn.story != null && pawn.story.WorkTagIsDisabled(WorkTags.Violent))
            {
                return(null);
            }
            bool  isMeleeAttack = pawn.CurrentEffectiveVerb.IsMeleeAttack;
            float num           = 8f;

            if (!isMeleeAttack)
            {
                num = Mathf.Clamp(pawn.CurrentEffectiveVerb.verbProps.range * 0.66f, 2f, 20f);
            }
            TargetScanFlags flags   = TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedLOSToNonPawns | TargetScanFlags.NeedReachableIfCantHitFromMyPos | TargetScanFlags.NeedThreat;
            float           maxDist = num;
            Thing           thing   = (Thing)AttackTargetFinder.BestAttackTarget(pawn, flags, null, 0f, maxDist, default(IntVec3), 3.40282347E+38f, false, true);

            if (thing == null)
            {
                return(null);
            }
            if (isMeleeAttack || pawn.CanReachImmediate(thing, PathEndMode.Touch))
            {
                return(new Job(JobDefOf.AttackMelee, thing));
            }
            return(new Job(JobDefOf.AttackStatic, thing)
            {
                maxNumStaticAttacks = 2,
                expiryInterval = 2000,
                endIfCantShootTargetFromCurPos = true
            });
        }
Esempio n. 12
0
        private Job TryGetAttackNearbyEnemyJob(Pawn pawn)
        {
            if (pawn.story != null && pawn.WorkTagIsDisabled(WorkTags.Violent))
            {
                return(null);
            }
            bool  flag = pawn.equipment.Primary == null || pawn.equipment.Primary.def.IsMeleeWeapon;
            float num  = 8f;

            if (!flag)
            {
                num = Mathf.Clamp(pawn.equipment.PrimaryEq.PrimaryVerb.verbProps.range * 0.66f, 2f, 20f);
            }
            float maxDist = num;
            Thing thing   = (Thing)AttackTargetFinder.BestAttackTarget(pawn, TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedLOSToNonPawns | TargetScanFlags.NeedReachableIfCantHitFromMyPos | TargetScanFlags.NeedThreat, null, 0f, maxDist, default(IntVec3), 3.40282347E+38f, false);
            // TODO evaluate if this is necessary?
            Pawn o = thing as Pawn;

            if (o != null)
            {
                if
                (o.Downed || o.health.InPainShock)
                {
                    return(null);
                }
            }

            if (thing == null)
            {
                return(null);
            }
            if (flag || thing.Position.AdjacentTo8Way(pawn.Position))
            {
                return(new Job(JobDefOf.AttackMelee, thing));
            }

            // Check for reload before attacking
            bool allowManualCastWeapons = !pawn.IsColonist;  //TODO: Is this correct?
            Verb verb = pawn.TryGetAttackVerb(thing, allowManualCastWeapons);

            if (pawn.equipment.Primary != null && pawn.equipment.PrimaryEq != null && verb != null && verb == pawn.equipment.PrimaryEq.PrimaryVerb)
            {
                CompAmmoUser compAmmo = pawn.equipment.Primary.TryGetComp <CompAmmoUser>();
                if (compAmmo != null && !compAmmo.CanBeFiredNow)
                {
                    if (compAmmo.HasAmmo)
                    {
                        Job job = new Job(CE_JobDefOf.ReloadWeapon, pawn, pawn.equipment.Primary);
                        if (job != null)
                        {
                            return(job);
                        }
                    }

                    return(new Job(JobDefOf.AttackMelee, thing));
                }
            }

            return(new Job(JobDefOf.AttackStatic, thing));
        }
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (!Base.Features.RangedAnimals)
            {
                return(null);
            }
            var enemyTarget = pawn.mindState.enemyTarget;

            if (enemyTarget != null && (enemyTarget.Destroyed ||
                                        Find.TickManager.TicksGame - pawn.mindState.lastEngageTargetTick > 400 ||
                                        !pawn.CanReach(enemyTarget, PathEndMode.Touch, Danger.Deadly) ||
                                        (pawn.Position - enemyTarget.Position).LengthHorizontalSquared >
                                        TargetKeepRadius * TargetKeepRadius ||
                                        ((IAttackTarget)enemyTarget).ThreatDisabled(pawn)))
            {
                enemyTarget = null;
            }
            if (pawn.TryGetAttackVerb(null, !pawn.IsColonist) == null)
            {
                enemyTarget = null;
            }
            else if (enemyTarget == null)
            {
                enemyTarget = (Thing)AttackTargetFinder.BestAttackTarget(pawn, TargetScanFlags.NeedThreat,
                                                                         x => x is Pawn && x.def.race.intelligence >= Intelligence.ToolUser, 0f, 9999f,
Esempio n. 14
0
        static void checkForAutoAttack(JobDriver_Goto __instance)
        {
            if ((__instance.pawn.story == null || !__instance.pawn.story.DisabledWorkTagsBackstoryAndTraits.HasFlag(WorkTags.Violent)) &&
                __instance.pawn.Faction != null &&
                !(__instance.pawn.stances.curStance is Stance_RunAndGun) &&
                __instance.pawn.jobs.curJob.def == JobDefOf.Goto &&
                (__instance.pawn.drafter == null || __instance.pawn.drafter.FireAtWill))
            {
                CompRunAndGun comp = __instance.pawn.TryGetComp <CompRunAndGun>();
                if (comp == null || comp.isEnabled == false)
                {
                    return;
                }
                Verb verb = __instance.pawn.TryGetAttackVerb(null);

                if (verb != null)
                {
                    TargetScanFlags targetScanFlags = TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedLOSToNonPawns | TargetScanFlags.NeedThreat;
                    if (verb.IsIncendiary())
                    {
                        targetScanFlags |= TargetScanFlags.NeedNonBurning;
                    }
                    Thing thing = (Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(__instance.pawn, targetScanFlags, null, 0f, 9999f);
                    if (thing != null && !(verb.IsMeleeAttack && __instance.pawn.CanReachImmediate(thing, PathEndMode.Touch))) //Don't allow melee attacks, but take into account ranged animals or dual wield users
                    {
                        __instance.pawn.TryStartAttack(thing);
                        return;
                    }
                }
            }
        }
 static void checkForAutoAttack(JobDriver_Goto __instance)
 {
     if ((__instance.pawn.story == null || !__instance.pawn.story.WorkTagIsDisabled(WorkTags.Violent)) &&
         __instance.pawn.Faction != null &&
         !(__instance.pawn.stances.curStance is Stance_RunAndGun) &&
         __instance.pawn.jobs.curJob.def == JobDefOf.Goto &&
         (__instance.pawn.drafter == null || __instance.pawn.drafter.FireAtWill))
     {
         CompRunAndGun comp = __instance.pawn.TryGetComp <CompRunAndGun>();
         if (comp == null || comp.isEnabled == false)
         {
             return;
         }
         Verb verb = __instance.pawn.TryGetAttackVerb(true);
         if (verb != null && !verb.verbProps.MeleeRange)
         {
             TargetScanFlags targetScanFlags = TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedLOSToNonPawns | TargetScanFlags.NeedThreat;
             if (verb.IsIncendiary())
             {
                 targetScanFlags |= TargetScanFlags.NeedNonBurning;
             }
             Thing thing = (Thing)AttackTargetFinder.BestShootTargetFromCurrentPosition(__instance.pawn, null, verb.verbProps.range, verb.verbProps.minRange, targetScanFlags);
             if (thing != null)
             {
                 __instance.pawn.TryStartAttack(thing);
                 return;
             }
         }
     }
 }
Esempio n. 16
0
            public static bool Prefix(ref IAttackTarget __result, IAttackTargetSearcher searcher,
                                      TargetScanFlags flags, Predicate <Thing> validator = null, float minDist = 0f,
                                      float maxDist = 9999f, IntVec3 locus = default(IntVec3),
                                      float maxTravelRadiusFromLocus = 3.40282347E+38f, bool canBash = false,
                                      bool canTakeTargetsCloserThanEffectiveMinRange = true)
            {
                bool result = true;

                if (!recursiveTrap)
                {
                    recursiveTrap = true;
                    Map     oldMap      = searcher.Thing.Map;
                    IntVec3 oldPosition = searcher.Thing.Position;
                    foreach (var map in ZUtils.GetAllMapsInClosestOrder(searcher.Thing, oldMap, oldPosition))
                    {
                        var target = AttackTargetFinder.BestAttackTarget(searcher, flags, validator, minDist,
                                                                         maxDist, locus, maxTravelRadiusFromLocus, canBash, canTakeTargetsCloserThanEffectiveMinRange);
                        Log.Message(ZUtils.ZTracker.GetMapInfo(searcher.Thing.Map) + " - result: " + target);
                        if (target != null)
                        {
                            __result = target;
                            result   = false;
                            break;
                        }
                    }
                    ZUtils.TeleportThing(searcher.Thing, oldMap, oldPosition);
                    recursiveTrap = false;
                }
                return(result);
            }
Esempio n. 17
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            float num   = float.MaxValue;
            Thing thing = null;
            List <IAttackTarget> potentialTargetsFor = pawn.Map.attackTargetsCache.GetPotentialTargetsFor(pawn);

            for (int i = 0; i < potentialTargetsFor.Count; i++)
            {
                IAttackTarget attackTarget = potentialTargetsFor[i];
                if (!attackTarget.ThreatDisabled(pawn) && AttackTargetFinder.IsAutoTargetable(attackTarget))
                {
                    Thing thing2 = (Thing)attackTarget;
                    int   num2   = thing2.Position.DistanceToSquared(pawn.Position);
                    if ((float)num2 < num && pawn.CanReach(thing2, PathEndMode.OnCell, Danger.Deadly))
                    {
                        num   = num2;
                        thing = thing2;
                    }
                }
            }
            if (thing != null)
            {
                Job job = JobMaker.MakeJob(JobDefOf.Goto, thing);
                job.checkOverrideOnExpire = true;
                job.expiryInterval        = 500;
                job.collideWithPawns      = true;
                return(job);
            }
            return(null);
        }
Esempio n. 18
0
        private Job TryGetAttackNearbyEnemyJob(Pawn pawn)
        {
            if (pawn.story != null && pawn.story.WorkTagIsDisabled(WorkTags.Violent))
            {
                return(null);
            }
            bool  isMeleeAttack = pawn.CurrentEffectiveVerb.IsMeleeAttack;
            float num           = 8f;

            if (!isMeleeAttack)
            {
                num = Mathf.Clamp(pawn.CurrentEffectiveVerb.verbProps.range * 0.66f, 2f, 20f);
            }
            float maxDist = num;
            Thing thing   = (Thing)AttackTargetFinder.BestAttackTarget(pawn, TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedLOSToNonPawns | TargetScanFlags.NeedReachableIfCantHitFromMyPos | TargetScanFlags.NeedThreat, null, 0f, maxDist, default(IntVec3), 3.40282347E+38f, false);
            // TODO evaluate if this is necessary?
            Pawn o = thing as Pawn;

            if (o != null)
            {
                if
                (o.Downed || o.health.InPainShock)
                {
                    return(null);
                }
            }

            if (thing == null)
            {
                return(null);
            }
            if (isMeleeAttack || pawn.CanReachImmediate(thing, PathEndMode.Touch))
            {
                return(new Job(JobDefOf.AttackMelee, thing));
            }

            // Check for reload before attacking
            Verb verb = pawn.TryGetAttackVerb(thing);

            if (pawn.equipment.Primary != null && pawn.equipment.PrimaryEq != null && verb != null && verb == pawn.CurrentEffectiveVerb)
            {
                CompAmmoUser compAmmo = pawn.equipment.Primary.TryGetComp <CompAmmoUser>();
                if (compAmmo != null && !compAmmo.CanBeFiredNow)
                {
                    if (compAmmo.HasAmmo)
                    {
                        Job job = new Job(CE_JobDefOf.ReloadWeapon, pawn, pawn.equipment.Primary);
                        if (job != null)
                        {
                            return(job);
                        }
                    }

                    return(new Job(JobDefOf.AttackMelee, thing));
                }
            }

            return(new Job(JobDefOf.AttackStatic, thing));
        }
Esempio n. 19
0
        private static Building FindTurretTarget(Pawn pawn)
        {
            Pawn pawn1 = pawn;
            Predicate <Thing> predicate = (Thing t) => t is Building;
            IntVec3           intVec3   = new IntVec3();

            return((Building)AttackTargetFinder.BestAttackTarget(pawn1, TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedLOSToNonPawns | TargetScanFlags.NeedLOSToAll | TargetScanFlags.NeedReachable | TargetScanFlags.NeedThreat, predicate, 0f, 70f, intVec3, float.MaxValue, false));
        }
Esempio n. 20
0
 private Building FindTurretTarget(Pawn pawn)
 {
     return((Building)AttackTargetFinder.BestAttackTarget(pawn,
                                                          TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedLOSToNonPawns |
                                                          TargetScanFlags.NeedReachable | TargetScanFlags.NeedThreat |
                                                          TargetScanFlags.NeedAutoTargetable, (Thing t) => t is Building, 0f, 70f,
                                                          default(IntVec3), float.MaxValue, false, true));
 }
Esempio n. 21
0
 // Token: 0x06003091 RID: 12433 RVA: 0x00111BB8 File Offset: 0x0010FDB8
 private Pawn FindPawnTarget(Pawn pawn)
 {
     return((Pawn)AttackTargetFinder.BestAttackTarget(pawn, TargetScanFlags.NeedReachable, delegate(Thing x)
     {
         Pawn pawn2;
         return (pawn2 = (x as Pawn)) != null && pawn2.Spawned && !pawn2.Downed && !pawn2.IsInvisible();
     }, 0f, 40f, default(IntVec3), float.MaxValue, true, true));
 }
Esempio n. 22
0
 public void MapInterfaceUpdate()
 {
     if (Find.CurrentMap != null)
     {
         if (!WorldRendererUtility.WorldRenderedNow)
         {
             Profiler.BeginSample("TargeterUpdate()");
             this.targeter.TargeterUpdate();
             Profiler.EndSample();
             Profiler.BeginSample("DrawSelectionOverlays()");
             SelectionDrawer.DrawSelectionOverlays();
             Profiler.EndSample();
             Profiler.BeginSample("EnvironmentStatsDrawer.DrawRoomOverlays()");
             EnvironmentStatsDrawer.DrawRoomOverlays();
             Profiler.EndSample();
             Profiler.BeginSample("DesignatorManagerUpdate()");
             this.designatorManager.DesignatorManagerUpdate();
             Profiler.EndSample();
             Profiler.BeginSample("RoofGridUpdate()");
             Find.CurrentMap.roofGrid.RoofGridUpdate();
             Profiler.EndSample();
             Profiler.BeginSample("ExitMapGridUpdate()");
             Find.CurrentMap.exitMapGrid.ExitMapGridUpdate();
             Profiler.EndSample();
             Profiler.BeginSample("DeepResourceGridUpdate()");
             Find.CurrentMap.deepResourceGrid.DeepResourceGridUpdate();
             Profiler.EndSample();
             Profiler.BeginSample("Debug drawing");
             if (DebugViewSettings.drawPawnDebug)
             {
                 Find.CurrentMap.pawnDestinationReservationManager.DebugDrawDestinations();
                 Find.CurrentMap.reservationManager.DebugDrawReservations();
             }
             if (DebugViewSettings.drawFoodSearchFromMouse)
             {
                 FoodUtility.DebugFoodSearchFromMouse_Update();
             }
             if (DebugViewSettings.drawPreyInfo)
             {
                 FoodUtility.DebugDrawPredatorFoodSource();
             }
             if (DebugViewSettings.drawAttackTargetScores)
             {
                 AttackTargetFinder.DebugDrawAttackTargetScores_Update();
             }
             MiscDebugDrawer.DebugDrawInteractionCells();
             Find.CurrentMap.debugDrawer.DebugDrawerUpdate();
             Find.CurrentMap.regionGrid.DebugDraw();
             InfestationCellFinder.DebugDraw();
             StealAIDebugDrawer.DebugDraw();
             if (DebugViewSettings.drawRiverDebug)
             {
                 Find.CurrentMap.waterInfo.DebugDrawRiver();
             }
             Profiler.EndSample();
         }
     }
 }
Esempio n. 23
0
 protected override Thing FindTarget(Pawn pawn)
 {
     return((Thing)AttackTargetFinder.BestAttackTarget(
                pawn,
                TargetScanFlags.NeedReachable | TargetScanFlags.NeedThreat,
                (Thing x) => x is Pawn && ((Pawn)x).RaceProps.Animal,
                0f,
                MaxAttackDistance,
                default(IntVec3),
                3.40282347E+38f,
                true));
 }
Esempio n. 24
0
        protected override Thing FindAttackTarget(Pawn pawn)
        {
            TargetScanFlags targetScanFlags = TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedReachableIfCantHitFromMyPos | TargetScanFlags.NeedThreat;

            /*if (PrimaryVerbIsIncendiary(pawn))
             * {
             *      targetScanFlags |= TargetScanFlags.NeedNonBurning;
             * }*/
            return((Thing)AttackTargetFinder.BestAttackTarget(pawn, targetScanFlags,
                                                              x => ExtraTargetValidator(pawn, x), 0f, TargetAcquireRadius,
                                                              default(IntVec3), float.MaxValue, false));
        }
Esempio n. 25
0
 protected override Thing FindTarget(Pawn pawn)
 {
     return((Thing)AttackTargetFinder.BestAttackTarget(
                pawn,
                TargetScanFlags.NeedReachable | TargetScanFlags.NeedThreat,
                (Thing x) => x is Pawn && pawn.relations.OpinionOf((Pawn)x) < 0,
                0f,
                MaxAttackDistance,
                default(IntVec3),
                3.40282347E+38f,
                true));
 }
        protected virtual Thing FindAttackTarget(Pawn pawn)
        {
            TargetScanFlags targetScanFlags = TargetScanFlags.NeedLOSToPawns | TargetScanFlags.NeedReachableIfCantHitFromMyPos | TargetScanFlags.NeedThreat | TargetScanFlags.NeedAutoTargetable;

            if (needLOSToAcquireNonPawnTargets)
            {
                targetScanFlags |= TargetScanFlags.NeedLOSToNonPawns;
            }
            if (PrimaryVerbIsIncendiary(pawn))
            {
                targetScanFlags |= TargetScanFlags.NeedNonBurning;
            }
            return((Thing)AttackTargetFinder.BestAttackTarget(pawn, targetScanFlags, (Thing x) => ExtraTargetValidator(pawn, x), 0f, targetAcquireRadius, GetFlagPosition(pawn), GetFlagRadius(pawn)));
        }
Esempio n. 27
0
        public static bool Prefix(ref IAttackTarget __result, List <IAttackTarget> ___tmpTargets, List <Pair <IAttackTarget, float> > ___availableShootingTargets,
                                  List <float> ___tmpTargetScores, List <bool> ___tmpCanShootAtTarget, List <IntVec3> ___tempDestList, List <IntVec3> ___tempSourceList,
                                  IAttackTargetSearcher searcher, TargetScanFlags flags, Predicate <Thing> validator = null, float minDist = 0f,
                                  float maxDist = 9999f, IntVec3 locus = default(IntVec3), float maxTravelRadiusFromLocus = 3.40282347E+38f, bool canBash = false,
                                  bool canTakeTargetsCloserThanEffectiveMinRange = true)
        {
            bool result = true;

            if (!recursiveTrap && multiMapSearch)
            {
                recursiveTrap = true;
                Map     oldMap             = searcher.Thing.Map;
                IntVec3 oldPosition        = searcher.Thing.Position;
                bool    dontCheckForStairs = searcher.Thing is Building;
                foreach (var map in ZUtils.GetAllMapsInClosestOrder(searcher.Thing, oldMap, oldPosition, dontCheckForStairs: dontCheckForStairs))
                {
                    if (ZUtils.ZTracker.GetZIndexFor(map) < ZUtils.ZTracker.GetZIndexFor(oldMap))
                    {
                        CanBeSeenOverFast_Patch.checkLevels = true;
                        CanBeSeenOverFast_Patch.upperMap    = oldMap;
                        CanBeSeenOverFast_Patch.lowerMap    = map;
                        CanBeSeenOverFast_Patch.caster      = searcher.Thing;
                    }
                    var target = AttackTargetFinder.BestAttackTarget(searcher, flags, validator, minDist,
                                                                     maxDist, locus, maxTravelRadiusFromLocus, canBash, canTakeTargetsCloserThanEffectiveMinRange);
                    //ZLogger.Message(searcher.Thing + " - 1: " + ZUtils.ZTracker.GetMapInfo(searcher.Thing.Map) + " - result: " + target);
                    if (target != null)
                    {
                        __result = target;
                        result   = false;
                        break;
                    }
                }
                //ZLogger.Message("1 Trying to get " + searcher.Thing + " back to " + oldMap + " - " + oldPosition, true);
                ZUtils.TeleportThing(searcher.Thing, oldMap, oldPosition);
                recursiveTrap = false;
                CanBeSeenOverFast_Patch.checkLevels = false;
                CanBeSeenOverFast_Patch.upperMap    = null;
                CanBeSeenOverFast_Patch.lowerMap    = null;
                CanBeSeenOverFast_Patch.caster      = null;
            }
            //else if (!multiMapSearch)
            //{
            //    ZLogger.Message("BestAttackTarget: multiMapSearch: " + multiMapSearch, true);
            //}
            return(result);
        }
 public void MapInterfaceUpdate()
 {
     if (Find.CurrentMap != null && !WorldRendererUtility.WorldRenderedNow)
     {
         targeter.TargeterUpdate();
         SelectionDrawer.DrawSelectionOverlays();
         EnvironmentStatsDrawer.DrawRoomOverlays();
         designatorManager.DesignatorManagerUpdate();
         Find.CurrentMap.roofGrid.RoofGridUpdate();
         Find.CurrentMap.fertilityGrid.FertilityGridUpdate();
         Find.CurrentMap.terrainGrid.TerrainGridUpdate();
         Find.CurrentMap.exitMapGrid.ExitMapGridUpdate();
         Find.CurrentMap.deepResourceGrid.DeepResourceGridUpdate();
         if (DebugViewSettings.drawPawnDebug)
         {
             Find.CurrentMap.pawnDestinationReservationManager.DebugDrawDestinations();
             Find.CurrentMap.reservationManager.DebugDrawReservations();
         }
         if (DebugViewSettings.drawDestReservations)
         {
             Find.CurrentMap.pawnDestinationReservationManager.DebugDrawReservations();
         }
         if (DebugViewSettings.drawFoodSearchFromMouse)
         {
             FoodUtility.DebugFoodSearchFromMouse_Update();
         }
         if (DebugViewSettings.drawPreyInfo)
         {
             FoodUtility.DebugDrawPredatorFoodSource();
         }
         if (DebugViewSettings.drawAttackTargetScores)
         {
             AttackTargetFinder.DebugDrawAttackTargetScores_Update();
         }
         MiscDebugDrawer.DebugDrawInteractionCells();
         Find.CurrentMap.debugDrawer.DebugDrawerUpdate();
         Find.CurrentMap.regionGrid.DebugDraw();
         InfestationCellFinder.DebugDraw();
         StealAIDebugDrawer.DebugDraw();
         if (DebugViewSettings.drawRiverDebug)
         {
             Find.CurrentMap.waterInfo.DebugDrawRiver();
         }
         BuildingsDamageSectionLayerUtility.DebugDraw();
     }
 }
Esempio n. 29
0
        // Verse.AI.GenAI
        private bool EnemyIsNear([NotNull] Pawn p, float radius)
        {
            bool enemy = false;

            this._target = null;

            if (!p.Spawned)
            {
                return(false);
            }

            List <IAttackTarget> potentialTargetsFor = p.Map?.attackTargetsCache?.GetPotentialTargetsFor(p);

            if (!potentialTargetsFor.NullOrEmpty())
            {
                // ReSharper disable once PossibleNullReferenceException
                foreach (IAttackTarget attackTarget in potentialTargetsFor)
                {
                    if (attackTarget == null || attackTarget.ThreatDisabled())
                    {
                        continue;
                    }

                    if (!p.Position.InHorDistOf(((Thing)attackTarget).Position, radius))
                    {
                        continue;
                    }

                    enemy = true;
                    break;
                }
            }

            if (!enemy)
            {
                return(false);
            }

            Thing thing = (Thing)AttackTargetFinder.BestAttackTarget(
                p,
                TargetScanFlags.NeedReachable |
                TargetScanFlags.NeedThreat,
                x => x is Pawn,
                0f,
                radius,
        protected override Thing FindAttackTarget(Pawn pawn)
        {
            TargetScanFlags targetScanFlags = TargetScanFlags.NeedLOSToPawns
                                              | TargetScanFlags.NeedReachableIfCantHitFromMyPos | TargetScanFlags.NeedThreat | TargetScanFlags.NeedAutoTargetable;

            if (PrimaryVerbIsIncendiary(pawn))
            {
                targetScanFlags |= TargetScanFlags.NeedNonBurning;
            }
            var target = enemies.RandomElement();

            if (target is null)
            {
                return((Thing)AttackTargetFinder.BestAttackTarget
                           (pawn, targetScanFlags, (Thing x) => ExtraTargetValidator(pawn, x), 0f, pawn.Map.Size.x, GetFlagPosition(pawn), GetFlagRadius(pawn)));
            }
            return(target);
        }