暂存
This commit is contained in:
@@ -1,115 +1,50 @@
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
using System.Linq;
|
||||
|
||||
namespace WulaFallenEmpire
|
||||
{
|
||||
public class WorkGiver_Warden_DeliverEnergy : WorkGiver_Scanner
|
||||
public class WorkGiver_Warden_DeliverEnergy : WorkGiver_Warden
|
||||
{
|
||||
private WorkGiverDefExtension_FeedWula ext;
|
||||
|
||||
private WorkGiverDefExtension_FeedWula Ext
|
||||
{
|
||||
get
|
||||
{
|
||||
if (ext == null)
|
||||
{
|
||||
ext = def.GetModExtension<WorkGiverDefExtension_FeedWula>();
|
||||
}
|
||||
return ext;
|
||||
}
|
||||
}
|
||||
|
||||
public override ThingRequest PotentialWorkThingRequest => ThingRequest.ForDef(ThingDef.Named("WulaSpecies"));
|
||||
|
||||
public override PathEndMode PathEndMode => PathEndMode.ClosestTouch;
|
||||
|
||||
public override Danger MaxPathDanger(Pawn pawn) => Danger.Deadly;
|
||||
|
||||
public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
|
||||
{
|
||||
Pawn prisoner = t as Pawn;
|
||||
|
||||
if (prisoner == null || prisoner == pawn || !prisoner.IsPrisonerOfColony || !prisoner.guest.CanBeBroughtFood)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Need_WulaEnergy energyNeed = prisoner.needs.TryGetNeed<Need_WulaEnergy>();
|
||||
if (energyNeed == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
NeedDefExtension_Energy ext = energyNeed.def.GetModExtension<NeedDefExtension_Energy>();
|
||||
float threshold = (ext != null) ? ext.deliverEnergyThreshold : 0.5f;
|
||||
|
||||
if (energyNeed.CurLevelPercentage > threshold)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (WardenFeedUtility.ShouldBeFed(prisoner))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!pawn.CanReserve(prisoner, 1, -1, null, forced))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Ext == null || Ext.energySourceDef == null)
|
||||
{
|
||||
Log.ErrorOnce("WorkGiver_Warden_DeliverEnergy is missing the DefModExtension with a valid energySourceDef.", def.GetHashCode());
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!FindBestEnergySourceFor(pawn, prisoner, out _, out _))
|
||||
{
|
||||
JobFailReason.Is("NoFood".Translate());
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
|
||||
{
|
||||
Pawn prisoner = (Pawn)t;
|
||||
if (FindBestEnergySourceFor(pawn, prisoner, out Thing energySource, out _))
|
||||
if (!(t is Pawn prisoner) || !ShouldTakeCareOfPrisoner(pawn, prisoner))
|
||||
{
|
||||
Job job = JobMaker.MakeJob(JobDefOf.DeliverFood, energySource, prisoner);
|
||||
job.count = 1;
|
||||
job.targetC = RCellFinder.SpotToChewStandingNear(prisoner, energySource);
|
||||
return job;
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
|
||||
if (!WardenFeedUtility.ShouldBeFed(prisoner) || prisoner.health.hediffSet.HasHediff(DefDatabase<HediffDef>.GetNamed("WULA_ChargingHediff")))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!TryFindBestEnergySourceFor(pawn, prisoner, out Thing energySource, out _))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
Job job = JobMaker.MakeJob(JobDefOf.DeliverFood, energySource, prisoner);
|
||||
job.count = 1;
|
||||
job.targetC = RCellFinder.SpotToChewStandingNear(prisoner, energySource);
|
||||
return job;
|
||||
}
|
||||
|
||||
private bool FindBestEnergySourceFor(Pawn getter, Pawn eater, out Thing foodSource, out ThingDef foodDef)
|
||||
private bool TryFindBestEnergySourceFor(Pawn getter, Pawn eater, out Thing energySource, out ThingDef energyDef)
|
||||
{
|
||||
foodSource = null;
|
||||
foodDef = null;
|
||||
energySource = null;
|
||||
energyDef = null;
|
||||
|
||||
if (Ext == null || Ext.energySourceDef == null)
|
||||
var allowedThings = getter.Map.listerThings.ThingsInGroup(ThingRequestGroup.HaulableEver)
|
||||
.Where(x => x.def.GetModExtension<ThingDefExtension_EnergySource>() != null);
|
||||
|
||||
Thing thing = GenClosest.ClosestThing_Global(eater.Position, allowedThings, 99999f,
|
||||
t => t.IngestibleNow && !t.IsForbidden(getter) && getter.CanReserve(t));
|
||||
|
||||
if (thing != null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
foodSource = GenClosest.ClosestThingReachable(
|
||||
getter.Position,
|
||||
getter.Map,
|
||||
ThingRequest.ForDef(Ext.energySourceDef),
|
||||
PathEndMode.OnCell,
|
||||
TraverseParms.For(getter),
|
||||
9999f,
|
||||
(Thing x) => !x.IsForbidden(getter) && getter.CanReserve(x) && x.GetRoom() != eater.GetRoom()
|
||||
);
|
||||
|
||||
if (foodSource != null)
|
||||
{
|
||||
foodDef = foodSource.def;
|
||||
energySource = thing;
|
||||
energyDef = thing.def;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user