Files
RickGrymes f827921c8d Merge keyed language XMLs and code fixes
Consolidate multiple keyed English language XMLs into Common/Languages/English/Keyed/FCPToolsKeyed.xml (removed ArmorRackKeys, Cages, Main, PowerArmor, RecipeGoodwill, Terminal, VATS). Update binaries in 1.6/Assemblies. Code changes: ensure generated enlistment pawns are set to player faction and join as colonists (ProvisionsInfo); add GetDisplayBodyType helper to ApparelExtensionUtility and a Harmony Prefix patch to override apparel body type during graphic lookup (Patches.cs); make CompTechprint float menu use a unified bench list and add requiredBench plus AllRequiredBenches helper to TechprintExtension to combine single and multiple required benches.
2026-05-12 13:52:57 -05:00

113 lines
3.6 KiB
C#

using HarmonyLib;
using RimWorld;
using System.Collections.Generic;
using System.Reflection.Emit;
using JetBrains.Annotations;
using Verse;
using Verse.AI;
namespace FCP.Core;
[UsedImplicitly]
[HarmonyPatch(typeof(ApparelGraphicRecordGetter), nameof(ApparelGraphicRecordGetter.TryGetGraphicApparel))]
public static class ApparelGraphicRecordGetter_TryGetGraphicApparel_Patch
{
public static void Prefix(Apparel apparel, ref BodyTypeDef bodyType)
{
var overrideType = apparel.def.GetDisplayBodyType();
if (overrideType != null)
bodyType = overrideType;
}
}
[UsedImplicitly]
[HarmonyPatch(typeof(PawnRenderNodeWorker), "AppendDrawRequests")]
public static class PawnRenderNodeWorker_AppendDrawRequests_Patch
{
public static bool Prefix(PawnRenderNode node, PawnDrawParms parms, List<PawnGraphicDrawRequest> requests)
{
if ((node is PawnRenderNode_Head || node.parent is PawnRenderNode_Head) && parms.pawn.apparel.AnyApparel)
{
foreach (var apparel in parms.pawn.apparel.WornApparel)
{
if (apparel.def.ShouldHideHead())
{
requests.Add(new PawnGraphicDrawRequest(node));
return false;
}
}
}
if ((node is PawnRenderNode_Body || node.parent is PawnRenderNode_Body) && parms.pawn.apparel.AnyApparel)
{
foreach (var apparel in parms.pawn.apparel.WornApparel)
{
if (apparel.def.ShouldHideBody())
{
requests.Add(new PawnGraphicDrawRequest(node));
return false;
}
}
}
return true;
}
}
[UsedImplicitly]
[HarmonyPatch(typeof(PawnRenderNodeWorker_Apparel_Head), "CanDrawNow")]
public static class PawnRenderNodeWorker_Apparel_Head_CanDrawNow_Patch
{
public static void Prefix(PawnDrawParms parms, out bool __state)
{
__state = Prefs.HatsOnlyOnMap;
if (parms.pawn.apparel.AnyApparel)
{
var headgear = parms.pawn.apparel.WornApparel
.FirstOrDefault(x => x.def.ShouldHideHead());
if (headgear != null)
{
Prefs.HatsOnlyOnMap = false;
}
}
}
public static void Postfix(bool __state)
{
Prefs.HatsOnlyOnMap = __state;
}
}
[UsedImplicitly]
[HarmonyPatch(typeof(PawnRenderNodeWorker_Apparel_Head), "HeadgearVisible")]
public static class PawnRenderNodeWorker_Apparel_Head_HeadgearVisible_Patch
{
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> codeInstructions)
{
var get_HatsOnlyOnMap = AccessTools.PropertyGetter(typeof(Prefs), nameof(Prefs.HatsOnlyOnMap));
foreach (var codeInstruction in codeInstructions)
{
yield return codeInstruction;
if (codeInstruction.Calls(get_HatsOnlyOnMap))
{
yield return new CodeInstruction(OpCodes.Ldarg_0);
yield return new CodeInstruction(OpCodes.Call,
AccessTools.Method(typeof(PawnRenderNodeWorker_Apparel_Head_HeadgearVisible_Patch),
"TryOverrideHatsOnlyOnMap"));
}
}
}
public static bool TryOverrideHatsOnlyOnMap(bool result, PawnDrawParms parms)
{
if (result is true && parms.pawn.apparel.AnyApparel)
{
var headgear = parms.pawn.apparel.WornApparel
.FirstOrDefault(x => x.def.ShouldHideHead());
if (headgear != null)
{
return false;
}
}
return result;
}
}