diff --git a/1.2/Assemblies/Rimworld-Animations.dll b/1.2/Assemblies/Rimworld-Animations.dll
index 6b5f9a8..fcdf0a1 100644
Binary files a/1.2/Assemblies/Rimworld-Animations.dll and b/1.2/Assemblies/Rimworld-Animations.dll differ
diff --git a/Rimworld-Animations.csproj b/Rimworld-Animations.csproj
index 9b564e6..3ce39b6 100644
--- a/Rimworld-Animations.csproj
+++ b/Rimworld-Animations.csproj
@@ -45,7 +45,7 @@
False
- ..\rjw-master\1.1\Assemblies\RJW.dll
+ ..\RJW\1.1\Assemblies\RJW.dll
False
@@ -94,6 +94,7 @@
+
diff --git a/Source/Patches/HarmonyPatch_HatsDisplaySelection.cs b/Source/Patches/HarmonyPatch_HatsDisplaySelection.cs
new file mode 100644
index 0000000..e048393
--- /dev/null
+++ b/Source/Patches/HarmonyPatch_HatsDisplaySelection.cs
@@ -0,0 +1,47 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HarmonyLib;
+using RimWorld;
+using Verse;
+using UnityEngine;
+using System.Reflection;
+using System.Reflection.Emit;
+
+namespace Rimworld_Animations {
+ public static class HarmonyPatch_HatsDisplaySelection {
+
+ public static void PatchHatsDisplaySelectionArgs() {
+ (new Harmony("rjw")).Patch(AccessTools.Method(AccessTools.TypeByName("HatDisplaySelection.Patch"), "DrawHatCEWithHair"),
+ transpiler: new HarmonyMethod(AccessTools.Method(typeof(HarmonyPatch_HatsDisplaySelection), "ReplaceDrawMeshOrLaterWithAnimate")));
+
+ (new Harmony("rjw")).Patch(AccessTools.Method(AccessTools.TypeByName("HatDisplaySelection.Patch"), "DrawHatWithHair"),
+ transpiler: new HarmonyMethod(AccessTools.Method(typeof(HarmonyPatch_HatsDisplaySelection), "ReplaceDrawMeshOrLaterWithAnimate")));
+ }
+
+ public static IEnumerable ReplaceDrawMeshOrLaterWithAnimate(IEnumerable instructions) {
+
+ MethodInfo drawMeshNowOrLater = AccessTools.Method(typeof(GenDraw), "DrawMeshNowOrLater");
+ List codes = instructions.ToList();
+ for (int i = 0; i < instructions.Count(); i++) {
+
+
+ if (codes[i].OperandIs(drawMeshNowOrLater)) {
+
+ yield return new CodeInstruction(OpCodes.Ldarg_0);
+ yield return new CodeInstruction(OpCodes.Ldfld, AccessTools.DeclaredField(AccessTools.TypeByName("HatDisplaySelection.Patch"), "pawn"));
+ yield return new CodeInstruction(OpCodes.Call, AccessTools.DeclaredMethod(typeof(AnimationUtility), nameof(AnimationUtility.RenderPawnHeadMeshInAnimation), new Type[] { typeof(Mesh), typeof(Vector3), typeof(Quaternion), typeof(Material), typeof(bool), typeof(Pawn) }));
+
+ }
+ else {
+ yield return codes[i];
+ }
+
+ }
+
+ }
+
+ }
+}
diff --git a/Source/Patches/HarmonyPatch_PawnRenderer.cs b/Source/Patches/HarmonyPatch_PawnRenderer.cs
index 8bad2f2..b41d834 100644
--- a/Source/Patches/HarmonyPatch_PawnRenderer.cs
+++ b/Source/Patches/HarmonyPatch_PawnRenderer.cs
@@ -13,24 +13,22 @@ using System.Reflection.Emit;
namespace Rimworld_Animations {
[HarmonyPatch(typeof(PawnRenderer), "RenderPawnInternal", new Type[]
- {
- typeof(Vector3),
- typeof(float),
- typeof(bool),
- typeof(Rot4),
- typeof(Rot4),
- typeof(RotDrawMode),
- typeof(bool),
- typeof(bool),
- typeof(bool)
- })]
-
- public static class HarmonyPatch_PawnRenderer
- {
+ {
+ typeof(Vector3),
+ typeof(float),
+ typeof(bool),
+ typeof(Rot4),
+ typeof(Rot4),
+ typeof(RotDrawMode),
+ typeof(bool),
+ typeof(bool),
+ typeof(bool)
+ }
+ )]
+ public static class HarmonyPatch_PawnRenderer {
[HarmonyBefore(new string[] { "showhair.kv.rw", "erdelf.HumanoidAlienRaces", "Nals.FacialAnimation" })]
- public static void Prefix(PawnRenderer __instance, ref Vector3 rootLoc, ref float angle, bool renderBody, ref Rot4 bodyFacing, ref Rot4 headFacing, RotDrawMode bodyDrawType, bool portrait, bool headStump, bool invisible)
- {
+ public static void Prefix(PawnRenderer __instance, ref Vector3 rootLoc, ref float angle, bool renderBody, ref Rot4 bodyFacing, ref Rot4 headFacing, RotDrawMode bodyDrawType, bool portrait, bool headStump, bool invisible) {
PawnGraphicSet graphics = __instance.graphics;
Pawn pawn = graphics.pawn;
CompBodyAnimator bodyAnim = pawn.TryGetComp();
@@ -39,13 +37,44 @@ namespace Rimworld_Animations {
graphics.ResolveAllGraphics();
}
-
+
if (bodyAnim != null && bodyAnim.isAnimating && !portrait && pawn.Map == Find.CurrentMap) {
bodyAnim.tickGraphics(graphics);
bodyAnim.animatePawn(ref rootLoc, ref angle, ref bodyFacing, ref headFacing);
}
}
+ }
+
+ [StaticConstructorOnStartup]
+ public static class HarmonyPatch_Animate
+ {
+
+ static HarmonyPatch_Animate() {
+
+ if (LoadedModManager.RunningModsListForReading.Any(x => x.Name == "Hats Display Selection")) {
+ HarmonyPatch_HatsDisplaySelection.PatchHatsDisplaySelectionArgs();
+ }
+ else {
+ PatchRimworldFunctionsNormally();
+ }
+ }
+
+ static void PatchRimworldFunctionsNormally() {
+ (new Harmony("rjw")).Patch(AccessTools.Method(typeof(PawnRenderer), "RenderPawnInternal", parameters: new Type[]
+ {
+ typeof(Vector3),
+ typeof(float),
+ typeof(bool),
+ typeof(Rot4),
+ typeof(Rot4),
+ typeof(RotDrawMode),
+ typeof(bool),
+ typeof(bool),
+ typeof(bool)
+ }),
+ transpiler: new HarmonyMethod(AccessTools.Method(typeof(HarmonyPatch_Animate), "Transpiler")));
+ }
[HarmonyAfter(new string[] { "showhair.kv.rw", "erdelf.HumanoidAlienRaces", "Nals.FacialAnimation" })]
[HarmonyReversePatch(HarmonyReversePatchType.Snapshot)]