public override string GetExplanation(StatRequest req, ToStringNumberSense numberSense) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(base.GetExplanation(req, numberSense)); if (req.HasThing) { Pawn thisPawn = req.Thing as Pawn; if (thisPawn != null) { if (thisPawn.RaceProps.intelligence >= Intelligence.ToolUser) { CompSlotsBackpack compSlotsBackpack = ToolsForHaulUtility.TryGetBackpack(thisPawn).TryGetComp <CompSlotsBackpack>(); if (compSlotsBackpack != null) { stringBuilder.AppendLine(); stringBuilder.AppendLine("CR_CarriedWeightBackpack".Translate() + ": x" + compSlotsBackpack.MoveSpeedFactor.ToStringPercent()); if (compSlotsBackpack.encumberPenalty > 0f) { stringBuilder.AppendLine("CR_EncumberedBackpack".Translate() + ": -" + compSlotsBackpack.encumberPenalty.ToStringPercent()); stringBuilder.AppendLine("CR_FinalModifierBackpack".Translate() + ": x" + this.GetStatFactor(thisPawn).ToStringPercent()); } } } } } return(stringBuilder.ToString()); }
public static Toil CheckNeedStorageCell(Toil jumpToil, TargetIndex CarrierInd, TargetIndex StoreCellInd) { Toil toil = new Toil(); toil.initAction = () => { Pawn actor = toil.actor; Vehicle_Cart cart = toil.actor.jobs.curJob.GetTarget(CarrierInd).Thing as Vehicle_Cart; Apparel_Backpack backpack = toil.actor.jobs.curJob.GetTarget(CarrierInd).Thing as Apparel_Backpack; if (cart == null && backpack == null) { Log.Error(actor.LabelCap + " Report: Don't have Carrier"); toil.actor.jobs.curDriver.EndJobWith(JobCondition.Errored); } ThingContainer container = cart != null ? cart.storage : backpack.slotsComp.slots; if (container.Count == 0) { return; } IntVec3 cell = ToolsForHaulUtility.FindStorageCell(actor, container.First()); if (cell != IntVec3.Invalid) { toil.actor.jobs.curJob.SetTarget(StoreCellInd, cell); Find.Reservations.Reserve(actor, cell); toil.actor.jobs.curDriver.JumpToToil(jumpToil); } }; return(toil); }
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); }
public override Job JobOnThing(Pawn pawn, Thing t) { if (t is Corpse) { return(null); } if (!HaulAIUtility.PawnCanAutomaticallyHaulFast(pawn, t)) { return(null); } Apparel_Backpack backpack = ToolsForHaulUtility.TryGetBackpack(pawn); if (backpack != null) { if ( !t.def.thingCategories.Exists( category => backpack.slotsComp.Properties.allowedThingCategoryDefs.Exists( subCategory => subCategory.ThisAndChildCategoryDefs.Contains(category)) && !backpack.slotsComp.Properties.forbiddenSubThingCategoryDefs.Exists( subCategory => subCategory.ThisAndChildCategoryDefs.Contains(category)))) { JobFailReason.Is("Backpack can't hold that thing"); return(null); } else { return(ToolsForHaulUtility.HaulWithTools(pawn)); } } JobFailReason.Is("NoBackpack".Translate()); return(null); }
private float GetStatFactor(Pawn thisPawn) { float result = 1f; if (MapComponent_ToolsForHaul.currentVehicle.ContainsKey(thisPawn)) { Vehicle_Cart vehicleCart = MapComponent_ToolsForHaul.currentVehicle[thisPawn] as Vehicle_Cart; if (vehicleCart != null) { if (vehicleCart.mountableComp.IsMounted && !vehicleCart.mountableComp.Driver.RaceProps.Animal && vehicleCart.mountableComp.Driver == thisPawn) { if (vehicleCart.IsCurrentlyMotorized()) { result = Mathf.Clamp(vehicleCart.VehicleSpeed, 2f, 100f); } else { result = Mathf.Clamp(vehicleCart.VehicleSpeed, 0.5f, 1f); } return(result); } } Vehicle_Turret vehicleTank = MapComponent_ToolsForHaul.currentVehicle[thisPawn] as Vehicle_Turret; if (vehicleTank != null) { if (vehicleTank.mountableComp.IsMounted && !vehicleTank.mountableComp.Driver.RaceProps.Animal && vehicleTank.mountableComp.Driver == thisPawn) { if (vehicleTank.IsCurrentlyMotorized()) { result = Mathf.Clamp(vehicleTank.VehicleSpeed, 2f, 100f); } else { result = Mathf.Clamp(vehicleTank.VehicleSpeed, 0.5f, 1f); } return(result); } } } Apparel_Backpack apparelBackpack = ToolsForHaulUtility.TryGetBackpack(thisPawn); CompSlotsBackpack compSlotsBackpack = apparelBackpack?.slotsComp; if (compSlotsBackpack != null) { result = Mathf.Clamp(compSlotsBackpack.moveSpeedFactor - compSlotsBackpack.encumberPenalty, 0.1f, 1f); } CompInventory compInventory = thisPawn.TryGetComp <CompInventory>(); if (compInventory != null) { result = Mathf.Clamp(compInventory.moveSpeedFactor - compInventory.encumberPenalty, 0.1f, 1f); return(result); } return(result); }
protected override Job TryGivePlayJob(Pawn pawn, Thing t) { if ((t as ThingWithComps).TryGetComp <CompMountable>().IsMounted&& !ToolsForHaulUtility.IsDriverOfThisVehicle(pawn, t)) { return(null); } if (!(t as ThingWithComps).TryGetComp <CompRefuelable>().HasFuel) { return(null); } if (t.IsForbidden(Faction.OfPlayer)) { return(null); } if (!JoyUtility.EnjoyableOutsideNow(pawn, null)) { return(null); } if (PawnUtility.WillSoonHaveBasicNeed(pawn)) { return(null); } Region reg; if (!CellFinder.TryFindClosestRegionWith(pawn.Position.GetRegion(), TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), (Region r) => r.Room.PsychologicallyOutdoors && !r.IsForbiddenEntirely(pawn), 100, out reg)) { return(null); } IntVec3 root; if (!reg.TryFindRandomCellInRegionUnforbidden(pawn, null, out root)) { return(null); } List <IntVec3> list; if (!WalkPathFinder.TryFindWalkPath(pawn, root, out list)) { return(null); } Job job = new Job(this.def.jobDef, list[0]) { targetQueueA = new List <TargetInfo>(), targetB = t, }; for (int i = 1; i < list.Count; i++) { job.targetQueueA.Add(list[i]); } job.locomotionUrgency = LocomotionUrgency.Jog; return(job); }
public override IEnumerable <Thing> PotentialWorkThingsGlobal(Pawn pawn) { List <Thing> list = new List <Thing>(); Apparel_Backpack backpack = ToolsForHaulUtility.TryGetBackpack(pawn); foreach (Thing thing in ListerHaulables.ThingsPotentiallyNeedingHauling()) { if (thing.def.thingCategories.Exists(category => backpack.slotsComp.Properties.allowedThingCategoryDefs.Exists(subCategory => subCategory.ThisAndChildCategoryDefs.Contains(category)) && !backpack.slotsComp.Properties.forbiddenSubThingCategoryDefs.Exists(subCategory => subCategory.ThisAndChildCategoryDefs.Contains(category)))) { list.Add(thing); } //return ToolsForHaulUtility.Cart(); } return(list); }
public override bool ShouldSkip(Pawn pawn) { Trace.DebugWriteHaulingPawn(pawn); Apparel_Backpack backpack = ToolsForHaulUtility.TryGetBackpack(pawn); //Should skip pawn that don't have backpack. if (backpack == null) { return(true); } if (backpack.MaxItem - backpack.slotsComp.slots.Count == 0) { return(true); } return(false); }
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); }
private float GetStatFactor(Pawn thisPawn) { float result = 1f; Apparel_Backpack apparelBackpack = ToolsForHaulUtility.TryGetBackpack(thisPawn); CompSlotsBackpack compSlotsBackpack = apparelBackpack?.SlotsComp; if (compSlotsBackpack != null) { result = Mathf.Clamp(compSlotsBackpack.MoveSpeedFactor - compSlotsBackpack.encumberPenalty, 0.5f, 1f); } #if CR CompInventory compInventory = thisPawn.TryGetComp <CompInventory>(); if (compInventory != null) { result = Mathf.Clamp(compInventory.moveSpeedFactor - compInventory.encumberPenalty, 0.1f, 1f); return(result); } #endif return(result); }
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 Job TryGiveJob(Pawn pawn) { List <Thing> steelVehicle = new List <Thing>(); foreach (Vehicle_Cart vehicle_Cart in ToolsForHaulUtility.Cart) { if (ToolsForHaulUtility.IsDriver(pawn)) { break; } if (pawn.RaceProps.Animal || !pawn.RaceProps.Humanlike || !pawn.RaceProps.hasGenders) { break; } if (!vehicle_Cart.IsBurning() && vehicle_Cart.Position.InHorDistOf(pawn.Position, 20f) && !vehicle_Cart.mountableComp.IsMounted && (float)vehicle_Cart.HitPoints / vehicle_Cart.MaxHitPoints > 0.2f && vehicle_Cart.VehicleSpeed >= pawn.GetStatValue(StatDefOf.MoveSpeed) && pawn.CanReserveAndReach(vehicle_Cart, PathEndMode.InteractionCell, Danger.Deadly)) { steelVehicle.Add(vehicle_Cart); } } foreach (Vehicle_Turret vehicle_Cart in ToolsForHaulUtility.CartTurret) { if (ToolsForHaulUtility.IsDriver(pawn)) { break; } if (pawn.RaceProps.Animal || !pawn.RaceProps.Humanlike || !pawn.RaceProps.hasGenders) { break; } if (!vehicle_Cart.IsBurning() && vehicle_Cart.Position.InHorDistOf(pawn.Position, 20f) && !vehicle_Cart.mountableComp.IsMounted && (float)vehicle_Cart.HitPoints / vehicle_Cart.MaxHitPoints > 0.2f && vehicle_Cart.VehicleSpeed >= pawn.GetStatValue(StatDefOf.MoveSpeed) && pawn.CanReserveAndReach(vehicle_Cart, PathEndMode.InteractionCell, Danger.Deadly)) { steelVehicle.Add(vehicle_Cart); } } if (steelVehicle.Any()) { IOrderedEnumerable <Thing> orderedEnumerable = steelVehicle.OrderBy(x => x.Position.DistanceToSquared(pawn.Position)); Job job = new Job(HaulJobDefOf.Mount); orderedEnumerable.First().SetFaction(null); job.targetA = orderedEnumerable.First(); return(job); } bool flag = false; if (this.forceCanDig || (pawn.mindState.duty != null && pawn.mindState.duty.canDig)) { flag = true; } IntVec3 vec; if (!this.TryFindGoodExitDest(pawn, flag, out vec)) { return(null); } if (flag) { using (PawnPath pawnPath = PathFinder.FindPath(pawn.Position, vec, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.PassAnything))) { IntVec3 cellBeforeBlocker; Thing thing = pawnPath.FirstBlockingBuilding(out cellBeforeBlocker, pawn); if (thing != null) { Job job = DigUtility.PassBlockerJob(pawn, thing, cellBeforeBlocker, true); if (job != null) { return(job); } } } } return(new Job(JobDefOf.Goto, vec) { exitMapOnArrival = true, locomotionUrgency = PawnUtility.ResolveLocomotion(pawn, this.defaultLocomotion, LocomotionUrgency.Jog), expiryInterval = this.jobMaxDuration, canBash = this.canBash }); }
public override Job JobOnThing(Pawn pawn, Thing t) { Vehicle_Cart cart = null; if (!HaulAIUtility.PawnCanAutomaticallyHaulFast(pawn, t)) { return(null); } // Vehicle selection if (ToolsForHaulUtility.IsDriver(pawn)) { cart = ToolsForHaulUtility.GetCartByDriver(pawn); if (cart == null) { // JobFailReason.Is("Can't haul with military vehicle"); return(ToolsForHaulUtility.DismountInBase(pawn, MapComponent_ToolsForHaul.currentVehicle[pawn])); } } if (cart == null) { cart = RightTools.GetRightVehicle(pawn, WorkTypeDefOf.Hauling, t) as Vehicle_Cart; if (cart == null) { return(null); } } if (cart.IsBurning()) { JobFailReason.Is(ToolsForHaulUtility.BurningLowerTrans); return(null); } if (!cart.allowances.Allows(t)) { JobFailReason.Is("Cart does not allow that thing"); return(null); } if (ListerHaulables.ThingsPotentiallyNeedingHauling().Count == 0 && cart.storage.Count == 0) { JobFailReason.Is("NoHaulable".Translate()); return(null); } if (Find.SlotGroupManager.AllGroupsListInPriorityOrder.Count == 0) { JobFailReason.Is(ToolsForHaulUtility.NoEmptyPlaceLowerTrans); return(null); } if (ToolsForHaulUtility.AvailableAnimalCart(cart) || ToolsForHaulUtility.AvailableVehicle(pawn, cart)) { return(ToolsForHaulUtility.HaulWithTools(pawn, cart, t)); } JobFailReason.Is(ToolsForHaulUtility.NoAvailableCart); return(null); }
public override string GetExplanation(StatRequest req, ToStringNumberSense numberSense) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(base.GetExplanation(req, numberSense)); if (req.HasThing) { Pawn thisPawn = req.Thing as Pawn; if (thisPawn != null) { if (thisPawn.RaceProps.intelligence >= Intelligence.ToolUser) { if (MapComponent_ToolsForHaul.currentVehicle.ContainsKey(thisPawn)) { Vehicle_Cart vehicle_Cart = MapComponent_ToolsForHaul.currentVehicle[thisPawn] as Vehicle_Cart; if (vehicle_Cart != null) { if (vehicle_Cart.mountableComp.IsMounted && vehicle_Cart.mountableComp.Driver == thisPawn) { stringBuilder.AppendLine(); stringBuilder.AppendLine("VehicleSpeed".Translate() + ": x" + vehicle_Cart.VehicleSpeed); return(stringBuilder.ToString()); } } Vehicle_Turret vehicle_Turret = MapComponent_ToolsForHaul.currentVehicle[req.Thing as Pawn] as Vehicle_Turret; if (vehicle_Turret != null) { if (vehicle_Turret.mountableComp.IsMounted && vehicle_Turret.mountableComp.Driver == thisPawn) { stringBuilder.AppendLine(); stringBuilder.AppendLine("VehicleSpeed".Translate() + ": x" + vehicle_Turret.VehicleSpeed); return(stringBuilder.ToString()); } } } CompInventory compInventory = ThingCompUtility.TryGetComp <CompInventory>(req.Thing); if (compInventory != null) { stringBuilder.AppendLine(); stringBuilder.AppendLine(Translator.Translate("CR_CarriedWeight") + ": x" + GenText.ToStringPercent(compInventory.moveSpeedFactor)); if (compInventory.encumberPenalty > 0f) { stringBuilder.AppendLine(Translator.Translate("CR_Encumbered") + ": -" + GenText.ToStringPercent(compInventory.encumberPenalty)); stringBuilder.AppendLine(Translator.Translate("CR_FinalModifier") + ": x" + GenText.ToStringPercent(this.GetStatFactor(thisPawn))); } } CompSlotsBackpack compSlotsBackpack = ToolsForHaulUtility.TryGetBackpack(thisPawn).TryGetComp <CompSlotsBackpack>(); if (compSlotsBackpack != null) { stringBuilder.AppendLine(); stringBuilder.AppendLine("CR_CarriedWeightBackpack".Translate() + ": x" + compSlotsBackpack.moveSpeedFactor.ToStringPercent()); if (compSlotsBackpack.encumberPenalty > 0f) { stringBuilder.AppendLine("CR_EncumberedBackpack".Translate() + ": -" + compSlotsBackpack.encumberPenalty.ToStringPercent()); stringBuilder.AppendLine("CR_FinalModifierBackpack".Translate() + ": x" + GetStatFactor(thisPawn).ToStringPercent()); } } } } } return(stringBuilder.ToString()); }
protected override Job TryGiveJob(Pawn pawn) { IntVec3 vec; if (!RCellFinder.TryFindBestExitSpot(pawn, out vec)) { return(null); } List <Thing> steelVehicle = new List <Thing>(); foreach (Vehicle_Turret vehicle_Cart in ToolsForHaulUtility.CartTurret) { if (ToolsForHaulUtility.IsDriver(pawn)) { break; } if (pawn.RaceProps.Animal || !pawn.RaceProps.Humanlike || !pawn.RaceProps.hasGenders) { break; } if (!vehicle_Cart.IsBurning() && vehicle_Cart.Position.InHorDistOf(pawn.Position, 12f) && !vehicle_Cart.mountableComp.IsMounted && (float)vehicle_Cart.HitPoints / vehicle_Cart.MaxHitPoints > 0.2f && vehicle_Cart.VehicleSpeed >= pawn.GetStatValue(StatDefOf.MoveSpeed) && pawn.CanReserveAndReach(vehicle_Cart, PathEndMode.InteractionCell, Danger.Deadly)) { steelVehicle.Add(vehicle_Cart); } } foreach (Vehicle_Cart vehicle_Cart in ToolsForHaulUtility.Cart) { if (ToolsForHaulUtility.IsDriver(pawn)) { break; } if (pawn.RaceProps.Animal || !pawn.RaceProps.Humanlike || !pawn.RaceProps.hasGenders) { break; } if (!vehicle_Cart.IsBurning() && vehicle_Cart.Position.InHorDistOf(pawn.Position, 12f) && !vehicle_Cart.mountableComp.IsMounted && (float)vehicle_Cart.HitPoints / vehicle_Cart.MaxHitPoints > 0.2f && vehicle_Cart.VehicleSpeed >= pawn.GetStatValue(StatDefOf.MoveSpeed) && pawn.CanReserveAndReach(vehicle_Cart, PathEndMode.InteractionCell, Danger.Deadly)) { steelVehicle.Add(vehicle_Cart); } } if (steelVehicle.Any() && !GenAI.InDangerousCombat(pawn)) { IOrderedEnumerable <Thing> orderedEnumerable = steelVehicle.OrderBy(x => x.Position.DistanceToSquared(pawn.Position)); Job job = new Job(HaulJobDefOf.Mount); orderedEnumerable.First().SetFaction(null); job.targetA = orderedEnumerable.First(); return(job); } Thing thing; if (StealAIUtility.TryFindBestItemToSteal(pawn.Position, 12f, out thing, pawn) && !GenAI.InDangerousCombat(pawn)) { return(new Job(JobDefOf.Steal) { targetA = thing, targetB = vec, maxNumToCarry = Mathf.Min(thing.stackCount, (int)(pawn.GetStatValue(StatDefOf.CarryingCapacity) / thing.def.VolumePerUnit)) }); } return(null); }
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); }
protected override IEnumerable <Toil> MakeNewToils() { /// //Set fail conditions /// this.FailOnDestroyedOrNull(CartInd); //Note we only fail on forbidden if the target doesn't start that way //This helps haul-aside jobs on forbidden items if (!TargetThingA.IsForbidden(pawn.Faction)) { this.FailOnForbidden(CartInd); } ThingWithComps cart = TargetThingA as ThingWithComps; if (ToolsForHaulUtility.FindStorageCell(pawn, cart) == IntVec3.Invalid) { JobFailReason.Is(ToolsForHaulUtility.NoEmptyPlaceForCart); } if (cart.TryGetComp <CompMountable>().Driver != null) { this.FailOnSomeonePhysicallyInteracting(CartInd); } /// //Define Toil /// Toil toilGoToCell = Toils_Goto.GotoCell(StoreCellInd, PathEndMode.ClosestTouch); /// //Toils Start /// //Reserve thing to be stored and storage cell yield return(Toils_Reserve.Reserve(CartInd)); yield return(Toils_Reserve.Reserve(StoreCellInd)); //JumpIf already mounted yield return(Toils_Jump.JumpIf(toilGoToCell, () => { return cart.TryGetComp <CompMountable>().Driver == pawn ? true : false; })); //Mount on Target yield return(Toils_Goto.GotoThing(CartInd, PathEndMode.ClosestTouch) .FailOnDestroyedOrNull(CartInd)); yield return(Toils_Cart.MountOn(CartInd)); //Dismount yield return(toilGoToCell); yield return(Toils_Cart.DismountAt(CartInd, StoreCellInd)); }
public override void CompTick() { base.CompTick(); if (IsMounted) { if (!Driver.Spawned) { parent.DeSpawn(); return; } if (Driver.Dead || Driver.Downed || Driver.health.InPainShock || Driver.MentalStateDef == MentalStateDefOf.WanderPsychotic || (parent.IsForbidden(Faction.OfPlayer) && Driver.Faction == Faction.OfPlayer)) { if (!Driver.Position.InBounds()) { DismountAt(Driver.Position); return; } DismountAt(Driver.Position - parent.def.interactionCellOffset.RotatedBy(Driver.Rotation)); Driver.Position = Driver.Position.RandomAdjacentCell8Way(); return; } if (Find.TickManager.TicksGame - tickCheck >= tickCooldown) { if (Driver.Faction == Faction.OfPlayer && Driver.CurJob != null) { if (Driver.CurJob.def.playerInterruptible && ( Driver.CurJob.def == JobDefOf.GotoWander || Driver.CurJob.def == JobDefOf.Open || Driver.CurJob.def == JobDefOf.ManTurret || Driver.CurJob.def == JobDefOf.EnterCryptosleepCasket || Driver.CurJob.def == JobDefOf.UseNeurotrainer || Driver.CurJob.def == JobDefOf.UseArtifact || Driver.CurJob.def == JobDefOf.DoBill || Driver.CurJob.def == JobDefOf.Research || Driver.CurJob.def == JobDefOf.OperateDeepDrill || Driver.CurJob.def == JobDefOf.Repair || Driver.CurJob.def == JobDefOf.FixBrokenDownBuilding || Driver.CurJob.def == JobDefOf.UseCommsConsole || Driver.CurJob.def == JobDefOf.BuryCorpse || Driver.CurJob.def == JobDefOf.TradeWithPawn || Driver.CurJob.def == JobDefOf.Lovin || Driver.CurJob.def == JobDefOf.SocialFight || Driver.CurJob.def == JobDefOf.Maintain || Driver.CurJob.def == JobDefOf.MarryAdjacentPawn || Driver.CurJob.def == JobDefOf.SpectateCeremony || Driver.CurJob.def == JobDefOf.StandAndBeSociallyActive || Driver.CurJob.def == JobDefOf.LayDown || Driver.CurJob.def == JobDefOf.Ingest || Driver.CurJob.def == JobDefOf.SocialRelax || Driver.CurJob.def == JobDefOf.Refuel || Driver.CurJob.def == JobDefOf.FillFermentingBarrel || Driver.CurJob.def == JobDefOf.TakeBeerOutOfFermentingBarrel || Driver.CurJob.def == JobDefOf.TakeWoundedPrisonerToBed || Driver.CurJob.def == JobDefOf.TakeToBedToOperate || Driver.CurJob.def == JobDefOf.EscortPrisonerToBed || Driver.CurJob.def == JobDefOf.CarryToCryptosleepCasket || Driver.CurJob.def == JobDefOf.ReleasePrisoner || Driver.CurJob.def == JobDefOf.PrisonerAttemptRecruit || Driver.CurJob.def == JobDefOf.PrisonerFriendlyChat || Driver.CurJob.def == JobDefOf.PrisonerExecution || Driver.CurJob.def == JobDefOf.FeedPatient || Driver.CurJob.def == JobDefOf.TendPatient || Driver.CurJob.def == JobDefOf.VisitSickPawn || Driver.CurJob.def == JobDefOf.Slaughter || Driver.CurJob.def == JobDefOf.Milk || Driver.CurJob.def == JobDefOf.Shear || Driver.CurJob.def == JobDefOf.Train || Driver.CurJob.def == JobDefOf.Mate || Driver.health.NeedsMedicalRest || Driver.health.PrefersMedicalRest ) && Driver.Position.Roofed()) { parent.Position = Position.ToIntVec3(); parent.Rotation = Driver.Rotation; if (!Driver.Position.InBounds()) { DismountAt(Driver.Position); return; } DismountAt(Driver.Position - InteractionOffset.ToIntVec3()); Driver.Position = Driver.Position.RandomAdjacentCell8Way(); return; } } tickCheck = Find.TickManager.TicksGame; tickCooldown = Rand.RangeInclusive(60, 180); CompVehicle vehicleComp = parent.TryGetComp <CompVehicle>(); if (!vehicleComp.MotorizedWithoutFuel()) { CompRefuelable refuelableComp = parent.TryGetComp <CompRefuelable>(); Job jobNew = ToolsForHaulUtility.DismountInBase(Driver, MapComponent_ToolsForHaul.currentVehicle[Driver]); if (Driver.Faction == Faction.OfPlayer) { if (!GenAI.EnemyIsNear(Driver, 40f)) { if (parent.HitPoints / parent.MaxHitPoints < 0.65f || (Driver.CurJob != null && Driver.jobs.curDriver.asleep) || vehicleComp.tankLeaking || !refuelableComp.HasFuel) { Driver.jobs.StartJob(jobNew, JobCondition.InterruptForced); } } } else if (!refuelableComp.HasFuel) { Dismount(); FireUtility.TryStartFireIn(Position.ToIntVec3(), 0.1f); } } } if (Find.TickManager.TicksGame - tickLastDoorCheck >= 96 && (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 >= 96 && lastPassedDoor != null) { lastPassedDoor.StartManualCloseBy(Driver); lastPassedDoor = null; } if (Driver.pather.Moving && Driver.Position != (Driver.pather.Destination.Cell)) { lastDrawAsAngle = Driver.Rotation.AsAngle; parent.Position = (Position.ToIntVec3()); parent.Rotation = (Driver.Rotation); } } }
public void MountOn(Pawn pawn) { if (Driver != null) { return; } Building_Reloadable turret = (parent as Building_Reloadable); if (turret != null) { turret.dontReload = true; } // Check to make pawns not mount two vehicles at once if (ToolsForHaulUtility.IsDriver(pawn)) { if (ToolsForHaulUtility.GetCartByDriver(pawn) != null) { ToolsForHaulUtility.GetCartByDriver(pawn).mountableComp.Dismount(); } if (ToolsForHaulUtility.GetTurretByDriver(pawn) != null) { ToolsForHaulUtility.GetTurretByDriver(pawn).mountableComp.Dismount(); } } Driver = pawn; MapComponent_ToolsForHaul.currentVehicle.Add(pawn, parent); if (Driver.RaceProps.Humanlike) { Driver.RaceProps.makesFootprints = false; } if (pawn.RaceProps.Humanlike) { driverComp = new CompDriver { vehicle = parent as Building }; Driver?.AllComps?.Add(driverComp); driverComp.parent = Driver; } Vehicle_Cart vehicleCart = parent as Vehicle_Cart; if (vehicleCart != null) { // Set faction of vehicle to whoever mounts it if (vehicleCart.Faction != Driver.Faction && vehicleCart.ClaimableBy(Driver.Faction)) { parent.SetFaction(Driver.Faction); } if (vehicleCart.IsCurrentlyMotorized()) { SoundInfo info = SoundInfo.InWorld(parent); sustainerAmbient = vehicleCart.vehicleComp.compProps.soundAmbient.TrySpawnSustainer(info); } return; } Vehicle_Turret vehicleTurret = parent as Vehicle_Turret; if (vehicleTurret != null) { // Set faction of vehicle to whoever mounts it if (vehicleTurret.Faction != Driver.Faction && vehicleTurret.ClaimableBy(Driver.Faction)) { parent.SetFaction(Driver.Faction); } if (vehicleTurret.IsCurrentlyMotorized()) { SoundInfo info = SoundInfo.InWorld(parent); sustainerAmbient = vehicleTurret.vehicleComp.compProps.soundAmbient.TrySpawnSustainer(info); } return; } }