fix(gestalt): 修复节点控制组重连、Overlord判定与过载刷新链路

- 修复控制组缩减时遍历并修改集合导致的潜在异常
- 修复读档重连覆盖已保存控制组分配的问题(仅补齐未分配节点)
- 控制组数量变化后立即刷新带宽与过载状态
- 修正 GetOverlord 仅返回 OverlordNode,避免 reflexive 关系方向歧义
- 接入 CompGestalt.CompTick -> GestaltTracker.GameComponentTick 周期更新
- 修复 HediffComp_GestaltNode 兜底 tracker 未绑定 Pawn 的潜在空引用
This commit is contained in:
2026-02-10 16:29:10 +08:00
parent c3952123cb
commit 2434fb17aa
5 changed files with 31 additions and 5 deletions

Binary file not shown.

View File

@@ -46,6 +46,8 @@ namespace ArachnaeSwarm
{ {
Pawn pawn = parent as Pawn; Pawn pawn = parent as Pawn;
if (pawn == null) return; if (pawn == null) return;
Pawn_GestaltTracker tracker = GestaltTracker;
if (tracker == null) return;
// 查找所有有 GestaltOverseer 关系的 pawn // 查找所有有 GestaltOverseer 关系的 pawn
List<DirectPawnRelation> relations = pawn.relations.DirectRelations; List<DirectPawnRelation> relations = pawn.relations.DirectRelations;
@@ -56,7 +58,10 @@ namespace ArachnaeSwarm
Pawn hiveNode = relation.otherPawn; Pawn hiveNode = relation.otherPawn;
if (hiveNode != null && hiveNode.IsGestaltNode(GestaltNodeType.HiveNode)) if (hiveNode != null && hiveNode.IsGestaltNode(GestaltNodeType.HiveNode))
{ {
GestaltTracker?.AssignPawnToControlGroup(hiveNode); if (tracker.GetControlGroup(hiveNode) == null)
{
tracker.AssignPawnToControlGroup(hiveNode);
}
} }
} }
} }
@@ -76,6 +81,17 @@ namespace ArachnaeSwarm
yield return gizmo; yield return gizmo;
} }
} }
public override void CompTick()
{
base.CompTick();
Pawn pawn = parent as Pawn;
if (pawn == null || !pawn.IsGestaltNode(GestaltNodeType.OverlordNode))
return;
GestaltTracker?.GameComponentTick();
}
public override void PostExposeData() public override void PostExposeData()
{ {

View File

@@ -9,12 +9,19 @@ namespace ArachnaeSwarm
{ {
public static Pawn GetOverlord(this Pawn pawn) public static Pawn GetOverlord(this Pawn pawn)
{ {
if (pawn?.relations == null)
return null;
List<DirectPawnRelation> relations = pawn.relations.DirectRelations; List<DirectPawnRelation> relations = pawn.relations.DirectRelations;
for (int i = 0; i < relations.Count; i++) for (int i = 0; i < relations.Count; i++)
{ {
if (relations[i].def == ARA_PawnRelationDefOf.ARA_GestaltOverseer) if (relations[i].def == ARA_PawnRelationDefOf.ARA_GestaltOverseer)
{ {
return relations[i].otherPawn; Pawn otherPawn = relations[i].otherPawn;
if (otherPawn != null && otherPawn.IsGestaltNode(GestaltNodeType.OverlordNode))
{
return otherPawn;
}
} }
} }
return null; return null;
@@ -45,4 +52,4 @@ namespace ArachnaeSwarm
} }
} }
} }
} }

View File

@@ -43,7 +43,7 @@ namespace ArachnaeSwarm
if (tracker == null && NodeType == GestaltNodeType.OverlordNode) if (tracker == null && NodeType == GestaltNodeType.OverlordNode)
{ {
tracker = new Pawn_GestaltTracker(); tracker = new Pawn_GestaltTracker(Pawn);
} }
return tracker; return tracker;
} }

View File

@@ -141,7 +141,8 @@ namespace ArachnaeSwarm
if (!groupToRemove.AssignedPawns.NullOrEmpty()) if (!groupToRemove.AssignedPawns.NullOrEmpty())
{ {
// 将pawn重新分配到其他组 // 将pawn重新分配到其他组
foreach (Pawn pawn in groupToRemove.AssignedPawns) List<Pawn> pawnsToReassign = groupToRemove.AssignedPawns.ToList();
foreach (Pawn pawn in pawnsToReassign)
{ {
if (controlGroups.Count > 1) if (controlGroups.Count > 1)
{ {
@@ -153,6 +154,8 @@ namespace ArachnaeSwarm
controlGroups.RemoveAt(controlGroups.Count - 1); controlGroups.RemoveAt(controlGroups.Count - 1);
} }
} }
Notify_BandwidthChanged();
} }
public void Notify_BandwidthChanged() public void Notify_BandwidthChanged()