using UnityEngine; using UnityEngine.Events; using System; namespace HQFPSWeapons { /// /// Will register damage events from outside and pass them to the parent entity. /// [RequireComponent(typeof(Collider))] [RequireComponent(typeof(Rigidbody))] public class Hitbox : MonoBehaviour, IDamageable { #region Internal [Serializable] public class DamageEvent : UnityEvent { } [Serializable] public class DamageEventSimple : UnityEvent { } #endregion public Collider Collider { get { return m_Collider; } } [SerializeField] [Clamp(0f, Mathf.Infinity)] private float m_DamageMultiplier = 1f; [SerializeField] private SoundPlayer m_GroundImpactSound = null; [SerializeField] private DamageEvent m_OnDamageEvent = null; [SerializeField] private DamageEventSimple m_OnDamageEventSimple = null; private Collider m_Collider; private Rigidbody m_Rigidbody; private LivingEntity m_ParentEntity; private bool m_HitboxImpact; public void TakeDamage(HealthEventData damageData) { if(enabled) { m_OnDamageEvent.Invoke(damageData); m_OnDamageEventSimple.Invoke(damageData.Delta); if (m_ParentEntity != null) { if (m_ParentEntity.Health.Get() > 0f) { damageData.Delta *= m_DamageMultiplier; m_ParentEntity.ChangeHealth.Try(damageData); } if (m_ParentEntity.Health.Get() == 0f) m_Rigidbody.AddForceAtPosition(damageData.HitDirection * damageData.HitImpulse, damageData.HitPoint, ForceMode.Impulse); } } } public LivingEntity GetEntity() { return m_ParentEntity; } private void OnCollisionEnter(Collision collision) { if (collision.relativeVelocity.sqrMagnitude > 5f && !m_Rigidbody.isKinematic && !m_HitboxImpact) { m_GroundImpactSound.PlayAtPosition(ItemSelection.Method.RandomExcludeLast, transform.position, 1f); m_HitboxImpact = true; } } private void Awake() { m_ParentEntity = GetComponentInParent(); m_Collider = GetComponent(); m_Rigidbody = GetComponent(); m_ParentEntity.Respawn.AddListener(Respawn); } private void Respawn() { m_HitboxImpact = false; } } }