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); }
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)); }
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); }