public void OnReceiveAttack(vDamage damage, vIMeleeFighter attacker)
 {
     // character is blocking
     if (!damage.ignoreDefense && isBlocking && meleeManager != null && meleeManager.CanBlockAttack(attacker.character.transform.position))
     {
         var damageReduction = meleeManager.GetDefenseRate();
         if (damageReduction > 0)
         {
             damage.ReduceDamage(damageReduction);
         }
         if (attacker != null && meleeManager != null && meleeManager.CanBreakAttack())
         {
             attacker.OnRecoil(meleeManager.GetDefenseRecoilID());
         }
         meleeManager.OnDefense();
         cc.currentStaminaRecoveryDelay = damage.staminaRecoveryDelay;
         cc.currentStamina -= damage.staminaBlockCost;
     }
     // apply damage
     damage.hitReaction = !isBlocking;
     cc.TakeDamage(damage);
 }