Ejemplo n.º 1
0
 public override void CompTick()
 {
     base.CompTick();
     if (this.IsMounted)
     {
         if (driver.Dead || driver.Downed || driver.health.InPainShock || driver.InMentalState || //Abnormal
             (!driver.RaceProps.Animal && driver.Faction != Faction.OfPlayer) ||
             ForbidUtility.IsForbidden(parent, Faction.OfPlayer))
         {
             Dismount();
         }
         else
         {
             if (Find.TickManager.TicksGame - tickLastDoorCheck >= TickCooldownDoorCheck &&
                 (driver.Position.GetEdifice() is Building_Door || parent.Position.GetEdifice() is Building_Door))
             {
                 lastPassedDoor = ((driver.Position.GetEdifice() is Building_Door) ?
                                   driver.Position.GetEdifice() : parent.Position.GetEdifice()) as Building_Door;
                 lastPassedDoor.StartManualOpenBy(driver);
                 tickLastDoorCheck = Find.TickManager.TicksGame;
             }
             else if (Find.TickManager.TicksGame - tickLastDoorCheck >= TickCooldownDoorCheck && lastPassedDoor != null)
             {
                 lastPassedDoor.StartManualCloseBy(driver);
                 lastPassedDoor = null;
             }
             parent.Position = IntVec3Utility.ToIntVec3(Position);
             parent.Rotation = driver.Rotation;
         }
     }
 }
Ejemplo n.º 2
0
        public override Job JobOnCell(Pawn pawn, IntVec3 cell)
        {
            Job job = base.JobOnCell(pawn, cell);

            if (job != null && job.plantDefToSow != null && job.plantDefToSow.blueprintDef != null)
            {
                Predicate <Thing> predicate = (Thing tempThing) =>
                                              !ForbidUtility.IsForbidden(tempThing, pawn.Faction) &&
                                              PawnLocalAwareness.AnimalAwareOf(pawn, tempThing) &&
                                              ReservationUtility.CanReserve(pawn, tempThing, 1);

                Thing bestSeedThingForSowing = GenClosest.ClosestThingReachable(
                    cell, pawn.Map, ThingRequest.ForDef(job.plantDefToSow.blueprintDef),
                    PathEndMode.ClosestTouch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999,
                    predicate, null, -1, false);

                if (bestSeedThingForSowing != null)
                {
                    return(new Job(LocalJobDefOf.SowWithSeeds, cell, bestSeedThingForSowing)
                    {
                        plantDefToSow = job.plantDefToSow,
                        count = 25
                    });
                }
                return(null);
            }

            return(job);
        }
        public override Job JobOnCell(Pawn pawn, IntVec3 c, bool forced = false)
        {
            var job = base.JobOnCell(pawn, c, forced);

            // plant has seeds, if there is a seed return a job, otherwise prevent it. Seeds with no category are forbidden.
            var seed = job?.plantDefToSow?.blueprintDef;

            if (seed != null && !seed.thingCategories.NullOrEmpty())
            {
                // Clear the area some...
                var zone = c.GetZone(pawn.Map);
                if (zone != null)
                {
                    foreach (var corner in GenAdj.AdjacentCells8WayRandomized())
                    {
                        var cell = c + corner;
                        if (zone.ContainsCell(cell))
                        {
                            foreach (var thing in pawn.Map.thingGrid.ThingsAt(cell))
                            {
                                if (thing.def != job.plantDefToSow && thing.def.BlocksPlanting(true) && pawn.CanReserve(thing) && !thing.IsForbidden(pawn))
                                {
                                    if (thing.def.category == ThingCategory.Plant)
                                    {
                                        return(new Job(JobDefOf.CutPlant, thing));
                                    }
                                    if (thing.def.EverHaulable)
                                    {
                                        return(HaulAIUtility.HaulAsideJobFor(pawn, thing));
                                    }
                                }
                            }
                        }
                    }
                }

                Predicate <Thing> predicate = (Thing tempThing) =>
                                              !ForbidUtility.IsForbidden(tempThing, pawn.Faction) &&
                                              ForbidUtility.InAllowedArea(tempThing.Position, pawn) &&
                                              PawnLocalAwareness.AnimalAwareOf(pawn, tempThing) &&
                                              ReservationUtility.CanReserve(pawn, tempThing, 1);

                Thing bestSeedThingForSowing = GenClosest.ClosestThingReachable(
                    c, pawn.Map, ThingRequest.ForDef(job.plantDefToSow.blueprintDef),
                    PathEndMode.ClosestTouch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999,
                    predicate);

                if (bestSeedThingForSowing != null)
                {
                    return(new Job(ResourceBank.JobDefOf.SowWithSeeds, c, bestSeedThingForSowing)
                    {
                        plantDefToSow = job.plantDefToSow,
                        count = SEEDS_TO_CARRY
                    });
                }
                return(null);
            }

            return(job);
        }
Ejemplo n.º 4
0
        public static void Postfix(Pawn pawn, Building_Turret tube, ref Thing __result)
        {
            if (__result != null)
            {
                return;
            }
            var               turret = tube as Building_ShipTurret;
            StorageSettings   allowedShellsSettings = ThingCompUtility.TryGetComp <CompChangeableProjectilePlural>(turret.gun).allowedShellsSettings;
            Predicate <Thing> pred = (Thing x) =>
            {
                if (ForbidUtility.IsForbidden(x, pawn) || !ReservationUtility.CanReserve(pawn, x, 1, -1, (ReservationLayerDef)null, false))
                {
                    return(false);
                }
                else
                {
                    return(allowedShellsSettings?.AllowedToAccept(x) ?? true);
                }
            };

            foreach (String defName in shellDefNames)
            {
                var val = ThingDef.Named(defName);
                __result = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(val), PathEndMode.ClosestTouch, TraverseParms.For(pawn), 9999f, pred);
                if (__result != null)
                {
                    return;
                }
            }
        }
        // Token: 0x0600003C RID: 60 RVA: 0x00002F10 File Offset: 0x00001110
        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            CompUniversalFermenter compUniversalFermenter = ThingCompUtility.TryGetComp <CompUniversalFermenter>(t);

            if (compUniversalFermenter == null || compUniversalFermenter.Fermented || compUniversalFermenter.SpaceLeftForIngredient <= 0)
            {
                return(false);
            }
            float ambientTemperature = compUniversalFermenter.parent.AmbientTemperature;

            if (ambientTemperature < compUniversalFermenter.Product.temperatureSafe.min + 2f || ambientTemperature > compUniversalFermenter.Product.temperatureSafe.max - 2f)
            {
                JobFailReason.Is(WorkGiver_FillUniversalFermenter.TemperatureTrans, null);
                return(false);
            }
            if (ForbidUtility.IsForbidden(t, pawn) || !ReservationUtility.CanReserveAndReach(pawn, t, (PathEndMode)2, DangerUtility.NormalMaxDanger(pawn), 1, -1, null, forced))
            {
                return(false);
            }
            if (pawn.Map.designationManager.DesignationOn(t, DesignationDefOf.Deconstruct) != null)
            {
                return(false);
            }
            if (this.FindIngredient(pawn, t) == null)
            {
                JobFailReason.Is(WorkGiver_FillUniversalFermenter.NoIngredientTrans, null);
                return(false);
            }
            return(!FireUtility.IsBurning(t));
        }
        public static Toil DropThing(TargetIndex haulableInd)
        {
            Toil toil = new Toil();

            toil.initAction = delegate
            {
                Pawn  actor  = toil.actor;
                Job   curJob = actor.jobs.curJob;
                Thing thing  = curJob.GetTarget(haulableInd).Thing;

                if (thing.holdingOwner.Owner is Pawn_InventoryTracker holder)
                {
                    int count = Mathf.Min(curJob.count, thing.stackCount);
                    Log.Message($"{holder.pawn} dropping {thing}x{count} for {actor}");

                    holder.innerContainer.TryDrop(thing, ThingPlaceMode.Near, count, out Thing droppedThing);
                    if (droppedThing == null)
                    {
                        actor.jobs.curDriver.EndJobWith(JobCondition.Incompletable);                        //Shoooot
                    }
                    else
                    {
                        actor.Map.reservationManager.Release(thing, actor, curJob);                        //Someone else might want the rest of the stack

                        ForbidUtility.SetForbidden(droppedThing, false, false);
                        actor.Reserve(droppedThing, curJob, 100, count);                        //max pawns 100 why not
                        curJob.SetTarget(haulableInd, droppedThing);
                    }
                }
            };
            return(toil);
        }
Ejemplo n.º 7
0
        public override IEnumerable <FloatMenuOption> CompFloatMenuOptions(Pawn selPawn)
        {
            ArmorRack armorRack = this.parent as ArmorRack;

            if (!selPawn.CanReach(armorRack, PathEndMode.Touch, Danger.Deadly, false, false, TraverseMode.ByPawn))
            {
                FloatMenuOption failer = new FloatMenuOption("CannotUseNoPath".Translate(), null, MenuOptionPriority.Default, null, null, 0f, null, null);
                yield return(failer);

                yield break;
            }

            var nonViolentOptionYielded = false;

            if (ArmorRackJobUtil.PawnCanEquipWeaponSet(armorRack, selPawn))
            {
                // Transfer to
                var swapWithOption = new FloatMenuOption("ArmorRacks_TransferToRack_FloatMenuLabel".Translate(), delegate
                {
                    var target_info = new LocalTargetInfo(armorRack);
                    var wearRackJob = new Job(ArmorRacksJobDefOf.ArmorRacks_JobTransferToRack, target_info);
                    selPawn.jobs.TryTakeOrderedJob(wearRackJob);
                });
                yield return(FloatMenuUtility.DecoratePrioritizedTask(swapWithOption, selPawn, armorRack, "ReservedBy"));
            }
            else
            {
                yield return(new FloatMenuOption("ArmorRacks_WearRack_FloatMenuLabel_NonViolent".Translate(), null));

                nonViolentOptionYielded = true;
            }

            if (ForbidUtility.IsForbidden(armorRack, selPawn))
            {
                yield break;
            }

            if (ArmorRackJobUtil.RackHasItems(armorRack))
            {
                if (ArmorRackJobUtil.PawnCanEquipWeaponSet(armorRack, selPawn))
                {
                    // Equip from
                    var equipFromOption = new FloatMenuOption("ArmorRacks_WearRack_FloatMenuLabel".Translate(), delegate
                    {
                        var target_info = new LocalTargetInfo(armorRack);
                        var wearRackJob = new Job(ArmorRacksJobDefOf.ArmorRacks_JobWearRack, target_info);
                        selPawn.jobs.TryTakeOrderedJob(wearRackJob);
                    });
                    yield return(FloatMenuUtility.DecoratePrioritizedTask(equipFromOption, selPawn, armorRack, "ReservedBy"));
                }
                else if (!nonViolentOptionYielded)
                {
                    yield return(new FloatMenuOption("ArmorRacks_WearRack_FloatMenuLabel_NonViolent".Translate(), null));
                }
            }
            else
            {
                yield return(new FloatMenuOption("ArmorRacks_WearRack_FloatMenuLabel_Empty".Translate(), null));
            }
        }
        private void DrawThingRow(ref float y, float width, Thing thing)
        {
            Rect rect = new Rect(0f, y, width, 28f);

            Widgets.InfoCardButton(rect.width - 24f, y, thing);
            rect.width -= 24f;

            Rect rect2 = new Rect(rect.width - 24f, y, 24f, 24f);

            TooltipHandler.TipRegion(rect2, "Allow/Forbid"); // Replace "Allow/Forbid" with a translated entry in a Keyed Language XML file

            bool forbidFlag = !thing.IsForbidden(Faction.OfPlayer);

            Widgets.Checkbox(rect2.x, rect2.y, ref forbidFlag, 24f, false, true, null, null);

            ForbidUtility.SetForbidden(thing, !forbidFlag, false);

            rect.width -= 24f;

            Rect rect3 = rect;

            rect3.xMin = rect3.xMax - 60f;
            RimWorld.Planet.CaravanThingsTabUtility.DrawMass(thing, rect3);
            rect.width -= 60f;
            if (Mouse.IsOver(rect))
            {
                GUI.color = ITab_Pawn_Gear.HighlightColor;
                GUI.DrawTexture(rect, TexUI.HighlightTex);
            }
            if (thing.def.DrawMatSingle != null && thing.def.DrawMatSingle.mainTexture != null)
            {
                Widgets.ThingIcon(new Rect(4f, y, 28f, 28f), thing, 1f);
            }
            Text.Anchor = TextAnchor.MiddleLeft;
            GUI.color   = ITab_Pawn_Gear.ThingLabelColor;
            Rect    rect4   = new Rect(36f, y, rect.width - 36f, rect.height);
            string  text    = thing.LabelCap;
            Apparel apparel = thing as Apparel;

            Text.WordWrap = false;
            Widgets.Label(rect4, text.Truncate(rect4.width, null));
            Text.WordWrap = true;
            string text2 = thing.DescriptionDetailed;

            if (thing.def.useHitPoints)
            {
                string text3 = text2;
                text2 = string.Concat(new object[]
                {
                    text3,
                    "\n",
                    thing.HitPoints,
                    " / ",
                    thing.MaxHitPoints
                });
            }
            TooltipHandler.TipRegion(rect, text2);
            y += 28f;
        }
        // Token: 0x0600003E RID: 62 RVA: 0x00003028 File Offset: 0x00001228
        private Thing FindIngredient(Pawn pawn, Thing fermenter)
        {
            ThingFilter       filter     = ThingCompUtility.TryGetComp <CompUniversalFermenter>(fermenter).Product.ingredientFilter;
            Predicate <Thing> predicate  = (Thing x) => !ForbidUtility.IsForbidden(x, pawn) && ReservationUtility.CanReserve(pawn, x, 1, -1, null, false) && filter.Allows(x);
            Predicate <Thing> predicate2 = predicate;

            return(GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, filter.BestThingRequest, (PathEndMode)3, TraverseParms.For(pawn, (Danger)3, 0, false), 9999f, predicate2, null, 0, -1, false, (RegionType)6, false));
        }
Ejemplo n.º 10
0
        public static Building_BaseRobotRechargeStation FindRechargeStationFor(ArcBaseRobot sleeper, ArcBaseRobot traveler, bool sleeperWillBePrisoner, bool checkSocialProperness, bool medicalBedNeeded = false)
        {
            Predicate <Thing> predicate = delegate(Thing t) {
                bool flag3 = !ReservationUtility.CanReserveAndReach(traveler, t, PathEndMode.OnCell, Danger.Some, 1, -1, null, false);
                bool result2;
                if (flag3)
                {
                    result2 = false;
                }
                else
                {
                    Building_BaseRobotRechargeStation rechargeStation = t as Building_BaseRobotRechargeStation;
                    bool flag4 = rechargeStation == null;
                    if (flag4)
                    {
                        result2 = false;
                    }
                    else
                    {
                        bool flag5 = rechargeStation.robot != null && rechargeStation.robot != sleeper;
                        if (flag5)
                        {
                            result2 = false;
                        }
                        else
                        {
                            bool flag6 = ForbidUtility.IsForbidden(rechargeStation, traveler);
                            if (flag6)
                            {
                                result2 = false;
                            }
                            else
                            {
                                bool flag7 = FireUtility.IsBurning(rechargeStation);
                                result2 = !flag7;
                            }
                        }
                    }
                }
                return(result2);
            };
            bool flag = sleeper.rechargeStation != null && predicate(sleeper.rechargeStation);
            Building_BaseRobotRechargeStation result;

            if (flag)
            {
                Building_BaseRobotRechargeStation rechargeStation = sleeper.rechargeStation;
                bool flag2 = rechargeStation != null;
                if (flag2)
                {
                    result = rechargeStation;
                    return(result);
                }
            }
            result = null;
            return(result);
        }
Ejemplo n.º 11
0
 // Token: 0x0600000B RID: 11 RVA: 0x000022E0 File Offset: 0x000004E0
 public void DropBox(Pawn pawn, Apparel box)
 {
     if (pawn != null && box != null && (pawn?.Map) != null && pawn.apparel.TryDrop(box, out Apparel apparel, pawn.Position, true))
     {
         if (apparel != null)
         {
             ForbidUtility.SetForbidden(apparel, true, false);
         }
         pawn.apparel.Notify_ApparelRemoved(box);
     }
 }
Ejemplo n.º 12
0
 public bool ReceiveThing(Thing thingToReceive)
 {
     if (thingToReceive != null && !thingToReceive.IsChunk())
     {
         if (compWarehouse != null)
         {
             compWarehouse.buffer.RemoveAll(x => x == thingToReceive);
         }
         foreach (IntVec3 cellReceiving in parent.OccupiedRect().Cells)
         {
             if (cellReceiving.AllowedToAccept(parent.Map, thingToReceive) &&
                 cellReceiving.Priority(parent.Map) >= thingToReceive.Position.Priority(parent.Map))
             {
                 IntVec3      thingToReceiveCell = thingToReceive.Position;
                 List <Thing> thingsReceiving    = cellReceiving.GetItemList(parent.Map);
                 if (thingsReceiving.Count < maxStacks &&
                     thingToReceive.stackCount > 0)
                 {
                     thingToReceiveCell.ThrowDustPuff(parent.Map);
                     Thing thing = GenSpawn.Spawn(thingToReceive.SplitOff(thingToReceive.stackCount), cellReceiving, parent.Map);
                     cellReceiving.DropSound(parent.Map, thing.def);
                     SlotGroup slotGroup = cellReceiving.GetSlotGroup(parent.Map);
                     if (slotGroup != null && slotGroup.parent != null)
                     {
                         slotGroup.parent.Notify_ReceivedThing(thing);
                     }
                     return(true);
                 }
                 else
                 {
                     foreach (Thing thingReceiving in thingsReceiving)
                     {
                         if (thingReceiving.CanAbsorb(thingToReceive))
                         {
                             int thingReceivingStackCount = thingReceiving.stackCount;
                             if (thingReceiving.TryAbsorbStack(thingToReceive, true))
                             {
                                 thingToReceiveCell.ThrowDustPuff(parent.Map);
                             }
                             if (thingReceivingStackCount != thingReceiving.stackCount)
                             {
                                 ForbidUtility.SetForbidden(thingReceiving, false, false);
                                 cellReceiving.DropSound(parent.Map, thingReceiving.def);
                             }
                             return(true);
                         }
                     }
                 }
             }
         }
     }
     return(false);
 }
 public static bool CustomForbidConditions(Thing thing, Pawn pawn)
 {
     if (PrisonerFoodReservation.IsReserved(thing) && !pawn.IsPrisoner)
     {
         return(true);
     }
     if (pawn.IsWatched() && ForbidUtility.IsForbidden(thing, Faction.OfPlayer))
     {
         return(true);
     }
     return(false);
 }
Ejemplo n.º 14
0
 private Area GetAllowedArea(Pawn pawn)
 {
     if (pawn != null && pawn.playerSettings != null && !pawn.Drafted && ForbidUtility.CaresAboutForbidden(pawn, true))
     {
         Area area = pawn.playerSettings.EffectiveAreaRestrictionInPawnCurrentMap;
         if (!(area is null) && area.TrueCount <= 0)
         {
             area = null;
         }
         return(area);
     }
     return(null);
 }
        private void DefragStockpileStacks()
        {
            CompRTQuantumStockpile sourceStockpile = compStockpiles[qsSourceIndex];
            CompRTQuantumStockpile targetStockpile = compStockpiles[qsTargetIndex];

            foreach (IntVec3 targetCell in targetStockpile.parent.OccupiedRect().Cells)
            {
                if (sparklesEnabled)
                {
                    targetCell.ThrowSparkle();
                }
                foreach (IntVec3 sourceCell in sourceStockpile.parent.OccupiedRect().Cells)
                {
                    List <Thing> targetThings = targetCell.GetItemList();
                    for (int i = 0; i < targetThings.Count(); i++)
                    {
                        bool  itemWasMoved = false;
                        Thing targetThing  = targetThings[i];
                        if (targetThing != null && targetCell.AllowedToAccept(targetThing))
                        {
                            List <Thing> sourceThings = sourceCell.GetItemList();
                            for (int j = 0; j < sourceThings.Count(); j++)
                            {
                                Thing sourceThing = sourceThings[j];
                                if (targetThing.CanAbsorb(sourceThing) &&
                                    sourceThing.stackCount < sourceThing.def.stackLimit)
                                {
                                    int targetStackCount = targetThing.stackCount;
                                    if (targetThing.TryAbsorbStack(sourceThing, true))
                                    {
                                        sourceCell.ThrowDustPuff();
                                    }
                                    if (targetStackCount != targetThing.stackCount)
                                    {
                                        ForbidUtility.SetForbidden(targetThing, false, false);
                                        targetCell.DropSound(targetThing.def);
                                    }
                                    itemWasMoved = true;
                                    break;
                                }
                            }
                        }
                        if (itemWasMoved)
                        {
                            break;
                        }
                    }
                }
            }
        }
Ejemplo n.º 16
0
        public static void ValidateArea(Pawn p)
        {
            if (ForbidUtility.InAllowedArea(p.Position, p))
            {
                return;
            }

            if (p.CurJob != null && !p.CurJob.def.casualInterruptible)
            {
                return;
            }

            p.jobs.EndCurrentJob(JobCondition.InterruptForced, true);
        }
Ejemplo n.º 17
0
        //ForbidUtility
        public static void IsForbiddenToPass_PostFix(this Thing t, Pawn pawn, ref bool __result)
        {
            if (t is Building_DoorRegionHandler reg)
            {
                //Log.Message("reg called");
                //__result = __result && ((t.Spawned && t.Position.IsForbidden(pawn) && !(t is Building_DoorRegionHandler)) || t.IsForbidden(pawn.Faction));
                //ForbidUtility.CaresAboutForbidden(pawn, false) && t.IsForbidden(pawn.Faction);
                //__result = reg.ParentDoor
                //    .IsForbidden(
                //        pawn);


                //if (!pawn.AnimalOrWildMan()) return;
                //if (pawn.playerSettings == null) return;


                //StringBuilder s = new StringBuilder();
                //s.AppendLine("t.Spawned == " + t.Spawned);
                //s.AppendLine("t.Position.IsForbidden(pawn) ==" + t.Position.IsForbidden(pawn));
                //s.AppendLine(" !pawn.Drafted ==" + !pawn.Drafted);

                //s.AppendLine("||");

                //s.AppendLine("t.IsForbidden(pawn.Faction) == " + t.IsForbidden(pawn.Faction));
                //s.AppendLine("pawn.HostileTo(t) == " + pawn.HostileTo(t));

                //s.AppendLine("t is " + t.ToString());

                //var c = t.Position;
                //s.AppendLine("ForbidUtility.CaresAboutForbidden(pawn, true) == " + ForbidUtility.CaresAboutForbidden(pawn, true));
                //s.AppendLine("!c.InAllowedArea(pawn) == " + !c.InAllowedArea(pawn));
                //s.AppendLine("pawn.mindState.maxDistToSquadFlag > 0f == " + (pawn.mindState.maxDistToSquadFlag > 0f));
                //s.AppendLine("!c.InHorDistOf(pawn.DutyLocation(), pawn.mindState.maxDistToSquadFlag)) == " + !c.InHorDistOf(pawn.DutyLocation(), pawn.mindState.maxDistToSquadFlag));
                //s.AppendLine("Result = " + (ForbidUtility.CaresAboutForbidden(pawn, true) && (!c.InAllowedArea(pawn) || (pawn.mindState.maxDistToSquadFlag > 0f && !c.InHorDistOf(pawn.DutyLocation(), pawn.mindState.maxDistToSquadFlag)))));
                //s.AppendLine("Supercool Result = " + (ForbidUtility.CaresAboutForbidden(pawn, true) && (pawn.mindState.maxDistToSquadFlag > 0f && !c.InHorDistOf(pawn.DutyLocation(), pawn.mindState.maxDistToSquadFlag))));
                //s.AppendLine("Final result: " + __result);
                //Log.Message(s.ToString());

                var tPositionIsForbidden_withoutLocationCheck = (ForbidUtility.CaresAboutForbidden(pawn, true) && (pawn.mindState.maxDistToSquadFlag > 0f && !t.Position.InHorDistOf(pawn.DutyLocation(), pawn.mindState.maxDistToSquadFlag)));

                __result =
                    ((t.Spawned && tPositionIsForbidden_withoutLocationCheck) ||
                     (t.IsForbidden(pawn.Faction) ||
                      (pawn.HostileTo(t)) && !reg.Open) ||
                     (reg.ParentDoor is Building_DoorRemote r && r.RemoteState == DoorRemote_State.ForcedClose));
                //if (__result == false && pawn.AnimalOrWildMan()) Log.Message(pawn.LabelShort + " rejected from expanded door");
                //Log.Message("Result is " + __result.ToString());
            }
        }
        public override Job JobOnCell(Pawn pawn, IntVec3 c, bool forced = false)
        {
            Job job = base.JobOnCell(pawn, c);

            if (job == null || job.plantDefToSow == null || job.plantDefToSow.blueprintDef == null)
            {
                return(job);
            }
            Zone zone = GridsUtility.GetZone(c, pawn.Map);

            if (zone != null)
            {
                foreach (IntVec3 current in GenAdj.AdjacentCells8WayRandomized())
                {
                    IntVec3 intVec = c + current;
                    if (zone.ContainsCell(intVec))
                    {
                        foreach (Thing current2 in pawn.Map.thingGrid.ThingsAt(intVec))
                        {
                            if (current2.def != job.plantDefToSow && current2.def.BlockPlanting && ReservationUtility.CanReserve(pawn, current2, 1, -1, null, false) && !ForbidUtility.IsForbidden(current2, pawn))
                            {
                                if (current2.def.category == ThingCategory.Plant)
                                {
                                    Job result = new Job(JobDefOf.CutPlant, current2);
                                    return(result);
                                }
                                if (current2.def.EverHaulable)
                                {
                                    Job result = HaulAIUtility.HaulAsideJobFor(pawn, current2);
                                    return(result);
                                }
                            }
                        }
                    }
                }
            }
            Predicate <Thing> predicate = (Thing tempThing) => !ForbidUtility.IsForbidden(tempThing, pawn.Faction) && PawnLocalAwareness.AnimalAwareOf(pawn, tempThing) && ReservationUtility.CanReserve(pawn, tempThing, 1, -1, null, false);
            Thing             thing     = GenClosest.ClosestThingReachable(c, pawn.Map, ThingRequest.ForDef(job.plantDefToSow.blueprintDef), PathEndMode.ClosestTouch, TraverseParms.For(pawn, Danger.Deadly, 0, false), 9999f, predicate, null, 0, -1, false, RegionType.Set_Passable, false);

            if (thing != null)
            {
                return(new Job(DefDatabase <JobDef> .GetNamed("SowWithSeeds"), c, thing)
                {
                    plantDefToSow = job.plantDefToSow,
                    count = 25
                });
            }
            return(null);
        }
Ejemplo n.º 19
0
        public Thing FindWeirdFoodInMap(ThingDef thingDef, Pawn pawn)
        {
            ThingRequest thingReq = ThingRequest.ForDef(thingDef);
            bool         ignoreEntirelyForbiddenRegions = ForbidUtility.CaresAboutForbidden(pawn, true) && pawn.playerSettings != null && pawn.playerSettings.EffectiveAreaRestrictionInPawnCurrentMap != null;
            Thing        thingToEat = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, thingReq, PathEndMode.ClosestTouch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, null, null, 0, -1, false, RegionType.Set_Passable, ignoreEntirelyForbiddenRegions);

            if (thingToEat != null && thingToEat.Position.InAllowedArea(pawn))
            {
                return(thingToEat);
            }
            else
            {
                return(null);
            }
        }
Ejemplo n.º 20
0
        private void doChewCorpse()
        {
            Corpse corpse = base.TargetThingA as Corpse;
            bool   flag   = corpse != null;
            bool   flag2  = flag;

            if (flag2)
            {
                IntVec3      position = corpse.Position;
                List <Thing> list     = theThing_Utility.ButcherCorpseProducts(corpse, this.pawn).ToList <Thing>();
                Thing        thing    = null;
                int          num;
                for (int i = 0; i < list.Count; i = num + 1)
                {
                    bool flag3 = !GenPlace.TryPlaceThing(list[i], position, base.Map, ThingPlaceMode.Near, out thing, null);
                    bool flag4 = flag3;
                    if (flag4)
                    {
                        this.pawn.jobs.EndCurrentJob(JobCondition.Incompletable, true);
                    }
                    bool flag5 = thing != null;
                    bool flag6 = flag5;
                    if (flag6)
                    {
                        ForbidUtility.SetForbidden(thing, true, true);
                    }
                    num = i;
                }
                bool flag7 = this.pawn.needs.mood != null;
                bool flag8 = flag7;
                if (flag8)
                {
                    this.pawn.needs.mood.thoughts.memories.TryGainMemory(ThoughtDef.Named("AteCorpse"), null);
                }
                corpse.Destroy(0);
                IEnumerable <Faction> allFactions = Find.FactionManager.AllFactions;
                Func <Faction, bool>  predicate;
                bool flag9 = (predicate = JobDriver_Segmentation.segment.letSegment) == null;
                if (flag9)
                {
                    predicate = (JobDriver_Segmentation.segment.letSegment = new Func <Faction, bool>(JobDriver_Segmentation.segment.JobSegment.doChewCorpse));
                }
                Faction faction = GenCollection.RandomElement <Faction>(allFactions.Where(predicate));
                this.abom = PawnGenerator.GeneratePawn(MODefOf.MO_AbominationPawnKind, faction);
                GenSpawn.Spawn(this.abom, position, base.Map);
            }
            this.pawn.jobs.EndCurrentJob(JobCondition.Succeeded, true);
        }
        private void TryUpdateAllowedArea(X2_AIRobot robot)
        {
            if (robot.DestroyedOrNull() || !robot.Spawned)
            {
                return;
            }
            if (ForbidUtility.InAllowedArea(this.Position, robot))
            {
                return;
            }

            Messages.Message("AIRobot_MessageRechargeStationOutsideAreaRestriction".Translate(), robot, MessageTypeDefOf.RejectInput);

            //Remove area from robot
            robot.playerSettings.Notify_AreaRemoved(robot.playerSettings.AreaRestriction);
        }
Ejemplo n.º 22
0
 // Token: 0x0600003F RID: 63 RVA: 0x0000397C File Offset: 0x00001B7C
 internal void FindBestRefuel(Pawn pilot, ThingDef FuelItem, int FuelMax, int Fuel, out Thing targ)
 {
     targ = null;
     if ((pilot?.Map) != null)
     {
         List <Thing> listfuel   = pilot?.Map.listerThings.ThingsOfDef(FuelItem);
         int          fuelneeded = FuelMax - Fuel;
         if (fuelneeded > FuelItem.stackLimit)
         {
             fuelneeded = FuelItem.stackLimit;
         }
         if (listfuel.Count > 0)
         {
             Thing besttarg   = null;
             float bestpoints = 0f;
             for (int i = 0; i < listfuel.Count; i++)
             {
                 Thing targchk = listfuel[i];
                 if (!ForbidUtility.IsForbidden(targchk, pilot) && ((targchk?.Faction) == null || targchk.Faction.IsPlayer) && ReservationUtility.CanReserveAndReach(pilot, targchk, PathEndMode.ClosestTouch, Danger.None, 1, -1, null, false))
                 {
                     float targpoints;
                     if (targchk.stackCount >= fuelneeded)
                     {
                         targpoints = (float)targchk.stackCount / IntVec3Utility.DistanceTo(pilot.Position, targchk.Position);
                     }
                     else
                     {
                         targpoints = (float)targchk.stackCount / (IntVec3Utility.DistanceTo(pilot.Position, targchk.Position) * 2f);
                     }
                     if (targpoints > bestpoints)
                     {
                         besttarg   = targchk;
                         bestpoints = targpoints;
                     }
                 }
             }
             if (besttarg != null)
             {
                 targ = besttarg;
             }
         }
     }
 }
Ejemplo n.º 23
0
        protected override void ScatterAt(IntVec3 loc, Map map, int stackCount = 1)
        {
            if (!TryGetRandomValidRotation(loc, map, out Rot4 rot))
            {
                Log.Warning("Could not find any valid rotation for " + thingDef);
                return;
            }
            if (clearSpaceSize > 0)
            {
                using (IEnumerator <IntVec3> enumerator = GridShapeMaker.IrregularLump(loc, map, clearSpaceSize).GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        Building edifice = GridsUtility.GetEdifice(enumerator.Current, map);
                        if (edifice != null)
                        {
                            edifice.Destroy(0);
                        }
                    }
                }
            }
            Thing thing = ThingMaker.MakeThing(thingDef, stuff);

            if (thingDef.Minifiable)
            {
                thing = MinifyUtility.MakeMinified(thing);
            }
            if (thing.def.category == ThingCategory.Item)
            {
                thing.stackCount = stackCount;
                ForbidUtility.SetForbidden(thing, true, false);
                GenPlace.TryPlaceThing(thing, loc, map, ThingPlaceMode.Near, out Thing thing2, null);
                if (nearPlayerStart && thing2 != null && thing2.def.category == ThingCategory.Item && TutorSystem.TutorialMode)
                {
                    Find.TutorialState.AddStartingItem(thing2);
                    return;
                }
            }
            else
            {
                GenSpawn.Spawn(thing, loc, map, rot, false);
            }
        }
Ejemplo n.º 24
0
        public Job TryGiveJob(Pawn pawn, Thing targetThing, bool NoJoyCheck = false)
        {
            Verb verb = null;

            if (pawn != null)
            {
                verb = pawn.meleeVerbs.TryGetMeleeVerb(targetThing);
            }
            Job result;

            if (pawn.WorkTagIsDisabled(WorkTags.Violent) || verb == null || verb.verbProps == null)
            {
                result = null;
            }
            else
            {
                List <Thing>      list      = pawn.Map.listerThings.ThingsOfDef(this.def.thingDefs[0]);
                Predicate <Thing> predicate = delegate(Thing t)
                {
                    return(!ForbidUtility.IsForbidden(t, pawn) &&
                           ReservationUtility.CanReserve(pawn, t, this.def.jobDef.joyMaxParticipants, -1, null, false) &&
                           SocialProperness.IsSociallyProper(t, pawn));
                };
                Thing thing = null;
                if (targetThing != null && ReachabilityUtility.CanReach(pawn, targetThing.Position, PathEndMode.InteractionCell, Danger.Deadly, false, 0) && predicate(targetThing))
                {
                    thing = targetThing;
                }
                else if (targetThing == null)
                {
                    thing = GenClosest.ClosestThing_Global_Reachable(pawn.Position, pawn.Map, list, PathEndMode.InteractionCell, TraverseParms.For(pawn, Danger.Deadly, 0, false), 9999f, predicate, null);
                }
                if (thing != null)
                {
                    Job job = JobMaker.MakeJob(this.def.jobDef, thing);
                    return(job);
                }
                result = null;
            }
            return(result);
        }
Ejemplo n.º 25
0
            internal bool CanUseThing(Thing t)
            {
                if (ForbidUtility.IsForbidden(t, this.pawn))
                {
                    return(false);
                }

                if (t is Building_AutomatedFactory)
                {
                    var FS = t as Building_AutomatedFactory;
                    if (
                        (!FS.InteractionCell.Standable()) ||
                        (!FS.CompPowerTrader.PowerOn) ||
                        (FS.BestProduct(FoodSynthesis.IsAlcohol, FoodSynthesis.SortAlcohol) == null)
                        )
                    {
                        return(false);
                    }
                }
                return(this.pawn.CanReserve(t, 1));
            }
Ejemplo n.º 26
0
        static void Postfix(Pawn sleeper, Pawn traveler, bool sleeperWillBePrisoner, bool checkSocialProperness, bool ignoreOtherReservations, ref Building_Bed __result)
        {
            if (__result == null || __result.Medical || !Helpers.ShouldRunForPawn(sleeper))
            {
                return;
            }
            var currentBeds = Helpers.PawnBedsOnMap(sleeper, sleeper.Map);

            //Log.Message("Pre-check bed count: " + currentBeds.Count.ToString());
            currentBeds = currentBeds
                          .Where(bed => sleeper.Map.reachability.CanReach(sleeper.Position, new LocalTargetInfo(bed), Verse.AI.PathEndMode.OnCell,
                                                                          new TraverseParms {
                canBash = false, maxDanger = Danger.Deadly, mode = TraverseMode.ByPawn, pawn = sleeper
            }) &&
                                 ForbidUtility.InAllowedArea(bed.Position, sleeper))
                          .ToList();
            //Log.Message("Post-check bed count: " + currentBeds.Count.ToString());
            if (currentBeds.Count > 0)
            {
                __result = currentBeds[0];
            }
        }
Ejemplo n.º 27
0
        public static bool IsForbiddenForPrisoner(this Thing t, Pawn pawn)
        {
            if (pawn.IsWatched() && ForbidUtility.IsForbidden(t, Faction.OfPlayer))
            {
                return(true);
            }
            if (!PrisonerCaresAboutForbidden(pawn, cellTarget: false))
            {
                return(false);
            }
            if (t.Spawned && t.Position.IsForbiddenForPrisoner(pawn))
            {
                return(true);
            }
            Lord lord = pawn.GetLord();

            if (lord != null && lord.extraForbiddenThings.Contains(t))
            {
                return(true);
            }
            return(false);
        }
Ejemplo n.º 28
0
 // Token: 0x0600004F RID: 79 RVA: 0x00005498 File Offset: 0x00003698
 private static bool DrugValidator(Pawn pawn, Thing drug)
 {
     if (!drug.def.IsDrug)
     {
         return(false);
     }
     if (!pawn.IsPrisoner && drug.Spawned)
     {
         if (ForbidUtility.IsForbidden(drug, pawn))
         {
             return(false);
         }
         if (!ReservationUtility.CanReserve(pawn, drug, 1, -1, null, false))
         {
             return(false);
         }
         if (!SocialProperness.IsSociallyProper(drug, pawn))
         {
             return(false);
         }
     }
     return(true);
 }
        //public static bool IsForbidden(this Thing t, Pawn pawn)
        public static bool IsForbiddenByType(Thing thing, Pawn pawn, WorkGiver_Grower workGiver)
        {
            if (!Mod.settings.zoneHarvestableToggle ||
                !(workGiver is WorkGiver_GrowerHarvest))
            {
                return(thing.IsForbidden(pawn));
            }

            //WorkGiver_GrowerHarvest now
            //Reimplementing IsForbidden with ForbidHarvestBuildingMapComp instead of forbidden comp
            if (!ForbidUtility.CaresAboutForbidden(pawn, false))
            {
                return(false);
            }
            if (thing.Spawned && thing.Position.IsForbidden(pawn))
            {
                return(true);
            }
            //if (thing.IsForbidden(pawn.Faction) || thing.IsForbidden(pawn.HostFaction))
            //{
            //	return true;
            //}
            return(!thing.CanHarvest());
        }
Ejemplo n.º 30
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (!Controller.settings.EnableAmmoSystem || !Controller.settings.AutoTakeAmmo)
            {
                return(null);
            }

            if (!pawn.RaceProps.Humanlike || (pawn.story != null && pawn.story.WorkTagIsDisabled(WorkTags.Violent)))
            {
                return(null);
            }
            if (pawn.Faction.IsPlayer && pawn.Drafted)
            {
                return(null);
            }

            if (!Rand.MTBEventOccurs(60, 1, 30))
            {
                return(null);
            }

            // Log.Message(pawn.ToString() +  " - priority:" + (GetPriorityWork(pawn)).ToString() + " capacityWeight: " + pawn.TryGetComp<CompInventory>().capacityWeight.ToString() + " currentWeight: " + pawn.TryGetComp<CompInventory>().currentWeight.ToString() + " capacityBulk: " + pawn.TryGetComp<CompInventory>().capacityBulk.ToString() + " currentBulk: " + pawn.TryGetComp<CompInventory>().currentBulk.ToString());

            var           brawler         = (pawn.story != null && pawn.story.traits != null && pawn.story.traits.HasTrait(TraitDefOf.Brawler));
            CompInventory inventory       = pawn.TryGetComp <CompInventory>();
            bool          hasPrimary      = (pawn.equipment != null && pawn.equipment.Primary != null);
            CompAmmoUser  primaryammouser = hasPrimary ? pawn.equipment.Primary.TryGetComp <CompAmmoUser>() : null;

            if (inventory != null)
            {
                // Prefer ranged weapon in inventory
                if (!pawn.Faction.IsPlayer && hasPrimary && pawn.equipment.Primary.def.IsMeleeWeapon && !brawler)
                {
                    if ((pawn.skills.GetSkill(SkillDefOf.Shooting).Level >= pawn.skills.GetSkill(SkillDefOf.Melee).Level ||
                         pawn.skills.GetSkill(SkillDefOf.Shooting).Level >= 6))
                    {
                        ThingWithComps InvListGun3 = inventory.rangedWeaponList.Find(thing => thing.TryGetComp <CompAmmoUser>() != null && thing.TryGetComp <CompAmmoUser>().HasAmmoOrMagazine);
                        if (InvListGun3 != null)
                        {
                            inventory.TrySwitchToWeapon(InvListGun3);
                        }
                    }
                }

                // Drop excess ranged weapon
                if (!pawn.Faction.IsPlayer && primaryammouser != null && GetPriorityWork(pawn) == WorkPriority.Unloading && inventory.rangedWeaponList.Count >= 1)
                {
                    Thing ListGun = inventory.rangedWeaponList.Find(thing => thing.TryGetComp <CompAmmoUser>() != null && thing.def != pawn.equipment.Primary.def);
                    if (ListGun != null)
                    {
                        Thing ammoListGun = null;
                        if (!ListGun.TryGetComp <CompAmmoUser>().HasAmmoOrMagazine)
                        {
                            foreach (AmmoLink link in ListGun.TryGetComp <CompAmmoUser>().Props.ammoSet.ammoTypes)
                            {
                                if (inventory.ammoList.Find(thing => thing.def == link.ammo) == null)
                                {
                                    ammoListGun = ListGun;
                                    break;
                                }
                            }
                        }
                        if (ammoListGun != null)
                        {
                            Thing droppedWeapon;
                            if (inventory.container.TryDrop(ListGun, pawn.Position, pawn.Map, ThingPlaceMode.Near, ListGun.stackCount, out droppedWeapon))
                            {
                                pawn.jobs.EndCurrentJob(JobCondition.None, true);
                                pawn.jobs.TryTakeOrderedJob(new Job(JobDefOf.DropEquipment, droppedWeapon, 30, true));
                            }
                        }
                    }
                }

                // Find and drop not need ammo from inventory
                if (!pawn.Faction.IsPlayer && hasPrimary && inventory.ammoList.Count > 1 && GetPriorityWork(pawn) == WorkPriority.Unloading)
                {
                    Thing WrongammoThing = null;
                    WrongammoThing = primaryammouser != null
                        ? inventory.ammoList.Find(thing => !primaryammouser.Props.ammoSet.ammoTypes.Any(a => a.ammo == thing.def))
                        : inventory.ammoList.RandomElement <Thing>();

                    if (WrongammoThing != null)
                    {
                        Thing InvListGun = inventory.rangedWeaponList.Find(thing => hasPrimary && thing.TryGetComp <CompAmmoUser>() != null && thing.def != pawn.equipment.Primary.def);
                        if (InvListGun != null)
                        {
                            Thing ammoInvListGun = null;
                            foreach (AmmoLink link in InvListGun.TryGetComp <CompAmmoUser>().Props.ammoSet.ammoTypes)
                            {
                                ammoInvListGun = inventory.ammoList.Find(thing => thing.def == link.ammo);
                                break;
                            }
                            if (ammoInvListGun != null && ammoInvListGun != WrongammoThing)
                            {
                                Thing droppedThingAmmo;
                                if (inventory.container.TryDrop(ammoInvListGun, pawn.Position, pawn.Map, ThingPlaceMode.Near, ammoInvListGun.stackCount, out droppedThingAmmo))
                                {
                                    pawn.jobs.EndCurrentJob(JobCondition.None, true);
                                    pawn.jobs.TryTakeOrderedJob(new Job(JobDefOf.DropEquipment, 30, true));
                                }
                            }
                        }
                        else
                        {
                            Thing droppedThing;
                            if (inventory.container.TryDrop(WrongammoThing, pawn.Position, pawn.Map, ThingPlaceMode.Near, WrongammoThing.stackCount, out droppedThing))
                            {
                                pawn.jobs.EndCurrentJob(JobCondition.None, true);
                                pawn.jobs.TryTakeOrderedJob(new Job(JobDefOf.DropEquipment, 30, true));
                            }
                        }
                    }
                }

                Room room = RegionAndRoomQuery.RoomAtFast(pawn.Position, pawn.Map);

                // Find weapon in inventory and try to switch if any ammo in inventory.
                if (GetPriorityWork(pawn) == WorkPriority.Weapon && !hasPrimary)
                {
                    ThingWithComps InvListGun2 = inventory.rangedWeaponList.Find(thing => thing.TryGetComp <CompAmmoUser>() != null);

                    if (InvListGun2 != null)
                    {
                        Thing ammoInvListGun2 = null;
                        foreach (AmmoLink link in InvListGun2.TryGetComp <CompAmmoUser>().Props.ammoSet.ammoTypes)
                        {
                            ammoInvListGun2 = inventory.ammoList.Find(thing => thing.def == link.ammo);
                            break;
                        }
                        if (ammoInvListGun2 != null)
                        {
                            inventory.TrySwitchToWeapon(InvListGun2);
                        }
                    }

                    // Find weapon with near ammo for ai.
                    if (!pawn.Faction.IsPlayer)
                    {
                        Predicate <Thing> validatorWS = (Thing w) => w.def.IsWeapon &&
                                                        w.MarketValue > 500 && pawn.CanReserve(w, 1) &&
                                                        (DangerInPosRadius(pawn, w.Position, pawn.Map, 30f).Count() <= 0
                                                    ? pawn.Position.InHorDistOf(w.Position, 25f)
                                                    : pawn.Position.InHorDistOf(w.Position, 6f)) &&
                                                        pawn.CanReach(w, PathEndMode.Touch, Danger.Deadly, true) &&
                                                        (pawn.Faction.HostileTo(Faction.OfPlayer) || pawn.Faction == Faction.OfPlayer || !pawn.Map.areaManager.Home[w.Position]);

                        // generate a list of all weapons (this includes melee weapons)
                        List <Thing> allWeapons = (
                            from w in pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.HaulableAlways)
                            where validatorWS(w)
                            orderby w.MarketValue - w.Position.DistanceToSquared(pawn.Position) * 2f descending
                            select w
                            ).ToList();

                        // now just get the ranged weapons out...
                        List <Thing> rangedWeapons = allWeapons.Where(w => w.def.IsRangedWeapon).ToList();

                        if (!rangedWeapons.NullOrEmpty())
                        {
                            foreach (Thing thing in rangedWeapons)
                            {
                                if (thing.TryGetComp <CompAmmoUser>() == null)
                                {
                                    // pickup a non-CE ranged weapon...
                                    int numToThing = 0;
                                    if (inventory.CanFitInInventory(thing, out numToThing))
                                    {
                                        return(new Job(JobDefOf.Equip, thing)
                                        {
                                            checkOverrideOnExpire = true,
                                            expiryInterval = 100
                                        });
                                    }
                                }
                                else
                                {
                                    // pickup a CE ranged weapon...
                                    List <ThingDef> thingDefAmmoList = thing.TryGetComp <CompAmmoUser>().Props.ammoSet.ammoTypes.Select(g => g.ammo as ThingDef).ToList();

                                    Predicate <Thing> validatorA = (Thing t) => t.def.category == ThingCategory.Item &&
                                                                   t is AmmoThing && pawn.CanReserve(t, 1) &&
                                                                   (DangerInPosRadius(pawn, t.Position, pawn.Map, 30f).Count() <= 0
                                                                ? pawn.Position.InHorDistOf(t.Position, 25f)
                                                                : pawn.Position.InHorDistOf(t.Position, 6f)) &&
                                                                   pawn.CanReach(t, PathEndMode.Touch, Danger.Deadly, true) &&
                                                                   (pawn.Faction.HostileTo(Faction.OfPlayer) || pawn.Faction == Faction.OfPlayer || !pawn.Map.areaManager.Home[t.Position]);

                                    List <Thing> thingAmmoList = (
                                        from t in pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.HaulableAlways)
                                        where validatorA(t)
                                        select t
                                        ).ToList();

                                    if (thingAmmoList.Count > 0 && thingDefAmmoList.Count > 0)
                                    {
                                        int   desiredStackSize = thing.TryGetComp <CompAmmoUser>().Props.magazineSize * 2;
                                        Thing th = thingAmmoList.FirstOrDefault(x => thingDefAmmoList.Contains(x.def) && x.stackCount > desiredStackSize);
                                        if (th != null)
                                        {
                                            int numToThing = 0;
                                            if (inventory.CanFitInInventory(thing, out numToThing))
                                            {
                                                return(new Job(JobDefOf.Equip, thing)
                                                {
                                                    checkOverrideOnExpire = true,
                                                    expiryInterval = 100
                                                });
                                            }
                                        }
                                    }
                                }
                            }
                        }

                        // else if no ranged weapons with nearby ammo was found, lets consider a melee weapon.
                        if (allWeapons != null && allWeapons.Count > 0)
                        {
                            // since we don't need to worry about ammo, just pick one.
                            Thing meleeWeapon = allWeapons.FirstOrDefault(w => !w.def.IsRangedWeapon && w.def.IsMeleeWeapon);

                            if (meleeWeapon != null)
                            {
                                return(new Job(JobDefOf.Equip, meleeWeapon)
                                {
                                    checkOverrideOnExpire = true,
                                    expiryInterval = 100
                                });
                            }
                        }
                    }
                }

                // Find ammo
                if ((GetPriorityWork(pawn) == WorkPriority.Ammo || GetPriorityWork(pawn) == WorkPriority.LowAmmo) &&
                    primaryammouser != null)
                {
                    List <ThingDef> curAmmoList = (from AmmoLink g in primaryammouser.Props.ammoSet.ammoTypes
                                                   select g.ammo as ThingDef).ToList();

                    if (curAmmoList.Count > 0)
                    {
                        Predicate <Thing> validator = (Thing t) => t is AmmoThing && pawn.CanReserve(t, 1) &&
                                                      pawn.CanReach(t, PathEndMode.Touch, Danger.Deadly, true) &&
                                                      ((pawn.Faction.IsPlayer && !ForbidUtility.IsForbidden(t, pawn)) || (!pawn.Faction.IsPlayer && DangerInPosRadius(pawn, t.Position, Find.VisibleMap, 30f).Count() <= 0
                                                                ? pawn.Position.InHorDistOf(t.Position, 25f)
                                                                : pawn.Position.InHorDistOf(t.Position, 6f))) &&
                                                      (pawn.Faction.HostileTo(Faction.OfPlayer) || pawn.Faction == Faction.OfPlayer || !pawn.Map.areaManager.Home[t.Position]);
                        List <Thing> curThingList = (
                            from t in pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.HaulableAlways)
                            where validator(t)
                            select t
                            ).ToList();
                        foreach (Thing th in curThingList)
                        {
                            foreach (ThingDef thd in curAmmoList)
                            {
                                if (thd == th.def)
                                {
                                    //Defence from low count loot spam
                                    float thw = (th.GetStatValue(CE_StatDefOf.Bulk)) * th.stackCount;
                                    if (thw > 0.5f)
                                    {
                                        if (pawn.Faction.IsPlayer)
                                        {
                                            int SearchRadius = 0;
                                            if (GetPriorityWork(pawn) == WorkPriority.LowAmmo)
                                            {
                                                SearchRadius = 70;
                                            }
                                            else
                                            {
                                                SearchRadius = 30;
                                            }

                                            Thing closestThing = GenClosest.ClosestThingReachable(
                                                pawn.Position,
                                                pawn.Map,
                                                ThingRequest.ForDef(th.def),
                                                PathEndMode.ClosestTouch,
                                                TraverseParms.For(pawn, Danger.None, TraverseMode.ByPawn),
                                                SearchRadius,
                                                x => !x.IsForbidden(pawn) && pawn.CanReserve(x));

                                            if (closestThing != null)
                                            {
                                                int numToCarry = 0;
                                                if (inventory.CanFitInInventory(th, out numToCarry))
                                                {
                                                    return(new Job(JobDefOf.TakeInventory, th)
                                                    {
                                                        count = numToCarry
                                                    });
                                                }
                                            }
                                        }
                                        else
                                        {
                                            int numToCarry = 0;
                                            if (inventory.CanFitInInventory(th, out numToCarry))
                                            {
                                                return(new Job(JobDefOf.TakeInventory, th)
                                                {
                                                    count = Mathf.RoundToInt(numToCarry * 0.8f),
                                                    expiryInterval = 150,
                                                    checkOverrideOnExpire = true
                                                });
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                /*
                 * if (!pawn.Faction.IsPlayer && pawn.apparel != null && GetPriorityWork(pawn) == WorkPriority.Apparel)
                 * {
                 *  if (!pawn.apparel.BodyPartGroupIsCovered(BodyPartGroupDefOf.Torso))
                 *  {
                 *      Apparel apparel = this.FindGarmentCoveringPart(pawn, BodyPartGroupDefOf.Torso);
                 *      if (apparel != null)
                 *      {
                 *          int numToapparel = 0;
                 *          if (inventory.CanFitInInventory(apparel, out numToapparel))
                 *          {
                 *              return new Job(JobDefOf.Wear, apparel)
                 *              {
                 *                  ignoreForbidden = true
                 *              };
                 *          }
                 *      }
                 *  }
                 *  if (!pawn.apparel.BodyPartGroupIsCovered(BodyPartGroupDefOf.Legs))
                 *  {
                 *      Apparel apparel2 = this.FindGarmentCoveringPart(pawn, BodyPartGroupDefOf.Legs);
                 *      if (apparel2 != null)
                 *      {
                 *          int numToapparel2 = 0;
                 *          if (inventory.CanFitInInventory(apparel2, out numToapparel2))
                 *          {
                 *              return new Job(JobDefOf.Wear, apparel2)
                 *              {
                 *                  ignoreForbidden = true
                 *              };
                 *          }
                 *      }
                 *  }
                 *  if (!pawn.apparel.BodyPartGroupIsCovered(BodyPartGroupDefOf.FullHead))
                 *  {
                 *      Apparel apparel3 = this.FindGarmentCoveringPart(pawn, BodyPartGroupDefOf.FullHead);
                 *      if (apparel3 != null)
                 *      {
                 *          int numToapparel3 = 0;
                 *          if (inventory.CanFitInInventory(apparel3, out numToapparel3))
                 *          {
                 *              return new Job(JobDefOf.Wear, apparel3)
                 *              {
                 *                  ignoreForbidden = true,
                 *                  locomotionUrgency = LocomotionUrgency.Sprint
                 *              };
                 *          }
                 *      }
                 *  }
                 * }
                 */
                return(null);
            }
            return(null);
        }