修寿命重置和hediffgiver重复给予hediff

This commit is contained in:
2025-10-14 16:24:40 +08:00
parent 6cd3cda24d
commit ef15d0039c
9 changed files with 214 additions and 44 deletions

Binary file not shown.

View File

@@ -188,7 +188,23 @@
</li>
</comps>
</HediffDef>
<!-- 勿删——用于记录寿命的hediff没有会导致寿命组件的工作出现异常 -->
<HediffDef Name="ARA_LifespanHediff" >
<defName>ARA_LifespanHediff</defName>
<hediffClass>Hediff_High</hediffClass>
<defaultLabelColor>(0.6, 0.8, 0.9)</defaultLabelColor>
<minSeverity>0.01</minSeverity>
<initialSeverity>0</initialSeverity>
<label>寿命记录</label>
<description>阿拉克涅虫族记录寿命的hediff正常情况下你不应该看见这个。</description>
<stages>
<li>
<minSeverity>0</minSeverity>
<becomeVisible>false</becomeVisible>
</li>
</stages>
</HediffDef>
<HediffDef>
<defName>ARA_TemperatureRegulation</defName>
<label>冷血动物</label>

View File

@@ -504,8 +504,8 @@
<EatingSpeed>2</EatingSpeed>
<CarryingCapacity>50</CarryingCapacity>
<MeatAmount>150</MeatAmount>
<LeatherAmount>100</LeatherAmount>
<MeatAmount>60</MeatAmount>
<LeatherAmount>30</LeatherAmount>
<PainShockThreshold>0.85</PainShockThreshold>
<PsychicSensitivity>1.5</PsychicSensitivity>
@@ -759,8 +759,6 @@
<MaxNutrition>1</MaxNutrition>
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>70</MeatAmount>
<LeatherAmount>10</LeatherAmount>
<MeleeDodgeChance>0.5</MeleeDodgeChance>
<!-- <MeleeHitChance>1</MeleeHitChance> -->
@@ -809,6 +807,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_NodeSwarmLifetime">
<immuteHediff>ARA_Cycle_Suppression_Hediff</immuteHediff>
<lifespanHediff>ARA_LifespanHediff</lifespanHediff>
<lifetimeDays>120</lifetimeDays>
<labelOverride>寿命</labelOverride>
<tooltipOverride>阿拉克涅的督虫们生命如精密的发条般运转着。</tooltipOverride>
@@ -916,8 +915,6 @@
<MaxNutrition>1</MaxNutrition>
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>50</MeatAmount>
<LeatherAmount>80</LeatherAmount>
<MeleeDodgeChance>0.75</MeleeDodgeChance>
<!-- <MeleeHitChance>1</MeleeHitChance> -->
@@ -970,6 +967,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_NodeSwarmLifetime">
<immuteHediff>ARA_Cycle_Suppression_Hediff</immuteHediff>
<lifespanHediff>ARA_LifespanHediff</lifespanHediff>
<lifetimeDays>60</lifetimeDays>
<labelOverride>寿命</labelOverride>
<tooltipOverride>阿拉克涅的督虫们生命如精密的发条般运转着。</tooltipOverride>
@@ -1039,8 +1037,6 @@
<MaxNutrition>3</MaxNutrition>
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>40</MeatAmount>
<LeatherAmount>10</LeatherAmount>
<MeleeDodgeChance>0.75</MeleeDodgeChance>
<!-- <MeleeHitChance>1</MeleeHitChance> -->
@@ -1092,6 +1088,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_NodeSwarmLifetime">
<immuteHediff>ARA_Cycle_Suppression_Hediff</immuteHediff>
<lifespanHediff>ARA_LifespanHediff</lifespanHediff>
<lifetimeDays>60</lifetimeDays>
<labelOverride>寿命</labelOverride>
<tooltipOverride>阿拉克涅的督虫们生命如精密的发条般运转着。</tooltipOverride>
@@ -1166,8 +1163,6 @@
<MaxNutrition>2</MaxNutrition>
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>60</MeatAmount>
<LeatherAmount>30</LeatherAmount>
<MeleeDodgeChance>1.25</MeleeDodgeChance>
<MeleeHitChance>1.25</MeleeHitChance>
@@ -1207,6 +1202,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_NodeSwarmLifetime">
<immuteHediff>ARA_Cycle_Suppression_Hediff</immuteHediff>
<lifespanHediff>ARA_LifespanHediff</lifespanHediff>
<lifetimeDays>60</lifetimeDays>
<labelOverride>寿命</labelOverride>
<tooltipOverride>阿拉克涅的督虫们生命如精密的发条般运转着。</tooltipOverride>
@@ -1313,8 +1309,6 @@
<MoveSpeed>5</MoveSpeed>
<EatingSpeed>5</EatingSpeed>
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>20</MeatAmount>
<LeatherAmount>5</LeatherAmount>
<MeleeDodgeChance>1.5</MeleeDodgeChance>
<MaxNutrition>2.5</MaxNutrition>
@@ -1379,8 +1373,6 @@
<!-- <MaxNutrition>3</MaxNutrition> -->
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>150</MeatAmount>
<LeatherAmount>150</LeatherAmount>
<MeleeDodgeChance>0.5</MeleeDodgeChance>
@@ -1431,6 +1423,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_NodeSwarmLifetime">
<immuteHediff>ARA_Cycle_Suppression_Hediff</immuteHediff>
<lifespanHediff>ARA_LifespanHediff</lifespanHediff>
<lifetimeDays>120</lifetimeDays>
<labelOverride>寿命</labelOverride>
<tooltipOverride>阿拉克涅的督虫们生命如精密的发条般运转着。</tooltipOverride>
@@ -1512,8 +1505,6 @@
<!-- <EatingSpeed>5</EatingSpeed> -->
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>160</MeatAmount>
<LeatherAmount>30</LeatherAmount>
<MeleeDodgeChance>1.5</MeleeDodgeChance>
@@ -1560,6 +1551,7 @@
</li>
<li Class="ArachnaeSwarm.CompProperties_NodeSwarmLifetime">
<immuteHediff>ARA_Cycle_Suppression_Hediff</immuteHediff>
<lifespanHediff>ARA_LifespanHediff</lifespanHediff>
<lifetimeDays>60</lifetimeDays>
<labelOverride>寿命</labelOverride>
<tooltipOverride>阿拉克涅的督虫们生命如精密的发条般运转着。</tooltipOverride>
@@ -1719,8 +1711,6 @@
<!-- <EatingSpeed>5</EatingSpeed> -->
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>160</MeatAmount>
<LeatherAmount>30</LeatherAmount>
<MeleeDodgeChance>0.75</MeleeDodgeChance>
@@ -1913,8 +1903,6 @@
<MaxNutrition>2</MaxNutrition>
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>80</MeatAmount>
<LeatherAmount>40</LeatherAmount>
<MeleeDodgeChance>1.5</MeleeDodgeChance>
<MeleeHitChance>1.5</MeleeHitChance>
@@ -1940,6 +1928,7 @@
<comps>
<li Class="ArachnaeSwarm.CompProperties_NodeSwarmLifetime">
<immuteHediff>ARA_Cycle_Suppression_Hediff</immuteHediff>
<lifespanHediff>ARA_LifespanHediff</lifespanHediff>
<lifetimeDays>180</lifetimeDays>
<labelOverride>寿命</labelOverride>
<tooltipOverride>阿拉克涅的督虫们生命如精密的发条般运转着。</tooltipOverride>
@@ -2028,8 +2017,6 @@
<MaxNutrition>3</MaxNutrition>
<CarryingCapacity>100</CarryingCapacity>
<MeatAmount>40</MeatAmount>
<LeatherAmount>10</LeatherAmount>
<MeleeDodgeChance>0.75</MeleeDodgeChance>
<!-- <MeleeHitChance>1</MeleeHitChance> -->

View File

@@ -7,11 +7,11 @@
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:thing_comps\\ara_compextraincubationinfo\\compextraincubationinfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\thing_comps\\ara_compextraincubationinfo\\compproperties_extraincubationinfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\thing_comps\\ara_compextraincubationinfo\\compproperties_extraincubationinfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:thing_comps\\ara_compextraincubationinfo\\compproperties_extraincubationinfo.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\building_comps\\ara_buildingterrainspawn\\compdelayedterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\building_comps\\ara_buildingterrainspawn\\compdelayedterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:building_comps\\ara_buildingterrainspawn\\compdelayedterrainspawn.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}
],
@@ -38,8 +38,7 @@
"RelativeToolTip": "Thing_Comps\\ARA_CompExtraIncubationInfo\\CompProperties_ExtraIncubationInfo.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAABMAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-10-13T03:27:00.382Z",
"EditorCaption": ""
"WhenOpened": "2025-10-13T03:27:00.382Z"
},
{
"$type": "Document",
@@ -64,8 +63,7 @@
"RelativeToolTip": "Building_Comps\\ARA_BuildingTerrainSpawn\\CompDelayedTerrainSpawn.cs",
"ViewState": "AgIAAA4AAAAAAAAAAAAAwD0AAAAhAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-10-12T15:30:31.391Z",
"EditorCaption": ""
"WhenOpened": "2025-10-12T15:30:31.391Z"
}
]
}

View File

@@ -7,6 +7,8 @@ namespace ArachnaeSwarm
{
public class CompHediffGiver : ThingComp
{
private bool hediffsApplied = false; // 新增标记是否已经应用过hediff
public CompProperties_HediffGiver Props => (CompProperties_HediffGiver)this.props;
public override void PostSpawnSetup(bool respawningAfterLoad)
@@ -16,7 +18,12 @@ namespace ArachnaeSwarm
// 只有当thing是pawn时才添加hediff
if (this.parent is Pawn pawn)
{
AddHediffsToPawn(pawn);
// 新增检查是否已经应用过hediff或者是否是读档
if (!hediffsApplied && !respawningAfterLoad)
{
AddHediffsToPawn(pawn);
hediffsApplied = true; // 标记为已应用
}
}
}
@@ -41,5 +48,23 @@ namespace ArachnaeSwarm
pawn.health.AddHediff(hediffDef);
}
}
// 新增序列化hediffsApplied标记
public override void PostExposeData()
{
base.PostExposeData();
Scribe_Values.Look(ref hediffsApplied, "hediffsApplied", false);
}
// 新增调试方法用于手动触发hediff添加仅开发模式
public void DebugApplyHediffs()
{
if (this.parent is Pawn pawn && !hediffsApplied)
{
AddHediffsToPawn(pawn);
hediffsApplied = true;
Log.Message($"Debug: Applied hediffs to {pawn.Label}");
}
}
}
}
}

View File

@@ -20,4 +20,4 @@ namespace ArachnaeSwarm
this.compClass = typeof(CompHediffGiver);
}
}
}
}

View File

@@ -1,5 +1,3 @@
// Assembly-CSharp, Version=1.6.9371.18214, Culture=neutral, PublicKeyToken=null
// RimWorld.CompNodeSwarmLifetime
using RimWorld;
using System.Collections.Generic;
using UnityEngine;
@@ -10,14 +8,17 @@ namespace ArachnaeSwarm
public class CompNodeSwarmLifetime : ThingComp
{
private int powerTicksLeft;
public bool depleted;
private NodeSwarmLifetimeGizmo gizmo;
// 添加:检查是否有特定 Hediff 的缓存字段
private bool? hasShutdownHediffCached;
private int lastHediffCheckTick;
// 新增寿命Hediff相关字段
private Hediff lifespanHediff;
private int lastHediffSyncTick;
private const int HEDIFF_SYNC_INTERVAL = 250; // 每250ticks同步一次
public CompProperties_NodeSwarmLifetime Props => (CompProperties_NodeSwarmLifetime)props;
@@ -59,6 +60,91 @@ namespace ArachnaeSwarm
return pawn.health.hediffSet.HasHediff(Props.immuteHediff);
}
// 新增获取或创建寿命Hediff
private Hediff GetOrCreateLifespanHediff()
{
Pawn pawn = parent as Pawn;
if (pawn == null) return null;
// 首先尝试查找现有的寿命Hediff
if (lifespanHediff == null || lifespanHediff.pawn != pawn)
{
lifespanHediff = pawn.health.hediffSet.GetFirstHediffOfDef(Props.lifespanHediff);
}
// 如果不存在创建新的寿命Hediff
if (lifespanHediff == null)
{
lifespanHediff = pawn.health.AddHediff(Props.lifespanHediff);
if (lifespanHediff != null)
{
// 初始化Hediff的严重程度为当前剩余寿命比例
lifespanHediff.Severity = PercentFull;
Log.Message($"Created lifespan hediff for {pawn.Label} with severity {lifespanHediff.Severity:P2}");
}
}
return lifespanHediff;
}
// 新增同步组件和Hediff的寿命数据
private void SyncLifespanWithHediff()
{
Pawn pawn = parent as Pawn;
if (pawn == null) return;
var hediff = GetOrCreateLifespanHediff();
if (hediff == null)
{
Log.Warning($"Failed to get or create lifespan hediff for {pawn.Label}");
return;
}
// 获取Hediff中的寿命数据
float hediffSeverity = hediff.Severity;
int hediffTicksLeft = (int)(hediffSeverity * Props.lifetimeDays * 60000);
// 比较组件和Hediff的数据
if (hediffTicksLeft != powerTicksLeft)
{
// 以Hediff的数据为准
if (Mathf.Abs(hediffTicksLeft - powerTicksLeft) > 1000) // 只在校正值较大时记录
{
Log.Message($"Lifespan sync: Component had {powerTicksLeft}, Hediff had {hediffTicksLeft}. Using Hediff value.");
}
powerTicksLeft = hediffTicksLeft;
}
// 更新Hediff的严重程度确保是最新的
if (Mathf.Abs(hediff.Severity - PercentFull) > 0.001f)
{
hediff.Severity = PercentFull;
}
}
// 新增定期校验Hediff状态
private void ValidateHediffState()
{
Pawn pawn = parent as Pawn;
if (pawn == null) return;
// 检查寿命Hediff是否存在
var currentHediff = pawn.health.hediffSet.GetFirstHediffOfDef(Props.lifespanHediff);
if (currentHediff == null)
{
// Hediff消失了重新创建
Log.Message($"Lifespan hediff was missing for {pawn.Label}, recreating with component data");
lifespanHediff = null; // 重置缓存
GetOrCreateLifespanHediff();
}
else if (currentHediff != lifespanHediff)
{
// Hediff引用发生变化更新缓存
lifespanHediff = currentHediff;
}
}
public override void PostSpawnSetup(bool respawningAfterLoad)
{
if (!ModLister.CheckBiotechOrAnomalyOrOdyssey("Node swarm lifetime"))
@@ -67,6 +153,7 @@ namespace ArachnaeSwarm
return;
}
base.PostSpawnSetup(respawningAfterLoad);
if (!respawningAfterLoad && !parent.BeingTransportedOnGravship)
{
// 修改:使用天数转换为 ticks
@@ -76,6 +163,13 @@ namespace ArachnaeSwarm
// 初始化 Hediff 检查缓存
hasShutdownHediffCached = null;
lastHediffCheckTick = Find.TickManager.TicksGame;
lastHediffSyncTick = Find.TickManager.TicksGame;
// 确保寿命Hediff存在
GetOrCreateLifespanHediff();
// 初始同步
SyncLifespanWithHediff();
}
public override IEnumerable<Gizmo> CompGetGizmosExtra()
@@ -109,6 +203,7 @@ namespace ArachnaeSwarm
action = delegate
{
powerTicksLeft = 0;
SyncLifespanWithHediff(); // 同步到Hediff
}
};
yield return new Command_Action
@@ -117,6 +212,25 @@ namespace ArachnaeSwarm
action = delegate
{
powerTicksLeft = (int)(Props.lifetimeDays * 60000);
SyncLifespanWithHediff(); // 同步到Hediff
}
};
// 新增调试命令显示Hediff状态
yield return new Command_Action
{
defaultLabel = "DEV: Show Hediff Info",
action = delegate
{
var hediff = GetOrCreateLifespanHediff();
if (hediff != null)
{
Messages.Message($"Lifespan Hediff: Severity={hediff.Severity:P2}, TicksLeft={powerTicksLeft}", MessageTypeDefOf.SilentInput);
}
else
{
Messages.Message("No lifespan hediff found", MessageTypeDefOf.SilentInput);
}
}
};
}
@@ -136,7 +250,24 @@ namespace ArachnaeSwarm
{
return;
}
// 定期同步Hediff状态
if (Find.TickManager.TicksGame > lastHediffSyncTick + HEDIFF_SYNC_INTERVAL)
{
SyncLifespanWithHediff();
ValidateHediffState();
lastHediffSyncTick = Find.TickManager.TicksGame;
}
powerTicksLeft--;
// 更新Hediff严重程度
var hediff = GetOrCreateLifespanHediff();
if (hediff != null)
{
hediff.Severity = PercentFull;
}
if (powerTicksLeft <= 0)
{
if (Props.killWhenDepleted)
@@ -165,6 +296,13 @@ namespace ArachnaeSwarm
{
pawn.Kill(null, null);
}
// 移除寿命Hediff
if (lifespanHediff != null)
{
pawn.health.RemoveHediff(lifespanHediff);
lifespanHediff = null;
}
}
public override void PostExposeData()
@@ -172,12 +310,14 @@ namespace ArachnaeSwarm
base.PostExposeData();
Scribe_Values.Look(ref powerTicksLeft, "powerTicksLeft", 0);
Scribe_Values.Look(ref depleted, "depleted", defaultValue: false);
Scribe_Values.Look(ref lastHediffSyncTick, "lastHediffSyncTick", 0);
// 添加:保存时重置缓存
if (Scribe.mode == LoadSaveMode.PostLoadInit)
{
hasShutdownHediffCached = null;
lastHediffCheckTick = Find.TickManager.TicksGame;
lifespanHediff = null; // 重置Hediff缓存下次需要时重新获取
// 添加:额外的安全检查
// 如果读档后 powerTicksLeft 异常,重置为满值
@@ -185,6 +325,10 @@ namespace ArachnaeSwarm
{
powerTicksLeft = (int)(Props.lifetimeDays * 60000);
}
// 确保寿命Hediff存在并同步
GetOrCreateLifespanHediff();
SyncLifespanWithHediff();
}
}
}

View File

@@ -1,6 +1,3 @@
// Assembly-CSharp, Version=1.6.9371.18214, Culture=neutral, PublicKeyToken=null
// RimWorld.CompProperties_NodeSwarmLifetime
using ArachnaeSwarm;
using RimWorld;
using Verse;
@@ -8,16 +5,19 @@ namespace ArachnaeSwarm
{
public class CompProperties_NodeSwarmLifetime : CompProperties
{
// 修改:使用天数而不是 ticks
// 修改:使用天数而不是 ticks
public float lifetimeDays = 10f;
//结束计时后杀死
//结束计时后杀死
public bool killWhenDepleted = true;
//关闭系统的hediff
//关闭系统的hediff
public HediffDef immuteHediff;
//是否在非玩家控制的pawn身上显示相关控件
//是否在非玩家控制的pawn身上显示相关控件
public bool showGizmoOnNonPlayerControlled;
// 新增用于记录寿命的隐藏Hediff
public HediffDef lifespanHediff;
[MustTranslate]
public string labelOverride;
@@ -29,4 +29,4 @@ namespace ArachnaeSwarm
compClass = typeof(CompNodeSwarmLifetime);
}
}
}
}