feat: 改进维护舱修复逻辑,处理缺失部件

修复了维护舱无法完全修复角色健康状况的问题,现在可以修复所有类型的损伤和缺失部件。增加日志记录以诊断修复失败的情况,避免无限循环。
This commit is contained in:
2025-08-16 17:55:56 +08:00
parent a830392b36
commit e3117cb76e
2 changed files with 25 additions and 4 deletions

View File

@@ -199,18 +199,39 @@ namespace WulaFallenEmpire
}
}
// 2. Heal all other injuries
// 2. Heal all other injuries and missing parts
int injuriesHealed = 0;
// Loop until no more health conditions can be fixed
while (HealthUtility.TryGetWorstHealthCondition(occupant, out var hediffToFix, out var _))
{
// Ensure we don't try to "heal" the maintenance hediff itself
if (hediffToFix.def == Props.hediffToRemove)
// Ensure we don't try to "heal" the maintenance hediff itself, as it's handled separately.
if (hediffToFix != null && hediffToFix.def == Props.hediffToRemove)
{
break;
}
// Store the state before attempting to fix
int initialHediffCount = occupant.health.hediffSet.hediffs.Count;
var hediffsBefore = new HashSet<Hediff>(occupant.health.hediffSet.hediffs);
// Attempt to fix the worst condition
HealthUtility.FixWorstHealthCondition(occupant);
injuriesHealed++;
// Check if a change actually occurred
bool conditionFixed = initialHediffCount > occupant.health.hediffSet.hediffs.Count ||
!hediffsBefore.SetEquals(occupant.health.hediffSet.hediffs);
if (conditionFixed)
{
injuriesHealed++;
}
else
{
// If FixWorstHealthCondition did nothing, it means it can't handle
// the current worst condition. We must break to avoid an infinite loop.
Log.Warning($"[WulaPodDebug] Halting healing loop. FixWorstHealthCondition did not resolve: {hediffToFix?.LabelCap ?? "a missing part"}.");
break;
}
}
if (injuriesHealed > 0)