暂存充电床
This commit is contained in:
76
Source/WulaFallenEmpire/CompChargingBed.cs
Normal file
76
Source/WulaFallenEmpire/CompChargingBed.cs
Normal file
@@ -0,0 +1,76 @@
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using System.Linq;
|
||||
|
||||
namespace WulaFallenEmpire
|
||||
{
|
||||
public class CompProperties_ChargingBed : CompProperties
|
||||
{
|
||||
public HediffDef hediffDef;
|
||||
public string raceDefName;
|
||||
|
||||
public CompProperties_ChargingBed()
|
||||
{
|
||||
compClass = typeof(CompChargingBed);
|
||||
}
|
||||
}
|
||||
|
||||
public class CompChargingBed : ThingComp
|
||||
{
|
||||
private Pawn lastOccupant;
|
||||
private CompProperties_ChargingBed Props => (CompProperties_ChargingBed)props;
|
||||
|
||||
public override void CompTick()
|
||||
{
|
||||
base.CompTick();
|
||||
|
||||
if (parent is Building_Bed bed)
|
||||
{
|
||||
Pawn currentOccupant = bed.CurOccupants.FirstOrDefault();
|
||||
|
||||
if (currentOccupant != lastOccupant)
|
||||
{
|
||||
Log.Message($"[CompChargingBed] Occupant changed. Old: {lastOccupant?.Name.ToStringShort ?? "null"}, New: {currentOccupant?.Name.ToStringShort ?? "null"} on {parent.Label}");
|
||||
}
|
||||
|
||||
// Pawn starts resting
|
||||
if (currentOccupant != null && lastOccupant == null)
|
||||
{
|
||||
if (IsWula(currentOccupant))
|
||||
{
|
||||
Log.Message($"[CompChargingBed] {currentOccupant.Name.ToStringShort} started resting. Applying hediff.");
|
||||
ApplyChargingHediff(currentOccupant);
|
||||
}
|
||||
}
|
||||
// Pawn stops resting
|
||||
else if (currentOccupant == null && lastOccupant != null)
|
||||
{
|
||||
// Logic to remove hediff is now in the JobDriver, but we can log the event.
|
||||
if (IsWula(lastOccupant))
|
||||
{
|
||||
Log.Message($"[CompChargingBed] {lastOccupant.Name.ToStringShort} stopped resting.");
|
||||
}
|
||||
}
|
||||
|
||||
lastOccupant = currentOccupant;
|
||||
}
|
||||
}
|
||||
|
||||
private bool IsWula(Pawn pawn)
|
||||
{
|
||||
return pawn.def.defName == Props.raceDefName || pawn.def.defName == (Props.raceDefName + "Real");
|
||||
}
|
||||
|
||||
private void ApplyChargingHediff(Pawn pawn)
|
||||
{
|
||||
var powerComp = parent.GetComp<CompPowerTrader>();
|
||||
Log.Message($"[CompChargingBed] Trying to apply hediff to {pawn.Name.ToStringShort}. PowerOn: {powerComp?.PowerOn}. HasHediff: {pawn.health.hediffSet.HasHediff(Props.hediffDef)}");
|
||||
if (powerComp != null && powerComp.PowerOn && !pawn.health.hediffSet.HasHediff(Props.hediffDef))
|
||||
{
|
||||
Log.Message($"[CompChargingBed] Adding hediff to {pawn.Name.ToStringShort}.");
|
||||
pawn.health.AddHediff(Props.hediffDef);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
58
Source/WulaFallenEmpire/JobDriver_WulaLayDownToCharge.cs
Normal file
58
Source/WulaFallenEmpire/JobDriver_WulaLayDownToCharge.cs
Normal file
@@ -0,0 +1,58 @@
|
||||
using RimWorld;
|
||||
using System.Collections.Generic;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
|
||||
namespace WulaFallenEmpire
|
||||
{
|
||||
public class JobDriver_WulaLayDownToCharge : JobDriver_LayDown
|
||||
{
|
||||
protected override IEnumerable<Toil> MakeNewToils()
|
||||
{
|
||||
this.AddFinishAction(jobCondition =>
|
||||
{
|
||||
Log.Message($"[JobDriver_WulaLayDownToCharge] Job finishing for {pawn.Name.ToStringShort} with condition {jobCondition}. Removing hediff.");
|
||||
var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("WULA_ChargingHediff"));
|
||||
if (hediff != null)
|
||||
{
|
||||
pawn.health.RemoveHediff(hediff);
|
||||
Log.Message($"[JobDriver_WulaLayDownToCharge] Hediff removed from {pawn.Name.ToStringShort}.");
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Message($"[JobDriver_WulaLayDownToCharge] No hediff found on {pawn.Name.ToStringShort} to remove.");
|
||||
}
|
||||
});
|
||||
|
||||
foreach (Toil toil in base.MakeNewToils())
|
||||
{
|
||||
yield return toil;
|
||||
}
|
||||
|
||||
var bed = (Building_Bed)job.targetA.Thing;
|
||||
var powerComp = bed.GetComp<CompPowerTrader>();
|
||||
|
||||
var checkToil = new Toil
|
||||
{
|
||||
tickAction = delegate
|
||||
{
|
||||
if (powerComp != null && !powerComp.PowerOn)
|
||||
{
|
||||
Log.Message($"[JobDriver_WulaLayDownToCharge] Power lost for {pawn.Name.ToStringShort}. Ending job.");
|
||||
EndJobWith(JobCondition.Incompletable);
|
||||
return;
|
||||
}
|
||||
|
||||
Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
|
||||
if (energyNeed != null && energyNeed.CurLevelPercentage >= 0.99f)
|
||||
{
|
||||
Log.Message($"[JobDriver_WulaLayDownToCharge] {pawn.Name.ToStringShort} is fully charged. Ending job.");
|
||||
EndJobWith(JobCondition.Succeeded);
|
||||
}
|
||||
},
|
||||
defaultCompleteMode = ToilCompleteMode.Never
|
||||
};
|
||||
yield return checkToil;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using RimWorld;
|
||||
using System.Linq;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
|
||||
@@ -12,8 +13,14 @@ namespace WulaFallenEmpire
|
||||
|
||||
public override float GetPriority(Pawn pawn)
|
||||
{
|
||||
if (pawn.health.hediffSet.HasHediff(DefDatabase<HediffDef>.GetNamed("WULA_ChargingHediff")))
|
||||
{
|
||||
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 || pawn.health.hediffSet.HasHediff(DefDatabase<HediffDef>.GetNamed("WULA_ChargingHediff")))
|
||||
if (energyNeed == null)
|
||||
{
|
||||
return 0f;
|
||||
}
|
||||
@@ -27,22 +34,33 @@ namespace WulaFallenEmpire
|
||||
|
||||
protected override Job TryGiveJob(Pawn pawn)
|
||||
{
|
||||
Log.Message($"[JobGiver_WulaGetEnergy] Trying to give job to {pawn.Name.ToStringShort}.");
|
||||
|
||||
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)
|
||||
{
|
||||
Log.Message($"[JobGiver_WulaGetEnergy] Energy level for {pawn.Name.ToStringShort} is sufficient. Job cancelled.");
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!TryFindBestEnergySourceFor(pawn, out Thing energySource))
|
||||
{
|
||||
Log.Message($"[JobGiver_WulaGetEnergy] No energy source found for {pawn.Name.ToStringShort}. Job cancelled.");
|
||||
return null;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
Job job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("WULA_IngestWulaEnergy"), energySource);
|
||||
job.count = 1;
|
||||
return job;
|
||||
@@ -50,6 +68,13 @@ namespace WulaFallenEmpire
|
||||
|
||||
private bool TryFindBestEnergySourceFor(Pawn pawn, out Thing energySource)
|
||||
{
|
||||
// 优先寻找可用的充电床
|
||||
energySource = FindChargingBed(pawn);
|
||||
if (energySource != null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// 优先从背包中寻找
|
||||
Thing thing = pawn.inventory.innerContainer.FirstOrFallback(t => t.def.GetModExtension<ThingDefExtension_EnergySource>() != null && t.IngestibleNow);
|
||||
if (thing != null)
|
||||
@@ -71,5 +96,33 @@ namespace WulaFallenEmpire
|
||||
|
||||
return energySource != null;
|
||||
}
|
||||
|
||||
private Building_Bed FindChargingBed(Pawn pawn)
|
||||
{
|
||||
// 寻找附近可用的 WULA_Charging_Station_Synth
|
||||
Building_Bed bed = (Building_Bed)GenClosest.ClosestThingReachable(
|
||||
pawn.Position,
|
||||
pawn.Map,
|
||||
ThingRequest.ForDef(ThingDefOf_WULA.WULA_Charging_Station_Synth),
|
||||
PathEndMode.InteractionCell,
|
||||
TraverseParms.For(pawn),
|
||||
9999f,
|
||||
b =>
|
||||
{
|
||||
Building_Bed bed_internal = b as Building_Bed;
|
||||
if (bed_internal == null) return false;
|
||||
|
||||
var powerComp = bed_internal.GetComp<CompPowerTrader>();
|
||||
return !bed_internal.IsForbidden(pawn) &&
|
||||
pawn.CanReserve(bed_internal) &&
|
||||
!bed_internal.Medical &&
|
||||
!bed_internal.IsBurning() &&
|
||||
powerComp != null &&
|
||||
powerComp.PowerOn &&
|
||||
!bed_internal.CurOccupants.Any();
|
||||
}
|
||||
);
|
||||
return bed;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ namespace WulaFallenEmpire
|
||||
public static class ThingDefOf_WULA
|
||||
{
|
||||
public static ThingDef WULA_MaintenancePod;
|
||||
public static ThingDef WULA_Charging_Station_Synth;
|
||||
|
||||
static ThingDefOf_WULA()
|
||||
{
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="CompChargingBed.cs" />
|
||||
<Compile Include="CompCleave.cs" />
|
||||
<Compile Include="Building_Wula_DarkEnergy_Engine.cs" />
|
||||
<Compile Include="CompApparelInterceptor.cs" />
|
||||
@@ -103,6 +104,7 @@
|
||||
<Compile Include="JobDriver_EnterMaintenancePod.cs" />
|
||||
<Compile Include="JobDriver_HaulToMaintenancePod.cs" />
|
||||
<Compile Include="JobDriver_IngestWulaEnergy.cs" />
|
||||
<Compile Include="JobDriver_WulaLayDownToCharge.cs" />
|
||||
<Compile Include="JobGiver_WulaGetEnergy.cs" />
|
||||
<Compile Include="JobGiver_WulaPackEnergy.cs" />
|
||||
<Compile Include="Job_Maintenance.cs" />
|
||||
|
||||
Reference in New Issue
Block a user