private Job TryOutfit(Pawn pawn)
        {
            if (pawn.equipment == null)
            {
                return(null);
            }

            if (pawn.RaceProps.Humanlike && pawn.story.WorkTagIsDisabled(WorkTags.Violent))
            {
                Gunfitter.Trace(pawn.ToString() + " is a wuss and cant even gunfit.");
                return(null);
            }

            if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))
            {
                return(null);
            }

            List <Thing> list          = pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.Weapon);
            Outfit       currentOutfit = pawn.outfits.CurrentOutfit;


            Thing thing = null;

            for (int j = 0; j < list?.Count; j++)
            {
                var gun = list[j];
                if (!currentOutfit.filter.Allows(gun))
                {
                    continue;
                }
                if (!gun.IsInAnyStorage())
                {
                    continue;
                }
                if (gun.IsForbidden(pawn))
                {
                    continue;
                }
                if (!this.ShouldEquipByOutfit(gun, pawn))
                {
                    continue;
                }
                if (!pawn.CanReserveAndReach(gun, PathEndMode.OnCell, pawn.NormalMaxDanger(), 1, -1, null, false)
                    )
                {
                    continue;
                }

                Gunfitter.Trace(pawn.ToString() + "Off to be gunfitted");
                return(new Job(JobDefOf.Equip, gun));
            }


            Gunfitter.Trace("Nothing for [" + pawn + "]");

            return(null);
        }
示例#2
0
        private Job TryOutfit(Pawn pawn)
        {
            if (!pawn.IsColonist || pawn.Drafted)
            {
                return(null);
            }

            if (pawn.equipment == null)
            {
                Gunfitter.Trace(pawn + " has no equipment settings.");
                return(null);
            }

            if (pawn.RaceProps.Humanlike && pawn.WorkTagIsDisabled(WorkTags.Violent))
            {
                Gunfitter.Trace(pawn + " is incapable of violence.");
                return(null);
            }

            if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation))
            {
                Gunfitter.Trace(pawn + " can not manipulate things.");
                return(null);
            }

            if (pawn.equipment?.Primary != null)
            {
                if (FindAGunDamnItMod.instance.Settings.FindingSetting == FindAGunDamnItMod.findingSettings[0] ||
                    ModLister.HasActiveModWithName("Simple sidearms"))
                {
                    Gunfitter.Trace(pawn + " has a weapon and simple sidearms is loaded or setting is " +
                                    FindAGunDamnItMod.findingSettings[0] + ", will not evaluate new guns.");
                    return(null);
                }

                var currentGun = pawn.equipment.Primary;
                if (FindAGunDamnItMod.instance.Settings.FindingSetting == FindAGunDamnItMod.findingSettings[1])
                {
                    var hunter  = pawn.workSettings.WorkIsActive(WorkTypeDefOf.Hunting);
                    var brawler = pawn.story.traits.HasTrait(TraitDefOf.Brawler);
                    if (!hunter && !brawler)
                    {
                        Gunfitter.Trace(pawn + " is not brawler or hunter and setting is " +
                                        FindAGunDamnItMod.findingSettings[1] + ", will not evaluate new guns.");
                        return(null);
                    }

                    if (brawler && currentGun.def.IsMeleeWeapon || hunter && currentGun.def.IsRangedWeapon)
                    {
                        Gunfitter.Trace(pawn + " is brawler or hunter with an appropriate weapon and setting is " +
                                        FindAGunDamnItMod.findingSettings[1] + ", will not evaluate new guns.");
                        return(null);
                    }
                }
            }

            var list        = pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.Weapon);
            var allowedGuns = new List <Thing>();

            for (var j = 0; j < list?.Count; j++)
            {
                var gun = list[j];
                Gunfitter.Trace(pawn + " testing weapon: " + gun.def, true);
                if (gun.IsForbidden(pawn))
                {
                    continue;
                }

                Gunfitter.Trace(gun.def + " is allowed", true);
                if (gun.def.IsMeleeWeapon && gun.GetStatValue(StatDefOf.MeleeWeapon_AverageDPS) < whatAFistCanDo)
                {
                    continue;
                }

                Gunfitter.Trace(gun.def + " is better than a fist", true);
                if (!this.ShouldEquipByOutfit(gun, pawn))
                {
                    continue;
                }

                Gunfitter.Trace(pawn + " should be equiped by outfit " + gun.def, true);
                if (!pawn.CanReserveAndReach(gun, PathEndMode.OnCell, Danger.None))
                {
                    continue;
                }

                Gunfitter.Trace(pawn + " can equip " + gun.def, true);
                allowedGuns.Add(gun);
            }

            Gunfitter.Trace(pawn + " determining best gun from equippable.");
            var bestGun = this.bestGunForPawn(allowedGuns, pawn);

            if (bestGun == null)
            {
                return(null);
            }

            if (Prefs.DevMode)
            {
                Log.Message("FindAGunDamnIt: " + pawn + " will equip " + bestGun.def);
            }
            else
            {
                Gunfitter.Trace(pawn + " will equip " + bestGun.def);
            }

            return(new Job(JobDefOf.Equip, bestGun));
        }