Пример #1
0
        public virtual void ApplyDamage(DamageMessage data)
        {
            //  if (currentHitPoints <= 0) {//ignore damage if already dead. TODO : may have to change that if we want to detect hit on death...

            if (m_Pawn.GetHealth() <= 0f)
            {
                return;
            }

            if (isInvulnerable)
            {
                OnHitWhileInvulnerable.Invoke();
                return;
            }

            Vector3 forward = transform.forward;

            forward = Quaternion.AngleAxis(hitForwardRotation, transform.up) * forward;

            //we project the direction to damager to the plane formed by the direction of damage
            Vector3 positionToDamager = data.damageSource - transform.position;

            positionToDamager -= transform.up * Vector3.Dot(transform.up, positionToDamager);

            if (Vector3.Angle(forward, positionToDamager) > hitAngle * 0.5f)
            {
                return;
            }

            isInvulnerable = true;
            // currentHitPoints -= data.amount;
            // if (currentHitPoints <= 0)
            //     schedule += OnDeath.Invoke; //This avoid race condition when objects kill each other.
            //else
            OnReceiveDamage.Invoke();

            //var messageType = currentHitPoints <= 0 ? MessageType.DEAD : MessageType.DAMAGED;

            for (var i = 0; i < onDamageMessageReceivers.Count; ++i)
            {
                var receiver = onDamageMessageReceivers[i] as IMessageReceiver;
                receiver.OnReceiveMessage(MessageType.DAMAGED, this, data);
            }
        }