From 67ff59ed80a222a08a18bdffbe038e2f5eb9121c Mon Sep 17 00:00:00 2001 From: c0ffee Date: Mon, 22 Apr 2024 10:56:34 -0700 Subject: [PATCH 1/3] added hediff-based graphic variants --- 1.5/Assemblies/Rimworld-Animations.dll | Bin 32768 -> 34816 bytes 1.5/Defs/AnimationDefs/TestAnimation1.xml | 2 +- .../AnimationPropDefs/AnimationPropDef.xml | 52 -------------- .../AnimationPropDef_Banana.xml | 18 +++++ .../AnimationPropDef_Xray_Inside.xml | 24 +++++++ .../AnimationPropDef_Xray_Penis.xml | 35 +++++++++ .../TexPathVariants_Cat.xml | 11 +++ .../TexPathVariants_XrayPenis_Horse.xml | 13 ++++ .../TexPathVariants_XrayPenis_Human.xml | 13 ++++ .../TexPathVariants_Xray_Inside.xml | 13 ++++ 1.5/Source/Comps/CompExtendedAnimator.cs | 6 ++ .../HarmonyPatch_PawnRenderTree.cs | 12 +++- ...derNodeProperties_GraphicHediffVariants.cs | 26 +++++++ ...nRenderNodeWorker_GraphicHediffVariants.cs | 15 ++++ .../PawnRenderNode_GraphicHediffVariants.cs | 67 ++++++++++++++++++ ...awnRenderNodeProperties_GraphicVariants.cs | 4 +- .../PawnRenderNodeWorker_GraphicVariants.cs | 10 +-- .../PawnRenderNode_GraphicVariants.cs | 19 +++-- 1.5/Source/PawnRenderNode/TexPathVariants.cs | 16 +++++ Rimworld-Animations.csproj | 12 +++- 20 files changed, 301 insertions(+), 67 deletions(-) delete mode 100644 1.5/Defs/AnimationPropDefs/AnimationPropDef.xml create mode 100644 1.5/Defs/AnimationPropDefs/AnimationPropDef_Banana.xml create mode 100644 1.5/Defs/AnimationPropDefs/AnimationPropDef_Xray_Inside.xml create mode 100644 1.5/Defs/AnimationPropDefs/AnimationPropDef_Xray_Penis.xml create mode 100644 1.5/Defs/TexPathVariantsDefs/TexPathVariants_Cat.xml create mode 100644 1.5/Defs/TexPathVariantsDefs/TexPathVariants_XrayPenis_Horse.xml create mode 100644 1.5/Defs/TexPathVariantsDefs/TexPathVariants_XrayPenis_Human.xml create mode 100644 1.5/Defs/TexPathVariantsDefs/TexPathVariants_Xray_Inside.xml create mode 100644 1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNodeProperties_GraphicHediffVariants.cs create mode 100644 1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNodeWorker_GraphicHediffVariants.cs create mode 100644 1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNode_GraphicHediffVariants.cs create mode 100644 1.5/Source/PawnRenderNode/TexPathVariants.cs diff --git a/1.5/Assemblies/Rimworld-Animations.dll b/1.5/Assemblies/Rimworld-Animations.dll index 1870329e6330cbc13bf56db1e0583ab1c9d90296..7a6e149485b66daf096fc943249bbbfacac0678b 100644 GIT binary patch delta 15715 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 diff --git a/1.5/Defs/AnimationDefs/TestAnimation1.xml b/1.5/Defs/AnimationDefs/TestAnimation1.xml index caee678..59f4cd2 100644 --- a/1.5/Defs/AnimationDefs/TestAnimation1.xml +++ b/1.5/Defs/AnimationDefs/TestAnimation1.xml @@ -100,7 +100,7 @@
  • - RenderNodeTag_Banana + RenderNodeTag_Xray_Inside Rimworld_Animations.AnimationWorker_KeyframesExtended diff --git a/1.5/Defs/AnimationPropDefs/AnimationPropDef.xml b/1.5/Defs/AnimationPropDefs/AnimationPropDef.xml deleted file mode 100644 index 7815092..0000000 --- a/1.5/Defs/AnimationPropDefs/AnimationPropDef.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - RenderNodeTag_Banana - - - - AnimationProp_Banana - - - - - AnimProp_Banana - Rimworld_Animations.PawnRenderNode_GraphicVariants - Rimworld_Animations.PawnRenderNodeWorker_GraphicVariants - - RenderNodeTag_Banana - Body - AnimationProps/Banana/Banana - - Head - 95 - - -
  • AnimationProps/Cat/Cat1
  • -
  • AnimationProps/Cat/Cat2
  • - - - True - - - - - - RenderNodeTag_Genitals - - - - AnimationProp_Genitals - - - AnimProp_Genitals - false - RenderNodeTag_Genitals - Body - - Head - 95 - - - diff --git a/1.5/Defs/AnimationPropDefs/AnimationPropDef_Banana.xml b/1.5/Defs/AnimationPropDefs/AnimationPropDef_Banana.xml new file mode 100644 index 0000000..fc1e606 --- /dev/null +++ b/1.5/Defs/AnimationPropDefs/AnimationPropDef_Banana.xml @@ -0,0 +1,18 @@ + + + + RenderNodeTag_Banana + + + + AnimationProp_Banana + + Banana + RenderNodeTag_Banana + Body + AnimationProps/Banana/Banana + Head + 95 + + + diff --git a/1.5/Defs/AnimationPropDefs/AnimationPropDef_Xray_Inside.xml b/1.5/Defs/AnimationPropDefs/AnimationPropDef_Xray_Inside.xml new file mode 100644 index 0000000..c758775 --- /dev/null +++ b/1.5/Defs/AnimationPropDefs/AnimationPropDef_Xray_Inside.xml @@ -0,0 +1,24 @@ + + + + + RenderNodeTag_Xray_Inside + + + + AnimationProp_Xray_Inside + + Xray Inside + Rimworld_Animations.PawnRenderNode_GraphicVariants + Rimworld_Animations.PawnRenderNodeWorker_GraphicVariants + RenderNodeTag_Xray_Inside + True + Body + + Head + 95 + TexPathVariants_Xray_Inside + + + + diff --git a/1.5/Defs/AnimationPropDefs/AnimationPropDef_Xray_Penis.xml b/1.5/Defs/AnimationPropDefs/AnimationPropDef_Xray_Penis.xml new file mode 100644 index 0000000..e0a97c2 --- /dev/null +++ b/1.5/Defs/AnimationPropDefs/AnimationPropDef_Xray_Penis.xml @@ -0,0 +1,35 @@ + + + + RenderNodeTag_Xray_Penis + + + AnimationProp_Penis + + Xray Penis + Rimworld_Animations.PawnRenderNode_GraphicHediffVariants + Rimworld_Animations.PawnRenderNodeWorker_GraphicHediffVariants + RenderNodeTag_Xray_Penis + Body + AnimationProps/Banana/Banana + + Head + 95 + True + + + TexPathVariants_XrayPenis_Human + + + +
  • + +
  • HorsePenis
  • +
  • RaccoonPenis
  • + + TexPathVariants_XrayPenis_Horse + +
    +
    +
    +
    \ No newline at end of file diff --git a/1.5/Defs/TexPathVariantsDefs/TexPathVariants_Cat.xml b/1.5/Defs/TexPathVariantsDefs/TexPathVariants_Cat.xml new file mode 100644 index 0000000..474aca4 --- /dev/null +++ b/1.5/Defs/TexPathVariantsDefs/TexPathVariants_Cat.xml @@ -0,0 +1,11 @@ + + + + TexPathVariants_Cat + +
  • AnimationProps/Cat/Cat1
  • +
  • AnimationProps/Cat/Cat2
  • +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/TexPathVariantsDefs/TexPathVariants_XrayPenis_Horse.xml b/1.5/Defs/TexPathVariantsDefs/TexPathVariants_XrayPenis_Horse.xml new file mode 100644 index 0000000..3b14154 --- /dev/null +++ b/1.5/Defs/TexPathVariantsDefs/TexPathVariants_XrayPenis_Horse.xml @@ -0,0 +1,13 @@ + + + + TexPathVariants_XrayPenis_Horse + +
  • AnimationProps/Cat/Cat1
  • + +
  • AnimationProps/Cat/Cat2
  • + +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/TexPathVariantsDefs/TexPathVariants_XrayPenis_Human.xml b/1.5/Defs/TexPathVariantsDefs/TexPathVariants_XrayPenis_Human.xml new file mode 100644 index 0000000..235ee3e --- /dev/null +++ b/1.5/Defs/TexPathVariantsDefs/TexPathVariants_XrayPenis_Human.xml @@ -0,0 +1,13 @@ + + + + TexPathVariants_XrayPenis_Human + +
  • AnimationProps/Cat/Cat1
  • + +
  • AnimationProps/Cat/Cat2
  • + +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Defs/TexPathVariantsDefs/TexPathVariants_Xray_Inside.xml b/1.5/Defs/TexPathVariantsDefs/TexPathVariants_Xray_Inside.xml new file mode 100644 index 0000000..4c9f90b --- /dev/null +++ b/1.5/Defs/TexPathVariantsDefs/TexPathVariants_Xray_Inside.xml @@ -0,0 +1,13 @@ + + + + TexPathVariants_Xray_Inside + +
  • AnimationProps/Cat/Cat1
  • + +
  • AnimationProps/Cat/Cat2
  • + +
    +
    + +
    \ No newline at end of file diff --git a/1.5/Source/Comps/CompExtendedAnimator.cs b/1.5/Source/Comps/CompExtendedAnimator.cs index a85a5fc..13cd1d3 100644 --- a/1.5/Source/Comps/CompExtendedAnimator.cs +++ b/1.5/Source/Comps/CompExtendedAnimator.cs @@ -153,6 +153,12 @@ namespace Rimworld_Animations { { PawnRenderNodeProperties props = animationProp.animPropProperties; + Log.Message("Texpath of prop:" + props.texPath); + if (props.texPath.NullOrEmpty()) + { + Log.Message("Setting default texture"); + props.texPath = "AnimationProps/Banana/Banana"; + } //create new render node PawnRenderNode animRenderNode = (PawnRenderNode)Activator.CreateInstance(props.nodeClass, new object[] { diff --git a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderTree.cs b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderTree.cs index 621b881..b79853f 100644 --- a/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderTree.cs +++ b/1.5/Source/Patches/RimworldPatches/HarmonyPatch_PawnRenderTree.cs @@ -38,9 +38,19 @@ namespace Rimworld_Animations * Set Render Node to absolute position */ if (node.Props is PawnRenderNodeProperties_GraphicVariants graphicVariantProp - && graphicVariantProp.absolutePosition) + && graphicVariantProp.absoluteTransform) { matrix = parms.matrix; + + //absolute transform -- just use the node's transform, not its ancestors + node.GetTransform(parms, out Vector3 offset, out Vector3 pivot, out Quaternion quaternion, out Vector3 scale); + + if (offset != Vector3.zero) matrix *= Matrix4x4.Translate(offset); + if (pivot != Vector3.zero) matrix *= Matrix4x4.Translate(pivot); + if (quaternion != Quaternion.identity) matrix *= Matrix4x4.Rotate(quaternion); + if (scale != Vector3.one) matrix *= Matrix4x4.Scale(scale); + if (pivot != Vector3.zero) matrix *= Matrix4x4.Translate(scale).inverse; + float num = node.Worker.AltitudeFor(node, parms); if (num != 0f) { diff --git a/1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNodeProperties_GraphicHediffVariants.cs b/1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNodeProperties_GraphicHediffVariants.cs new file mode 100644 index 0000000..894c085 --- /dev/null +++ b/1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNodeProperties_GraphicHediffVariants.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + public class PawnRenderNodeProperties_GraphicHediffVariants : PawnRenderNodeProperties_GraphicVariants + { + + public List hediffVariants; + + } + + public class TexPathVariants_Hediff + { + + public List hediffs; + public TexPathVariantsDef texPathVariantsDef; + + } + + +} diff --git a/1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNodeWorker_GraphicHediffVariants.cs b/1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNodeWorker_GraphicHediffVariants.cs new file mode 100644 index 0000000..24a10dc --- /dev/null +++ b/1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNodeWorker_GraphicHediffVariants.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Rimworld_Animations +{ + public class PawnRenderNodeWorker_GraphicHediffVariants : PawnRenderNodeWorker_GraphicVariants + { + //same functionality as graphicvariants worker + //just here for readability + + } +} diff --git a/1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNode_GraphicHediffVariants.cs b/1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNode_GraphicHediffVariants.cs new file mode 100644 index 0000000..8d78dca --- /dev/null +++ b/1.5/Source/PawnRenderNode/GraphicHediffVariants/PawnRenderNode_GraphicHediffVariants.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + public class PawnRenderNode_GraphicHediffVariants : PawnRenderNode_GraphicVariants + { + + protected new PawnRenderNodeProperties_GraphicHediffVariants props; + private HediffDef curHediff; + + public PawnRenderNode_GraphicHediffVariants(Pawn pawn, PawnRenderNodeProperties props, PawnRenderTree tree) : base(pawn, props, tree) + { + + this.props = (PawnRenderNodeProperties_GraphicHediffVariants)props; + + } + + protected override Dictionary GraphicVariantsFor(Pawn pawn) + { + + //for each different hediff-based texpathvariants, + foreach (TexPathVariants_Hediff texPathVariant_Hediff in props.hediffVariants) + { + //for all the hediffs corresponding to that texpathvariant, + foreach (HediffDef hediffDef in texPathVariant_Hediff.hediffs) + { + //if the pawn has that hediff, + if (pawn.health.hediffSet.hediffs.Any((Hediff hediff) => hediff.def == hediffDef)) + { + //return that specific variant + curHediff = hediff.def; + return GenerateVariants(pawn, texPathVariant_Hediff.texPathVariantsDef); + + } + } + + } + + //otherwise just use default + curHediff = null; + return base.GraphicVariantsFor(pawn); + + } + + protected override void EnsureMaterialsInitialized() + { + //if pawn no longer has the hediff, + if (curHediff == null || + (this.tree.pawn.health?.hediffSet?.hediffs is List hediffs + && hediffs.Any((Hediff hediff) => hediff.def == curHediff))) + { + //redo graphicvariantsfor + variants = GraphicVariantsFor(this.tree.pawn); + } + + base.EnsureMaterialsInitialized(); + } + + + } + +} diff --git a/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNodeProperties_GraphicVariants.cs b/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNodeProperties_GraphicVariants.cs index b1a8720..15ac022 100644 --- a/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNodeProperties_GraphicVariants.cs +++ b/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNodeProperties_GraphicVariants.cs @@ -10,8 +10,8 @@ namespace Rimworld_Animations public class PawnRenderNodeProperties_GraphicVariants : PawnRenderNodeProperties { - public List texPathVariants; - public bool absolutePosition = false; + public TexPathVariantsDef texPathVariantsDef; + public bool absoluteTransform = false; } } diff --git a/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNodeWorker_GraphicVariants.cs b/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNodeWorker_GraphicVariants.cs index 15b5a92..50a8caa 100644 --- a/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNodeWorker_GraphicVariants.cs +++ b/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNodeWorker_GraphicVariants.cs @@ -30,14 +30,14 @@ namespace Rimworld_Animations //if node is animating, and is a graphic variant type of node if ((node.AnimationWorker is AnimationWorker_KeyframesExtended extendedAnimWorker) + + //and node is one with graphic variants && (node is PawnRenderNode_GraphicVariants nodeWithGraphicVariants) + + //and texpathvariant is set && extendedAnimWorker.TexPathVariantAtTick(node.tree.AnimationTick) != null) { - //if node has a graphic variant, - int variant = (int)extendedAnimWorker.TexPathVariantAtTick(node.tree.AnimationTick); - - //return the variant - return GetMaterialVariant(nodeWithGraphicVariants, parms, variant); + return GetMaterialVariant(nodeWithGraphicVariants, parms, (int)extendedAnimWorker.TexPathVariantAtTick(node.tree.AnimationTick)); } //otherwise return original texture diff --git a/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNode_GraphicVariants.cs b/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNode_GraphicVariants.cs index fa46ce7..64eb815 100644 --- a/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNode_GraphicVariants.cs +++ b/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNode_GraphicVariants.cs @@ -11,8 +11,8 @@ namespace Rimworld_Animations public class PawnRenderNode_GraphicVariants : PawnRenderNode { - private new PawnRenderNodeProperties_GraphicVariants props; - private Dictionary variants; + protected new PawnRenderNodeProperties_GraphicVariants props; + protected Dictionary variants; public Graphic getGraphicVariant(int variant) { @@ -38,14 +38,22 @@ namespace Rimworld_Animations protected virtual Dictionary GraphicVariantsFor(Pawn pawn) { + + return GenerateVariants(pawn, props.texPathVariantsDef); + + } + + protected Dictionary GenerateVariants(Pawn pawn, TexPathVariantsDef texPathVariants) + { + Dictionary variantGraphics = new Dictionary(); - Shader shader = this.ShaderFor(pawn); //for each graphic variant - for (int i = 0; i < props.texPathVariants.Count; i++) + for (int i = 0; i < texPathVariants.variants.Count; i++) { + //get new graphic - Graphic variant = GraphicDatabase.Get(props.texPathVariants[i], shader, Vector2.one, this.ColorFor(pawn)); + Graphic variant = GraphicDatabase.Get(texPathVariants.variants[i], this.ShaderFor(pawn), Vector2.one, this.ColorFor(pawn)); //add it to the variants dictionary; i + 1 for easier readability in logs variantGraphics.Add(i + 1, variant); @@ -53,6 +61,7 @@ namespace Rimworld_Animations } return variantGraphics; + } diff --git a/1.5/Source/PawnRenderNode/TexPathVariants.cs b/1.5/Source/PawnRenderNode/TexPathVariants.cs new file mode 100644 index 0000000..d741756 --- /dev/null +++ b/1.5/Source/PawnRenderNode/TexPathVariants.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + public class TexPathVariantsDef : Def + { + + public List variants; + + } +} diff --git a/Rimworld-Animations.csproj b/Rimworld-Animations.csproj index e676bbd..2ab9ff6 100644 --- a/Rimworld-Animations.csproj +++ b/Rimworld-Animations.csproj @@ -112,9 +112,13 @@ + + + + @@ -126,11 +130,17 @@ - + + + + + + + From c33072614bcfb8b1cf459d50df95dc284624506d Mon Sep 17 00:00:00 2001 From: c0ffee Date: Mon, 22 Apr 2024 12:55:46 -0700 Subject: [PATCH 2/3] Better error handling for missing graphic variants, missing offsets --- 1.5/Assemblies/Rimworld-Animations.dll | Bin 34816 -> 35328 bytes 1.5/Defs/AnimationDefs/TestAnimation1.xml | 1 - .../TestGroupAnimation1.xml | 1 + .../GroupAnimations/GroupAnimationDef.cs | 1 + 1.5/Source/Comps/CompExtendedAnimator.cs | 2 -- .../PawnRenderNodeWorker_GraphicVariants.cs | 13 +++++++++++-- .../PawnRenderNode_GraphicVariants.cs | 8 ++++++++ 7 files changed, 21 insertions(+), 5 deletions(-) diff --git a/1.5/Assemblies/Rimworld-Animations.dll b/1.5/Assemblies/Rimworld-Animations.dll index 7a6e149485b66daf096fc943249bbbfacac0678b..56a78fd4736a3adf2ab02f7fec50ec3f923473d4 100644 GIT binary patch delta 12989 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 a>={w>jADlxk1^ffd5`~=e@V5SjsFKHQzY#G delta 12607 zcmaib34D~*)&9BfI(ueGCNr4<5<*}|!YU~HB5M>REGj`z0oeo{lCV0ENdPIRt>7#A zAy$ZJKTxYu5S7}`Ek1!7{Jr-L5PD&VmOGG6lbCs<{>Sh^}m%XI8#x?5z=dJCt4iPQ|H4hF@j+v zfLbJ@Ktg7~ERRynZTc6S27yOtCp=#XIsjAR9y$Ve_g zX~1afD^IaY__>2c^z?D7y|;J23!zDlV;B$cloccHi%{~CQwZYpXJrSy<$b~2!qJ&qsN3WE`B*>_Au9BF{1yYV+Sd_#RkkuChvNbtvH9;z) z(vB@2IxC5Y^iT?S?Wy(>kn12Um6M_Le3YzneH~+$LhdRfqx4!dQ^rbVRR=^;Q!K1n z-*_?EdfFFqFF=qoh(wk3zOP?+8ful)qoZ2#G89wO8D?1Ba-#0bxp)O2d8IWmCmPu( zXt9#&1k;jkTIbv{JvkG~#0YCmPHFg*RL+8+rbwa1iP@|gX+4v3Tnx4D^%sVUl~e*% zReh?GDnVgJa*?G3It#M81Uj47z@AjA?*}7dx%ES^R9gWvt3xO+omhoZ?P`GA zG?I1rC9|diVRpn5@nmi?4M}GcWZ3Xzz0@Wf_@^|~Qz3McFaSK;*RZe-vq{T6BV0y# zA=P2NX>POJU2_fhTF%?rwJ@t^E2_hM({il?p+Nfjv-)+cXAPB3g4gTWYr;)bmi!eL zdFVID!Uc4sUCY!+R7p{(q9!(SiArao?hRb5>kVIZcuuv|H-eWEaol*e_#2>_?P$77 z?M+a*jKr_;ll%==gB=W2x&XfgvV)b$o2}~H{C1nzW-~(&^Jw)gC>cs+$`)Jq<`(z6 z8KR{KS#cS;XH+Dhj8wJqtP$7ELtRf$ITLmf#WHi{mc0Dvv3$=*@;07MA#cE& zZR|+g+19Z$@mm(iAbbH|wyiU9S6kccAaVjZ<;7!$oQiC!g4O=uf7*pb_GURs#3oL4QXLK zc_RW^K))koAeX4{SbkS=uXQ~Cw`pEIGK)iM2Fgn>L{iHuG`Tir)|M7=Y8OfgFQ$EY z;=db&llQ?)JtM+rM48Ah6JcyOhzmiLr0$0*ziKuAfIUDHC4GQt^7lYel@zuhSK=W6 zCg~zlR4w^1Yq+pS7LtFEKPkD~?L`?ac^u`PNew6VSreiKv3+d7S$M?O$_WVP;lzGx zU9`LLD8zM-S&v0WjXHp0emL<*{CFJ383V&>)II^0$U#RtoB599|AA5MlR&Q%78nMj z_9?K{PXo+|Gx>kk`2{n2JPYPhDw9q4mFaVXJO|=2yQ#TlK~tu)HQCln1qGtXI#E#Q zX@*hA84kIesa;lHY^>`A2&M&Gm#u!mnip$l$c`SgZip2WVr>&8;hKlAK-^uDU-Jh4 z)}Mogq;v@3fq&L&iuE-(xa41~pUxHs#HY_Y1gWbZmIew^;zbaw24<=+>LyUH>0QvD!3WAEz&P)sX{w;|`nlh@91=zpBo&KxE24&?Byg*{~h z)MV?Lg;2tVnpxjqk_@2%Ih(^?Cr%PDcVjjt-i6LnMh8V0b673=gwd+`w-OLN`r9RRqiw? zPPUr-h%NcdG7E9&iI1(fI`r<`I>K#+eCOrZ-rB<)P4rv@&a8^R3wSQ+%VRzZN zq@@PKx0yTv2{y}5@ss#WmXjyB97Yw7VdhVDB)&F<$uO3*({bu<32`h-W?MNO^NP1aj?i(+K84&Z8NT!w0&&WxI@(0eE zQ8S8loR?qFEoU9);}>*~vW~mhMwe!%bu7m8&4v3@Fyr=G4u%ljWTGbLy-iI!n*FTf zbpL|xUDk2pe?gb)fDS{D{w3vlR`O){g^EwHjz=MJ8WG4BrtENyI@UoVvxXDxKVenR zGNZ=hL{*-3S#HN=(rO=hF)IJ!e#z72uekK{(`BfqAguLxHN|sR(-9u!6Z|PD*sHBy zcZ!Motlgc8dv|Aj;zzi^bJ-75fJikJQ|{+l5(zUry4={X3VNKZu+DU9hsyDiGT_*f zc>3R{d`1g70*(O-fBNYsJc62h+wGC&EJ@1Kg#)GTg;`>|n0gjo5>BhJODNr&1JAPf*>MX8XKXsyj22NH zd&_px6B>o36DvF=6no_C&>XM7bEShvO(uUQ)B*+Ih7+iJAry zRXQQNcrxYU`N2G-;xQLj;Gw5Z;Jd7LUAvUr0yYBQOYq%+FLrodkqJ@B%Z^f%ds_>- zmZaCB5BxDG&)JM4?HY*{j#;4``hoXqs&>S34EjOhTM`#IS<+YHMG`ki`3%SZ!oxs` zPe{p5#}T(d4@I8#8njWothgxdK5F`?lhOyMD}B<`|00CNB|Oq0rGB za?u7CYsb0PYcA@N%jN4O?vnC-1uUu28E?*GELRwdO~#Mm)1cp>;oE6o4$(I0-$jdL z-C^*PcF`n*O%KQ*ddOxT0R|}@92^VMW3j<8gI3FcwgX)>!VW05Uh~m?kv^#ViN+q9 zWZmluzKXbLqsG|Jf7A@qkFjlvLCejjyR-6_lakuHOtiLuSsvhsA9_P3=? zQn2=T4 zG|-srN4(PAWVmzD?Fi1G5of+h0ZkECQ z4%5w`w`BeOh?(`!vJ4NM<7J&Cn%egMFbJ4pu64 zTM_m!uT0~KJBKEL`Du=9{v4Vt*0>3SrJo50S9*p|wfz>MSWm}&lUX*m@AWy>oi(=lkwW>P&ud%nPCvn1Ps zTnwi^G)H>bEG_%cT*-P%UAhm=mvl@1;k-jIy;`z_45lwFl!;qk*(x1L>cp2M>;oW|28Qj7fboHe`W#Pq7%p-zM9@)-AqM*}y7xO{(b zzGlz{|42OR&2BDNsf>>pjJtC$g3Zk6CBR+LX~30!uH}|~LMGSR6}=piC&RNOUJZ;I zjAat-T8-&Y4Mer(5l4%o3Axuf1znmq1ZSisXC2DZg6o01qBj5op81-fr`)%oJS%6K zGfbPr?ZD501|5hF5eB`IyA9=~VJ_$A-h=Xl$OFLRx%+@)^PT`!*xGQq38ZVBO`CG- zP`hE)7(=Kpv)Y7nl2@d=(9VO*eg{#0rTQ0cW{5(3APs z>S=?16hlO1As!l9AL)hThoC>UVNEupaC9;bc9lhEEftzBSu@=go#s;L{w$qJ`?7Sn zCGL2(o<>t7L%lRAYE+%2)Y%T7W}Thtw93}e?KyK0`F6?H$v{ool~vEAJ#E;5R`xxX z^+S?1;}1^`;ikXaI{LB^-h$(m^n9=&`j=L0G=lbQR7E1$;V zw9Os-SI(1QZ%WqS_)HWHoEiLu;I3) zSb$*ox`jW@dXMm5l?aWrEorP$u13-{u1&>DTG?~12+g#^q9@?vhupCJ&nVgEGPfG&~aBGHD%bX(Jx%Zl#|B0XiI|SOap7y zKgj!+t20HU&Tc+Iog`}})+OkHta_#NSeCAo3h@p~So)uf8t!s>PBJ^RZuC+c_C`F!G-aKYJ<(SbBhGOjnlJ&?Z5(hVk@nz(&dPIC{YL7+Cf$~}}ONM<)N zjHb5g7P^O#b>7(~M$ny-v6toU5p*QOcE{50Q8ccf?Q?hRX7?Cc)Zb>?BDcH8(r=li z$?kmx9mpu}hG_*I%COzByWF_%8gRD3apaNgHrgF~&^?X@X6Y`Xk!{%cHtdo%>r!%QivSwNw{l-0$4rJ-(P*X<7tH&IAeyCk9%{$&4IwGk( z6mzI-Sc}sV#~d0aSu?pJ32iRDGn{qJ6wfng9(|i(TD)AHNAB}kcN^{Zsh)W>Hp6Ot zUeA2`p_R4sETSoVw*bp4(=biaz82~$^(>}C88+V6(^E}_d@+&Pnro@6WNRrT27790 zM3!y|jmy$4p}85>3zkc%UNXCb%jl-odf5M$(Uy#92b$wrMtibMm(!nGP4Nm&%^AyU zXoP1uy_BU}L2qVs#iEW@P|r~u_F5W_lhq1(NizFsT0w7Qbj1Su-wOJyjq=;GO6VM; z&-Q)=1teQb|HMRGK}A`*l~kJ19is}*N>ma!75)D)-O0@tI&7-aGX+?(=?0yv4e_%4 zxA?<|UH&Ef)XCaAd~CTZ+P19X*vgWSpYbWQ!UtBybXbA?%~GCjL$VZ=xW-Xvit6{P z8B<%bC+Do>3bbG-K!Wglv98pskIxPiG=R8fCiJX-nnoX6!P%Q*fx}u%48b z_83>l^zy*9^z4_*DvtN;-$t&B>x2JvXE*a|{@JYXJW%BrYxJOWai>H(u_vV^qe44z zX=x9cmYD%RmkS)c+4BtckOnzB9S$J9g8m!Yy*v=}VP5e-GqS`_sxZ1;yetZO`o@#?eFGej+M{c!!{TPr+~z z5V81GVhZJ<`6;sb>C)zFnu|BdB7vhe9aMJ5?-0{zaRh4v{SdfMIFP583-A!2{`?^Z@^%&K7Mk-GA*2owopdQr6 zD^Yc4e3EjE)`u@uURL($)0HB%y*^X9icTsA@V3sG_?n6%tCe*$FCDp6xe4y>S8mO? zYj8b-G8+|%jRnsuMRFkUhXW-4EwR%$q*RDaaNS>JNtGzZ*?72$K$VH=yx^D0oiefa z(02t7qL(v59<@q676_E>K^H#ncC6b{ptZce-5NP5i#jJs6_ylRbMvhVq0A zV!G^ilawEl^67L`U#T9F+Sg=~-<3n~t}K5jak`XDmpwiy1FBY4-`~{_rMy}_T_Ci8 zxY6TFYf;&=MlmfG*BZqW60h@c`NJq#=I>WpSN% zxhBN?!1cf+svKYNA?rn!rX%Thg=v!%+xrR=Q5`%3%HY2(a!9aWcL|Ul9PEhyqufe18S**MM zwP?_}nNxV<7oxy-fxcD!D(6zYN?91bRzIkmirpdZkx7m!58=Kesw}|_k19XnW;m+! zj|>rw>Z6{N9#y7B)&c_##ut&N1?pIHzP4MfHEx3BD0;s~P2a5Fr0=1=E=yl2ZjWu% ztJO0Fd!RlRc|kv@?svbaYsgR|9aBx;G2J5`^PbZCD?Ig1U;;K$f5o432DSPdsxedL zi-@T5dZa(_-^x(n8@?f;T76m@h4OiLToO&8oKxmz znX|15A3u3r(HvV@lBP!dlsFodL3!nl-C~wH)KR5<>c(R!YWx+D^RaWLrkmF|?vYOK zk&og?nW2%g$KwPqN>ehqSy1q>V-MxU|KeDn@x5A9SrvHAQLPoKZ#h zj%vqR#}>yY4i7f?IR5HDqoj_jnT=#Jvq~X-#TY{6kOw}I8EfkQlW@7XY@Jg zjmi$?Q9M<;TBwdv$Egd|8ueE759*8R`|3z-y!N*KrM}(xU*jR;QR5ZkYV$Xa9gbc2 zSBqLbA1bmx58yO|vta9|m-BZD6M@$5>)0EIDgNM!IQxUs3O-*Lj5>mIA~5?i)9N)Q zl=m;3U4HI%l~pxn__RIrp|X@dRX(8~)z9$tip#VK;!1t8Sf@l*W-J$6d^nksg+S*U+53Gw1jf(ch}RI=;7P{vgBefB4$R{#@N*uo=9q-A_AkE9wZ(ydJ6ivFpkb>upn9PD_nHxG*u(IMRbQQ#>os*HFEB#{ zD}$8^mIW1ct$o$Q{5hry#Y_<-z*bq>&@oFv?x1 z0BxnyR8eN`C=@{0W2lti8ZZ9SjKG=zQ~cmRjt})3M(HLBgPnQ7`Yj3^4mJu!NQB5$ zsES}!usT?O+HHB4xkp7!z14>8lvZY+)MPX(7cB^L16P9n?K(S-*1?wJFoty0c55uaVdjlK36q|dR{}1Ct B%vJyZ diff --git a/1.5/Defs/AnimationDefs/TestAnimation1.xml b/1.5/Defs/AnimationDefs/TestAnimation1.xml index 59f4cd2..466bbb4 100644 --- a/1.5/Defs/AnimationDefs/TestAnimation1.xml +++ b/1.5/Defs/AnimationDefs/TestAnimation1.xml @@ -98,7 +98,6 @@ -
  • RenderNodeTag_Xray_Inside diff --git a/1.5/Defs/GroupAnimationDefs/TestGroupAnimation1.xml b/1.5/Defs/GroupAnimationDefs/TestGroupAnimation1.xml index 6be826f..1f68f3d 100644 --- a/1.5/Defs/GroupAnimationDefs/TestGroupAnimation1.xml +++ b/1.5/Defs/GroupAnimationDefs/TestGroupAnimation1.xml @@ -3,6 +3,7 @@ TestGroupAnimation1 2 + True
  • 10 diff --git a/1.5/Source/Animations/GroupAnimations/GroupAnimationDef.cs b/1.5/Source/Animations/GroupAnimations/GroupAnimationDef.cs index 55f3bea..c9cc5e0 100644 --- a/1.5/Source/Animations/GroupAnimations/GroupAnimationDef.cs +++ b/1.5/Source/Animations/GroupAnimations/GroupAnimationDef.cs @@ -55,6 +55,7 @@ namespace Rimworld_Animations { //element at or default to stop errors if (offsetDefs == null) return null; + if ((actor + reorder) % numActors >= offsetDefs.Count) return null; return offsetDefs[(actor + reorder) % numActors].FindOffset(pawn); } } diff --git a/1.5/Source/Comps/CompExtendedAnimator.cs b/1.5/Source/Comps/CompExtendedAnimator.cs index 13cd1d3..2c57aa8 100644 --- a/1.5/Source/Comps/CompExtendedAnimator.cs +++ b/1.5/Source/Comps/CompExtendedAnimator.cs @@ -153,10 +153,8 @@ namespace Rimworld_Animations { { PawnRenderNodeProperties props = animationProp.animPropProperties; - Log.Message("Texpath of prop:" + props.texPath); if (props.texPath.NullOrEmpty()) { - Log.Message("Setting default texture"); props.texPath = "AnimationProps/Banana/Banana"; } diff --git a/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNodeWorker_GraphicVariants.cs b/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNodeWorker_GraphicVariants.cs index 50a8caa..da96fe5 100644 --- a/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNodeWorker_GraphicVariants.cs +++ b/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNodeWorker_GraphicVariants.cs @@ -13,6 +13,8 @@ namespace Rimworld_Animations public override bool CanDrawNow(PawnRenderNode node, PawnDrawParms parms) { + if (!base.CanDrawNow(node, parms)) return false; + if (parms.Portrait) return false; //don't draw if not visible at tick @@ -23,7 +25,7 @@ namespace Rimworld_Animations } - return base.CanDrawNow(node, parms); + return true; } protected override Material GetMaterial(PawnRenderNode node, PawnDrawParms parms) { @@ -37,7 +39,11 @@ namespace Rimworld_Animations //and texpathvariant is set && extendedAnimWorker.TexPathVariantAtTick(node.tree.AnimationTick) != null) { - return GetMaterialVariant(nodeWithGraphicVariants, parms, (int)extendedAnimWorker.TexPathVariantAtTick(node.tree.AnimationTick)); + Material materialVariant = GetMaterialVariant(nodeWithGraphicVariants, parms, (int)extendedAnimWorker.TexPathVariantAtTick(node.tree.AnimationTick)); + if (materialVariant != null) { + return materialVariant; + } + } //otherwise return original texture @@ -47,6 +53,9 @@ namespace Rimworld_Animations public virtual Material GetMaterialVariant(PawnRenderNode_GraphicVariants node, PawnDrawParms parms, int variant) { Material material = node.getGraphicVariant(variant).NodeGetMat(parms); + + if (material == null) return null; + if (material != null && !parms.Portrait && parms.flags.FlagSet(PawnRenderFlags.Invisible)) { material = InvisibilityMatPool.GetInvisibleMat(material); diff --git a/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNode_GraphicVariants.cs b/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNode_GraphicVariants.cs index 64eb815..24a74d6 100644 --- a/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNode_GraphicVariants.cs +++ b/1.5/Source/PawnRenderNode/GraphicVariants/PawnRenderNode_GraphicVariants.cs @@ -16,6 +16,12 @@ namespace Rimworld_Animations public Graphic getGraphicVariant(int variant) { + if (!variants.ContainsKey(variant)) + { + Log.ErrorOnce("[Anims] Error: tried to get key from variants that doesn't exist; key = " + variant, 2043428111); + return null; + } + return variants[variant]; } @@ -48,6 +54,8 @@ namespace Rimworld_Animations Dictionary variantGraphics = new Dictionary(); + if (texPathVariants == null) return variantGraphics; + //for each graphic variant for (int i = 0; i < texPathVariants.variants.Count; i++) { From 315a57e53de45855d958d210cdb5cdbee8f2d7eb Mon Sep 17 00:00:00 2001 From: c0ffee Date: Mon, 22 Apr 2024 14:46:00 -0700 Subject: [PATCH 3/3] fixed: invis sleeping sex job length matches anim length --- 1.5/Assemblies/Rimworld-Animations.dll | Bin 35328 -> 38400 bytes 1.5/Source/Comps/CompExtendedAnimator.cs | 17 ++++++++ ...HarmonyPatch_JobDriver_SexBaseInitiator.cs | 18 ++++---- .../JobDriver_Sex/HarmonyPatch_Animate.cs | 39 ++++++++++++++++++ .../HarmonyPatch_PlaySexSounds.cs | 0 .../JobDriver_Sex}/HarmonyPatch_SexTick.cs | 0 ...onyPatch_JobDriver_SexBaseReceiverLoved.cs | 29 +++++++++++++ 1.5/Source/Utilities/AnimationUtility.cs | 6 +++ Rimworld-Animations.csproj | 6 ++- 9 files changed, 104 insertions(+), 11 deletions(-) create mode 100644 1.5/Source/Patches/RJWPatches/JobDrivers/JobDriver_Sex/HarmonyPatch_Animate.cs rename 1.5/Source/Patches/RJWPatches/{ => JobDrivers/JobDriver_Sex}/HarmonyPatch_PlaySexSounds.cs (100%) rename 1.5/Source/Patches/RJWPatches/{ => JobDrivers/JobDriver_Sex}/HarmonyPatch_SexTick.cs (100%) diff --git a/1.5/Assemblies/Rimworld-Animations.dll b/1.5/Assemblies/Rimworld-Animations.dll index 56a78fd4736a3adf2ab02f7fec50ec3f923473d4..9ecd0832967adcf3ee268bfdf5a63adf8d6041b8 100644 GIT binary patch literal 38400 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 Y{FwT8c+QvKpZzaU`2UUm7fay(0wxnH;Q#;t literal 35328 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 diff --git a/1.5/Source/Comps/CompExtendedAnimator.cs b/1.5/Source/Comps/CompExtendedAnimator.cs index 2c57aa8..463dd3f 100644 --- a/1.5/Source/Comps/CompExtendedAnimator.cs +++ b/1.5/Source/Comps/CompExtendedAnimator.cs @@ -51,6 +51,23 @@ namespace Rimworld_Animations { } } + public int AnimationLength + { + get + { + if (!IsAnimating) return 0; + + int groupAnimLength = 0; + foreach(AnimationDef anim in animationQueue) + { + groupAnimLength += anim.durationTicks; + } + + return groupAnimLength; + + } + } + public Vector3 getAnchor() { return anchor.getDrawPos(); diff --git a/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs b/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs index 8980cec..07f286f 100644 --- a/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs +++ b/1.5/Source/Patches/RJWPatches/JobDrivers/HarmonyPatch_JobDriver_SexBaseInitiator.cs @@ -37,7 +37,7 @@ namespace Rimworld_Animations { bool quickie = (__instance is JobDriver_SexQuick) && AnimationSettings.fastAnimForQuickie; int preAnimDuration = __instance.duration; - int AnimationTimeTicks = 0; + List participants = partnerSexBaseReceiver.parteners.Append(partner).ToList(); @@ -45,16 +45,16 @@ namespace Rimworld_Animations { if (groupAnimation != null) { AnimationUtility.StartGroupAnimation(participants, groupAnimation, reorder, partner); - } - + int animTicks = AnimationUtility.GetAnimationLength(pawn); - //Modify Orgasm ticks to only orgasm as many times as RJW stock orgasm allows - if (AnimationTimeTicks != 0) - { - __instance.orgasmstick = preAnimDuration * __instance.orgasmstick / AnimationTimeTicks; + foreach(Pawn participant in participants) + { + (participant.jobs.curDriver as JobDriver_Sex).ticks_left = animTicks; + (participant.jobs.curDriver as JobDriver_Sex).sex_ticks = animTicks; + (participant.jobs.curDriver as JobDriver_Sex).orgasmStartTick = animTicks; + (participant.jobs.curDriver as JobDriver_Sex).duration = animTicks; + } } - - } } 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 new file mode 100644 index 0000000..eaaf9b1 --- /dev/null +++ b/1.5/Source/Patches/RJWPatches/JobDrivers/JobDriver_Sex/HarmonyPatch_Animate.cs @@ -0,0 +1,39 @@ +using HarmonyLib; +using rjw; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Verse; + +namespace Rimworld_Animations +{ + [HarmonyPatch(typeof(JobDriver_Sex), "Animate")] + public class HarmonyPatch_Animate + { + public static bool Prefix(ref JobDriver_Sex __instance, ref Pawn pawn, ref Thing target) + { + //remove all bumping stuff in animations; keep draw nude code + if (target != null) + { + Pawn pawn2 = target as Pawn; + if (!__instance.isEndytophile) + { + SexUtility.DrawNude(pawn, false); + if (pawn2 != null) + { + SexUtility.DrawNude(pawn2, false); + return false; + } + } + } + else if (!__instance.isEndytophile) + { + SexUtility.DrawNude(pawn, false); + } + + return false; + } + } +} diff --git a/1.5/Source/Patches/RJWPatches/HarmonyPatch_PlaySexSounds.cs b/1.5/Source/Patches/RJWPatches/JobDrivers/JobDriver_Sex/HarmonyPatch_PlaySexSounds.cs similarity index 100% rename from 1.5/Source/Patches/RJWPatches/HarmonyPatch_PlaySexSounds.cs rename to 1.5/Source/Patches/RJWPatches/JobDrivers/JobDriver_Sex/HarmonyPatch_PlaySexSounds.cs diff --git a/1.5/Source/Patches/RJWPatches/HarmonyPatch_SexTick.cs b/1.5/Source/Patches/RJWPatches/JobDrivers/JobDriver_Sex/HarmonyPatch_SexTick.cs similarity index 100% rename from 1.5/Source/Patches/RJWPatches/HarmonyPatch_SexTick.cs rename to 1.5/Source/Patches/RJWPatches/JobDrivers/JobDriver_Sex/HarmonyPatch_SexTick.cs diff --git a/1.5/Source/Patches/RJWPatches/JobDrivers/SexBaseReceivers/HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs b/1.5/Source/Patches/RJWPatches/JobDrivers/SexBaseReceivers/HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs index 6c4faa8..ca4df23 100644 --- a/1.5/Source/Patches/RJWPatches/JobDrivers/SexBaseReceivers/HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs +++ b/1.5/Source/Patches/RJWPatches/JobDrivers/SexBaseReceivers/HarmonyPatch_JobDriver_SexBaseReceiverLoved.cs @@ -1,8 +1,10 @@ using HarmonyLib; +using RimWorld; using rjw; using System; using System.Collections.Generic; using System.Linq; +using System.Reflection.Emit; using System.Text; using System.Threading.Tasks; using Verse.AI; @@ -19,5 +21,32 @@ namespace Rimworld_Animations AnimationUtility.StopGroupAnimation(__instance.pawn); }); } + + public static IEnumerable Transpiler(IEnumerable codeInstructions) + { + + var ins = codeInstructions.ToList(); + for (int i = 0; i < ins.Count; i++) + { + if (i < ins.Count && ins[i].opcode == OpCodes.Call && ins[i].OperandIs(AccessTools.DeclaredMethod(typeof(Toils_LayDown), "LayDown"))) + { + + ins[i].operand = AccessTools.DeclaredMethod(typeof(HarmonyPatch_JobDriver_SexBaseReceiverLoved), "DoNotLayDown"); + yield return ins[i]; + + } + + else + { + yield return ins[i]; + } + } + + } + + public static Toil DoNotLayDown(TargetIndex bedOrRestSpotIndex, bool hasBed, bool lookForOtherJobs, bool canSleep = true, bool gainRestAndHealth = true, PawnPosture noBedLayingPosture = PawnPosture.LayingMask, bool deathrest = false) + { + return new Toil(); + } } } diff --git a/1.5/Source/Utilities/AnimationUtility.cs b/1.5/Source/Utilities/AnimationUtility.cs index 2431db7..e57a096 100644 --- a/1.5/Source/Utilities/AnimationUtility.cs +++ b/1.5/Source/Utilities/AnimationUtility.cs @@ -95,5 +95,11 @@ namespace Rimworld_Animations { } + + public static int GetAnimationLength(Pawn pawn) + { + return pawn.TryGetComp().AnimationLength; + } + } } diff --git a/Rimworld-Animations.csproj b/Rimworld-Animations.csproj index 2ab9ff6..bdf8615 100644 --- a/Rimworld-Animations.csproj +++ b/Rimworld-Animations.csproj @@ -46,6 +46,7 @@ ..\rjw\1.5\Assemblies\RJW.dll + False ..\rjw-toys-and-masturbation\Assemblies\RJW-ToysAndMasturbation.dll @@ -104,8 +105,9 @@ - - + + +