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) &&