From f30a02bcc8fdf138cee558c5a3da18afd658979f Mon Sep 17 00:00:00 2001 From: c0ffee Date: Sat, 4 May 2024 16:14:52 -0700 Subject: [PATCH] various tweaks; portrait fix, pawntest whitelist/blacklist, more fixes for headfacing, granularity for render tree menu --- 1.5/Assemblies/Rimworld-Animations.dll | Bin 51200 -> 53760 bytes .../Cowgirl/AnimationPropDef_Cowgirl_Xray.xml | 4 +- .../Cowgirl/GroupAnimation_Cowgirl.xml | 2 + .../DoublePenetration/GroupAnimation_DP.xml | 13 ++++- .../BaseGroupAnimationContext.cs | 33 ++++++++++++ .../Animations/PawnTests/BasePawnTest.cs | 15 ++++++ .../Animations/PawnTests/PawnTest_Always.cs | 17 +++++++ .../Animations/PawnTests/PawnTest_Multi.cs | 27 ++++++++++ .../PawnTests/PawnTest_RJWCanBeFucked.cs | 18 +++++++ .../PawnTests/PawnTest_RJWCanFuck.cs | 18 +++++++ .../ExtendedAnimatorAnchor_Thing.cs | 4 +- .../ExtendedAnimatorAnchor_Vector3.cs | 3 +- .../JobDriver_Sex/HarmonyPatch_Animate.cs | 14 ++++++ .../RJWPatches/RJWAnimationSettings.cs | 5 ++ .../HarmonyPatch_Dialog_DebugRenderTree.cs | 47 ++++++++++++++++++ .../HarmonyPatch_PawnRenderNode.cs | 2 + .../HarmonyPatch_PawnRenderTree.cs | 4 ++ .../HarmonyPatch_PawnRenderer.cs | 2 +- .../HarmonyPatch_Pawn_DrawTracker.cs | 20 +++++--- .../PawnRenderSubWorker_HideWhenAnimating.cs | 5 ++ .../Keyed/RJWAnimations-LanguageData.xml | 1 + Rimworld-Animations.csproj | 6 +++ 22 files changed, 247 insertions(+), 13 deletions(-) create mode 100644 1.5/Source/Animations/PawnTests/BasePawnTest.cs create mode 100644 1.5/Source/Animations/PawnTests/PawnTest_Always.cs create mode 100644 1.5/Source/Animations/PawnTests/PawnTest_Multi.cs create mode 100644 1.5/Source/Animations/PawnTests/PawnTest_RJWCanBeFucked.cs create mode 100644 1.5/Source/Animations/PawnTests/PawnTest_RJWCanFuck.cs create mode 100644 1.5/Source/Patches/RimworldPatches/HarmonyPatch_Dialog_DebugRenderTree.cs diff --git a/1.5/Assemblies/Rimworld-Animations.dll b/1.5/Assemblies/Rimworld-Animations.dll index 1f8be2a8641dec0deb8420b4dd0e83c81db4717d..d9422cd51dbd84d767fe63612363533ad3b922e2 100644 GIT binary patch literal 53760 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

dVk@=%2O4md+pc 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πZ+5`kVE^-kqqLD?_RThL%5&XETMI*hV^U}P^7 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 N9y0xtWRGHead 95 TexPathVariants_Cowgirl_Xray - - + + diff --git a/1.5/Defs/AnimationDefs/Cowgirl/GroupAnimation_Cowgirl.xml b/1.5/Defs/AnimationDefs/Cowgirl/GroupAnimation_Cowgirl.xml index a4d5f1c..e5ccdec 100644 --- a/1.5/Defs/AnimationDefs/Cowgirl/GroupAnimation_Cowgirl.xml +++ b/1.5/Defs/AnimationDefs/Cowgirl/GroupAnimation_Cowgirl.xml @@ -98,6 +98,8 @@ --> + +

  • Offset_Placeholder
  • Offset_Cowgirl_Top
  • diff --git a/1.5/Defs/AnimationDefs/DoublePenetration/GroupAnimation_DP.xml b/1.5/Defs/AnimationDefs/DoublePenetration/GroupAnimation_DP.xml index 97d1b7d..60f898d 100644 --- a/1.5/Defs/AnimationDefs/DoublePenetration/GroupAnimation_DP.xml +++ b/1.5/Defs/AnimationDefs/DoublePenetration/GroupAnimation_DP.xml @@ -71,6 +71,11 @@
  • 1 + +
  • +
  • +
  • + 2
  • Sex_DoublePenetration
  • @@ -85,6 +90,11 @@
  • 1 + +
  • +
  • +
  • +
  • Sex_Reverse_DoublePenetration
  • Sex_Reverse_DoublePenetrationM
  • @@ -115,6 +125,8 @@ + + GroupAnimation_DP_Stage2_Branch1 3 @@ -143,7 +155,6 @@ - GroupAnimation_DP_Stage2_Branch2 3 diff --git a/1.5/Source/Animations/GroupAnimations/GroupAnimationContexts/BaseGroupAnimationContext.cs b/1.5/Source/Animations/GroupAnimations/GroupAnimationContexts/BaseGroupAnimationContext.cs index 19f475d..de5ddc3 100644 --- a/1.5/Source/Animations/GroupAnimations/GroupAnimationContexts/BaseGroupAnimationContext.cs +++ b/1.5/Source/Animations/GroupAnimations/GroupAnimationContexts/BaseGroupAnimationContext.cs @@ -11,13 +11,46 @@ namespace Rimworld_Animations { public int actorShift = 0; public int priority = 0; + + public List whitelist; + public List blacklist; + public virtual bool CanAnimationBeUsed(List actors, int numActors) { + if (numActors != actors.Count) { return false; } + if (!whitelist.NullOrEmpty()) + { + for (int i = 0; i < whitelist.Count; i++) + { + // check whitelist to make sure pawn can be in this act + //for each whitelist item, pawntest must hold true for that pawn + if (!whitelist[i].PawnTest(actors[i])) + { + return false; + } + + } + } + + if (!blacklist.NullOrEmpty()) + { + for (int i = 0; i < blacklist.Count; i++) + { + // check blacklist to make sure pawn can be in this act + // for each blacklist item, pawntest must hold false for that pawn + if (blacklist[i].PawnTest(actors[i])) + { + return false; + } + + } + } + return true; } public virtual int AnimationReorder() diff --git a/1.5/Source/Animations/PawnTests/BasePawnTest.cs b/1.5/Source/Animations/PawnTests/BasePawnTest.cs new file mode 100644 index 0000000..9ada366 --- /dev/null +++ b/1.5/Source/Animations/PawnTests/BasePawnTest.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + public abstract class BasePawnTest + { + public abstract bool PawnTest(Pawn pawn); + + } +} diff --git a/1.5/Source/Animations/PawnTests/PawnTest_Always.cs b/1.5/Source/Animations/PawnTests/PawnTest_Always.cs new file mode 100644 index 0000000..198f71b --- /dev/null +++ b/1.5/Source/Animations/PawnTests/PawnTest_Always.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + public class PawnTest_Always : BasePawnTest + { + public override bool PawnTest(Pawn pawn) + { + return true; + } + } +} diff --git a/1.5/Source/Animations/PawnTests/PawnTest_Multi.cs b/1.5/Source/Animations/PawnTests/PawnTest_Multi.cs new file mode 100644 index 0000000..8c854a2 --- /dev/null +++ b/1.5/Source/Animations/PawnTests/PawnTest_Multi.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + public class PawnTest_Multi : BasePawnTest + { + public List tests = new List(); + public override bool PawnTest(Pawn pawn) + { + //check all different pawn tests in list for pawn + foreach (BasePawnTest test in tests) + { + if (!test.PawnTest(pawn)) + { + return false; + } + } + + return true; + } + } +} diff --git a/1.5/Source/Animations/PawnTests/PawnTest_RJWCanBeFucked.cs b/1.5/Source/Animations/PawnTests/PawnTest_RJWCanBeFucked.cs new file mode 100644 index 0000000..044b9c9 --- /dev/null +++ b/1.5/Source/Animations/PawnTests/PawnTest_RJWCanBeFucked.cs @@ -0,0 +1,18 @@ +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + public class PawnTest_RJWCanBeFucked : BasePawnTest + { + public override bool PawnTest(Pawn pawn) + { + return xxx.can_be_fucked(pawn); + } + } +} diff --git a/1.5/Source/Animations/PawnTests/PawnTest_RJWCanFuck.cs b/1.5/Source/Animations/PawnTests/PawnTest_RJWCanFuck.cs new file mode 100644 index 0000000..7ef9c55 --- /dev/null +++ b/1.5/Source/Animations/PawnTests/PawnTest_RJWCanFuck.cs @@ -0,0 +1,18 @@ +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + public class PawnTest_RJWCanFuck : BasePawnTest + { + public override bool PawnTest(Pawn pawn) + { + return xxx.can_fuck(pawn); + } + } +} diff --git a/1.5/Source/Comps/ExtendedAnimatorAnchor/ExtendedAnimatorAnchor_Thing.cs b/1.5/Source/Comps/ExtendedAnimatorAnchor/ExtendedAnimatorAnchor_Thing.cs index 4331046..b7b7f61 100644 --- a/1.5/Source/Comps/ExtendedAnimatorAnchor/ExtendedAnimatorAnchor_Thing.cs +++ b/1.5/Source/Comps/ExtendedAnimatorAnchor/ExtendedAnimatorAnchor_Thing.cs @@ -22,8 +22,8 @@ namespace Rimworld_Animations public override Vector3 getDrawPos() { - //vector3.up means stand above the thing - return thing.DrawPos; + //x and z position, regular altitude for pawns + return new Vector3(thing.DrawPos.x, AltitudeLayer.Pawn.AltitudeFor(), thing.DrawPos.z); } public override void ExposeData() diff --git a/1.5/Source/Comps/ExtendedAnimatorAnchor/ExtendedAnimatorAnchor_Vector3.cs b/1.5/Source/Comps/ExtendedAnimatorAnchor/ExtendedAnimatorAnchor_Vector3.cs index ffb84ab..7eb5ed8 100644 --- a/1.5/Source/Comps/ExtendedAnimatorAnchor/ExtendedAnimatorAnchor_Vector3.cs +++ b/1.5/Source/Comps/ExtendedAnimatorAnchor/ExtendedAnimatorAnchor_Vector3.cs @@ -16,7 +16,8 @@ namespace Rimworld_Animations private Vector3 position; public ExtendedAnimatorAnchor_Vector3(Vector3 position) : base() { - this.position = position; + //default to altitude for layer for y + this.position = new Vector3(position.x, AltitudeLayer.Pawn.AltitudeFor(), position.z); } public override Vector3 getDrawPos() diff --git a/1.5/Source/Patches/RJWPatches/JobDrivers/JobDriver_Sex/HarmonyPatch_Animate.cs b/1.5/Source/Patches/RJWPatches/JobDrivers/JobDriver_Sex/HarmonyPatch_Animate.cs index eaaf9b1..4de97aa 100644 --- a/1.5/Source/Patches/RJWPatches/JobDrivers/JobDriver_Sex/HarmonyPatch_Animate.cs +++ b/1.5/Source/Patches/RJWPatches/JobDrivers/JobDriver_Sex/HarmonyPatch_Animate.cs @@ -15,9 +15,23 @@ namespace Rimworld_Animations public static bool Prefix(ref JobDriver_Sex __instance, ref Pawn pawn, ref Thing target) { //remove all bumping stuff in animations; keep draw nude code + __instance.RotatePawns(pawn, __instance.Partner); if (target != null) { Pawn pawn2 = target as Pawn; + + if (pawn2 != null && !__instance.Sexprops.isRapist) + { + // if not (pawn has root node and rootnode is animating) + if (!(pawn2?.Drawer?.renderer?.renderTree?.rootNode is PawnRenderNode rootNode + && (rootNode.AnimationWorker is AnimationWorker_KeyframesExtended || rootNode.children.Any(x => x.AnimationWorker is AnimationWorker_KeyframesExtended)))) + { + //play bumpin anim + pawn.Drawer.Notify_MeleeAttackOn(target); + } + + } + if (!__instance.isEndytophile) { SexUtility.DrawNude(pawn, false); diff --git a/1.5/Source/Patches/RJWPatches/RJWAnimationSettings.cs b/1.5/Source/Patches/RJWPatches/RJWAnimationSettings.cs index fac9115..0716cb8 100644 --- a/1.5/Source/Patches/RJWPatches/RJWAnimationSettings.cs +++ b/1.5/Source/Patches/RJWPatches/RJWAnimationSettings.cs @@ -16,6 +16,7 @@ namespace Rimworld_Animations { //probably move this setting to a different mod menu if moving rjw parts of code public static bool playHumanlikeVoicesAsDefault = true; + public static float floatRangeInRenderTreeMenu = 1f; public static bool offsetTab = false, debugMode = false; public static float shiverIntensity = 2f; @@ -34,6 +35,7 @@ namespace Rimworld_Animations { Scribe_Values.Look(ref PlayAnimForNonsexualActs, "RJWAnims-PlayAnimForNonsexualActs"); Scribe_Values.Look(ref soundOverride, "RJWAnimations-rjwAnimSoundOverride", true); Scribe_Values.Look(ref shiverIntensity, "RJWAnimations-shiverIntensity", 2f); + Scribe_Values.Look(ref floatRangeInRenderTreeMenu, "RJWAnimations-FloatRangeRenderMenu", 1f); //todo: save offsetsByDefName } @@ -63,6 +65,9 @@ namespace Rimworld_Animations { listingStandard.Label("RimAnim_ShiverIntensity".Translate() + RJWAnimationSettings.shiverIntensity); RJWAnimationSettings.shiverIntensity = listingStandard.Slider(RJWAnimationSettings.shiverIntensity, 0.0f, 12f); + listingStandard.Label("RimAnim_FloatRangeRenderTree".Translate() + RJWAnimationSettings.floatRangeInRenderTreeMenu); + RJWAnimationSettings.floatRangeInRenderTreeMenu = listingStandard.Slider(RJWAnimationSettings.floatRangeInRenderTreeMenu, 0.1f, 12f); + listingStandard.CheckboxLabeled("RimAnim_DebugMode".Translate(), ref RJWAnimationSettings.debugMode); diff --git a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_Dialog_DebugRenderTree.cs b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_Dialog_DebugRenderTree.cs new file mode 100644 index 0000000..eadccea --- /dev/null +++ b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_Dialog_DebugRenderTree.cs @@ -0,0 +1,47 @@ +using HarmonyLib; +using RimWorld; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + [HarmonyPatch(typeof(Dialog_DebugRenderTree), "RightRect")] + public static class HarmonyPatch_Dialog_DebugRenderTree + { + + static MethodInfo replaceFloatRangeMethod = SymbolExtensions.GetMethodInfo(() => HarmonyPatch_Dialog_DebugRenderTree.ReplaceFloatValueRange()); + + public static IEnumerable Transpiler(IEnumerable instructions) + { + var codes = new List(instructions); + + for (int i = 0; i < codes.Count; i++) + { + //increase granularity of x and z sliders to be 0.01 instead + if (codes[i].opcode == OpCodes.Ldc_R4 && (float)codes[i].operand == 0.05f) + { + codes[i].operand = 0.001f; + codes[i - 8].opcode = OpCodes.Call; + codes[i - 8].operand = replaceFloatRangeMethod; + + } + + } + + return codes.AsEnumerable(); + + } + + public static FloatRange ReplaceFloatValueRange() + { + return new FloatRange(-RJWAnimationSettings.floatRangeInRenderTreeMenu, RJWAnimationSettings.floatRangeInRenderTreeMenu); + } + + } +} diff --git a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs index 7e30364..7f78668 100644 --- a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs +++ b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderNode.cs @@ -21,6 +21,8 @@ namespace Rimworld_Animations if (__instance.AnimationWorker is AnimationWorker_KeyframesExtended extendedAnimWorker) { + if (parms.Portrait) return true; + // ADJUST FACING get rotated textures // compare the previous tick to the current tick; if the current tick rotation is different, recache parms.facing = extendedAnimWorker.facingAtTick(__instance.tree.AnimationTick); diff --git a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderTree.cs b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderTree.cs index c3cca54..470b3d3 100644 --- a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderTree.cs +++ b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderTree.cs @@ -20,6 +20,10 @@ namespace Rimworld_Animations * Facing offsets fix */ //find lowest parent that is animating, or nothing if not animating + + //don't do anything if portrait + if (parms.Portrait) return true; + PawnRenderNode animatingNode = node; while (animatingNode != null && !(animatingNode.AnimationWorker is AnimationWorker_KeyframesExtended)) diff --git a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderer.cs b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderer.cs index a013ea7..7aced9a 100644 --- a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderer.cs +++ b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderer.cs @@ -15,7 +15,7 @@ namespace Rimworld_Animations { public static bool Prefix(ref Pawn ___pawn, ref float __result) { - //stop using cache when animating, for when downed (downed disables cache) + //set body angle to zero, for when downed if (___pawn?.Drawer?.renderer?.renderTree?.rootNode?.AnimationWorker is AnimationWorker_KeyframesExtended) { __result = 0; diff --git a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_Pawn_DrawTracker.cs b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_Pawn_DrawTracker.cs index 31c4692..4ad7419 100644 --- a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_Pawn_DrawTracker.cs +++ b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_Pawn_DrawTracker.cs @@ -12,13 +12,21 @@ namespace Rimworld_Animations { public static void Postfix(ref Pawn ___pawn, ref Vector3 __result) { //align pos on top of partner, position, etc., based on animatoranchor - if (___pawn.TryGetComp() is CompExtendedAnimator animator - && animator.IsAnchored) + if (___pawn.TryGetComp() is CompExtendedAnimator animator) { - Vector3 anchor = animator.getAnchor(); - //ignore y so that pawns don't clip through stuff - __result.x = anchor.x; - __result.z = anchor.z; + if (animator.IsAnchored) + { + Vector3 anchor = animator.getAnchor(); + __result.x = anchor.x; + __result.y = anchor.y; + __result.z = anchor.z; + } + else + { + __result.y = AltitudeLayer.Pawn.AltitudeFor(); + } + + } } diff --git a/1.5/Source/RenderSubWorkers/PawnRenderSubWorker_HideWhenAnimating.cs b/1.5/Source/RenderSubWorkers/PawnRenderSubWorker_HideWhenAnimating.cs index 57c174d..74bc599 100644 --- a/1.5/Source/RenderSubWorkers/PawnRenderSubWorker_HideWhenAnimating.cs +++ b/1.5/Source/RenderSubWorkers/PawnRenderSubWorker_HideWhenAnimating.cs @@ -14,6 +14,8 @@ namespace Rimworld_Animations public override void EditMaterial(PawnRenderNode node, PawnDrawParms parms, ref Material material) { + if (node.tree.pawn.def != ThingDefOf.Human) return; + if (node.tree.rootNode.AnimationWorker is AnimationWorker_KeyframesExtended || node.tree.rootNode.children.Any(x => x.AnimationWorker is AnimationWorker_KeyframesExtended)) { @@ -24,7 +26,10 @@ namespace Rimworld_Animations public override void TransformLayer(PawnRenderNode node, PawnDrawParms parms, ref float layer) { + base.TransformLayer(node, parms, ref layer); + + if (node.tree.pawn.def != ThingDefOf.Human) return; layer -= 1000; } diff --git a/Languages/English/Keyed/RJWAnimations-LanguageData.xml b/Languages/English/Keyed/RJWAnimations-LanguageData.xml index 7227181..bdd8344 100644 --- a/Languages/English/Keyed/RJWAnimations-LanguageData.xml +++ b/Languages/English/Keyed/RJWAnimations-LanguageData.xml @@ -19,6 +19,7 @@ Warning--You generally don't want to change human offsets, only alien offsets or animals Copy Offset to Clipboard Paste offset values in OffsetDef, or share in Discord + Float range for Debug Render Tree offset menu \ No newline at end of file diff --git a/Rimworld-Animations.csproj b/Rimworld-Animations.csproj index e27cfbc..e57bad2 100644 --- a/Rimworld-Animations.csproj +++ b/Rimworld-Animations.csproj @@ -84,6 +84,11 @@ + + + + + @@ -104,6 +109,7 @@ +