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;
}
}
}