Example #1
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (pawn.Map == null)
            {
                return(null);
            }
            if (!WorkGiver_HunterHunt.HasHuntingWeapon(pawn))
            {
                IEnumerable <Thing> huntingWeapons = (from t in pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.Weapon)
                                                      where t.def.IsRangedWeapon && t.TryGetComp <CompEquippable>().PrimaryVerb.HarmsHealth() && !t.TryGetComp <CompEquippable>().PrimaryVerb.UsesExplosiveProjectiles() && pawn.CanReserveAndReach(t, PathEndMode.Touch, Danger.None)
                                                      orderby t.GetStatValue(StatDefOf.AccuracyLong) descending
                                                      select t);
                if (huntingWeapons.Count() > 0)
                {
                    Thing bestWeapon = huntingWeapons.First();
                    if (pawn.equipment.Primary == null || !pawn.equipment.Primary.def.IsRangedWeapon || !pawn.equipment.PrimaryEq.PrimaryVerb.HarmsHealth() || pawn.equipment.PrimaryEq.PrimaryVerb.UsesExplosiveProjectiles() || pawn.equipment.Primary.GetStatValue(StatDefOf.AccuracyLong) < bestWeapon.GetStatValue(StatDefOf.AccuracyLong))
                    {
                        return(new Job(JobDefOf.Equip, bestWeapon));
                    }
                }
            }
            if (WorkGiver_HunterHunt.HasShieldAndRangedWeapon(pawn))
            {
                List <Apparel> wornApparel = pawn.apparel.WornApparel;
                for (int i = 0; i < wornApparel.Count; i++)
                {
                    if (wornApparel[i] is ShieldBelt)
                    {
                        return(new Job(JobDefOf.DropEquipment, wornApparel[i]));
                    }
                }
            }
            if (!(pawn.MentalState is MentalState_HuntingTrip))
            {
                return(null);
            }
            Pawn assignedPrey = (pawn.MentalState as MentalState_HuntingTrip).prey;

            if (assignedPrey != null && !assignedPrey.Dead)
            {
                return(new Job(JobDefOfPsychology.BreakHunt, assignedPrey));
            }
            IEnumerable <Pawn> wildlife = from p in Find.CurrentMap.mapPawns.AllPawns
                                          where p.Spawned && p.Faction == null && p.AnimalOrWildMan() && !p.Position.Fogged(p.Map) && pawn.CanReserve(p, 1, -1, null, true)
                                          select p;

            if (wildlife.Count() > 0)
            {
                Pawn prey = wildlife.RandomElement();
                (pawn.MentalState as MentalState_HuntingTrip).prey = prey;
                return(new Job(JobDefOfPsychology.BreakHunt, prey));
            }
            return(null);
        }
Example #2
0
 public override bool ShouldSkip(Pawn pawn)
 {
     return(!WorkGiver_HunterHunt.HasHuntingWeapon(pawn) || pawn.equipment.Primary.def.defName.Contains("TFJ_Tool") || WorkGiver_HunterHunt.HasShieldAndRangedWeapon(pawn));
 }