Files
WulaFallenEmpireRW/Source/WulaFallenEmpire/EmergencyAbilityPatches.cs
2025-07-21 16:24:04 +08:00

137 lines
6.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using HarmonyLib;
using RimWorld;
using System; // Added for Type
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;
using Verse;
namespace WulaFallenEmpire
{
[HarmonyPatch]
public static class EmergencyAbilityPatches
{
// 修复倒地时无法使用能力的问题
[HarmonyPatch(typeof(Ability), "get_CanCast")]
[HarmonyPostfix]
public static void CanCast_Postfix(Ability __instance, ref AcceptanceReport __result)
{
if (__instance.def.defName == "WULA_EmergencyEnergyRestore")
{
Log.Message($"[EmergencyAbilityPatches] CanCast_Postfix for {__instance.pawn?.LabelShort}, initial result: {__result.Accepted}, reason: {__result.Reason}");
if (!__result.Accepted)
{
// 检查是否是因为pawn失去知觉而无法使用能力
if (__instance.pawn.Downed)
{
// 对于紧急能量恢复能力,我们允许在倒地时使用
__result = true;
Log.Message($"[EmergencyAbilityPatches] CanCast_Postfix: Pawn is downed, overriding to true. New result: {__result.Accepted}");
}
}
}
}
// 修复倒地时无法显示能力按钮的问题
[HarmonyPatch(typeof(Pawn_AbilityTracker), "get_AllAbilitiesForReading")]
[HarmonyPostfix]
public static void GetAbilitiesForDisplay_Postfix(Pawn_AbilityTracker __instance, ref List<Ability> __result)
{
// 检查pawn是否倒地
if (__instance.pawn.Downed)
{
// 添加紧急能量恢复能力即使pawn倒地
foreach (Ability ability in __instance.abilities)
{
if (ability.def.defName == "WULA_EmergencyEnergyRestore" && !__result.Contains(ability))
{
__result.Add(ability);
}
}
}
}
// 修复倒地时无法使用能力的UI限制 - 直接修补Ability.GizmoDisabled方法
[HarmonyPatch(typeof(Ability), "GizmoDisabled")]
[HarmonyPostfix]
public static void Ability_GizmoDisabled_Postfix(Ability __instance, ref bool __result, ref string reason)
{
if (__instance.def.defName == "WULA_EmergencyEnergyRestore")
{
Log.Message($"[EmergencyAbilityPatches] GizmoDisabled_Postfix for {__instance.pawn?.LabelShort}, initial result: {__result}, reason: {reason}");
if (__result)
{
// 检查是否是因为倒地而被禁用
if (__instance.pawn.Downed && reason != null &&
(reason.Contains("失去知觉") || reason.Contains("unconscious") || reason.Contains("CommandDisabledUnconscious")))
{
// 对于紧急能量恢复能力,我们允许在倒地时使用
__result = false;
reason = null;
Log.Message($"[EmergencyAbilityPatches] GizmoDisabled_Postfix: Pawn is downed, overriding to false. New result: {__result}");
}
}
}
}
// 额外的安全措施修复Command_Ability的禁用检查
[HarmonyPatch(typeof(Command_Ability), "get_Disabled")]
[HarmonyPostfix]
public static void Command_Ability_GizmoDisabled_Postfix(Command_Ability __instance, ref bool __result)
{
// 使用反射获取ability字段
var abilityField = typeof(Command_Ability).GetField("ability", BindingFlags.Instance | BindingFlags.NonPublic);
if (abilityField == null) return;
Ability ability = (Ability)abilityField.GetValue(__instance);
if (ability == null) return;
if (ability.def.defName == "WULA_EmergencyEnergyRestore")
{
Log.Message($"[EmergencyAbilityPatches] Command_Ability_GizmoDisabled_Postfix for {ability.pawn?.LabelShort}, initial result: {__result}");
if (__result && ability.pawn.Downed)
{
// 对于紧急能量恢复能力,我们允许在倒地时使用
__result = false;
Log.Message($"[EmergencyAbilityPatches] Command_Ability_GizmoDisabled_Postfix: Pawn is downed, overriding to false. New result: {__result}");
}
}
}
// 新增补丁检查ApparelPreventsShooting是否阻止了施法
[HarmonyPatch(typeof(Verb), "ApparelPreventsShooting")]
[HarmonyPostfix]
public static void ApparelPreventsShooting_Postfix(Verb __instance, ref bool __result)
{
Log.Message($"[EmergencyAbilityPatches] ApparelPreventsShooting_Postfix called. Verb type: {__instance.GetType().Name}, Caster: {__instance.CasterPawn?.LabelShort}, initial result: {__result}");
if (__instance is Verb_CastAbility castAbilityVerb && castAbilityVerb.ability?.def.defName == "WULA_EmergencyEnergyRestore")
{
Log.Message($"[EmergencyAbilityPatches] ApparelPreventsShooting_Postfix for EmergencyEnergyRestore. Pawn: {__instance.CasterPawn?.LabelShort}, result: {__result}");
}
}
// 最终诊断补丁检查Verb.TryStartCastOn是否被调用
[HarmonyPatch(typeof(Verb), "TryStartCastOn", new Type[] { typeof(LocalTargetInfo), typeof(LocalTargetInfo), typeof(bool), typeof(bool), typeof(bool), typeof(bool) })]
[HarmonyPrefix]
public static void TryStartCastOn_DiagnosticPrefix(Verb __instance, LocalTargetInfo castTarg, LocalTargetInfo destTarg, ref bool __result)
{
Log.Message($"[EmergencyAbilityPatches] TryStartCastOn_DiagnosticPrefix called for Verb type: {__instance.GetType().Name}. Caster: {__instance.CasterPawn?.LabelShort}. CastTarg: {castTarg}, DestTarg: {destTarg}");
if (__instance is Verb_CastAbility castAbilityVerb && castAbilityVerb.ability?.def.defName == "WULA_EmergencyEnergyRestore")
{
Log.Message($"[EmergencyAbilityPatches] TryStartCastOn_DiagnosticPrefix: This is EmergencyEnergyRestore ability. Caster: {__instance.CasterPawn?.LabelShort}");
}
}
// 诊断补丁检查Verb_CastAbility.TryCastShot是否被调用
[HarmonyPatch(typeof(Verb_CastAbility), "TryCastShot")]
[HarmonyPrefix]
public static void TryCastShot_DiagnosticPrefix(Verb_CastAbility __instance, ref bool __result)
{
if (__instance.ability?.def.defName == "WULA_EmergencyEnergyRestore")
{
Log.Message($"[EmergencyAbilityPatches] TryCastShot_DiagnosticPrefix called for EmergencyEnergyRestore. Pawn: {__instance.CasterPawn?.LabelShort}");
}
}
}
}