修复不工作
This commit is contained in:
Binary file not shown.
@@ -77,9 +77,9 @@
|
||||
</subNodes>
|
||||
</li>
|
||||
|
||||
<!-- Work modes -->
|
||||
<li Class="ThinkNode_ConditionalWorkMode" MayRequire="Ludeon.RimWorld.Biotech">
|
||||
<workMode>Work</workMode>
|
||||
<!-- 工作模式:通过 thinktree 寻找可用工作 -->
|
||||
<li Class="WulaFallenEmpire.ThinkNode_ConditionalAutonomousWorkMode">
|
||||
<requiredMode>Work</requiredMode>
|
||||
<subNodes>
|
||||
<li Class="JobGiver_SeekAllowedArea" />
|
||||
<li Class="JobGiver_GetEnergy_Charger" />
|
||||
@@ -114,9 +114,9 @@
|
||||
</subNodes>
|
||||
</li>
|
||||
|
||||
<!-- 充电模式 -->
|
||||
<li Class="ThinkNode_ConditionalWorkMode" MayRequire="Ludeon.RimWorld.Biotech">
|
||||
<workMode>Recharge</workMode>
|
||||
<!-- 充电模式:优先去匹配的充电桩充电,完成后休眠 -->
|
||||
<li Class="WulaFallenEmpire.ThinkNode_ConditionalAutonomousWorkMode">
|
||||
<requiredMode>Recharge</requiredMode>
|
||||
<subNodes>
|
||||
<li Class="JobGiver_SeekAllowedArea" />
|
||||
<li Class="JobGiver_GetEnergy_Charger" />
|
||||
@@ -126,9 +126,9 @@
|
||||
</subNodes>
|
||||
</li>
|
||||
|
||||
<!-- 休眠模式 -->
|
||||
<li Class="ThinkNode_ConditionalWorkMode" MayRequire="Ludeon.RimWorld.Biotech">
|
||||
<workMode>SelfShutdown</workMode>
|
||||
<!-- 关机模式:立刻休眠 -->
|
||||
<li Class="WulaFallenEmpire.ThinkNode_ConditionalAutonomousWorkMode">
|
||||
<requiredMode>Shutdown</requiredMode>
|
||||
<subNodes>
|
||||
<li Class="JobGiver_SeekAllowedArea" />
|
||||
<li Class="JobGiver_SelfShutdown" />
|
||||
|
||||
@@ -30,6 +30,14 @@ namespace WulaFallenEmpire
|
||||
}
|
||||
}
|
||||
|
||||
// 新增:自主工作模式枚举
|
||||
public enum AutonomousWorkMode
|
||||
{
|
||||
Work, // 工作模式:通过 thinktree 寻找工作
|
||||
Recharge, // 充电模式:优先充电,完成后休眠
|
||||
Shutdown // 关机模式:立即休眠
|
||||
}
|
||||
|
||||
public class CompProperties_AutonomousMech : CompProperties
|
||||
{
|
||||
public bool enableAutonomousDrafting = true;
|
||||
@@ -49,6 +57,9 @@ namespace WulaFallenEmpire
|
||||
|
||||
public Pawn MechPawn => parent as Pawn;
|
||||
|
||||
// 新增:当前工作模式
|
||||
private AutonomousWorkMode currentWorkMode = AutonomousWorkMode.Work;
|
||||
|
||||
public bool CanBeAutonomous
|
||||
{
|
||||
get
|
||||
@@ -101,6 +112,9 @@ namespace WulaFallenEmpire
|
||||
}
|
||||
}
|
||||
|
||||
// 新增:公开访问当前工作模式
|
||||
public AutonomousWorkMode CurrentWorkMode => currentWorkMode;
|
||||
|
||||
public override void PostSpawnSetup(bool respawningAfterLoad)
|
||||
{
|
||||
base.PostSpawnSetup(respawningAfterLoad);
|
||||
@@ -132,7 +146,7 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
yield return new Command_Action
|
||||
{
|
||||
defaultLabel = "Work Mode: " + GetCurrentWorkMode(),
|
||||
defaultLabel = "Work Mode: " + GetCurrentWorkModeDisplay(),
|
||||
defaultDesc = "Switch autonomous work mode",
|
||||
icon = TexCommand.Attack,
|
||||
action = () => ShowWorkModeMenu()
|
||||
@@ -167,21 +181,20 @@ namespace WulaFallenEmpire
|
||||
}
|
||||
}
|
||||
|
||||
private string GetCurrentWorkMode()
|
||||
// 修改:返回自定义工作模式的显示名称
|
||||
private string GetCurrentWorkModeDisplay()
|
||||
{
|
||||
if (MechPawn.workSettings == null)
|
||||
return "None";
|
||||
|
||||
// 检查当前激活的工作模式
|
||||
foreach (var workType in MechPawn.RaceProps.mechEnabledWorkTypes)
|
||||
switch (currentWorkMode)
|
||||
{
|
||||
if (MechPawn.workSettings.GetPriority(workType) > 0)
|
||||
{
|
||||
return workType.defName;
|
||||
}
|
||||
case AutonomousWorkMode.Work:
|
||||
return "Work";
|
||||
case AutonomousWorkMode.Recharge:
|
||||
return "Recharge";
|
||||
case AutonomousWorkMode.Shutdown:
|
||||
return "Shutdown";
|
||||
default:
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
return "None";
|
||||
}
|
||||
|
||||
private void ShowWorkModeMenu()
|
||||
@@ -189,36 +202,36 @@ namespace WulaFallenEmpire
|
||||
List<FloatMenuOption> list = new List<FloatMenuOption>();
|
||||
|
||||
// 工作模式
|
||||
list.Add(new FloatMenuOption("Work Mode", () => SetWorkMode("Work")));
|
||||
list.Add(new FloatMenuOption("Work Mode - Perform assigned work tasks",
|
||||
() => SetWorkMode(AutonomousWorkMode.Work)));
|
||||
|
||||
// 充电模式
|
||||
list.Add(new FloatMenuOption("Recharge Mode", () => SetWorkMode("Recharge")));
|
||||
list.Add(new FloatMenuOption("Recharge Mode - Charge and then shutdown",
|
||||
() => SetWorkMode(AutonomousWorkMode.Recharge)));
|
||||
|
||||
// 休眠模式
|
||||
list.Add(new FloatMenuOption("Shutdown Mode", () => SetWorkMode("SelfShutdown")));
|
||||
list.Add(new FloatMenuOption("Shutdown Mode - Immediately shutdown",
|
||||
() => SetWorkMode(AutonomousWorkMode.Shutdown)));
|
||||
|
||||
Find.WindowStack.Add(new FloatMenu(list));
|
||||
}
|
||||
|
||||
private void SetWorkMode(string mode)
|
||||
// 修改:设置自定义工作模式
|
||||
private void SetWorkMode(AutonomousWorkMode mode)
|
||||
{
|
||||
if (MechPawn.workSettings == null)
|
||||
return;
|
||||
|
||||
// 重置所有工作模式优先级
|
||||
foreach (var workType in MechPawn.RaceProps.mechEnabledWorkTypes)
|
||||
currentWorkMode = mode;
|
||||
|
||||
// 清除当前工作,让机械族重新选择符合新模式的工作
|
||||
if (MechPawn.CurJob != null && MechPawn.CurJob.def != JobDefOf.Wait_Combat)
|
||||
{
|
||||
MechPawn.workSettings.SetPriority(workType, 0);
|
||||
}
|
||||
|
||||
// 设置选择的工作模式
|
||||
var targetMode = DefDatabase<WorkTypeDef>.GetNamedSilentFail(mode);
|
||||
if (targetMode != null)
|
||||
{
|
||||
MechPawn.workSettings.SetPriority(targetMode, 3);
|
||||
Messages.Message($"{MechPawn.LabelCap} switched to {mode} mode",
|
||||
MechPawn, MessageTypeDefOf.NeutralEvent);
|
||||
MechPawn.jobs.StopAll();
|
||||
}
|
||||
|
||||
string modeName = GetCurrentWorkModeDisplay();
|
||||
Messages.Message($"{MechPawn.LabelCap} switched to {modeName} mode",
|
||||
MechPawn, MessageTypeDefOf.NeutralEvent);
|
||||
|
||||
Log.Message($"AutonomousMech: {MechPawn.LabelCap} work mode set to {modeName}");
|
||||
}
|
||||
|
||||
private string GetBlockReason()
|
||||
@@ -245,16 +258,6 @@ namespace WulaFallenEmpire
|
||||
{
|
||||
MechPawn.workSettings = new Pawn_WorkSettings(MechPawn);
|
||||
}
|
||||
|
||||
if (MechPawn.RaceProps.mechEnabledWorkTypes != null)
|
||||
{
|
||||
// 默认设置为工作模式
|
||||
var workMode = DefDatabase<WorkTypeDef>.GetNamedSilentFail("Work");
|
||||
if (workMode != null)
|
||||
{
|
||||
MechPawn.workSettings.SetPriority(workMode, 3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public string GetAutonomousStatusString()
|
||||
@@ -265,7 +268,14 @@ namespace WulaFallenEmpire
|
||||
if (MechPawn.Drafted)
|
||||
return "Operating autonomously";
|
||||
else
|
||||
return "Autonomous mode available";
|
||||
return $"Autonomous mode: {GetCurrentWorkModeDisplay()}";
|
||||
}
|
||||
|
||||
// 新增:保存和加载工作模式
|
||||
public override void PostExposeData()
|
||||
{
|
||||
base.PostExposeData();
|
||||
Scribe_Values.Look(ref currentWorkMode, "currentWorkMode", AutonomousWorkMode.Work);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,153 +23,4 @@ namespace WulaFallenEmpire
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 修复红光闪烁问题 - 使用 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
using Verse.AI;
|
||||
|
||||
namespace WulaFallenEmpire
|
||||
{
|
||||
public class ThinkNode_ConditionalAutonomousWorkMode : ThinkNode_Conditional
|
||||
{
|
||||
public AutonomousWorkMode requiredMode = AutonomousWorkMode.Work;
|
||||
|
||||
protected override bool Satisfied(Pawn pawn)
|
||||
{
|
||||
if (pawn == null || pawn.Dead || pawn.Downed)
|
||||
return false;
|
||||
|
||||
// 检查是否有自主机械组件
|
||||
var comp = pawn.GetComp<CompAutonomousMech>();
|
||||
if (comp == null)
|
||||
return false;
|
||||
|
||||
// 检查当前工作模式是否匹配要求
|
||||
return comp.CurrentWorkMode == requiredMode;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -107,6 +107,7 @@
|
||||
<Compile Include="Pawn\WULA_AutonomousMech\CompAutonomousMech.cs" />
|
||||
<Compile Include="Pawn\WULA_AutonomousMech\Patch_MechanitorUtility_CanDraftMech.cs" />
|
||||
<Compile Include="Pawn\WULA_AutonomousMech\Patch_UncontrolledMechDrawPulse.cs" />
|
||||
<Compile Include="Pawn\WULA_AutonomousMech\ThinkNode_ConditionalAutonomousWorkMode.cs" />
|
||||
<Compile Include="Pawn\WULA_BrokenPersonality\MentalBreakWorker_BrokenPersonality.cs" />
|
||||
<Compile Include="Pawn\WULA_BrokenPersonality\MentalStateDefExtension_BrokenPersonality.cs" />
|
||||
<Compile Include="Pawn\WULA_BrokenPersonality\MentalState_BrokenPersonality.cs" />
|
||||
|
||||
Reference in New Issue
Block a user