public override Job JobOnThing(Pawn pawn, Thing thing, bool forced = false) { Pawn targetPawn = thing as Pawn; //Get closest consumable source we can find. Thing closestEnergySource = TryFindBestEnergySource(pawn); if (closestEnergySource != null) { Need_Energy needEnergy = targetPawn.needs.TryGetNeed <Need_Energy>(); EnergySourceComp energySourceComp = closestEnergySource.TryGetComp <EnergySourceComp>(); //Consume for pawn. int thingCount = (int)Math.Ceiling((needEnergy.MaxLevel - needEnergy.CurLevel) / energySourceComp.EnergyProps.energyWhenConsumed); thingCount = Math.Min(thingCount, closestEnergySource.stackCount); if (thingCount > 0) { return new Job(JobDefOf.ChJAndroidRechargeEnergyComp, new LocalTargetInfo(closestEnergySource), new LocalTargetInfo(targetPawn)) { count = thingCount } } ; } return(null); }
public override IEnumerable <FloatMenuOption> CompFloatMenuOptions(Pawn selPawn) { Need_Energy energyNeed = selPawn.needs.TryGetNeed <Need_Energy>(); if (EnergyProps.isConsumable) { if (energyNeed != null) { //Consume for self. int thingCount = (int)Math.Ceiling((energyNeed.MaxLevel - energyNeed.CurLevel) / EnergyProps.energyWhenConsumed); if (thingCount > 0) { FloatMenuOption floatMenuOption = new FloatMenuOption("AndroidConsumeEnergySource".Translate(parent.LabelCap), () => selPawn.jobs.TryTakeOrderedJob( new Verse.AI.Job(JobDefOf.ChJAndroidRechargeEnergyComp, new LocalTargetInfo(parent)) { count = thingCount }), MenuOptionPriority.Default, null, parent); yield return(floatMenuOption); } } } }
public override void RechargeEnergyNeed(Pawn targetPawn) { bool isNight = GenLocalDate.DayPercent(targetPawn) < 0.2f || GenLocalDate.DayPercent(targetPawn) > 0.7f; if (isNight) { return; } if (targetPawn.InContainerEnclosed) { return; } if (!targetPawn.IsCaravanMember() && targetPawn.Position.Roofed(targetPawn.Map)) { return; } Need_Energy energyNeed = targetPawn.needs.TryGetNeed <Need_Energy>(); if (energyNeed != null) { energyNeed.CurLevel += EnergyProps.passiveEnergyGeneration; } }
public override void PostSpawnSetup(bool respawningAfterLoad) { pawn = parent as Pawn; if (pawn != null) { energyNeed = pawn.needs.TryGetNeed <Need_Energy>(); } }
public override void Notify_Starting() { base.Notify_Starting(); energyNeed = GetActor().needs.TryGetNeed <Need_Energy>(); if (startTick == Find.TickManager.TicksGame && TargetThingAIsCarriedOrInInventory()) { isUsedFromInventory = true; } }
public override float GetPriority(Pawn pawn) { Need_Energy energy = pawn.needs.TryGetNeed <Need_Energy>(); if (energy == null) { return(0f); } if (energy.CurLevelPercentage < Need_Energy.rechargePercentage) { return(11.5f); } return(0f); }
public virtual void RechargeEnergyNeed(Pawn targetPawn) { Need_Energy energyNeed = targetPawn.needs.TryGetNeed <Need_Energy>(); if (energyNeed != null) { if (EnergyProps.isConsumable) { float finalEnergyGain = parent.stackCount * EnergyProps.energyWhenConsumed; energyNeed.CurLevel += finalEnergyGain; } else { energyNeed.CurLevel += EnergyProps.passiveEnergyGeneration; } } }
public override void RechargeEnergyNeed(Pawn targetPawn) { base.RechargeEnergyNeed(targetPawn); //Deduct fuel. if (fuelAmountLoaded > 0d) { fuelAmountLoaded -= FuelUsedPerInterval * FuelUsageModifier(); //Recharge. Need_Energy energyNeed = targetPawn.needs.TryGetNeed <Need_Energy>(); if (energyNeed != null) { energyNeed.CurLevel += EnergyProps.activeEnergyGeneration; } } //Cap fuel amount. if (fuelAmountLoaded < 0d) { fuelAmountLoaded = 0d; } //Attempt refilling in caravan if possible. if (targetPawn.IsCaravanMember() && MissingFuelPercentage > 0.8f) { Caravan caravan = targetPawn.GetCaravan(); Thing validFuelSource = caravan.Goods.FirstOrDefault( fuelThing => EnergyProps.fuels.Any(req => req.thingDef == fuelThing.def)); if (validFuelSource != null) { int refillAmount = CalculateFuelNeededToRefill(validFuelSource); if (refillAmount > 0) { Thing takenFuel = validFuelSource.SplitOff(refillAmount); if (takenFuel != null) { LoadFuel(takenFuel); } } } } }
// Token: 0x060000F0 RID: 240 RVA: 0x00009888 File Offset: 0x00007A88 public override void ApplyOnPawn(Pawn pawn, BodyPartRecord part, Pawn billDoer, List <Thing> ingredients, Bill bill) { Need_Energy need_Energy = pawn.needs.TryGetNeed <Need_Energy>(); EnergyTrackerComp energyTrackerComp = pawn.TryGetComp <EnergyTrackerComp>(); bool flag = need_Energy != null; if (flag) { need_Energy.CurLevelPercentage = 0f; } bool flag2 = energyTrackerComp != null; if (flag2) { energyTrackerComp.energy = 0f; } ButcherUtility.SpawnDrops(pawn, pawn.Position, pawn.Map); pawn.Kill(null, null); }
// Token: 0x06000087 RID: 135 RVA: 0x000056D0 File Offset: 0x000038D0 public override void RechargeEnergyNeed(Pawn targetPawn) { bool flag = GenLocalDate.DayPercent(targetPawn) < 0.2f || GenLocalDate.DayPercent(targetPawn) > 0.7f; bool flag2 = flag; if (!flag2) { bool inContainerEnclosed = targetPawn.InContainerEnclosed; if (!inContainerEnclosed) { bool flag3 = !targetPawn.IsCaravanMember() && targetPawn.Position.Roofed(targetPawn.Map); if (!flag3) { Need_Energy need_Energy = targetPawn.needs.TryGetNeed <Need_Energy>(); need_Energy.CurLevel += base.EnergyProps.passiveEnergyGeneration; } } } }
public override void ApplyOnPawn(Pawn pawn, BodyPartRecord part, Pawn billDoer, List <Thing> ingredients, Bill bill) { //Set the power Need and EnergyTrackerComp to 0. Need_Energy needEnergy = pawn.needs.TryGetNeed <Need_Energy>(); EnergyTrackerComp energyTrackerComp = pawn.TryGetComp <EnergyTrackerComp>(); if (needEnergy != null) { needEnergy.CurLevelPercentage = 0f; } if (energyTrackerComp != null) { energyTrackerComp.energy = 0f; } //Spawn extra butcher products. ButcherUtility.SpawnDrops(pawn, pawn.Position, pawn.Map); pawn.Kill(null); }
// Token: 0x06000028 RID: 40 RVA: 0x00002E68 File Offset: 0x00001068 public override Job JobOnThing(Pawn pawn, Thing thing, bool forced = false) { Pawn pawn2 = thing as Pawn; Thing thing2 = this.TryFindBestEnergySource(pawn); bool flag = thing2 != null; if (flag) { Need_Energy need_Energy = pawn2.needs.TryGetNeed <Need_Energy>(); EnergySourceComp energySourceComp = thing2.TryGetComp <EnergySourceComp>(); int num = (int)Math.Ceiling((double)((need_Energy.MaxLevel - need_Energy.CurLevel) / energySourceComp.EnergyProps.energyWhenConsumed)); num = Math.Min(num, thing2.stackCount); bool flag2 = num > 0; if (flag2) { return(new Job(JobDefOf.ChJAndroidRechargeEnergyComp, new LocalTargetInfo(thing2), new LocalTargetInfo(pawn2)) { count = num }); } } return(null); }
// Token: 0x06000019 RID: 25 RVA: 0x00002430 File Offset: 0x00000630 public override float GetPriority(Pawn pawn) { Need_Energy need_Energy = pawn.needs.TryGetNeed <Need_Energy>(); bool flag = need_Energy == null; float result; if (flag) { result = 0f; } else { bool flag2 = need_Energy.CurLevelPercentage < Need_Energy.rechargePercentage; if (flag2) { result = 11.5f; } else { result = 0f; } } return(result); }
// Token: 0x06000027 RID: 39 RVA: 0x00002CB8 File Offset: 0x00000EB8 public override bool HasJobOnThing(Pawn pawn, Thing thing, bool forced = false) { bool downed = pawn.Downed; bool result; if (downed) { result = false; } else { bool flag = thing.IsForbidden(pawn) || !thing.Position.InAllowedArea(pawn); if (flag) { bool flag2 = !pawn.CanReach(new LocalTargetInfo(thing), PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn); if (flag2) { return(false); } } bool flag3 = HealthAIUtility.ShouldSeekMedicalRest(pawn); if (flag3) { result = false; } else { Pawn pawn2 = thing as Pawn; bool flag4 = pawn2 == null; if (flag4) { result = false; } else { bool flag5 = !pawn.CanReserve(new LocalTargetInfo(pawn2), 1, -1, null, false); if (flag5) { result = false; } else { bool?flag6; if (pawn2 == null) { flag6 = null; } else { Faction faction = pawn2.Faction; flag6 = ((faction != null) ? new bool?(!faction.IsPlayer) : null); } bool flag7 = flag6 ?? true; if (flag7) { result = false; } else { bool flag8 = !pawn2.InBed() || !pawn2.Downed; if (flag8) { result = false; } else { bool flag9 = !HealthAIUtility.ShouldSeekMedicalRest(pawn2); if (flag9) { result = false; } else { Need_Energy need_Energy = pawn2.needs.TryGetNeed <Need_Energy>(); bool flag10 = need_Energy == null; if (flag10) { result = false; } else { bool flag11 = !forced && need_Energy.CurLevelPercentage > 0.5f; if (flag11) { result = false; } else { Thing thing2 = this.TryFindBestEnergySource(pawn); bool flag12 = thing2 == null; if (flag12) { result = false; } else { bool flag13 = !pawn.CanReserve(new LocalTargetInfo(thing2), 1, -1, null, false); result = !flag13; } } } } } } } } } } return(result); }
protected override Job TryGiveJob(Pawn pawn) { if (pawn.Downed) { return(null); } Need_Energy energy = pawn.needs.TryGetNeed <Need_Energy>(); if (energy == null) { return(null); } if (energy.CurLevelPercentage >= Need_Energy.rechargePercentage) { return(null); } if (Find.TickManager.TicksGame < GetLastTryTick(pawn) + 2500) { return(null); } SetLastTryTick(pawn, Find.TickManager.TicksGame); //See if we got a nearby powernet to tap into. Thing closestPowerSource = EnergyNeedUtility.ClosestPowerSource(pawn); if (closestPowerSource != null) { Building building = closestPowerSource as Building; if (closestPowerSource != null && building != null && building.PowerComp != null && building.PowerComp.PowerNet.CurrentStoredEnergy() > 50f) { //Find a suitable spot to drain from. IntVec3 drainSpot = closestPowerSource.Position; //Give out job to go out and tap it. if (drainSpot.Walkable(pawn.Map) && drainSpot.InAllowedArea(pawn) && pawn.CanReserve(new LocalTargetInfo(drainSpot)) && pawn.CanReach(drainSpot, PathEndMode.OnCell, Danger.Deadly)) { return(new Job(JobDefOf.ChJAndroidRecharge, closestPowerSource)); } //Check surrounding cells. foreach (IntVec3 adjCell in GenAdj.CellsAdjacentCardinal(building).OrderByDescending(selector => selector.DistanceTo(pawn.Position))) { if (adjCell.Walkable(pawn.Map) && adjCell.InAllowedArea(pawn) && pawn.CanReserve(new LocalTargetInfo(adjCell)) && pawn.CanReach(adjCell, PathEndMode.OnCell, Danger.Deadly)) { return(new Job(JobDefOf.ChJAndroidRecharge, closestPowerSource, adjCell)); } } } } //No power source? Try looking for a consumable resource. //In the inventory. (Or being carried) if (pawn.carryTracker is Pawn_CarryTracker carryTracker && carryTracker.CarriedThing is Thing carriedThing && carriedThing.TryGetComp <EnergySourceComp>() is EnergySourceComp carriedThingComp && carriedThingComp.EnergyProps.isConsumable) { if (carriedThing.stackCount > 0) { return(new Job(JobDefOf.ChJAndroidRechargeEnergyComp, new LocalTargetInfo(carriedThing)) { count = carriedThing.stackCount }); } } if (pawn.inventory is Pawn_InventoryTracker inventory && inventory.innerContainer.Any(thing => thing.TryGetComp <EnergySourceComp>() is EnergySourceComp comp && comp.EnergyProps.isConsumable)) { Thing validEnergySource = inventory.innerContainer.FirstOrDefault( thing => thing.TryGetComp <EnergySourceComp>() is EnergySourceComp energySource && energySource.EnergyProps.isConsumable ); if (validEnergySource != null) { //Use enough to get satisfied. EnergySourceComp energySourceComp = validEnergySource.TryGetComp <EnergySourceComp>(); int thingCount = (int)Math.Ceiling((energy.MaxLevel - energy.CurLevel) / energySourceComp.EnergyProps.energyWhenConsumed); thingCount = Math.Min(thingCount, validEnergySource.stackCount); if (thingCount > 0) { return(new Job(JobDefOf.ChJAndroidRechargeEnergyComp, new LocalTargetInfo(validEnergySource)) { count = thingCount }); } } } //On the map. Thing closestConsumablePowerSource = GenClosest.ClosestThingReachable( pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.HaulableEver), PathEndMode.OnCell, TraverseParms.For(pawn), 9999f, thing => thing.TryGetComp <EnergySourceComp>() != null && !thing.IsForbidden(pawn) && pawn.CanReserve(new LocalTargetInfo(thing)) && thing.Position.InAllowedArea(pawn) && pawn.CanReach(new LocalTargetInfo(thing), PathEndMode.OnCell, Danger.Deadly)); if (closestConsumablePowerSource != null) { EnergySourceComp energySourceComp = closestConsumablePowerSource.TryGetComp <EnergySourceComp>(); if (energySourceComp != null) { int thingCount = (int)Math.Ceiling((energy.MaxLevel - energy.CurLevel) / energySourceComp.EnergyProps.energyWhenConsumed); if (thingCount > 0) { return(new Job(JobDefOf.ChJAndroidRechargeEnergyComp, new LocalTargetInfo(closestConsumablePowerSource)) { count = thingCount }); } } } return(null); }
public override void Notify_Starting() { base.Notify_Starting(); energyNeed = GetActor().needs.TryGetNeed <Need_Energy>(); }
public override bool HasJobOnThing(Pawn pawn, Thing thing, bool forced = false) { if (pawn.Downed) { return(false); } if (thing.IsForbidden(pawn) || !thing.Position.InAllowedArea(pawn)) { if (!pawn.CanReach(new LocalTargetInfo(thing), PathEndMode.ClosestTouch, Danger.Deadly)) { return(false); } } if (HealthAIUtility.ShouldSeekMedicalRest(pawn)) { return(false); } Pawn targetPawn = thing as Pawn; if (targetPawn == null) { return(false); } if (!pawn.CanReserve(new LocalTargetInfo(targetPawn))) { return(false); } if (!targetPawn?.Faction?.IsPlayer ?? true) { return(false); } if (/*!targetPawn.InBed() || */ !targetPawn.Downed) { return(false); } if (!HealthAIUtility.ShouldSeekMedicalRest(targetPawn)) { return(false); } Need_Energy needEnergy = targetPawn.needs.TryGetNeed <Need_Energy>(); if (needEnergy == null) { return(false); } if (!forced && needEnergy.CurLevelPercentage > 0.5f) { return(false); } Thing closestEnergySource = TryFindBestEnergySource(pawn); if (closestEnergySource == null) { return(false); } if (closestEnergySource.Spawned && !pawn.CanReserve(new LocalTargetInfo(closestEnergySource))) { return(false); } return(true); }
// Token: 0x0600001A RID: 26 RVA: 0x0000247C File Offset: 0x0000067C protected override Job TryGiveJob(Pawn pawn) { bool downed = pawn.Downed; Job result; if (downed) { result = null; } else { Need_Energy need_Energy = pawn.needs.TryGetNeed <Need_Energy>(); bool flag = need_Energy == null; if (flag) { result = null; } else { bool flag2 = need_Energy.CurLevelPercentage >= Need_Energy.rechargePercentage; if (flag2) { result = null; } else { Thing thing3 = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.BuildingArtificial), PathEndMode.ClosestTouch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, (Thing thing) => this.BestClosestPowerSource(pawn, thing), null, 0, -1, false, RegionType.Set_Passable, false); bool flag3 = thing3 != null; if (flag3) { Building building = thing3 as Building; bool flag4 = thing3 != null && building != null && building.PowerComp != null && building.PowerComp.PowerNet.CurrentStoredEnergy() > 50f; if (flag4) { IntVec3 position = thing3.Position; bool flag5 = position.Walkable(pawn.Map) && position.InAllowedArea(pawn) && pawn.CanReserve(new LocalTargetInfo(position), 1, -1, null, false) && pawn.CanReach(position, PathEndMode.OnCell, Danger.Deadly, false, TraverseMode.ByPawn); if (flag5) { return(new Job(JobDefOf.ChJAndroidRecharge, thing3)); } IEnumerable <IntVec3> source = GenAdj.CellsAdjacentCardinal(building); Func <IntVec3, float> < > 9__1; Func <IntVec3, float> keySelector; if ((keySelector = < > 9__1) == null) { keySelector = (< > 9__1 = ((IntVec3 selector) => selector.DistanceTo(pawn.Position))); } foreach (IntVec3 intVec in source.OrderByDescending(keySelector)) { bool flag6 = intVec.Walkable(pawn.Map) && intVec.InAllowedArea(pawn) && pawn.CanReserve(new LocalTargetInfo(intVec), 1, -1, null, false) && pawn.CanReach(intVec, PathEndMode.OnCell, Danger.Deadly, false, TraverseMode.ByPawn); if (flag6) { return(new Job(JobDefOf.ChJAndroidRecharge, thing3, intVec)); } } } } Thing thing2 = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.HaulableEver), PathEndMode.ClosestTouch, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, (Thing thing) => thing.TryGetComp <EnergySourceComp>() != null && !thing.IsForbidden(pawn) && pawn.CanReserve(new LocalTargetInfo(thing), 1, -1, null, false) && thing.Position.InAllowedArea(pawn) && pawn.CanReach(new LocalTargetInfo(thing), PathEndMode.OnCell, Danger.Deadly, false, TraverseMode.ByPawn), null, 0, -1, false, RegionType.Set_Passable, false); bool flag7 = thing2 != null; if (flag7) { EnergySourceComp energySourceComp = thing2.TryGetComp <EnergySourceComp>(); bool flag8 = energySourceComp != null; if (flag8) { int num = (int)Math.Ceiling((double)((need_Energy.MaxLevel - need_Energy.CurLevel) / energySourceComp.EnergyProps.energyWhenConsumed)); bool flag9 = num > 0; if (flag9) { return(new Job(JobDefOf.ChJAndroidRechargeEnergyComp, new LocalTargetInfo(thing2)) { count = num }); } } } result = null; } } } return(result); }