RiftMayhem/Assets/Scripts/NPC/BossAbilityBinder.cs
2025-02-21 18:35:51 +00:00

97 lines
2.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BossAbilityBinder : MonoBehaviour
{
[SerializeField] protected BaseAbility meleeAbility;
[SerializeField] protected BaseAbility coreAbility;
[SerializeField] protected BaseAbility ultimateAbility;
[SerializeField] protected float ultimateCooldown;
protected Taggable userTag;
protected Mana mana;
protected Coroutine ultimateCooldownCoroutine;
protected bool ultimateOnCooldown = true;
protected virtual void Awake()
{
userTag = GetComponentInParent<Taggable>();
mana = GetComponentInParent<Mana>();
}
private void Start()
{
ultimateCooldownCoroutine = StartCoroutine(UltimateCooldownTimerCoroutine());
}
public virtual void UseMeleeAbility()
{
if (meleeAbility == null) return;
if (mana.EnoughMana(meleeAbility.manaCost))
meleeAbility.Execute(userTag);
}
public virtual void UseCoreAbility(Vector3 point)
{
if (coreAbility == null) return;
if (mana.EnoughMana(coreAbility.manaCost))
coreAbility.Execute(userTag, point);
}
public virtual void UseUltimateAbility(Vector3 point)
{
if (ultimateAbility == null) return;
if (mana.EnoughMana(ultimateAbility.manaCost))
{
ultimateAbility.Execute(userTag, point);
ultimateCooldownCoroutine = StartCoroutine(UltimateCooldownTimerCoroutine());
}
}
public virtual void UseUltimateAbility(Transform target)
{
if (ultimateAbility == null) return;
if (mana.EnoughMana(ultimateAbility.manaCost))
{
ultimateAbility.Execute(userTag, target);
ultimateCooldownCoroutine = StartCoroutine(UltimateCooldownTimerCoroutine());
}
}
public bool ValidCoreAbility()
{
return coreAbility != null;
}
public virtual bool CanCastUltimate()
{
return (ultimateCooldownCoroutine == null && mana.EnoughMana(ultimateAbility.manaCost) && !ultimateOnCooldown);
}
public virtual bool CanCastCoreAbility()
{
return mana.EnoughMana(coreAbility.manaCost);
}
protected virtual IEnumerator UltimateCooldownTimerCoroutine()
{
ultimateOnCooldown = true;
yield return new WaitForSeconds(ultimateCooldown);
OnUltimateCooldownReset();
}
protected virtual void OnUltimateCooldownReset()
{
ultimateCooldownCoroutine = null;
ultimateOnCooldown = false;
}
}