using UnityEngine; namespace Invector.vCharacterController { [vClassHeader("DAMAGE RECEIVER", "You can add damage multiplier for example causing twice damage on Headshots", openClose = false)] public partial class vDamageReceiver : vMonoBehaviour, vIDamageReceiver { [vEditorToolbar("Default")] public float damageMultiplier = 1f; [HideInInspector] public vRagdoll ragdoll; public bool overrideReactionID; [vHideInInspector("overrideReactionID")] public int reactionID; [vEditorToolbar("Random")] public bool useRandomValues; [vHideInInspector("useRandomValues")] public bool fixedValues; [vHideInInspector("useRandomValues")] public float minDamageMultiplier, maxDamageMultiplier; [vHideInInspector("useRandomValues")] public int minReactionID, maxReactionID; [vHideInInspector("useRandomValues;fixedValues"), Tooltip("Change Between 0 and 100")] public float changeToMaxValue; public GameObject targetReceiver; public vIHealthController healthController; [SerializeField] protected OnReceiveDamage _onStartReceiveDamage = new OnReceiveDamage(); [SerializeField] protected OnReceiveDamage _onReceiveDamage = new OnReceiveDamage(); public UnityEngine.Events.UnityEvent OnGetMaxValue; public OnReceiveDamage onStartReceiveDamage { get { return _onStartReceiveDamage; } protected set { _onStartReceiveDamage = value; } } public OnReceiveDamage onReceiveDamage { get { return _onReceiveDamage; } protected set { _onReceiveDamage = value; } } protected virtual void Start() { ragdoll = GetComponentInParent(); } protected virtual void OnCollisionEnter(Collision collision) { if (collision != null) { if (ragdoll && ragdoll.isActive) { ragdoll.OnRagdollCollisionEnter(new vRagdollCollision(this.gameObject, collision)); } } } public virtual void TakeDamage(vDamage damage) { if (healthController == null && targetReceiver) healthController = targetReceiver.GetComponent(); else if (healthController == null) healthController = GetComponentInParent(); if (healthController != null) { onStartReceiveDamage.Invoke(damage); var _damage = ApplyDamageModifiers(damage); healthController.TakeDamage(_damage); onReceiveDamage.Invoke(_damage); } } public virtual vDamage ApplyDamageModifiers(vDamage damage) { float multiplier = (useRandomValues && !fixedValues) ? Random.Range(minDamageMultiplier, maxDamageMultiplier) : (useRandomValues && fixedValues) ? randomChange ? maxDamageMultiplier : minDamageMultiplier : damageMultiplier; var _damage = new vDamage(damage); _damage.damageValue *= (int)multiplier; if (multiplier == maxDamageMultiplier) OnGetMaxValue.Invoke(); OverrideReaction(ref _damage); return _damage; } protected virtual void OverrideReaction(ref vDamage damage) { if (overrideReactionID) { if (useRandomValues && !fixedValues) damage.reaction_id = Random.Range(minReactionID, maxReactionID); else if (useRandomValues && fixedValues) damage.reaction_id = randomChange ? maxReactionID : minReactionID; else damage.reaction_id = reactionID; } } protected virtual bool randomChange { get { return Random.Range(0f, 100f) < changeToMaxValue; } } } }