using Koptilnya.StateMachine; using Mirror; using UnityEngine; namespace Characters.Enemy.States { public class StunnedState : State { private readonly Enemy _enemy; private static readonly int StunnedAnimHash = Animator.StringToHash("stunned"); private readonly AudioClip _stunnedClip; private bool _entered; public StunnedState(Enemy enemy) : base(EnemyState.Stunned) { _enemy = enemy; _stunnedClip = Resources.Load("Audio/EnemySounds/FX/stunned"); } public override void Enter() { if (_enemy.isServer) { _enemy.targetTransform = null; _enemy.SetSpeedMul(0f); _enemy.networkAnimator.SetTrigger(StunnedAnimHash); } if(_enemy.isClient) { _enemy.audioSource.clip = _stunnedClip; _enemy.audioSource.Play(); _enemy.hitVFX.Stop(); _enemy.hitVFX.Play(); } } public override void ReEnter() { if (_enemy.isServer) { _enemy.networkAnimator.SetTrigger(StunnedAnimHash); } if (_enemy.isClient) { _enemy.audioSource.Stop(); _enemy.audioSource.Play(); } } [ServerCallback] public override void Update() { var stateInfo = _enemy.animator.GetCurrentAnimatorStateInfo(0); bool inAnim = stateInfo.shortNameHash == StunnedAnimHash; if (!_entered && inAnim) _entered = true; if (_entered && !inAnim) _enemy.ChangeState(EnemyState.Patrol); } public override void Exit() { if (_enemy.isServer) { _entered = false; _enemy.networkAnimator.ResetTrigger(StunnedAnimHash); _enemy.SetSpeedMul(1f); } if (_enemy.isClient) { _enemy.audioSource.Stop(); } } } }