fix: 修复夺舍能力在跳跃前执行导致空指针的问题
修复 GestaltNode 相关逻辑的空指针异常 修复 Overlord 死亡或销毁时 HiveNode 的状态更新问题 增加 Pawn 不在当前地图时的检查
This commit is contained in:
@@ -41,17 +41,10 @@ namespace ArachnaeSwarm
|
|||||||
{
|
{
|
||||||
base.Apply(target, dest);
|
base.Apply(target, dest);
|
||||||
|
|
||||||
// 新增:检查目标是否无法行动(倒地)
|
// 修复:不再在 Apply 中直接执行 DoPossession。
|
||||||
if (target.Pawn != null && IsTargetImmobilized(target.Pawn))
|
// 因为该能力使用 Verb_JumpAndCastOnLanding,会在落地时通过 OnJumpCompleted 触发夺舍。
|
||||||
{
|
// 在此处执行会导致施法者在跳跃开始前或期间被销毁,导致 PawnFlyer 抛出空指针异常。
|
||||||
ArachnaeLog.Debug($"[夺舍] 目标 {target.Pawn.LabelShort} 无法行动,直接执行夺舍");
|
ArachnaeLog.Debug($"[夺舍] Apply 触发,目标: {target.Pawn?.LabelShort ?? "无"}。等待跳跃落地后执行夺舍逻辑。");
|
||||||
DoPossession(this.parent.pawn, target.Pawn);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ArachnaeLog.Debug($"[夺舍] 目标可以行动,执行标准夺舍流程");
|
|
||||||
DoPossession(this.parent.pawn, target.Pawn);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增:检查目标是否无法行动
|
// 新增:检查目标是否无法行动
|
||||||
|
|||||||
@@ -124,6 +124,12 @@ namespace ArachnaeSwarm
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 如果Pawn当前不在地图上,无法寻找Overlord
|
||||||
|
if (Pawn.Map == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 在殖民地寻找可用的OverlordNode
|
// 在殖民地寻找可用的OverlordNode
|
||||||
Pawn bestOverlord = null;
|
Pawn bestOverlord = null;
|
||||||
float bestScore = -1f;
|
float bestScore = -1f;
|
||||||
|
|||||||
@@ -65,27 +65,25 @@ namespace ArachnaeSwarm
|
|||||||
{
|
{
|
||||||
base.Notify_PostRemovedByDeath(firstPawn, secondPawn);
|
base.Notify_PostRemovedByDeath(firstPawn, secondPawn);
|
||||||
|
|
||||||
|
if (firstPawn == null || secondPawn == null)
|
||||||
|
return;
|
||||||
|
|
||||||
// 处理死亡事件
|
// 处理死亡事件
|
||||||
Pawn overlord = (firstPawn.IsGestaltNode(GestaltNodeType.OverlordNode) ? firstPawn : secondPawn);
|
Pawn overlord = (firstPawn.IsGestaltNode(GestaltNodeType.OverlordNode) ? firstPawn : secondPawn);
|
||||||
Pawn hiveNode = (firstPawn == overlord) ? secondPawn : firstPawn;
|
Pawn hiveNode = (firstPawn == overlord) ? secondPawn : firstPawn;
|
||||||
|
|
||||||
if (!hiveNode.Dead && hiveNode.IsGestaltNode(GestaltNodeType.HiveNode))
|
if (hiveNode != null && !hiveNode.Dead && hiveNode.IsGestaltNode(GestaltNodeType.HiveNode))
|
||||||
{
|
{
|
||||||
// 断开连接并寻找新的Overlord
|
// 当关系断开时(无论是Overlord死亡还是被销毁),HiveNode 需要更新状态并寻找新主
|
||||||
if (overlord != null && !overlord.Dead)
|
HediffComp_GestaltNode hiveNodeComp = hiveNode.GetGestaltNodeComp();
|
||||||
|
if (hiveNodeComp != null)
|
||||||
{
|
{
|
||||||
HediffComp_GestaltNode hiveNodeComp = hiveNode.GetGestaltNodeComp();
|
hiveNodeComp.UpdateSeverityBasedOnConnection();
|
||||||
if (hiveNodeComp != null)
|
hiveNodeComp.TryFindOverlord();
|
||||||
{
|
|
||||||
hiveNodeComp.UpdateSeverityBasedOnConnection();
|
|
||||||
}
|
|
||||||
|
|
||||||
// HiveNode会自动尝试寻找新的Overlord
|
|
||||||
hiveNodeComp?.TryFindOverlord();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (overlord != null && !overlord.Dead)
|
if (overlord != null && hiveNode != null && (!overlord.Dead || overlord.Destroyed))
|
||||||
{
|
{
|
||||||
Messages.Message("MessageGestaltLostControl".Translate(overlord, hiveNode) + ": " + hiveNode.LabelShortCap,
|
Messages.Message("MessageGestaltLostControl".Translate(overlord, hiveNode) + ": " + hiveNode.LabelShortCap,
|
||||||
new LookTargets(new Thing[] { overlord, hiveNode }), MessageTypeDefOf.NeutralEvent);
|
new LookTargets(new Thing[] { overlord, hiveNode }), MessageTypeDefOf.NeutralEvent);
|
||||||
|
|||||||
Reference in New Issue
Block a user