diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll
index 794c7c9..c65fc0c 100644
Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.dll and b/1.6/1.6/Assemblies/ArachnaeSwarm.dll differ
diff --git a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml
index 50c6bb8..1652ecb 100644
--- a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml
+++ b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_HiveMind.xml
@@ -188,7 +188,23 @@
-
+
+
+
+ ARA_LifespanHediff
+ Hediff_High
+ (0.6, 0.8, 0.9)
+ 0.01
+ 0
+
+ 阿拉克涅虫族记录寿命的hediff,正常情况下你不应该看见这个。
+
+
+ 0
+ false
+
+
+
ARA_TemperatureRegulation
diff --git a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml
index bf7f4da..4e4dd10 100644
--- a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml
+++ b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml
@@ -504,8 +504,8 @@
2
50
- 150
- 100
+ 60
+ 30
0.85
1.5
@@ -759,8 +759,6 @@
1
100
- 70
- 10
0.5
@@ -809,6 +807,7 @@
ARA_Cycle_Suppression_Hediff
+ ARA_LifespanHediff
120
寿命
阿拉克涅的督虫们生命如精密的发条般运转着。
@@ -916,8 +915,6 @@
1
100
- 50
- 80
0.75
@@ -970,6 +967,7 @@
ARA_Cycle_Suppression_Hediff
+ ARA_LifespanHediff
60
寿命
阿拉克涅的督虫们生命如精密的发条般运转着。
@@ -1039,8 +1037,6 @@
3
100
- 40
- 10
0.75
@@ -1092,6 +1088,7 @@
ARA_Cycle_Suppression_Hediff
+ ARA_LifespanHediff
60
寿命
阿拉克涅的督虫们生命如精密的发条般运转着。
@@ -1166,8 +1163,6 @@
2
100
- 60
- 30
1.25
1.25
@@ -1207,6 +1202,7 @@
ARA_Cycle_Suppression_Hediff
+ ARA_LifespanHediff
60
寿命
阿拉克涅的督虫们生命如精密的发条般运转着。
@@ -1313,8 +1309,6 @@
5
5
100
- 20
- 5
1.5
2.5
@@ -1379,8 +1373,6 @@
100
- 150
- 150
0.5
@@ -1431,6 +1423,7 @@
ARA_Cycle_Suppression_Hediff
+ ARA_LifespanHediff
120
寿命
阿拉克涅的督虫们生命如精密的发条般运转着。
@@ -1512,8 +1505,6 @@
100
- 160
- 30
1.5
@@ -1560,6 +1551,7 @@
ARA_Cycle_Suppression_Hediff
+ ARA_LifespanHediff
60
寿命
阿拉克涅的督虫们生命如精密的发条般运转着。
@@ -1719,8 +1711,6 @@
100
- 160
- 30
0.75
@@ -1913,8 +1903,6 @@
2
100
- 80
- 40
1.5
1.5
@@ -1940,6 +1928,7 @@
ARA_Cycle_Suppression_Hediff
+ ARA_LifespanHediff
180
寿命
阿拉克涅的督虫们生命如精密的发条般运转着。
@@ -2028,8 +2017,6 @@
3
100
- 40
- 10
0.75
diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo
index 0556729..8139c83 100644
Binary files a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo and b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/.suo differ
diff --git a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json
index 7514925..a9a7db9 100644
--- a/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json
+++ b/Source/ArachnaeSwarm/.vs/ArachnaeSwarm/v17/DocumentLayout.json
@@ -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"
}
]
}
diff --git a/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs b/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs
index 4436cf0..541cdc5 100644
--- a/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs
+++ b/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompHediffGiver.cs
@@ -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}");
+ }
+ }
}
-}
\ No newline at end of file
+}
diff --git a/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompProperties_HediffGiver.cs b/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompProperties_HediffGiver.cs
index 470c230..3cee652 100644
--- a/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompProperties_HediffGiver.cs
+++ b/Source/ArachnaeSwarm/Pawn_Comps/ARA_CompHediffGiver/CompProperties_HediffGiver.cs
@@ -20,4 +20,4 @@ namespace ArachnaeSwarm
this.compClass = typeof(CompHediffGiver);
}
}
-}
\ No newline at end of file
+}
diff --git a/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompNodeSwarmLifetime.cs b/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompNodeSwarmLifetime.cs
index d777355..0e75510 100644
--- a/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompNodeSwarmLifetime.cs
+++ b/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompNodeSwarmLifetime.cs
@@ -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 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();
}
}
}
diff --git a/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompProperties_NodeSwarmLifetime.cs b/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompProperties_NodeSwarmLifetime.cs
index 9660ae9..a5c0a0e 100644
--- a/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompProperties_NodeSwarmLifetime.cs
+++ b/Source/ArachnaeSwarm/Pawn_Comps/ARA_NodeSwarmLifetime/CompProperties_NodeSwarmLifetime.cs
@@ -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);
}
}
-}
\ No newline at end of file
+}