mirror of
https://gitgud.io/c0ffeeeeeeee/rimworld-animations.git
synced 2026-06-18 19:35:58 +00:00
229 lines
7.5 KiB
C#
229 lines
7.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using UnityEngine;
|
|
using Verse;
|
|
|
|
namespace Rimworld_Animations
|
|
{
|
|
public class AnimationWorker_KeyframesExtended : AnimationWorker_Keyframes
|
|
{
|
|
|
|
public override bool Enabled(AnimationDef def, PawnRenderNode node, AnimationPart part, PawnDrawParms parms)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
/*
|
|
public override Vector3 OffsetAtTick(int tick, PawnDrawParms parms)
|
|
{
|
|
//Todo: Use this for bodyoffsets
|
|
//or maybe make a rendersubworker for it instead
|
|
return base.OffsetAtTick(tick, parms);
|
|
}
|
|
|
|
//don't need for anims
|
|
|
|
*/
|
|
|
|
public VoiceTagDef voiceAtTick(int tick, AnimationDef def, PawnRenderNode node)
|
|
{
|
|
|
|
KeyframeAnimationPart keyframeAnimationPart = def.keyframeParts[node.Props.tagDef];
|
|
|
|
foreach (Verse.Keyframe keyframe in keyframeAnimationPart.keyframes)
|
|
{
|
|
if (tick == keyframe.tick)
|
|
{
|
|
VoiceTagDef voiceTag = (keyframe as ExtendedKeyframe).voice;
|
|
|
|
//probability checking null fix
|
|
if (voiceTag != null && Rand.Chance(voiceTag.probability))
|
|
{
|
|
|
|
return voiceTag;
|
|
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
public SoundDef soundAtTick(int tick, AnimationDef def, PawnRenderNode node)
|
|
{
|
|
KeyframeAnimationPart keyframeAnimationPart = def.keyframeParts[node.Props.tagDef];
|
|
|
|
|
|
//Verse.Keyframe keyframe = this.part.keyframes[0];
|
|
Verse.Keyframe keyframe2 = keyframeAnimationPart.keyframes[keyframeAnimationPart.keyframes.Count - 1];
|
|
foreach (Verse.Keyframe keyframe in keyframeAnimationPart.keyframes)
|
|
{
|
|
if (tick == keyframe.tick)
|
|
{
|
|
return (keyframe as ExtendedKeyframe).sound;
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
|
|
|
|
//use extendedkeyframes to determine addon facing
|
|
public Rot4 facingAtTick(int tick, AnimationDef def, PawnRenderNode node)
|
|
{
|
|
|
|
KeyframeAnimationPart keyframeAnimationPart = def.keyframeParts[node.Props.tagDef];
|
|
|
|
//if ticks are < first keyframe tick, just be stuck to first keyframe rot
|
|
if (tick <= keyframeAnimationPart.keyframes[0].tick)
|
|
{
|
|
|
|
return (keyframeAnimationPart.keyframes[0] as ExtendedKeyframe).rotation;
|
|
|
|
}
|
|
|
|
//if ticks are > last keyframe tick, just be stuck to last keyframe rot
|
|
if (tick >= keyframeAnimationPart.keyframes[keyframeAnimationPart.keyframes.Count - 1].tick)
|
|
{
|
|
|
|
return (keyframeAnimationPart.keyframes[keyframeAnimationPart.keyframes.Count - 1] as ExtendedKeyframe).rotation;
|
|
|
|
}
|
|
Verse.Keyframe keyframe = keyframeAnimationPart.keyframes[0];
|
|
Verse.Keyframe keyframe2 = keyframeAnimationPart.keyframes[keyframeAnimationPart.keyframes.Count - 1];
|
|
int i = 0;
|
|
while (i < keyframeAnimationPart.keyframes.Count)
|
|
{
|
|
if (tick <= keyframeAnimationPart.keyframes[i].tick)
|
|
{
|
|
keyframe2 = keyframeAnimationPart.keyframes[i];
|
|
if (i > 0)
|
|
{
|
|
keyframe = keyframeAnimationPart.keyframes[i - 1];
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
i++;
|
|
}
|
|
}
|
|
|
|
return (keyframe as ExtendedKeyframe).rotation;
|
|
|
|
}
|
|
public bool visibleAtTick(int tick, AnimationDef def, PawnRenderNode node)
|
|
{
|
|
KeyframeAnimationPart keyframeAnimationPart = def.keyframeParts[node.Props.tagDef];
|
|
|
|
//if ticks are < first keyframe tick, just be stuck to first keyframe rot
|
|
if (tick <= keyframeAnimationPart.keyframes[0].tick)
|
|
{
|
|
|
|
return (keyframeAnimationPart.keyframes[0] as ExtendedKeyframe).visible;
|
|
|
|
}
|
|
|
|
//if ticks are > last keyframe tick, just be stuck to last keyframe rot
|
|
if (tick >= keyframeAnimationPart.keyframes[keyframeAnimationPart.keyframes.Count - 1].tick)
|
|
{
|
|
|
|
return (keyframeAnimationPart.keyframes[keyframeAnimationPart.keyframes.Count - 1] as ExtendedKeyframe).visible;
|
|
|
|
}
|
|
|
|
Verse.Keyframe keyframe = keyframeAnimationPart.keyframes[0];
|
|
Verse.Keyframe keyframe2 = keyframeAnimationPart.keyframes[keyframeAnimationPart.keyframes.Count - 1];
|
|
|
|
int i = 0;
|
|
while (i < keyframeAnimationPart.keyframes.Count)
|
|
{
|
|
if (tick <= keyframeAnimationPart.keyframes[i].tick)
|
|
{
|
|
keyframe2 = keyframeAnimationPart.keyframes[i];
|
|
if (i > 0)
|
|
{
|
|
keyframe = keyframeAnimationPart.keyframes[i - 1];
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
i++;
|
|
}
|
|
}
|
|
|
|
return (keyframe as ExtendedKeyframe).visible;
|
|
|
|
|
|
}
|
|
|
|
public virtual bool shouldRecache(int tick, AnimationDef def, PawnRenderNode node)
|
|
{
|
|
if (facingAtTick(tick, def, node) != facingAtTick(tick - 1, def, node)
|
|
|| visibleAtTick(tick, def, node) != visibleAtTick(tick - 1, def, node)
|
|
|| TexPathVariantAtTick(tick, def, node) != TexPathVariantAtTick(tick - 1, def, node))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public int? TexPathVariantAtTick(int tick, AnimationDef def, PawnRenderNode node)
|
|
{
|
|
|
|
KeyframeAnimationPart keyframeAnimationPart = def.keyframeParts[node.Props.tagDef];
|
|
|
|
//if ticks are < first keyframe tick, just be stuck to first keyframe rot
|
|
if (tick <= keyframeAnimationPart.keyframes[0].tick)
|
|
{
|
|
|
|
return (keyframeAnimationPart.keyframes[0] as ExtendedKeyframe).variant;
|
|
|
|
}
|
|
|
|
//if ticks are > last keyframe tick, just be stuck to last keyframe rot
|
|
if (tick >= keyframeAnimationPart.keyframes[keyframeAnimationPart.keyframes.Count - 1].tick)
|
|
{
|
|
|
|
return (keyframeAnimationPart.keyframes[keyframeAnimationPart.keyframes.Count - 1] as ExtendedKeyframe).variant;
|
|
|
|
}
|
|
Verse.Keyframe keyframe = keyframeAnimationPart.keyframes[0];
|
|
Verse.Keyframe keyframe2 = keyframeAnimationPart.keyframes[keyframeAnimationPart.keyframes.Count - 1];
|
|
int i = 0;
|
|
while (i < keyframeAnimationPart.keyframes.Count)
|
|
{
|
|
if (tick <= keyframeAnimationPart.keyframes[i].tick)
|
|
{
|
|
keyframe2 = keyframeAnimationPart.keyframes[i];
|
|
if (i > 0)
|
|
{
|
|
keyframe = keyframeAnimationPart.keyframes[i - 1];
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
i++;
|
|
}
|
|
}
|
|
|
|
return (keyframe as ExtendedKeyframe).variant;
|
|
|
|
}
|
|
}
|
|
}
|