using Photon.Pun; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; using UnityEngine.Events; public class CharacterAnimatorController : MonoBehaviour { Animator anim; NavMeshAgent agent; PhotonView photonView; CharacterAnimatorParent parentController; SimpleRotationFX characterSpin; bool isCasting; bool wasSpinning = false; public UnityEvent onFishingStarted = new UnityEvent(); public UnityEvent onFishingEnding = new UnityEvent(); public UnityEvent onFishingEnded = new UnityEvent(); private void Awake() { anim = GetComponent(); agent = GetComponentInParent(); photonView = GetComponentInParent(); parentController = GetComponentInParent(); characterSpin = photonView.GetComponentInChildren(); } // Start is called before the first frame update void Start() { if (!photonView.IsMine) { return; } } private void OnEnable() { parentController = GetComponentInParent(); //Debug.Log("OnEnable: parentController is " + (parentController != null ? "not null" : "null")); if (photonView.IsMine) { CastBarHandler.Instance.OnCastingStateChanged.AddListener(UpdateIsCastingState); //Debug.Log("Adding Listener for character: " + this.gameObject.name); } } private void OnDisable() { if (photonView.IsMine) CastBarHandler.Instance.OnCastingStateChanged.RemoveListener(UpdateIsCastingState); } // Update is called once per frame void Update() { if (!photonView.IsMine) { if (characterSpin != null) characterSpin.enabled = anim.GetBool("spinning"); return; } anim.SetFloat("movementSpeed", agent.velocity.magnitude); } private void UpdateIsCastingState(bool isCasting) { this.isCasting = isCasting; if (isCasting) { anim.SetFloat("throwingTime", (1 / CastBarHandler.Instance.currentCastTime)); SetTriggerBasedOnAbility(CastBarHandler.Instance.currentAbility.animationType, CastBarHandler.Instance.currentAbility.animationType == AbilityAnimationType.Spin); if (parentController == null) { parentController = GetComponentInParent(); //Debug.Log("OnEnable: parentController is " + (parentController != null ? "not null" : "null")); } //Debug.Log("NULL: " + parentController); parentController.SetRemoteTriggerBasedOnAbility((int)CastBarHandler.Instance.currentAbility.animationType); } else if (wasSpinning) { SetTriggerBasedOnAbility(AbilityAnimationType.Spin, false); } } public void OnDeath() { SetDeadTrigger(); parentController.SetRemoteDead(); } public void OnRevived() { SetRevivedTrigger(); parentController.SetRemoteRevived(); } public void OnFish() { SetFishTrigger(); parentController.SetRemoteFish(); } public void OnPickup() { SetPickupTrigger(); parentController.SetRemotePickup(); } public void SetDeadTrigger() { anim.SetTrigger("dead"); } public void SetRevivedTrigger() { anim.SetTrigger("revived"); } public void SetFishTrigger() { anim.SetTrigger("fish"); onFishingStarted.Invoke(); } public void SetPickupTrigger() { anim.SetTrigger("pickup"); } public void OnFishingEnding() { onFishingEnding.Invoke(); if (!photonView.IsMine) return; } public void OnFishingEnded() { onFishingEnded.Invoke(); if (!photonView.IsMine) return; } public void OnAnimationEvent() { if (!photonView.IsMine) return; //Debug.Log("$$melee Animation event"); //if (!isCasting) return; //Debug.Log("$$melee Animation event casting true"); if (CastBarHandler.Instance.currentAbility.animationType == AbilityAnimationType.Melee) { CastBarHandler.Instance.ExecuteQueuedCastOnAnimationEvent(); parentController.castingStateController.ResetCastingOnMeleeAnimationEvent(); } } public void SetTriggerBasedOnAbility(AbilityAnimationType animationType, bool spinning = false) { switch (animationType) { case AbilityAnimationType.Throw: anim.SetTrigger("throw"); break; case AbilityAnimationType.Spell: anim.SetTrigger("cast"); break; case AbilityAnimationType.Melee: anim.SetTrigger("melee"); break; case AbilityAnimationType.Spin: wasSpinning = spinning; anim.SetBool("spinning", spinning); if (characterSpin != null) characterSpin.enabled = spinning; break; case AbilityAnimationType.Summon: anim.SetTrigger("summon"); break; case AbilityAnimationType.Jump: anim.SetTrigger("jump"); break; case AbilityAnimationType.Potion: anim.SetTrigger("potion"); break; default: break; } } } public enum AbilityAnimationType { Throw, Spell, Melee, Spin, Summon, Jump, Potion }