using System; using System.Collections.Generic; using System.Linq; using System.Xml; using System.Xml.Serialization; using UnityEngine; using UnityEngine.UI; namespace RimWorldAnimationStudio { public class PawnKeyframe : Keyframe { public float bodyAngle; public float headAngle; public float headBob; public float bodyOffsetX; public float bodyOffsetZ; public float headFacing = 2; public float bodyFacing = 2; public float genitalAngle; public bool? quiver; [XmlArray("addonKeyframes"), XmlArrayItem("li")] public List _addonKeyframes = new List(); [XmlIgnore] public List addonKeyframes = new List(); [XmlIgnore] public int keyframeID; [XmlIgnore] public int actorID = -1; public bool ShouldSerializegenitalAngle() { return genitalAngle != 0; } public bool ShouldSerializequiver() { return quiver != null; } public override void ValidateData() { soundEffect = Tags.soundDefs.Concat(CustomTags.soundDefs).Contains(soundEffect) ? soundEffect : null; _addonKeyframes.Clear(); foreach (AddonKeyframe addonKeyframe in addonKeyframes) { ActorAddon addon = Workspace.Instance.GetAnimationClipThatOwnsKeyframe(keyframeID, out int clipID).GetActorAddon(addonKeyframe.addonName); if (addon.render) { _addonKeyframes.Add(addonKeyframe.Copy()); } } } public void OnPostLoad() { addonKeyframes.Clear(); foreach (AddonKeyframe addonKeyframe in _addonKeyframes) { addonKeyframes.Add(addonKeyframe.Copy()); } } public void GenerateKeyframeID(int actorID) { this.actorID = actorID; int _keyframeID = UnityEngine.Random.Range(100000, 1000000); if (Workspace.animationDef.animationStages.Any(x => x.animationClips.Any(y => y.keyframes.Any(z => z.keyframeID == _keyframeID)))) { GenerateKeyframeID(actorID); return; } keyframeID = _keyframeID; } public bool HasValidKeyframeID() { return keyframeID >= 100000 && keyframeID < 1000000; } public KeyframeSlider GetKeyframeSlider() { return Selectable.allSelectablesArray.FirstOrDefault(x => x.GetComponent()?.keyframeID == keyframeID)?.GetComponent< KeyframeSlider>(); } public AddonKeyframe GetAddonKeyframe(string addonName) { return addonKeyframes.FirstOrDefault(x => x.addonName == addonName); } } }