This commit is contained in:
2025-08-14 16:45:40 +08:00
parent acb5dcebc0
commit 975c18df4a
2 changed files with 13 additions and 40 deletions

View File

@@ -9,59 +9,36 @@ namespace WulaFallenEmpire
{ {
public float minEnergyLevelPercentage = 0.3f; public float minEnergyLevelPercentage = 0.3f;
public float maxEnergyLevelPercentage = 0.9f; public float maxEnergyLevelPercentage = 0.9f;
public float emergencyPriority = 9.5f;
public override float GetPriority(Pawn pawn) public override float GetPriority(Pawn pawn)
{ {
if (pawn.health.hediffSet.HasHediff(DefDatabase<HediffDef>.GetNamed("WULA_ChargingHediff"))) var energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
{ if (energyNeed == null || energyNeed.CurLevelPercentage >= minEnergyLevelPercentage)
Log.Message($"[JobGiver_WulaGetEnergy] {pawn.Name.ToStringShort} already has charging hediff. Priority 0.");
return 0f;
}
Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
if (energyNeed == null)
{ {
return 0f; return 0f;
} }
return 9.5f;
if (energyNeed.CurLevelPercentage < minEnergyLevelPercentage)
{
return emergencyPriority;
}
return 0f;
} }
protected override Job TryGiveJob(Pawn pawn) protected override Job TryGiveJob(Pawn pawn)
{ {
Log.Message($"[JobGiver_WulaGetEnergy] Trying to give job to {pawn.Name.ToStringShort}."); var energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
if (pawn.health.hediffSet.HasHediff(DefDatabase<HediffDef>.GetNamed("WULA_ChargingHediff")))
{
Log.Message($"[JobGiver_WulaGetEnergy] {pawn.Name.ToStringShort} already has charging hediff. Job cancelled.");
return null;
}
Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
if (energyNeed == null || energyNeed.CurLevelPercentage >= maxEnergyLevelPercentage) if (energyNeed == null || energyNeed.CurLevelPercentage >= maxEnergyLevelPercentage)
{ {
Log.Message($"[JobGiver_WulaGetEnergy] Energy level for {pawn.Name.ToStringShort} is sufficient. Job cancelled.");
return null; return null;
} }
if (!TryFindBestEnergySourceFor(pawn, out Thing energySource)) if (!TryFindBestEnergySourceFor(pawn, out var energySource))
{ {
Log.Message($"[JobGiver_WulaGetEnergy] No energy source found for {pawn.Name.ToStringShort}. Job cancelled.");
return null; return null;
} }
if (energySource is Building_Bed) if (energySource is Building_Bed)
{ {
Log.Message($"[JobGiver_WulaGetEnergy] Found bed for {pawn.Name.ToStringShort}. Creating WULA_LayDownToCharge job.");
return JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("WULA_LayDownToCharge"), energySource); return JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("WULA_LayDownToCharge"), energySource);
} }
Job job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("WULA_IngestWulaEnergy"), energySource); var job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("WULA_IngestWulaEnergy"), energySource);
job.count = 1; job.count = 1;
return job; return job;
} }
@@ -109,20 +86,16 @@ namespace WulaFallenEmpire
9999f, 9999f,
b => b =>
{ {
Building_Bed bed_internal = b as Building_Bed; if (!(b is Building_Bed bed_internal)) return false;
if (bed_internal == null) return false;
var chargingComp = bed_internal.GetComp<CompChargingBed>();
if (chargingComp == null) return false;
if (bed_internal.GetComp<CompChargingBed>() == null) return false;
var powerComp = bed_internal.GetComp<CompPowerTrader>(); var powerComp = bed_internal.GetComp<CompPowerTrader>();
return !bed_internal.IsForbidden(pawn) &&
pawn.CanReserve(bed_internal) && // 使用 pawn.CanReserve 是最可靠的方法,它包含了对 ملكية، حظر، منطقة، الخ 的所有检查。
!bed_internal.Medical && return powerComp != null &&
!bed_internal.IsBurning() &&
powerComp != null &&
powerComp.PowerOn && powerComp.PowerOn &&
!bed_internal.CurOccupants.Any(); pawn.CanReserve(bed_internal);
} }
); );
return bed; return bed;