public void TakeDamage(int damage)
        {
            _nextState = SnowMonsterState.TakingDamage;
            InterruptActiveState();

            health -= damage;
        }
 private void StartAttacking()
 {
     Debug.Log("Start Attacking");
     _state = SnowMonsterState.Attacking;
     _monsterNavMesh.transform.LookAt(GetPlayerDestinationBendSafe());
     _animator.ResetTrigger(_runForwardInPlaceHash);
     _nextAttack = Time.time;
 }
        private void ExecuteTakingDamageState()
        {
            _monsterNavMesh.SetDestination(gameObject.transform.position); //Stop moving
            _animator.SetTrigger(_takeDamageHash);
            _audioSource.PlayOneShot(painSound);
            _nextState = SnowMonsterState.Idle;

            NextCheckInSeconds(1f);
        }
        private void ExecuteIdleState()
        {
            if (PlayerIsInRange())
            {
                _nextState = SnowMonsterState.MovingToPlayer;
            }

            NextCheckInSeconds(0.1f);
        }
 public void TakeDamage(int damage)
 {
     _state = SnowMonsterState.TakingDamage;
     _monsterNavMesh.SetDestination(gameObject.transform
                                    .position); //Set current position as destination to stop moving
     _animator.ResetTrigger(_runForwardInPlaceHash);
     _animator.SetTrigger(_takeDamageHash);
     _stopTakingDamage = Time.time + 1f; //Expires after 2seconds if no further damage is taken
     health           -= damage;
     if (health <= 0 && MonsterIsAlive())
     {
         Die();
     }
 }
        private void ExecuteAttackingState()
        {
            _monsterNavMesh.transform.LookAt(_currentTarget.transform);
            _animator.SetTrigger(_slapAttackRight);
            _currentTarget.TakeDamage(10);
            _audioSource.PlayOneShot(meleeAttackSound);

            if (!PlayerIsCloseEnoughToAttack())
            {
                _nextState = SnowMonsterState.Idle;
            }

            NextCheckInSeconds(1f);
        }
        private void Attack()
        {
            float distanceToPlayer = Vector3.Distance(_playerTransform.position, transform.position);

            if (distanceToPlayer < _monsterNavMesh.stoppingDistance)
            {
                Debug.Log("Attack");
                _monsterNavMesh.transform.LookAt(GetPlayerDestinationBendSafe());
                _animator.ResetTrigger(_runForwardInPlaceHash);
                _animator.SetTrigger(_slapAttackRight);
                _player.TakeDamage(10);
                _nextAttack = Time.time + 1f;
            }
            else
            {
                _animator.ResetTrigger(_slapAttackRight);
                _state = SnowMonsterState.Idle;
            }
        }
        private void ExecuteMovingToPlayerState()
        {
            _animator.SetTrigger(_runForwardInPlaceHash);

            _monsterNavMesh.transform.LookAt(_currentTarget.transform);
            _monsterNavMesh.SetDestination(_currentTarget.transform.position);

            //Detect state transitions
            if (!PlayerIsInRange())
            {
                _nextState = SnowMonsterState.Idle;
            }

            if (PlayerIsCloseEnoughToAttack())
            {
                _nextState = SnowMonsterState.Attacking;
            }

            //Next check should be asap
        }
 private void Die()
 {
     _state = SnowMonsterState.Dead;
     _animator.SetTrigger(_dieHash);
     Destroy(gameObject, 5);
 }
        // Update is called once per frame
        void Update()
        {
            //TODO: maybe reduce checks if this is bad for performance
            _currentTarget = _playerManager.GetClosestPlayer(transform);

            if (Time.time > _nextCheck)
            {
                if (_currentState != _nextState)
                {
                    if (_currentState == SnowMonsterState.Dead)
                    {
                        // Prevents reviving after interrupts from outside sources
                        _nextState = SnowMonsterState.Dead;
                    }

                    if (_currentState == SnowMonsterState.MovingToPlayer)
                    {
                        //Stop moving
                        _monsterNavMesh.SetDestination(gameObject.transform.position);
                    }

                    ResetAllAnimations();

                    if (_currentState != SnowMonsterState.Dead && _nextState == SnowMonsterState.Dead)
                    {
                        Die();
                    }

                    //Finally set states equal
                    Debug.Log("State transition from " + _currentState + " to " + _nextState);
                    _currentState = _nextState;
                }
                else
                {
                    switch (_currentState)
                    {
                    case SnowMonsterState.Idle:
                        ExecuteIdleState();
                        return;

                    case SnowMonsterState.MovingToPlayer:
                        ExecuteMovingToPlayerState();
                        return;

                    case SnowMonsterState.Attacking:
                        ExecuteAttackingState();
                        return;

                    case SnowMonsterState.TakingDamage:
                        ExecuteTakingDamageState();
                        return;

                    case SnowMonsterState.Dead:
                        return;     // A dead monster is dead
                    }
                }
            }

            if (health <= 0)
            {
                _nextState = SnowMonsterState.Dead;
                InterruptActiveState();
            }
        }