From 2a26ae84753c15b6c230206cdbbc9a948417b614 Mon Sep 17 00:00:00 2001 From: Eddio0141 Date: Wed, 4 Sep 2024 15:45:03 +0100 Subject: [PATCH] handle legacy animations --- .../FrameAdvancing.AnimatorHandler.cs | 52 ++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/UniTAS/Patcher/Implementations/FrameAdvancing/FrameAdvancing.AnimatorHandler.cs b/UniTAS/Patcher/Implementations/FrameAdvancing/FrameAdvancing.AnimatorHandler.cs index 74eef35f..40fab1a5 100644 --- a/UniTAS/Patcher/Implementations/FrameAdvancing/FrameAdvancing.AnimatorHandler.cs +++ b/UniTAS/Patcher/Implementations/FrameAdvancing/FrameAdvancing.AnimatorHandler.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.Reflection; using HarmonyLib; +using UniTAS.Patcher.Utils; +using UnityEngine; using Object = UnityEngine.Object; namespace UniTAS.Patcher.Implementations.FrameAdvancing; @@ -10,15 +12,21 @@ namespace UniTAS.Patcher.Implementations.FrameAdvancing; public partial class FrameAdvancing { private readonly List _trackedAnimators = new(); - // private readonly List _trackedAnimations = new(); + private readonly List _trackedAnimations = new(); private void PauseAnimation() { RefreshTrackedAnimators(); + RefreshTrackedAnimations(); foreach (var animator in _trackedAnimators) { animator.Pause(); } + + foreach (var animation in _trackedAnimations) + { + animation.Pause(); + } } private void ResumeAnimation() @@ -28,7 +36,13 @@ private void ResumeAnimation() animator.Resume(); } + foreach (var animation in _trackedAnimations) + { + animation.Resume(); + } + _trackedAnimators.Clear(); + _trackedAnimations.Clear(); } private void RefreshTrackedAnimators() @@ -43,6 +57,18 @@ private void RefreshTrackedAnimators() } } + private void RefreshTrackedAnimations() + { + var animations = ObjectUtils.FindObjectsOfType(); + _trackedAnimations.Clear(); + _logger.LogDebug( + $"refreshing tracked animations for frame advancing, found {animations.Length} animations in scene"); + foreach (var animation in animations) + { + _trackedAnimations.Add(new(animation)); + } + } + private class AnimatorTracker(Object animator) { private float _speedBeforePause; @@ -70,4 +96,28 @@ public void Resume() SetSpeed.Invoke(animator, [_speedBeforePause]); } } + + private class AnimationTracker(Animation animation) + { + private readonly Dictionary _speeds = new(); + + public void Pause() + { + foreach (AnimationState state in animation) + { + _speeds.Add(state, state.speed); + state.speed = 0f; + } + } + + public void Resume() + { + foreach (var keyValue in _speeds) + { + keyValue.Key.speed = keyValue.Value; + } + + _speeds.Clear(); + } + } } \ No newline at end of file