暂存2
This commit is contained in:
Binary file not shown.
@@ -269,6 +269,7 @@
|
||||
<ThingDef ParentName="BasicBedBase">
|
||||
<defName>WULA_Charging_Station_Synth</defName>
|
||||
<thingClass>Building_Bed</thingClass>
|
||||
<tickerType>Normal</tickerType>
|
||||
<label>合成人修复站</label>
|
||||
<description>一台供乌拉帝国合成人进行机体修复的检修站。</description>
|
||||
<graphicData>
|
||||
|
||||
@@ -25,41 +25,71 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
base.CompTick();
|
||||
var bed = (Building_Bed)parent;
|
||||
var occupants = new HashSet<Pawn>(bed.CurOccupants);
|
||||
var powerComp = parent.GetComp<CompPowerTrader>();
|
||||
|
||||
// 如果床没电,停止所有充电
|
||||
if (powerComp is { PowerOn: false })
|
||||
{
|
||||
StopAllCharging();
|
||||
return;
|
||||
}
|
||||
|
||||
var currentOccupants = new HashSet<Pawn>(bed.CurOccupants);
|
||||
|
||||
// 移除已经不在床上的 pawn 的充电效果
|
||||
for (int i = chargingPawns.Count - 1; i >= 0; i--)
|
||||
{
|
||||
var pawn = chargingPawns[i];
|
||||
if (!occupants.Contains(pawn))
|
||||
if (!currentOccupants.Contains(pawn))
|
||||
{
|
||||
var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(Props.hediffDef);
|
||||
if (hediff != null)
|
||||
{
|
||||
pawn.health.RemoveHediff(hediff);
|
||||
}
|
||||
StopCharging(pawn);
|
||||
chargingPawns.RemoveAt(i);
|
||||
}
|
||||
}
|
||||
|
||||
if (bed.AnyOccupants)
|
||||
// 为床上的新 pawn 开始充电
|
||||
foreach (var pawn in currentOccupants)
|
||||
{
|
||||
foreach (var pawn in bed.CurOccupants)
|
||||
if (ShouldCharge(pawn) && !chargingPawns.Contains(pawn))
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
StartCharging(pawn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private bool ShouldCharge(Pawn pawn)
|
||||
{
|
||||
return pawn.def.defName == Props.raceDefName;
|
||||
}
|
||||
|
||||
private void StartCharging(Pawn pawn)
|
||||
{
|
||||
if (pawn.health.hediffSet.HasHediff(Props.hediffDef)) return;
|
||||
pawn.health.AddHediff(Props.hediffDef);
|
||||
if (!chargingPawns.Contains(pawn))
|
||||
{
|
||||
chargingPawns.Add(pawn);
|
||||
}
|
||||
}
|
||||
|
||||
private void StopCharging(Pawn pawn)
|
||||
{
|
||||
var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(Props.hediffDef);
|
||||
if (hediff != null)
|
||||
{
|
||||
pawn.health.RemoveHediff(hediff);
|
||||
}
|
||||
}
|
||||
|
||||
private void StopAllCharging()
|
||||
{
|
||||
for (int i = chargingPawns.Count - 1; i >= 0; i--)
|
||||
{
|
||||
StopCharging(chargingPawns[i]);
|
||||
chargingPawns.RemoveAt(i);
|
||||
}
|
||||
}
|
||||
|
||||
public override void PostExposeData()
|
||||
{
|
||||
base.PostExposeData();
|
||||
|
||||
@@ -14,52 +14,24 @@ namespace WulaFallenEmpire
|
||||
|
||||
protected override IEnumerable<Toil> MakeNewToils()
|
||||
{
|
||||
this.AddFinishAction(jobCondition =>
|
||||
{
|
||||
var bed = (Building_Bed)job.targetA.Thing;
|
||||
var comp = bed.GetComp<CompChargingBed>();
|
||||
if (comp == null) return;
|
||||
var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(comp.Props.hediffDef);
|
||||
if (hediff != null)
|
||||
{
|
||||
pawn.health.RemoveHediff(hediff);
|
||||
}
|
||||
});
|
||||
|
||||
yield return Toils_Bed.GotoBed(TargetIndex.A);
|
||||
|
||||
Toil layDownAndCharge = Toils_LayDown.LayDown(TargetIndex.A, true, false, false, false);
|
||||
layDownAndCharge.AddPreInitAction(delegate
|
||||
{
|
||||
if (!pawn.health.hediffSet.HasHediff(HediffDef.Named("WULA_ChargingHediff")))
|
||||
{
|
||||
var bed = (Building_Bed)job.targetA.Thing;
|
||||
var comp = bed.GetComp<CompChargingBed>();
|
||||
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<CompPowerTrader>();
|
||||
|
||||
if (powerComp is { PowerOn: false })
|
||||
{
|
||||
var bed = (Building_Bed)job.targetA.Thing;
|
||||
var powerComp = bed.GetComp<CompPowerTrader>();
|
||||
|
||||
if (powerComp != null && !powerComp.PowerOn)
|
||||
{
|
||||
EndJobWith(JobCondition.Incompletable);
|
||||
return;
|
||||
}
|
||||
|
||||
Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
|
||||
if (energyNeed != null && energyNeed.CurLevelPercentage >= 0.99f)
|
||||
{
|
||||
EndJobWith(JobCondition.Succeeded);
|
||||
}
|
||||
EndJobWith(JobCondition.Incompletable);
|
||||
return;
|
||||
}
|
||||
|
||||
var energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
|
||||
if (energyNeed != null && energyNeed.CurLevelPercentage >= 1f)
|
||||
{
|
||||
EndJobWith(JobCondition.Succeeded);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user