fix(gestalt): 修复节点控制组重连、Overlord判定与过载刷新链路
- 修复控制组缩减时遍历并修改集合导致的潜在异常 - 修复读档重连覆盖已保存控制组分配的问题(仅补齐未分配节点) - 控制组数量变化后立即刷新带宽与过载状态 - 修正 GetOverlord 仅返回 OverlordNode,避免 reflexive 关系方向歧义 - 接入 CompGestalt.CompTick -> GestaltTracker.GameComponentTick 周期更新 - 修复 HediffComp_GestaltNode 兜底 tracker 未绑定 Pawn 的潜在空引用
This commit is contained in:
Binary file not shown.
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace ArachnaeSwarm
|
||||
|
||||
if (tracker == null && NodeType == GestaltNodeType.OverlordNode)
|
||||
{
|
||||
tracker = new Pawn_GestaltTracker();
|
||||
tracker = new Pawn_GestaltTracker(Pawn);
|
||||
}
|
||||
return tracker;
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user