2024-04-17 23:57:18 +00:00
|
|
|
|
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
|
|
|
|
|
{
|
2024-04-18 22:32:31 +00:00
|
|
|
|
|
|
|
|
|
// CompExtendedAnimator
|
|
|
|
|
// Helps manage AnimationQueue, AbsolutePosition
|
|
|
|
|
|
|
|
|
|
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();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//ticks of current animation
|
|
|
|
|
private int animationTicks;
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
animationQueue = groupAnimation;
|
|
|
|
|
PlayNextAnimation();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void PostExposeData()
|
|
|
|
|
{
|
|
|
|
|
base.PostExposeData();
|
|
|
|
|
Scribe_Values.Look<bool>(ref this.isAnimating, "animations_isAnimating", false);
|
|
|
|
|
|
|
|
|
|
Scribe_Collections.Look<AnimationDef>(ref animationQueue, "animations_queue");
|
|
|
|
|
Scribe_Deep.Look<BaseExtendedAnimatorAnchor>(ref this.anchor, "animations_anchor");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Pawn pawn => base.parent as Pawn;
|
2024-04-17 23:57:18 +00:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|