RiftMayhem/Assets/Scripts/AbilitySystem/Base/CastingStateController.cs
Pedro Gomes 5ce9c0b3a7 Bugfixes + Weapon Visual handler
- bugfix build manager on starter builds not correctly assigning keybinders with defaults
- added 2h ranged shoot animation
- added shoot animation type for abilities
- new weapon visual handler swaps visual weapons based on ability queues
2025-01-13 20:48:15 +00:00

107 lines
3.1 KiB
C#

using Photon.Pun;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Events;
public class CastingStateController : MonoBehaviour
{
public bool isCasting;
public PlayerMovement playerMovement;
public LayerMask movementMask;
Camera cam;
Ray ray;
RaycastHit hit;
PhotonView photonView;
ProjectileSpawnLocationController projectileSpawnLocationController;
public UnityEvent<BaseAbility> OnAbilityQueued = new UnityEvent<BaseAbility>();
private void Awake()
{
cam = Camera.main;
photonView = GetComponentInParent<PhotonView>();
projectileSpawnLocationController = transform.root.GetComponentInChildren<ProjectileSpawnLocationController>();
}
private void Start()
{
if (!photonView.IsMine) this.enabled = false;
}
public void RequestAbilityCast(BaseAbility ability, Action abilityExecution)
{
if (isCasting) return;
if (!ability.castableWhileMoving)
playerMovement.ToggleAgentMoving(true);
OnAbilityQueued.Invoke(ability);
StartCoroutine(Casting(ability, abilityExecution));
}
public void RequestAbilityChannel(BaseAbility channeledAbility, Action abilityChannelExecution)
{
if (isCasting) return;
if (!channeledAbility.castableWhileMoving)
playerMovement.ToggleAgentMoving(true);
OnAbilityQueued.Invoke(channeledAbility);
StartCoroutine(Channeling(channeledAbility, abilityChannelExecution));
}
private IEnumerator Casting(BaseAbility ability, Action abilityExecution)
{
isCasting = true;
CastBarHandler.Instance.ShowCastBar(ability, abilityExecution);
playerMovement.InstantFaceCast(projectileSpawnLocationController.GetLookat());
//cast animation
yield return new WaitForSeconds(ability.castTime);
if (ability.animationType != AbilityAnimationType.Melee && ability.animationType != AbilityAnimationType.Shoot)
{
abilityExecution.Invoke();
isCasting = false;
if (!ability.castableWhileMoving)
playerMovement.ToggleAgentMoving(false);
}
//Debug.Log("$$sCastbar Done casting");
}
private IEnumerator Channeling(BaseAbility channeledAbility, Action abilityChannelExecution)
{
isCasting = true;
CastBarHandler.Instance.ShowChannelingBar(channeledAbility, abilityChannelExecution);
playerMovement.InstantFaceCast(projectileSpawnLocationController.GetLookat());
abilityChannelExecution.Invoke();
if (!channeledAbility.castableWhileMoving)
playerMovement.ToggleAgentMoving(true);
yield return null;
}
public void ResetChannelingCast()
{
isCasting = false;
playerMovement.ToggleAgentMoving(false);
}
public void ResetCastingOnMeleeAnimationEvent()
{
isCasting = false;
playerMovement.ToggleAgentMoving(false);
StopAllCoroutines();
//Debug.Log("$$ResetCastingState On Event");
}
}