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)]