diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll index 80e4abd4..01c46003 100644 Binary files a/1.6/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/1.6/Assemblies/WulaFallenEmpire.dll differ diff --git a/1.6/1.6/Defs/QuestScriptDefs/WULA_Intro_NewColony.xml b/1.6/1.6/Defs/QuestScriptDefs/WULA_Intro_NewColony.xml index 945e7667..b6fcabcb 100644 --- a/1.6/1.6/Defs/QuestScriptDefs/WULA_Intro_NewColony.xml +++ b/1.6/1.6/Defs/QuestScriptDefs/WULA_Intro_NewColony.xml @@ -3,7 +3,7 @@ WULA_Intro_NewColony 0 - true + false false 1 true diff --git a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Manpack_Weapon.xml b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Manpack_Weapon.xml index c33da3f4..ba405047 100644 --- a/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Manpack_Weapon.xml +++ b/1.6/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Manpack_Weapon.xml @@ -2362,6 +2362,7 @@ 可以删除除了块堆和地板外所有东西的武器,拿去和其他超正义mod对打吧——你或许知道,这玩意不属于正常流程中应使用的东西。 false + 0 Wula/Weapon/WULA_MW_Scepter_Of_CLoak Graphic_Single diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_NewColony.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_NewColony.xml index 4f2c9d02..abc66787 100644 --- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_NewColony.xml +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/DefInjected/QuestScriptDef/WULA_Intro_NewColony.xml @@ -4,6 +4,6 @@
  • questName->新殖民地
  • -
  • questDescription->乌拉帝国的先遣队已经抵达地表,舰队给她们发来了第一条通讯。
  • +
  • questDescription->(因为不看提示问我乌拉族科技怎么升的全部砍死)\n\n乌拉帝国的先遣队已经抵达地表,舰队给她们发来了第一条通讯。
  • \ No newline at end of file diff --git a/Source/WulaFallenEmpire/HediffComp/HediffCompProperties_SwitchableHediff.cs b/Source/WulaFallenEmpire/HediffComp/HediffCompProperties_SwitchableHediff.cs index 490b4212..b7b498ea 100644 --- a/Source/WulaFallenEmpire/HediffComp/HediffCompProperties_SwitchableHediff.cs +++ b/Source/WulaFallenEmpire/HediffComp/HediffCompProperties_SwitchableHediff.cs @@ -85,8 +85,6 @@ namespace WulaFallenEmpire // 记录hediff的ID用于保存/恢复 activeHediffId = GetHediffId(activeHediff); - - Log.Message($"[SwitchableHediff] Applied {hediffDef.defName} to {Pawn.LabelShort}, ID: {activeHediffId}"); } } } @@ -109,7 +107,6 @@ namespace WulaFallenEmpire if (GetHediffId(hediff) == activeHediffId) { activeHediff = hediff; - Log.Message($"[SwitchableHediff] Restored active hediff: {hediff.def.defName}, ID: {activeHediffId}"); return true; } } @@ -124,7 +121,6 @@ namespace WulaFallenEmpire { activeHediff = hediff; activeHediffId = GetHediffId(hediff); - Log.Message($"[SwitchableHediff] Found matching hediff by def: {hediff.def.defName}"); return true; } } @@ -329,7 +325,6 @@ namespace WulaFallenEmpire // 加载后恢复状态 if (Scribe.mode == LoadSaveMode.PostLoadInit) { - Log.Message($"[SwitchableHediff] PostLoadInit - currentHediffIndex: {currentHediffIndex}, activeHediffId: {activeHediffId}"); if (currentHediffIndex == -1 && Props.availableHediffs.Count > 0) { @@ -342,14 +337,8 @@ namespace WulaFallenEmpire // 尝试恢复已保存的hediff引用 if (!TryRestoreActiveHediff()) { - // 如果恢复失败,重新应用当前选择的hediff - Log.Message($"[SwitchableHediff] Failed to restore active hediff, reapplying..."); ApplySelectedHediff(); } - else - { - Log.Message($"[SwitchableHediff] Successfully restored active hediff"); - } // 验证状态一致性 ValidateStateConsistency(); @@ -364,7 +353,6 @@ namespace WulaFallenEmpire // 检查currentHediffIndex是否有效 if (currentHediffIndex < 0 || currentHediffIndex >= Props.availableHediffs.Count) { - Log.Warning($"[SwitchableHediff] Invalid currentHediffIndex: {currentHediffIndex}"); hasConsistency = false; } @@ -374,14 +362,12 @@ namespace WulaFallenEmpire var expectedDef = Props.availableHediffs[currentHediffIndex]; if (activeHediff.def != expectedDef) { - Log.Warning($"[SwitchableHediff] Inconsistent state: activeHediff.def ({activeHediff.def.defName}) != expectedDef ({expectedDef.defName})"); hasConsistency = false; } } if (!hasConsistency) { - Log.Message($"[SwitchableHediff] State inconsistency detected, attempting to repair..."); RepairState(); } } @@ -397,14 +383,11 @@ namespace WulaFallenEmpire if (Props.availableHediffs[i] == activeHediff.def) { currentHediffIndex = i; - Log.Message($"[SwitchableHediff] Repaired: set currentHediffIndex to {i} based on active hediff"); return; } } } - // 如果无法修复,重新应用当前选择的hediff - Log.Message($"[SwitchableHediff] Could not repair state, reapplying current selection"); ApplySelectedHediff(); } diff --git a/Source/WulaFallenEmpire/Pawn/WULA_Maintenance/Need_Maintenance.cs b/Source/WulaFallenEmpire/Pawn/WULA_Maintenance/Need_Maintenance.cs index 05998781..a621feba 100644 --- a/Source/WulaFallenEmpire/Pawn/WULA_Maintenance/Need_Maintenance.cs +++ b/Source/WulaFallenEmpire/Pawn/WULA_Maintenance/Need_Maintenance.cs @@ -3,6 +3,7 @@ using RimWorld; using Verse; using System.Linq; using System; +using System.Collections.Generic; namespace WulaFallenEmpire { @@ -17,6 +18,10 @@ namespace WulaFallenEmpire private MaintenanceStatus currentAppliedStatus = MaintenanceStatus.Operational; private Hediff currentAppliedHediff = null; + // 新增:验证计数器 + private int validationTickCounter = 0; + private const int VALIDATION_INTERVAL_TICKS = 250; // 每250 ticks验证一次 + // 当前维护状态 public MaintenanceStatus Status { @@ -60,6 +65,7 @@ namespace WulaFallenEmpire daysSinceLastMaintenance = 0f; currentAppliedStatus = MaintenanceStatus.Operational; currentAppliedHediff = null; + validationTickCounter = 0; } public override void NeedInterval() @@ -85,6 +91,136 @@ namespace WulaFallenEmpire // 检查状态变化 CheckStatusChanges(); + + // 新增:周期性验证 Hediff 状态 + PerformHediffValidation(); + } + + // 新增:周期性 Hediff 验证 + private void PerformHediffValidation() + { + validationTickCounter += 150; // NeedInterval 每次调用间隔150 ticks + + if (validationTickCounter >= VALIDATION_INTERVAL_TICKS) + { + validationTickCounter = 0; + ValidateHediffConsistency(); + } + } + + // 新增:验证 Hediff 一致性 + private void ValidateHediffConsistency() + { + if (pawn.Dead || !pawn.Spawned) + return; + + var expectedStatus = Status; + var actualHediffs = GetCurrentMaintenanceHediffs(); + + // 情况1:没有 Hediff,但应该有 + if (expectedStatus != MaintenanceStatus.Operational && actualHediffs.Count == 0) + { + Log.Warning($"[Maintenance] Validation: {pawn.Label} should have {expectedStatus} hediff but has none. Reapplying."); + UpdateHediffForStatus(expectedStatus); + return; + } + + // 情况2:有 Hediff,但不应该有 + if (expectedStatus == MaintenanceStatus.Operational && actualHediffs.Count > 0) + { + Log.Warning($"[Maintenance] Validation: {pawn.Label} is operational but has maintenance hediffs. Removing all."); + RemoveAllMaintenanceHediffs(); + currentAppliedStatus = MaintenanceStatus.Operational; + currentAppliedHediff = null; + return; + } + + // 情况3:有多个 Hediff + if (actualHediffs.Count > 1) + { + Log.Warning($"[Maintenance] Validation: {pawn.Label} has multiple maintenance hediffs ({actualHediffs.Count}). Cleaning up."); + CleanupMultipleHediffs(expectedStatus); + return; + } + + // 情况4:Hediff 类型不正确 + if (actualHediffs.Count == 1 && expectedStatus != MaintenanceStatus.Operational) + { + var currentHediff = actualHediffs[0]; + var expectedHediffDef = GetHediffDefForStatus(expectedStatus); + + if (currentHediff.def != expectedHediffDef) + { + Log.Warning($"[Maintenance] Validation: {pawn.Label} has wrong hediff type. Expected {expectedHediffDef?.defName}, got {currentHediff.def.defName}. Correcting."); + UpdateHediffForStatus(expectedStatus); + return; + } + + // 更新当前应用的 Hediff 引用 + if (currentAppliedHediff != currentHediff) + { + currentAppliedHediff = currentHediff; + Log.Message($"[Maintenance] Validation: Updated currentAppliedHediff reference for {pawn.Label}"); + } + } + + // 情况5:状态记录不一致 + if (currentAppliedStatus != expectedStatus) + { + Log.Warning($"[Maintenance] Validation: {pawn.Label} status mismatch. Recorded: {currentAppliedStatus}, Actual: {expectedStatus}. Synchronizing."); + currentAppliedStatus = expectedStatus; + } + } + + // 新增:获取当前所有的维护 Hediff + private List GetCurrentMaintenanceHediffs() + { + var maintenanceHediffs = new List(); + + if (Extension == null) + return maintenanceHediffs; + + var allMaintenanceHediffDefs = new List + { + Extension.minorBreakdownHediff, + Extension.majorBreakdownHediff, + Extension.criticalFailureHediff + }.Where(def => def != null).ToList(); + + foreach (var hediff in pawn.health.hediffSet.hediffs) + { + if (allMaintenanceHediffDefs.Contains(hediff.def)) + { + maintenanceHediffs.Add(hediff); + } + } + + return maintenanceHediffs; + } + + // 新增:移除所有维护 Hediff + private void RemoveAllMaintenanceHediffs() + { + var maintenanceHediffs = GetCurrentMaintenanceHediffs(); + foreach (var hediff in maintenanceHediffs) + { + pawn.health.RemoveHediff(hediff); + } + } + + // 新增:清理多个 Hediff + private void CleanupMultipleHediffs(MaintenanceStatus expectedStatus) + { + // 移除所有维护 Hediff + RemoveAllMaintenanceHediffs(); + + // 重新应用正确的 Hediff + if (expectedStatus != MaintenanceStatus.Operational) + { + UpdateHediffForStatus(expectedStatus); + } + + currentAppliedStatus = expectedStatus; } // 修改 CalculateDegradationRate 方法以使用 StatDef @@ -110,27 +246,22 @@ namespace WulaFallenEmpire // 只有当状态发生变化时才更新 Hediff if (newStatus != currentAppliedStatus) { + if (Prefs.DevMode) + { + Log.Message($"[Maintenance] Status changed for {pawn.Label}: {currentAppliedStatus} -> {newStatus}"); + } + UpdateHediffForStatus(newStatus); currentAppliedStatus = newStatus; } - - // 额外检查:确保当前 Hediff 仍然存在(可能被其他系统移除) - if (currentAppliedHediff != null && !pawn.health.hediffSet.hediffs.Contains(currentAppliedHediff)) - { - // Hediff 被意外移除,重新应用 - UpdateHediffForStatus(currentAppliedStatus); - } } - // 新增:智能更新 Hediff + // 修改:智能更新 Hediff private void UpdateHediffForStatus(MaintenanceStatus status) { - // 首先移除当前应用的 Hediff - if (currentAppliedHediff != null) - { - pawn.health.RemoveHediff(currentAppliedHediff); - currentAppliedHediff = null; - } + // 首先移除所有维护相关的 Hediff + RemoveAllMaintenanceHediffs(); + currentAppliedHediff = null; // 根据新状态添加相应的 Hediff HediffDef hediffDefToAdd = GetHediffDefForStatus(status); @@ -142,7 +273,7 @@ namespace WulaFallenEmpire // 调试日志 if (Prefs.DevMode) { - Log.Message($"Maintenance: Applied {hediffDefToAdd.defName} for status {status} to {pawn.Label}"); + Log.Message($"[Maintenance] Applied {hediffDefToAdd.defName} for status {status} to {pawn.Label}"); } } else if (status == MaintenanceStatus.Operational) @@ -150,7 +281,7 @@ namespace WulaFallenEmpire // 操作状态,不需要 Hediff if (Prefs.DevMode) { - Log.Message($"Maintenance: {pawn.Label} is operational, no hediff needed"); + Log.Message($"[Maintenance] {pawn.Label} is operational, no hediff needed"); } } } @@ -181,13 +312,16 @@ namespace WulaFallenEmpire CurLevel = ClampNeedLevel(CurLevel); daysSinceLastMaintenance = 0f; - // 更新状态(会自动移除旧的 Hediff 并应用新的) + // 强制验证以确保状态正确 var newStatus = Status; UpdateHediffForStatus(newStatus); currentAppliedStatus = newStatus; // 触发维护完成的效果 OnMaintenancePerformed(maintenanceAmount); + + // 立即执行一次验证 + ValidateHediffConsistency(); } // 修改 ApplyDamagePenalty 方法以使用 StatDef @@ -208,6 +342,9 @@ namespace WulaFallenEmpire UpdateHediffForStatus(newStatus); currentAppliedStatus = newStatus; } + + // 立即执行一次验证 + ValidateHediffConsistency(); } private void OnMaintenancePerformed(float amount) @@ -240,21 +377,18 @@ namespace WulaFallenEmpire Scribe_Values.Look(ref daysSinceLastMaintenance, "daysSinceLastMaintenance", 0f); Scribe_Values.Look(ref currentAppliedStatus, "currentAppliedStatus", MaintenanceStatus.Operational); Scribe_References.Look(ref currentAppliedHediff, "currentAppliedHediff"); + Scribe_Values.Look(ref validationTickCounter, "validationTickCounter", 0); // 修复:加载后验证状态一致性 if (Scribe.mode == LoadSaveMode.PostLoadInit) { - // 确保当前状态与实际 Hediff 一致 - if (currentAppliedHediff != null && !pawn.health.hediffSet.hediffs.Contains(currentAppliedHediff)) + // 延迟执行验证,确保所有组件都已加载 + LongEventHandler.ExecuteWhenFinished(() => { - // Hediff 丢失,重新应用 - UpdateHediffForStatus(currentAppliedStatus); - } - else if (currentAppliedHediff == null && currentAppliedStatus != MaintenanceStatus.Operational) - { - // 应该有 Hediff 但没有,重新应用 - UpdateHediffForStatus(currentAppliedStatus); - } + // 使用简单的延迟调用而不是 AddOnceOffAction + Find.TickManager.DebugSetTicksGame(Find.TickManager.TicksGame); // 强制触发一次更新 + ValidateHediffConsistency(); + }); } } } diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index d8af6820..08988ddf 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -256,6 +256,9 @@ + + +