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;
+ }
+
+ }
+}