diff --git a/1.3/Assemblies/Rimworld-Animations.dll b/1.3/Assemblies/Rimworld-Animations.dll new file mode 100644 index 0000000..fff7328 Binary files /dev/null and b/1.3/Assemblies/Rimworld-Animations.dll differ diff --git a/About/About.xml b/About/About.xml index 5109d9a..bd867ae 100644 --- a/About/About.xml +++ b/About/About.xml @@ -7,6 +7,7 @@
  • 1.1
  • 1.2
  • +
  • 1.3
  • c0ffee.rimworld.animations diff --git a/LoadFolders.xml b/LoadFolders.xml index 4093021..1ed37eb 100644 --- a/LoadFolders.xml +++ b/LoadFolders.xml @@ -9,5 +9,10 @@
  • 1.2
  • Patch_HatsDisplaySelection/1.2
  • + +
  • /
  • +
  • 1.3
  • +
  • Patch_HatsDisplaySelection/1.2
  • +
    diff --git a/Rimworld-Animations.csproj b/Rimworld-Animations.csproj index ee98d47..e183076 100644 --- a/Rimworld-Animations.csproj +++ b/Rimworld-Animations.csproj @@ -39,8 +39,12 @@ ..\..\..\..\workshop\content\294100\839005762\1.2\Assemblies\AlienRace.dll False + + ..\..\RimWorldWin64_Data\Managed\Assembly-CSharp.dll + False + - ..\rjw-master\1.2\Assemblies\RJW.dll + ..\rjw\1.3\Assemblies\RJW.dll False @@ -93,6 +97,7 @@ + diff --git a/Source/AnimationUtility.cs b/Source/AnimationUtility.cs index 5bb091a..ca284e7 100644 --- a/Source/AnimationUtility.cs +++ b/Source/AnimationUtility.cs @@ -51,7 +51,7 @@ namespace Rimworld_Animations { " ", localParticipants[i].Name.ToStringSafe(), " does not match required gender" - }), false); + })); } return false; } @@ -276,5 +276,15 @@ namespace Rimworld_Animations { return true; } + + public static Rot4 PawnHeadRotInAnimation(Pawn pawn, Rot4 regularPos) + { + if(pawn?.TryGetComp() != null && pawn.TryGetComp().isAnimating) + { + return pawn.TryGetComp().headFacing; + } + + return regularPos; + } } } diff --git a/Source/Comps/CompBodyAnimator.cs b/Source/Comps/CompBodyAnimator.cs index 568afb2..8ce0aca 100644 --- a/Source/Comps/CompBodyAnimator.cs +++ b/Source/Comps/CompBodyAnimator.cs @@ -32,7 +32,6 @@ namespace Rimworld_Animations { actorsInCurrentAnimation = null; } - PortraitsCache.SetDirty(pawn); } } private bool Animating = false; @@ -179,6 +178,9 @@ namespace Rimworld_Animations { base.CompTick(); if(isAnimating) { + + GlobalTextureAtlasManager.TryMarkPawnFrameSetDirty(pawn); + if (pawn.Dead || pawn?.jobs?.curDriver == null || (pawn?.jobs?.curDriver != null && !(pawn?.jobs?.curDriver is rjw.JobDriver_Sex))) { isAnimating = false; } @@ -187,7 +189,7 @@ namespace Rimworld_Animations { } } } - public void animatePawn(ref Vector3 rootLoc, ref float angle, ref Rot4 bodyFacing, ref Rot4 headFacing) { + public void animatePawnBody(ref Vector3 rootLoc, ref float angle, ref Rot4 bodyFacing) { if(!isAnimating) { return; @@ -195,19 +197,23 @@ namespace Rimworld_Animations { rootLoc = anchor + deltaPos; angle = bodyAngle; bodyFacing = this.bodyFacing; - headFacing = this.headFacing; - - - } + public Rot4 AnimateHeadFacing() + { + return this.headFacing; + } + + public void tickGraphics(PawnGraphicSet graphics) { this.Graphics = graphics; } public void tickAnim() { + + if (!isAnimating) return; if (anim == null) { @@ -231,6 +237,9 @@ namespace Rimworld_Animations { } + + + } public void tickStage() diff --git a/Source/JobDrivers/JobDriver_SexBaseRecieverLovedForAnimation.cs b/Source/JobDrivers/JobDriver_SexBaseRecieverLovedForAnimation.cs index d8d99d2..9efa508 100644 --- a/Source/JobDrivers/JobDriver_SexBaseRecieverLovedForAnimation.cs +++ b/Source/JobDrivers/JobDriver_SexBaseRecieverLovedForAnimation.cs @@ -65,7 +65,8 @@ namespace Rimworld_Animations { get_loved.handlingFacing = true; get_loved.AddPreTickAction(delegate { if (pawn.IsHashIntervalTick(ticks_between_hearts)) - MoteMaker.ThrowMetaIcon(pawn.Position, pawn.Map, ThingDefOf.Mote_Heart); + FleckMaker.ThrowMetaIcon(pawn.Position, pawn.Map, FleckDefOf.Heart); + }); get_loved.AddEndCondition(() => { diff --git a/Source/JobDrivers/JobDriver_SexCasualForAnimation.cs b/Source/JobDrivers/JobDriver_SexCasualForAnimation.cs index 7b9aba0..285c542 100644 --- a/Source/JobDrivers/JobDriver_SexCasualForAnimation.cs +++ b/Source/JobDrivers/JobDriver_SexCasualForAnimation.cs @@ -65,7 +65,7 @@ namespace Rimworld_Animations { } if(Gen.IsHashIntervalTick(pawn, ticks_between_hearts)) { - MoteMaker.ThrowMetaIcon(pawn.Position, pawn.Map, ThingDefOf.Mote_Heart); + FleckMaker.ThrowMetaIcon(pawn.Position, pawn.Map, FleckDefOf.Heart); } SexTick(pawn, Partner); SexUtility.reduce_rest(Partner); diff --git a/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs b/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs index 6cc2b13..2ce39df 100644 --- a/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs +++ b/Source/MainTabWindows/MainTabWindow_OffsetConfigure.cs @@ -119,8 +119,6 @@ namespace Rimworld_Animations { listingStandard.End(); - base.DoWindowContents(inRect); - } public override void PreOpen() { diff --git a/Source/Patches/HarmonyPatch_HatsDisplaySelection.cs b/Source/Patches/HarmonyPatch_HatsDisplaySelection.cs index 10ada03..1cd5707 100644 --- a/Source/Patches/HarmonyPatch_HatsDisplaySelection.cs +++ b/Source/Patches/HarmonyPatch_HatsDisplaySelection.cs @@ -54,7 +54,10 @@ namespace Rimworld_Animations { for (int i = 0; i < instructions.Count(); i++) { - if (codes[i].OperandIs(drawMeshNowOrLater)) { + if (codes[i]. + + +(drawMeshNowOrLater)) { yield return new CodeInstruction(OpCodes.Ldarg_0); yield return new CodeInstruction(OpCodes.Ldfld, AccessTools.DeclaredField(AccessTools.TypeByName("HatDisplaySelection.Patch"), "pawn")); diff --git a/Source/Patches/HarmonyPatch_PawnRenderer.cs b/Source/Patches/HarmonyPatch_PawnRenderer.cs index 94ad8d6..6e31a1d 100644 --- a/Source/Patches/HarmonyPatch_PawnRenderer.cs +++ b/Source/Patches/HarmonyPatch_PawnRenderer.cs @@ -11,112 +11,74 @@ using System.Reflection; 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 { - - [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) { - PawnGraphicSet graphics = __instance.graphics; - Pawn pawn = graphics.pawn; - CompBodyAnimator bodyAnim = pawn.TryGetComp(); - - if (!graphics.AllResolved) { - 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() { - // hats display selection patch -- broken - /* - if (LoadedModManager.RunningModsListForReading.Any(x => x.Name == "Hats Display Selection")) { - HarmonyPatch_HatsDisplaySelection.PatchHatsDisplaySelectionArgs(); - } - else { - PatchRimworldFunctionsNormally(); - } - */ - - - 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"))); + typeof(PawnRenderFlags) } + )] + public static class HarmonyPatch_PawnRenderer + { - [HarmonyAfter(new string[] { "showhair.kv.rw", "erdelf.HumanoidAlienRaces", "Nals.FacialAnimation" })] - [HarmonyReversePatch(HarmonyReversePatchType.Snapshot)] - public static IEnumerable Transpiler(IEnumerable instructions) { - - MethodInfo drawMeshNowOrLater = AccessTools.Method(typeof(GenDraw), "DrawMeshNowOrLater"); - FieldInfo headGraphic = AccessTools.Field(typeof(PawnGraphicSet), "headGraphic"); + [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, RotDrawMode bodyDrawType, PawnRenderFlags flags) + { + PawnGraphicSet graphics = __instance.graphics; + Pawn pawn = graphics.pawn; + CompBodyAnimator bodyAnim = pawn.TryGetComp(); - List codes = instructions.ToList(); - bool forHead = true; - for(int i = 0; i < codes.Count(); i++) { + if (bodyAnim != null && bodyAnim.isAnimating && pawn.Map == Find.CurrentMap) + { + bodyAnim.animatePawnBody(ref rootLoc, ref angle, ref bodyFacing); - //Instead of calling drawmeshnoworlater, add pawn to the stack and call my special static method - if (codes[i].OperandIs(drawMeshNowOrLater) && forHead) { - - yield return new CodeInstruction(OpCodes.Ldarg_0); - yield return new CodeInstruction(OpCodes.Ldfld, AccessTools.DeclaredField(typeof(PawnRenderer), "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) })); - - } - //checking for if(graphics.headGraphic != null) - else if (codes[i].opcode == OpCodes.Ldfld && codes[i].OperandIs(headGraphic)) { - forHead = true; - yield return codes[i]; - } - //checking for if(renderbody) - else if(codes[i].opcode == OpCodes.Ldarg_3) { - forHead = false; - yield return codes[i]; - } - else { - yield return codes[i]; - } } } - } + + public static IEnumerable Transpiler(IEnumerable instructions) + { + bool forHead = false; + + foreach (CodeInstruction i in instructions) + { + + + + + if (i.opcode == OpCodes.Ldfld && i.OperandIs(AccessTools.Field(typeof(PawnGraphicSet), "headGraphic"))) + { + + forHead = true; + yield return i; + } + + else if (forHead && i.operand == (object)7) + { + + yield return new CodeInstruction(OpCodes.Ldarg_0); + yield return new CodeInstruction(OpCodes.Ldfld, AccessTools.Field(typeof(PawnRenderer), "pawn")); + yield return new CodeInstruction(OpCodes.Ldloc_S, operand: 7); + yield return new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(AnimationUtility), "PawnHeadRotInAnimation")); + } + + else + { + yield return i; + } + + + } + + } + + } + + + + } diff --git a/Source/Patches/HarmonyPatch_PawnRotation.cs b/Source/Patches/HarmonyPatch_PawnRotation.cs index 9fb95ef..d09b1f6 100644 --- a/Source/Patches/HarmonyPatch_PawnRotation.cs +++ b/Source/Patches/HarmonyPatch_PawnRotation.cs @@ -25,4 +25,25 @@ namespace Rimworld_Animations { } } + + [HarmonyPatch(typeof(PawnRenderer), "BodyAngle")] + public static class HarmonyPatch_PawnAngle + { + public static bool Prefix(Pawn ___pawn, ref float __result) + { + + if(___pawn.TryGetComp().isAnimating) + { + __result = ___pawn.TryGetComp().bodyAngle; + return false; + } + + return true; + + } + } + + + + } diff --git a/Source/Patches/HarmonyPatch_SetPawnAnimatable.cs b/Source/Patches/HarmonyPatch_SetPawnAnimatable.cs new file mode 100644 index 0000000..4ddff2c --- /dev/null +++ b/Source/Patches/HarmonyPatch_SetPawnAnimatable.cs @@ -0,0 +1,40 @@ +using HarmonyLib; +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection.Emit; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Verse; + +namespace Rimworld_Animations +{ + [HarmonyPatch(typeof(PawnRenderer), "RenderPawnAt")] + public static class PawnRenderer_RenderPawnAt_Patch + { + static bool ClearCache(Pawn pawn) + { + return pawn.IsInvisible() || pawn.TryGetComp().isAnimating; + } + + public static IEnumerable Transpiler(IEnumerable instructions) + { + var list = instructions.ToList(); + + foreach (CodeInstruction i in instructions) + { + if (i.OperandIs(AccessTools.Method(typeof(PawnUtility), "IsInvisible"))) + { + yield return new CodeInstruction(OpCodes.Call, AccessTools.Method(typeof(PawnRenderer_RenderPawnAt_Patch), "ClearCache")); + } + else + { + yield return i; + } + } + } + } + +} diff --git a/Source/Patches/HarmonyPatch_SetPawnLaying.cs b/Source/Patches/HarmonyPatch_SetPawnLaying.cs new file mode 100644 index 0000000..1eef30f --- /dev/null +++ b/Source/Patches/HarmonyPatch_SetPawnLaying.cs @@ -0,0 +1,28 @@ +using HarmonyLib; +using Verse; +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rimworld_Animations +{ + [HarmonyPatch(typeof(PawnUtility), "GetPosture")] + public static class HarmonyPatch_SetPawnLaying + { + + public static bool Prefix(Pawn p, ref PawnPosture __result) + { + if(p.TryGetComp().isAnimating) + { + __result = PawnPosture.LayingOnGroundNormal; + return false; + } + + return true; + } + + } +}