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