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;
if (pawn == null) return;
Pawn_GestaltTracker tracker = GestaltTracker;
if (tracker == null) return;
// 查找所有有 GestaltOverseer 关系的 pawn
List<DirectPawnRelation> relations = pawn.relations.DirectRelations;
@@ -56,7 +58,10 @@ namespace ArachnaeSwarm
Pawn hiveNode = relation.otherPawn;
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;
}
}
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()
{

View File

@@ -9,12 +9,19 @@ namespace ArachnaeSwarm
{
public static Pawn GetOverlord(this Pawn pawn)
{
if (pawn?.relations == null)
return null;
List<DirectPawnRelation> relations = pawn.relations.DirectRelations;
for (int i = 0; i < relations.Count; i++)
{
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;
@@ -45,4 +52,4 @@ namespace ArachnaeSwarm
}
}
}
}
}

View File

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

View File

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