90 lines
2.7 KiB
C#
90 lines
2.7 KiB
C#
using Kryz.CharacterStats.Examples;
|
|
using Photon.Pun;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class AbilityKeyBinder : MonoBehaviour
|
|
{
|
|
[SerializeField] private BaseAbility ability;
|
|
[SerializeField] private GameKey key;
|
|
[SerializeField] private CastingStateController castingStateController;
|
|
[SerializeField] private GameEvent_AbilityKeyBinder onAbilityKeyBinderSpawned;
|
|
|
|
private PhotonView user;
|
|
private Taggable userTag;
|
|
private Mana mana;
|
|
|
|
public BaseAbility Ability => ability;
|
|
public GameKey GameKey => key;
|
|
|
|
Coroutine currentChanneling;
|
|
NetworkedChanneling networkedChanneling;
|
|
AbilityBindInstance abilityBindInstance;
|
|
|
|
private void Awake()
|
|
{
|
|
user = GetComponentInParent<PhotonView>();
|
|
userTag = GetComponentInParent<Taggable>();
|
|
mana = GetComponentInParent<Mana>();
|
|
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
if (!user.IsMine)
|
|
{
|
|
this.enabled = false;
|
|
return;
|
|
}
|
|
|
|
onAbilityKeyBinderSpawned.Raise(this);
|
|
}
|
|
// Update is called once per frame
|
|
void Update()
|
|
{
|
|
if (Input.GetKeyDown(key.keyCode))
|
|
{
|
|
if (abilityBindInstance != null)
|
|
abilityBindInstance.pressed.SetActive(true);
|
|
if (mana.EnoughMana(ability.manaCost))
|
|
{
|
|
if(ability is ChanneledAbility)
|
|
{
|
|
castingStateController.RequestAbilityChannel(ability, () => networkedChanneling = ((ChanneledAbility)ability).ExecuteChannel(user, userTag, ref currentChanneling));
|
|
}
|
|
else
|
|
castingStateController.RequestAbilityCast(ability, () => ability.Execute(user, userTag));
|
|
}
|
|
}
|
|
if(Input.GetKeyUp(key.keyCode))
|
|
{
|
|
if (abilityBindInstance != null)
|
|
abilityBindInstance.pressed.SetActive(false);
|
|
if (currentChanneling != null)
|
|
{
|
|
StopCoroutine(currentChanneling);
|
|
castingStateController.ResetChannelingCast();
|
|
CastBarHandler.Instance.CancelChannelingOnButtonReleased();
|
|
}
|
|
|
|
if(networkedChanneling != null)
|
|
{
|
|
networkedChanneling.channeling = false;
|
|
networkedChanneling.DisableVisuals();
|
|
}
|
|
}
|
|
}
|
|
|
|
public void SetupAbilityBindInstance(AbilityBindInstance abilityBindInstance)
|
|
{
|
|
this.abilityBindInstance = abilityBindInstance;
|
|
mana.onResourceChanged.AddListener(OnManaChanged);
|
|
}
|
|
|
|
public void OnManaChanged(float currentMana)
|
|
{
|
|
abilityBindInstance.noMana.SetActive(!mana.EnoughMana(ability.manaCost));
|
|
}
|
|
}
|