Exemple #1
0
        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            // No designation
            if (pawn.Map.designationManager.DesignationOn(t, DesignationDefOf.VFES_RearmTrap) == null)
            {
                return(false);
            }

            // Cannot reserve
            if (!pawn.CanReserve(t, ignoreOtherReservations: forced))
            {
                return(false);
            }

            // No movable items off trap
            var thingList = t.Position.GetThingList(t.Map);

            for (int i = 0; i < thingList.Count; i++)
            {
                var thing = thingList[i];
                if (thing != t && thing.def.category == ThingCategory.Item && (thing.IsForbidden(pawn) || thing.IsInValidStorage() || !HaulAIUtility.CanHaulAside(pawn, thing, out IntVec3 storeCell)))
                {
                    return(false);
                }
            }

            return(true);
        }
Exemple #2
0
        // Token: 0x06000009 RID: 9 RVA: 0x0000211C File Offset: 0x0000031C
        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            if (pawn.Map.designationManager.DesignationOn(t, TrapsDefOf.TR_RearmTrap) == null)
            {
                return(false);
            }
            LocalTargetInfo localTargetInfo = t;

            if (!ReservationUtility.CanReserve(pawn, localTargetInfo, 1, -1, null, forced))
            {
                return(false);
            }
            List <Thing> thingList = GridsUtility.GetThingList(t.Position, t.Map);

            for (int i = 0; i < thingList.Count; i++)
            {
                if (thingList[i] != t && thingList[i].def.category == ThingCategory.Item && (ForbidUtility.IsForbidden(thingList[i], pawn) || StoreUtility.IsInValidStorage(thingList[i]) || !HaulAIUtility.CanHaulAside(pawn, thingList[i], out IntVec3 intVec)))
                {
                    return(false);
                }
            }
            return(true);
        }
        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            if (pawn.Map.designationManager.DesignationOn(t, BetaTrapDefOf.RearmTrap) == null)
            {
                return(false);
            }
            LocalTargetInfo target = t;

            if (!pawn.CanReserve(target, 1, -1, null, forced))
            {
                return(false);
            }
            List <Thing> thingList = t.Position.GetThingList(t.Map);

            for (int i = 0; i < thingList.Count; i++)
            {
                IntVec3 intVec;
                if (thingList[i] != t && thingList[i].def.category == ThingCategory.Item && (thingList[i].IsForbidden(pawn) || thingList[i].IsInValidStorage() || !HaulAIUtility.CanHaulAside(pawn, thingList[i], out intVec)))
                {
                    return(false);
                }
            }
            return(true);
        }
Exemple #4
0
        public static bool CheckOportunisticToolJob(Pawn pawn, Job currJob, out Job toolJob)
        {
            toolJob = null;
            if (!pawn.CanUseTools(out var tracker) || pawn.InMentalState || pawn.IsBurning())
            {
                return(false);
            }
            var      jobDef = currJob.def;
            ToolType toolType;

            if (jobDef == RimWorld.JobDefOf.DoBill)
            {
                var billGiver = currJob.targetA.Thing.def;
                toolType = Dictionaries.billGiverToolType.TryGetValue(billGiver);
            }
            else
            {
                toolType = Dictionaries.jobToolType.TryGetValue(jobDef);
            }
            var toolList = tracker.memoryTool.ToList();

            if (toolType != null)
            {
                toolList.RemoveAll(t => t.ToolTypes().Contains(toolType));
            }
            // Return tool
            if (!toolList.NullOrEmpty() && jobDef.allowOpportunisticPrefix && !jobDef.IsReturningTool())
            {
                bool           foundPos = false;
                IntVec3        bestPos  = pawn.PositionHeld;
                ThingWithComps tool     = null;
                IntVec3        pawnPos  = pawn.PositionHeld;
                foreach (var currTool in toolList)
                {
                    if (HaulAIUtility.CanHaulAside(pawn, currTool, out var pos))
                    {
                        if (!foundPos)
                        {
                            bestPos  = pos;
                            tool     = currTool;
                            foundPos = true;
                            continue;
                        }
                        if (pos.DistanceTo(pawnPos) < bestPos.DistanceTo(pawnPos))
                        {
                            bestPos = pos;
                            tool    = currTool;
                        }
                    }
                }
                if (foundPos)
                {
                    toolJob = pawn.PutAwayTool(tool, false);
                    TransformJob(ref toolJob);
                    return(true);
                }
                return(false);
            }
            // Take tool
            else if (toolType != null)
            {
                if (!toolType.emergencyTool && !jobDef.allowOpportunisticPrefix)
                {
                    return(false);
                }
                if (tracker.UsedHandler.BestTool[toolType] != null)
                {
                    return(false);
                }
                var mapTracker = pawn.MapHeld.GetMapToolTracker();
                var tool       = mapTracker.ClosestTool(toolType, pawn.PositionHeld, pawn);
                if (tool != null)
                {
                    toolJob = pawn.TakeTool(tool);
                    TransformJob(ref toolJob);
                    pawn.MapHeld.reservationManager.Reserve(pawn, toolJob, tool);
                    return(true);
                }
            }
            return(false);
        }