public override bool HasJobOnThing(Pawn pawn, Thing t)
        {
            Apparel_Toolbelt toolbelt = ToolsForHaulUtility.TryGetToolbelt(pawn);

            if (toolbelt == null)
            {
                return(false);
            }

            if (!pawn.CanReserveAndReach(t, PathEndMode.ClosestTouch, Danger.Some))
            {
                return(false);
            }

            if (toolbelt.slotsComp.slots.Contains(t.def))
            {
                return(false);
            }

            if (pawn.equipment.Primary != null && pawn.equipment.Primary.def.Equals(t.def))
            {
                return(false);
            }


            return(true);
        }
        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced)
        {
            Apparel_Toolbelt toolbelt = ToolsForHaulUtility.TryGetToolbelt(pawn);

            if (toolbelt == null)
            {
                return(false);
            }

            if (!HaulAIUtility.PawnCanAutomaticallyHaul(pawn, t, forced))
            {
                return(false);
            }

            if (toolbelt.slotsComp.slots.Contains(t.def))
            {
                return(false);
            }

            if (pawn.equipment.Primary != null && pawn.equipment.Primary.def.Equals(t.def))
            {
                return(false);
            }


            return(true);
        }
        internal static bool TryDrop(this Pawn_ApparelTracker _this, Apparel ap, out Apparel resultingAp, IntVec3 pos, bool forbid = true)
        {
            // drop all toolbelt & backpack stuff so that it won't disappear
            Apparel_Backpack backpack  = ap as Apparel_Backpack;
            Apparel_Toolbelt toolbelt  = ap as Apparel_Toolbelt;
            Thing            dropThing = null;

            if (backpack?.SlotsComp?.slots?.Count >= 1)
            {
                foreach (Thing slot in backpack.SlotsComp.slots)
                {
                    GenThing.TryDropAndSetForbidden(slot, pos, ap.Map, ThingPlaceMode.Near, out dropThing, forbid);
                }
            }

            if (toolbelt?.slotsComp?.slots?.Count >= 1)
            {
                foreach (Thing slot in toolbelt.slotsComp.slots)
                {
                    GenThing.TryDropAndSetForbidden(slot, pos, ap.Map, ThingPlaceMode.Near, out dropThing, forbid);
                }

                for (int i = MapComponent_ToolsForHaul.CachedToolEntries.Count - 1;
                     i >= 0;
                     i--)
                {
                    var entry = MapComponent_ToolsForHaul.CachedToolEntries[i];
                    if (entry.pawn == _this.pawn)
                    {
                        MapComponent_ToolsForHaul.CachedToolEntries.RemoveAt(i);
                    }
                }
            }


            if (!_this.WornApparel.Contains(ap))
            {
                Log.Warning(_this.pawn.LabelCap + " tried to drop apparel he didn't have: " + ap.LabelCap);
                resultingAp = null;
                return(false);
            }
            if (_this.pawn.MapHeld == null)
            {
                Log.Warning(_this.pawn.LabelCap + " tried to drop apparel but his MapHeld is null.");
                resultingAp = null;
                return(false);
            }
            ap.Notify_Stripped(_this.pawn);
            _this.Remove(ap);
            Thing thing  = null;
            bool  result = GenThing.TryDropAndSetForbidden(ap, pos, _this.pawn.MapHeld, ThingPlaceMode.Near, out thing, forbid);

            resultingAp = (thing as Apparel);

#if CR
            Combat_Realism.CR_Utility.TryUpdateInventory(_this.pawn);     // Apparel was dropped, update inventory
#endif
            return(result);
        }
        public override bool ShouldSkip(Pawn pawn)
        {
            Apparel_Toolbelt toolbelt = ToolsForHaulUtility.TryGetToolbelt(pawn);

            //Should skip pawn that don't have a toolbelt.
            if (toolbelt == null)
            {
                return(true);
            }

            // Skip it toolbelt full

            if (toolbelt.MaxItem <= toolbelt.slotsComp.slots.Count)
            {
                return(true);
            }

            return(false);
        }
        public override Job JobOnThing(Pawn pawn, Thing thing)
        {
            Apparel_Toolbelt toolbelt = ToolsForHaulUtility.TryGetToolbelt(pawn);

            if (toolbelt != null)
            {
                Job jobNew = new Job(HaulJobDefOf.PutInToolbeltSlot);
                jobNew.targetQueueA   = new List <TargetInfo>();
                jobNew.numToBringList = new List <int>();
                jobNew.targetB        = toolbelt;
                jobNew.targetQueueA.Add(thing);
                jobNew.numToBringList.Add(thing.def.stackLimit);
                pawn.Reserve(thing);

                return(jobNew);
            }

            JobFailReason.Is("NoToolbelt".Translate());
            return(null);
        }
        public override bool ShouldSkip(Pawn pawn)
        {
            Apparel_Toolbelt toolbelt = ToolsForHaulUtility.TryGetToolbelt(pawn);

            // Pacifists are incapable of using tools/weapons
            if (pawn.story != null && pawn.story.WorkTagIsDisabled(WorkTags.Violent))
            {
                return(true);
            }

            // Should skip pawn that don't have a toolbelt.
            if (toolbelt == null)
            {
                return(true);
            }

            // Skip it toolbelt full
            if (toolbelt.MaxItem <= toolbelt.slotsComp.slots.Count)
            {
                return(true);
            }

            return(false);
        }
示例#7
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            Apparel_Toolbelt toolbelt = CurJob.GetTarget(SlotterInd).Thing as Apparel_Toolbelt;

            // no free slots
            this.FailOn(() => toolbelt.slotsComp.slots.Count >= toolbelt.MaxItem);


            // reserve resources
            yield return(Toils_Reserve.ReserveQueue(HaulableInd));

            // extract next target thing from targetQueue
            Toil toilExtractNextTarget = Toils_JobTransforms.ExtractNextTargetFromQueue(HaulableInd);

            yield return(toilExtractNextTarget);

            Toil toilGoToThing = Toils_Goto.GotoThing(HaulableInd, PathEndMode.ClosestTouch)
                                 .FailOnDespawnedOrNull(HaulableInd);

            yield return(toilGoToThing);

            Toil pickUpThingIntoSlot = new Toil
            {
                initAction = () =>
                {
                    if (!toolbelt.slotsComp.slots.TryAdd(CurJob.targetA.Thing))
                    {
                        EndJobWith(JobCondition.Incompletable);
                    }
                }
            };

            yield return(pickUpThingIntoSlot);

            yield return(Toils_Jump.JumpIfHaveTargetInQueue(HaulableInd, toilExtractNextTarget));
        }
示例#8
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            Apparel_Toolbelt toolbelt = this.CurJob.GetTarget(SlotterInd).Thing as Apparel_Toolbelt;

            // no free slots
            this.FailOn(() => toolbelt.slotsComp.slots.Count >= toolbelt.MaxItem);


            // reserve resources
            yield return(Toils_Reserve.ReserveQueue(HaulableInd));

            // extract next target thing from targetQueue
            Toil toilExtractNextTarget = Toils_JobTransforms.ExtractNextTargetFromQueue(HaulableInd);

            yield return(toilExtractNextTarget);

            Toil toilGoToThing = Toils_Goto.GotoThing(HaulableInd, PathEndMode.ClosestTouch)
                                 .FailOnDespawnedOrNull(HaulableInd);

            yield return(toilGoToThing);

            Toil pickUpThingIntoSlot = new Toil
            {
                initAction = () =>
                {
                    if (!toolbelt.slotsComp.slots.TryAdd(this.CurJob.targetA.Thing))
                    {
                        this.EndJobWith(JobCondition.Incompletable);
                    }
                    else
                    {
                        float statfloat = 0;
                        Thing thing     = this.TargetThingA;
                        // add stats to pawn inventory
                        foreach (KeyValuePair <StatDef, float> stat in pawn.GetWeightedWorkStats())
                        {
                            statfloat = RightTools.GetMaxStat(thing as ThingWithComps, stat.Key);
                            if (statfloat > 0)
                            {
                                MapComponent_ToolsForHaul.CachedToolEntries.Add(new MapComponent_ToolsForHaul.Entry(pawn, thing, stat.Key, statfloat));
                            }
                            for (int i = toolbelt.slotsComp.slots.Count - 1; i >= 0; i--)
                            {
                                var tool      = toolbelt.slotsComp.slots[i];
                                var checkstat = RightTools.GetMaxStat(tool as ThingWithComps, stat.Key);
                                if (checkstat > 0 && checkstat < statfloat)
                                {
                                    Thing dropTool;
                                    toolbelt.slotsComp.slots.TryDrop(tool, pawn.Position, pawn.Map, ThingPlaceMode.Near, out dropTool, null);
                                    for (int j = MapComponent_ToolsForHaul.CachedToolEntries.Count - 1;
                                         j >= 0;
                                         j--)
                                    {
                                        var entry = MapComponent_ToolsForHaul.CachedToolEntries[j];
                                        if (entry.tool == tool)
                                        {
                                            MapComponent_ToolsForHaul.CachedToolEntries.RemoveAt(j);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            };

            yield return(pickUpThingIntoSlot);

            yield return(Toils_Jump.JumpIfHaveTargetInQueue(HaulableInd, toilExtractNextTarget));
        }
        public override ThinkResult TryIssueJobPackage(Pawn pawn)
        {
            Job         job     = this.TryGiveJob(pawn);
            bool        jobNull = job == null;
            ThinkResult result;

            Apparel_Toolbelt toolbelt = ToolsForHaulUtility.TryGetToolbelt(pawn);

            if (toolbelt != null)
            {
                if (PreviousPawnWeapon.ContainsKey(pawn) && PreviousPawnWeapon[pawn] != null)
                {
                    Pawn           wearer         = toolbelt.Wearer;
                    ThingWithComps previousWeapon = PreviousPawnWeapon[pawn];
                    if (previousWeapon != null && toolbelt.slotsComp.slots.Contains(previousWeapon))
                    {
                        for (int i = toolbelt.slotsComp.slots.Count - 1; i >= 0; i--)
                        {
                            var            thing = toolbelt.slotsComp.slots[i];
                            ThingWithComps item  = (ThingWithComps)thing;
                            if (item == previousWeapon)
                            {
                                if (wearer.equipment.Primary != null)
                                {
                                    toolbelt.slotsComp.SwapEquipment(item);
                                }
                                else
                                {
                                    wearer.equipment.AddEquipment(item);
                                    toolbelt.slotsComp.slots.Remove(item);
                                }
                                break;
                            }
                        }
                    }
                }
                PreviousPawnWeapon[pawn] = null;
            }

            if (jobNull)
            {
                result = ThinkResult.NoJob;
            }
            else
            {
                if (pawn.Faction == Faction.OfPlayer && pawn.RaceProps.Humanlike && pawn.RaceProps.IsFlesh)
                {
                    if (job.def == JobDefOf.DoBill)
                    {
                        RightTools.EquipRigthTool(pawn, job.RecipeDef.workSpeedStat);
                    }

                    if (job.def == JobDefOf.FinishFrame || job.def == JobDefOf.Deconstruct || job.def == JobDefOf.Repair || job.def == JobDefOf.BuildRoof || job.def == JobDefOf.RemoveRoof || job.def == JobDefOf.RemoveFloor)
                    {
                        RightTools.EquipRigthTool(pawn, StatDefOf.ConstructionSpeed);
                    }
                    if (job.def == JobDefOf.SmoothFloor)
                    {
                        RightTools.EquipRigthTool(pawn, StatDefOf.SmoothingSpeed);
                    }

                    if (job.def == JobDefOf.Harvest)
                    {
                        RightTools.EquipRigthTool(pawn, StatDefOf.PlantHarvestYield);
                    }
                    if (job.def == JobDefOf.CutPlant || job.def == JobDefOf.Sow)
                    {
                        RightTools.EquipRigthTool(pawn, StatDefOf.PlantWorkSpeed);
                    }

                    if (job.def == JobDefOf.Mine)
                    {
                        RightTools.EquipRigthTool(pawn, StatDefOf.MiningSpeed);
                    }
                }

                result = new ThinkResult(job, this);
            }

            return(result);
        }