using Animancer; using BrewMonster; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using static CECPlayer; public class PlayerVisual : MonoBehaviour { [SerializeField] NamedAnimancerComponent namedAnimancer; [SerializeField] private INFO _playerInfo; private Dictionary _activeStates = new(); [SerializeField] private AnimancerState _currentState; [SerializeField] private Queue _animationQueue = new Queue(); [SerializeField] private bool isHit; QueueActionEvent queueActionEvent; private void PlayActionEventHandler(PlayActionEvent @event) { _currentState = namedAnimancer.TryPlay(@event.AnimationName); if (_currentState == null) { BMLogger.LogError("HoangDev: PlayActionEventHandler Failed " + @event.AnimationName); } } public void InitHostPlayerEventDoneHandler() { namedAnimancer = GetComponentInChildren(); if (namedAnimancer == null) { BrewMonster.BMLogger.LogError("animancer == null"); return; } var player = GetComponentInParent(); if (player == null) { BrewMonster.BMLogger.LogError("player == null"); return; } _playerInfo = player.GetPlayInfo(); EventBus.SubscribeChannel(_playerInfo.cid, PlayActionEventHandler); EventBus.SubscribeChannelClass(_playerInfo.cid, QueueActionEventHandler); EventBus.SubscribeChannel(_playerInfo.cid, CleearComActFlagAllRankNodesEventHandler); } private void CleearComActFlagAllRankNodesEventHandler(CleearComActFlagAllRankNodesEvent @event) { _animationQueue.Clear(); if (isHit) { ApplyDamage(); } } private void QueueActionEventHandler(QueueActionEvent @event) { if (!EnqueueAnimation(@event)) { BMLogger.LogError("HoangDev : EnqueueAnimation Failed"); } } private void Update() { PlayNext(); } public bool EnqueueAnimation(QueueActionEvent @event) { if (namedAnimancer == null) return false; _animationQueue.Enqueue(@event.AnimationName); if (!isHit) { queueActionEvent = @event; isHit = @event.IsHitAnim; } return true; } private void PlayNext() { if (_animationQueue.Count == 0) { return; } if (_currentState == null) return; if (_currentState.NormalizedTime < 1f) return; if (isHit) { ApplyDamage(); } string animName = _animationQueue.Dequeue(); _currentState = namedAnimancer.TryPlay(animName); } void ApplyDamage() { if(queueActionEvent == null) return; isHit = false; queueActionEvent.SetFlag(true, queueActionEvent.AttackEvent); queueActionEvent = null; } private void OnDestroy() { EventBus.UnsubscribeAllInChannel(_playerInfo.cid); } public bool IsAnimationExist(string animationName) { return namedAnimancer.States.TryGet("ActionName", out var existingState) ? true : false; } }