- Max Particle significantly reduced - preload ability assets & most shaders - fix coroutine error on channeled abilities - billboard random flickers fixed - spin to win animation and rotation sync fixed
147 lines
4.5 KiB
C#
147 lines
4.5 KiB
C#
using Kryz.CharacterStats.Examples;
|
|
using Photon.Pun;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class AbilityKeyBinder : MonoBehaviour
|
|
{
|
|
[Header("Listeners:")]
|
|
[SerializeField] private GameEventListener onLocalPlayerFainted;
|
|
[SerializeField] private GameEventListener onLocalPlayerPermaDeath;
|
|
[SerializeField] private GameEventListener onLocalPlayerRevived;
|
|
[Space]
|
|
[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;
|
|
AbilityCooldownTracker cooldownTracker;
|
|
|
|
bool isDead = false;
|
|
|
|
private void Awake()
|
|
{
|
|
user = GetComponentInParent<PhotonView>();
|
|
userTag = GetComponentInParent<Taggable>();
|
|
mana = GetComponentInParent<Mana>();
|
|
cooldownTracker = user.GetComponentInChildren<AbilityCooldownTracker>();
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
if (!user.IsMine)
|
|
{
|
|
this.enabled = false;
|
|
return;
|
|
}
|
|
|
|
onLocalPlayerFainted.Response.AddListener(() =>
|
|
{
|
|
isDead = true;
|
|
|
|
});
|
|
onLocalPlayerPermaDeath.Response.AddListener(() =>
|
|
{
|
|
isDead = true;
|
|
|
|
});
|
|
onLocalPlayerRevived.Response.AddListener(() =>
|
|
{
|
|
isDead = false;
|
|
|
|
});
|
|
|
|
onAbilityKeyBinderSpawned.Raise(this);
|
|
}
|
|
// Update is called once per frame
|
|
void Update()
|
|
{
|
|
if (isDead) return;
|
|
|
|
if (Input.GetKeyDown(key.keyCode))
|
|
{
|
|
if (abilityBindInstance != null)
|
|
abilityBindInstance.pressed.SetActive(true);
|
|
if (IsAbilityOffCooldown() && mana.EnoughMana(ability.manaCost))
|
|
{
|
|
if (ability is ChanneledAbility)
|
|
{
|
|
castingStateController.RequestAbilityChannel(ability, () =>
|
|
{
|
|
networkedChanneling = ((ChanneledAbility)ability).ExecuteChannel(user, userTag, ref currentChanneling);
|
|
if (ability.cooldown > 0)
|
|
{
|
|
cooldownTracker.StartAbilityCooldown(ability);
|
|
abilityBindInstance.StartCooldownTrackerUI();
|
|
}
|
|
});
|
|
}
|
|
else
|
|
{
|
|
castingStateController.RequestAbilityCast(ability, () =>
|
|
{
|
|
ability.Execute(user, userTag);
|
|
if (ability.cooldown > 0)
|
|
{
|
|
cooldownTracker.StartAbilityCooldown(ability);
|
|
abilityBindInstance.StartCooldownTrackerUI();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
if (Input.GetKeyUp(key.keyCode))
|
|
{
|
|
if (abilityBindInstance != null)
|
|
abilityBindInstance.pressed.SetActive(false);
|
|
if (currentChanneling != null)
|
|
{
|
|
|
|
if (networkedChanneling != null)
|
|
{
|
|
networkedChanneling.StopCoroutine(currentChanneling);
|
|
}
|
|
else
|
|
{
|
|
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));
|
|
}
|
|
|
|
public bool IsAbilityOffCooldown()
|
|
{
|
|
return ability.cooldown <= 0 || !cooldownTracker.OnCooldown(ability);
|
|
}
|
|
}
|