fixes to bodyangle throwing null ref errors, and prop animation offsets

This commit is contained in:
c0ffee 2024-05-03 20:34:58 -07:00
parent d36c2b8314
commit a491c1dade
7 changed files with 51 additions and 18 deletions

View file

@ -19,6 +19,10 @@
<overlayLayer>Head</overlayLayer>
<baseLayer>95</baseLayer>
<texPathVariantsDef>TexPathVariants_Cowgirl_Xray</texPathVariantsDef>
<propOffsetDef>PropOffsetDef_Cowgirl_Xray</propOffsetDef>
</animPropProperties>
</Rimworld_Animations.AnimationPropDef>

View file

@ -11,12 +11,12 @@ namespace Rimworld_Animations
[HarmonyPatch(typeof(PawnRenderer), "BodyAngle")]
public class HarmonyPatch_PawnRenderer2
public class HarmonyPatch_PawnRenderer
{
public static bool Prefix(ref Pawn ___pawn, ref float __result)
{
//stop using cache when animating, for when downed (downed disables cache)
if (___pawn.Drawer.renderer.renderTree.rootNode.AnimationWorker is AnimationWorker_KeyframesExtended)
if (___pawn?.Drawer?.renderer?.renderTree?.rootNode?.AnimationWorker is AnimationWorker_KeyframesExtended)
{
__result = 0;
return false;

View file

@ -10,6 +10,7 @@ namespace Rimworld_Animations
public class PawnRenderNodeProperties_GraphicVariants : PawnRenderNodeProperties
{
public AnimationOffsetDef propOffsetDef = null;
public TexPathVariantsDef texPathVariantsDef = null;
public bool absoluteTransform = false;

View file

@ -61,9 +61,51 @@ namespace Rimworld_Animations
return material;
}
public override Vector3 OffsetFor(PawnRenderNode node, PawnDrawParms parms, out Vector3 pivot)
{
Vector3 regularOffsets = base.OffsetFor(node, parms, out pivot);
if ((node.Props as PawnRenderNodeProperties_GraphicVariants)?.propOffsetDef?.offsets is List<BaseAnimationOffset> offsets)
{
foreach (BaseAnimationOffset offset in offsets)
{
if (offset.appliesToPawn(node.tree.pawn))
{
//modify offset of prop for animationOffset position
regularOffsets += offset.getOffset(node.tree.pawn) ?? Vector3.zero;
return regularOffsets;
}
}
}
//unmodified; no offsets found
return regularOffsets;
}
public override Quaternion RotationFor(PawnRenderNode node, PawnDrawParms parms)
{
Quaternion rotation = base.RotationFor(node, parms);
if ((node.Props as PawnRenderNodeProperties_GraphicVariants)?.propOffsetDef?.offsets is List<BaseAnimationOffset> offsets)
{
foreach (BaseAnimationOffset offset in offsets)
{
if (offset.appliesToPawn(node.tree.pawn))
{
//modify offset of prop for animationOffset rotation
rotation *= Quaternion.AngleAxis(offset.getRotation(node.tree.pawn) ?? 0, Vector3.up);
return rotation;
}
}
}
//unmodified; no rotation offsets found
return rotation;
}
}
}

View file

@ -10,20 +10,6 @@ namespace Rimworld_Animations
{
public class PawnRenderSubWorker_HideWhenAnimating : PawnRenderSubWorker
{
/* hides the entire head node don't use unless you want to do that
public override bool CanDrawNowSub(PawnRenderNode node, PawnDrawParms parms)
{
if (node.tree.rootNode.AnimationWorker is AnimationWorker_KeyframesExtended
|| node.tree.rootNode.children.Any(x => x.AnimationWorker is AnimationWorker_KeyframesExtended))
{
return false;
}
return base.CanDrawNowSub(node, parms);
}
*/
public override void EditMaterial(PawnRenderNode node, PawnDrawParms parms, ref Material material)
{