Files
WulaFallenEmpireRW/Source/WulaFallenEmpire/Pawn/WULA_AutonomousMech/Patch_UncontrolledMechDrawPulse.cs

176 lines
6.4 KiB
C#

using HarmonyLib;
using RimWorld;
using Verse;
using System.Reflection;
using UnityEngine;
namespace WulaFallenEmpire
{
// 修复红色名字问题 - 直接修补 PawnNameColorUtility.PawnNameColorOf 方法
[HarmonyPatch(typeof(PawnNameColorUtility), "PawnNameColorOf")]
public static class Patch_PawnNameColorUtility_PawnNameColorOf
{
public static void Postfix(Pawn pawn, ref Color __result)
{
if (pawn != null && pawn.IsColonyMech)
{
var comp = pawn.GetComp<CompAutonomousMech>();
if (comp != null && comp.ShouldSuppressUncontrolledWarning)
{
// 使用正常的白色名字
__result = Color.white;
}
}
}
}
// 修复红光闪烁问题 - 使用 Traverse 访问私有字段
[HarmonyPatch(typeof(Pawn_PlayerSettings), "get_UncontrolledMechDrawPulse")]
public static class Patch_Pawn_PlayerSettings_UncontrolledMechDrawPulse
{
public static bool Prefix(Pawn_PlayerSettings __instance, ref float __result)
{
var traverse = Traverse.Create(__instance);
Pawn pawn = traverse.Field("pawn").GetValue<Pawn>();
if (pawn != null && pawn.IsColonyMech)
{
var comp = pawn.GetComp<CompAutonomousMech>();
if (comp != null && comp.ShouldSuppressUncontrolledWarning)
{
// 返回 0 来禁用红光脉冲
__result = 0f;
return false; // 跳过原始方法
}
}
return true;
}
}
// 修复机械族控制状态检查
[HarmonyPatch(typeof(MechanitorUtility), "IsMechanitorControlled")]
public static class Patch_MechanitorUtility_IsMechanitorControlled
{
public static void Postfix(Pawn mech, ref bool __result)
{
if (!__result && mech != null && mech.IsColonyMech)
{
var comp = mech.GetComp<CompAutonomousMech>();
if (comp != null && comp.ShouldSuppressUncontrolledWarning)
{
// 让游戏认为机械族是受控的
__result = true;
}
}
}
}
// 修复机械族控制状态检查的另一个方法
[HarmonyPatch(typeof(CompOverseerSubject), "get_IsControlled")]
public static class Patch_CompOverseerSubject_IsControlled
{
public static void Postfix(CompOverseerSubject __instance, ref bool __result)
{
Pawn mech = __instance.parent as Pawn;
if (!__result && mech != null && mech.IsColonyMech)
{
var comp = mech.GetComp<CompAutonomousMech>();
if (comp != null && comp.ShouldSuppressUncontrolledWarning)
{
// 让游戏认为机械族是受控的
__result = true;
}
}
}
}
// 修复机械族控制状态显示的另一个检查
[HarmonyPatch(typeof(Pawn), "GetOverseer")]
public static class Patch_Pawn_GetOverseer
{
public static void Postfix(Pawn __instance, ref Pawn __result)
{
if (__result == null && __instance.IsColonyMech)
{
var comp = __instance.GetComp<CompAutonomousMech>();
if (comp != null && comp.ShouldSuppressUncontrolledWarning)
{
// 返回一个虚拟的监管者来避免红色显示
__result = __instance;
}
}
}
}
// 修复机械族控制组提示
[HarmonyPatch(typeof(CompOverseerSubject), "GetUndraftedControlGroupTip")]
public static class Patch_CompOverseerSubject_GetUndraftedControlGroupTip
{
public static bool Prefix(CompOverseerSubject __instance, ref string __result)
{
Pawn mech = __instance.parent as Pawn;
if (mech != null && mech.IsColonyMech)
{
var comp = mech.GetComp<CompAutonomousMech>();
if (comp != null && comp.ShouldSuppressUncontrolledWarning)
{
// 提供自主状态的提示而不是未受控提示
__result = comp.GetAutonomousStatusString() ?? "Autonomous operation";
return false; // 跳过原始方法
}
}
return true;
}
}
// 修复机械族控制状态的其他检查
[HarmonyPatch(typeof(Pawn), "GetInspectString")]
public static class Patch_Pawn_GetInspectString
{
public static void Postfix(Pawn __instance, ref string __result)
{
if (__instance.IsColonyMech)
{
var comp = __instance.GetComp<CompAutonomousMech>();
if (comp != null && comp.ShouldSuppressUncontrolledWarning)
{
// 清理任何未受控相关的文本
if (__result.Contains("MechUncontrolled") || __result.Contains("uncontrolled"))
{
string autonomousStatus = comp.GetAutonomousStatusString();
if (!string.IsNullOrEmpty(autonomousStatus))
{
__result = autonomousStatus;
}
else
{
__result = __result.Replace("MechUncontrolled", "")
.Replace("uncontrolled", "autonomous");
}
}
}
}
}
}
// 修复机械族控制状态的UI显示
[HarmonyPatch(typeof(MechanitorUtility), "GetMechControlGroupDesc")]
public static class Patch_MechanitorUtility_GetMechControlGroupDesc
{
public static bool Prefix(Pawn mech, ref string __result)
{
if (mech != null && mech.IsColonyMech)
{
var comp = mech.GetComp<CompAutonomousMech>();
if (comp != null && comp.ShouldSuppressUncontrolledWarning)
{
// 提供自主状态描述
__result = comp.GetAutonomousStatusString() ?? "Autonomous operation";
return false; // 跳过原始方法
}
}
return true;
}
}
}