rimworld-animations/1.5/Source/Comps/CompExtendedAnimator.cs

137 lines
3.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using RimWorld;
using rjw;
using UnityEngine;
using Verse;
using Verse.AI;
using Verse.Sound;
namespace Rimworld_Animations {
public class CompExtendedAnimator : ThingComp
{
// CompExtendedAnimator
// Helps manage AnimationQueue, AbsolutePosition
//ticks of current animation
private int animationTicks;
private List<AnimationDef> animationQueue;
private BaseExtendedAnimatorAnchor anchor;
private bool isAnimating = false;
public bool IsAnimating
{
get
{
return isAnimating;
}
}
public bool IsAnchored
{
get
{
return anchor != null;
}
}
public Vector3 getAnchor()
{
return anchor.getDrawPos();
}
public override void CompTick()
{
if (isAnimating)
{
animationTicks++;
//if animationticks is equal to cur. anim duration,
if (animationTicks >= animationQueue[0].durationTicks)
{
//dequeue; returns false if more animations
if (!PopAnimationQueue())
{
//play next if more anims still
PlayNextAnimation();
}
else
{
StopAnimating();
}
}
}
base.CompTick();
}
//returns false if still more animations
public bool PopAnimationQueue()
{
if (!animationQueue.Empty())
{
//pop queue
animationQueue.RemoveAt(0);
}
return animationQueue.Empty();
}
public void PlayNextAnimation()
{
if (!animationQueue.Empty())
{
isAnimating = true;
animationTicks = 0;
pawn.Drawer.renderer.SetAnimation(animationQueue[0]);
}
}
public void StopAnimating()
{
isAnimating = false;
animationQueue = null;
anchor = null;
pawn.Drawer.renderer.SetAnimation(null);
}
public void PlayGroupAnimation(List<AnimationDef> groupAnimation)
{
animationQueue = groupAnimation;
PlayNextAnimation();
}
public void PlayGroupAnimation(List<AnimationDef> groupAnimation, BaseExtendedAnimatorAnchor anchor)
{
this.anchor = anchor;
PlayGroupAnimation(groupAnimation);
}
public override void PostExposeData()
{
base.PostExposeData();
Scribe_Values.Look<bool>(ref this.isAnimating, "animations_isAnimating", false);
Scribe_Values.Look<int>(ref this.animationTicks, "animations_ticks", 0);
Scribe_Collections.Look<AnimationDef>(ref animationQueue, "animations_queue");
Scribe_Deep.Look<BaseExtendedAnimatorAnchor>(ref this.anchor, "animations_anchor");
}
public static void CheckRecacheNecessary(int anim)
{
}
private Pawn pawn => base.parent as Pawn;
}
}