diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll
index 6eafdd50..a55bd7d4 100644
Binary files a/1.6/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/1.6/Assemblies/WulaFallenEmpire.dll differ
diff --git a/1.6/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml b/1.6/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml
index 381947bd..8135f7a3 100644
--- a/1.6/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml
+++ b/1.6/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml
@@ -190,7 +190,6 @@
0.9
9.5
-
diff --git a/1.6/Defs/JobDefs/WULA_Jobs.xml b/1.6/Defs/JobDefs/WULA_Jobs.xml
new file mode 100644
index 00000000..b65494e2
--- /dev/null
+++ b/1.6/Defs/JobDefs/WULA_Jobs.xml
@@ -0,0 +1,9 @@
+
+
+
+ WULA_LayDownToCharge
+ WulaFallenEmpire.JobDriver_WulaLayDownToCharge
+ 正在充电。
+ false
+
+
\ No newline at end of file
diff --git a/Source/WulaFallenEmpire/CompChargingBed.cs b/Source/WulaFallenEmpire/CompChargingBed.cs
index 5defd99c..fab3111a 100644
--- a/Source/WulaFallenEmpire/CompChargingBed.cs
+++ b/Source/WulaFallenEmpire/CompChargingBed.cs
@@ -1,6 +1,6 @@
using RimWorld;
+using System.Collections.Generic;
using Verse;
-using System.Linq;
namespace WulaFallenEmpire
{
@@ -17,60 +17,53 @@ namespace WulaFallenEmpire
public class CompChargingBed : ThingComp
{
- private Pawn lastOccupant;
- private CompProperties_ChargingBed Props => (CompProperties_ChargingBed)props;
+ public CompProperties_ChargingBed Props => (CompProperties_ChargingBed)props;
+
+ private List chargingPawns = new List();
public override void CompTick()
{
base.CompTick();
+ var bed = (Building_Bed)parent;
+ var occupants = new HashSet(bed.CurOccupants);
- if (parent is Building_Bed bed)
+ for (int i = chargingPawns.Count - 1; i >= 0; i--)
{
- Pawn currentOccupant = bed.CurOccupants.FirstOrDefault();
-
- if (currentOccupant != lastOccupant)
+ var pawn = chargingPawns[i];
+ if (!occupants.Contains(pawn))
{
- 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))
+ var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(Props.hediffDef);
+ if (hediff != null)
{
- Log.Message($"[CompChargingBed] {currentOccupant.Name.ToStringShort} started resting. Applying hediff.");
- ApplyChargingHediff(currentOccupant);
+ pawn.health.RemoveHediff(hediff);
+ }
+ chargingPawns.RemoveAt(i);
+ }
+ }
+
+ if (bed.AnyOccupants)
+ {
+ foreach (var pawn in bed.CurOccupants)
+ {
+ if (pawn.def.defName == Props.raceDefName)
+ {
+ if (!pawn.health.hediffSet.HasHediff(Props.hediffDef))
+ {
+ pawn.health.AddHediff(Props.hediffDef);
+ if (!chargingPawns.Contains(pawn))
+ {
+ chargingPawns.Add(pawn);
+ }
+ }
}
}
- // 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)
+ public override void PostExposeData()
{
- return pawn.def.defName == Props.raceDefName || pawn.def.defName == (Props.raceDefName + "Real");
+ base.PostExposeData();
+ Scribe_Collections.Look(ref chargingPawns, "chargingPawns", LookMode.Reference);
}
-
- private void ApplyChargingHediff(Pawn pawn)
- {
- var powerComp = parent.GetComp();
- 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);
- }
- }
-
}
}
\ No newline at end of file
diff --git a/Source/WulaFallenEmpire/JobDriver_WulaLayDownToCharge.cs b/Source/WulaFallenEmpire/JobDriver_WulaLayDownToCharge.cs
index dd41c4cc..0f6e5b6d 100644
--- a/Source/WulaFallenEmpire/JobDriver_WulaLayDownToCharge.cs
+++ b/Source/WulaFallenEmpire/JobDriver_WulaLayDownToCharge.cs
@@ -5,40 +5,52 @@ using Verse.AI;
namespace WulaFallenEmpire
{
- public class JobDriver_WulaLayDownToCharge : JobDriver_LayDown
+ public class JobDriver_WulaLayDownToCharge : JobDriver
{
+ public override bool TryMakePreToilReservations(bool errorOnFailed)
+ {
+ return pawn.Reserve(job.targetA, job, 1, -1, null, errorOnFailed);
+ }
+
protected override IEnumerable 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"));
+ var bed = (Building_Bed)job.targetA.Thing;
+ var comp = bed.GetComp();
+ if (comp == null) return;
+ var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(comp.Props.hediffDef);
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;
- }
+ yield return Toils_Bed.GotoBed(TargetIndex.A);
- var bed = (Building_Bed)job.targetA.Thing;
- var powerComp = bed.GetComp();
-
- var checkToil = new Toil
+ Toil layDownAndCharge = Toils_LayDown.LayDown(TargetIndex.A, true, false, false, false);
+ layDownAndCharge.AddPreInitAction(delegate
{
- tickAction = delegate
+ if (!pawn.health.hediffSet.HasHediff(HediffDef.Named("WULA_ChargingHediff")))
{
+ var bed = (Building_Bed)job.targetA.Thing;
+ var comp = bed.GetComp();
+ if (comp != null && !pawn.health.hediffSet.HasHediff(comp.Props.hediffDef))
+ {
+ pawn.health.AddHediff(comp.Props.hediffDef);
+ }
+ }
+ });
+
+ layDownAndCharge.tickAction = delegate
+ {
+ if (pawn.IsHashIntervalTick(60))
+ {
+ var bed = (Building_Bed)job.targetA.Thing;
+ var powerComp = bed.GetComp();
+
if (powerComp != null && !powerComp.PowerOn)
{
- Log.Message($"[JobDriver_WulaLayDownToCharge] Power lost for {pawn.Name.ToStringShort}. Ending job.");
EndJobWith(JobCondition.Incompletable);
return;
}
@@ -46,13 +58,12 @@ namespace WulaFallenEmpire
Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed();
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;
+
+ yield return layDownAndCharge;
}
}
}
\ No newline at end of file
diff --git a/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs b/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs
index 7fff016d..3f2839eb 100644
--- a/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs
+++ b/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs
@@ -103,7 +103,7 @@ namespace WulaFallenEmpire
Building_Bed bed = (Building_Bed)GenClosest.ClosestThingReachable(
pawn.Position,
pawn.Map,
- ThingRequest.ForDef(ThingDefOf_WULA.WULA_Charging_Station_Synth),
+ ThingRequest.ForGroup(ThingRequestGroup.BuildingArtificial),
PathEndMode.InteractionCell,
TraverseParms.For(pawn),
9999f,
@@ -112,6 +112,9 @@ namespace WulaFallenEmpire
Building_Bed bed_internal = b as Building_Bed;
if (bed_internal == null) return false;
+ var chargingComp = bed_internal.GetComp();
+ if (chargingComp == null) return false;
+
var powerComp = bed_internal.GetComp();
return !bed_internal.IsForbidden(pawn) &&
pawn.CanReserve(bed_internal) &&