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; } } }
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); }
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); }
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)); }
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); }
// 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); } }
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); }
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; } } } } }
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); }
//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); }
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); } }
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); }
// 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; } } } }
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); } }
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); }
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)); }
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]; } }
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); }
// 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()); }
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); }