using System.Collections; using System.Collections.Generic; using Invector; using Invector.vCharacterController; using Invector.vEventSystems; using UnityEngine; namespace Beyond { public class bThirdPersonController : vThirdPersonController { //public bool triggerDieBehaviour = false; protected bool m_isDashing; protected bool m_GodMode = false; public bool m_ignoreTriggers = true; public bool GodMode { get => m_GodMode; set { m_GodMode = value; isImmortal = m_GodMode; } } public bool IsDashingOrRolling() { return m_isDashing || isRolling; } protected override void Start() { base.Start(); //var receiver = GetComponent(); //var ev = new vAnimatorEvent(); // ev. } public void OnEvadeStart() { if (m_GodMode) return; isImmortal = true; } public void OnEvadeEnd() { if (m_GodMode) return; isImmortal = false; } public override void ActionsControl() { base.ActionsControl(); m_isDashing = IsAnimatorTag("IsDashing"); } public override void Roll() { OnRoll.Invoke(); isRolling = true; animator.CrossFadeInFixedTime("Roll", rollTransition, baseLayer); ReduceStamina(rollStamina, false); currentStaminaRecoveryDelay = 2f; } public virtual void Dash() { // OnRoll.Invoke(); // isRolling = true; animator.CrossFadeInFixedTime("Dash", rollTransition, baseLayer); ReduceStamina(rollStamina, false); currentStaminaRecoveryDelay = 2f; } protected override void DeadAnimation() { if (!isDead) { return; } if (!triggerDieBehaviour) { triggerDieBehaviour = true; DeathBehaviour(); } // death by animation if (deathBy == DeathBy.Animation) { int deadLayer = 0; var info = animatorStateInfos.GetStateInfoUsingTag("Dead"); if (info != null) { if (!animator.IsInTransition(deadLayer) && info.normalizedTime >= 0.99f && groundDistance <= 0.15f) { RemoveComponents(); } } } // death by animation & ragdoll after a time else if (deathBy == DeathBy.AnimationWithRagdoll) { int deadLayer = 0; var info = animatorStateInfos.GetStateInfoUsingTag("Dead"); if (info != null) { if (!animator.IsInTransition(deadLayer) && info.normalizedTime >= 0.8f) { onActiveRagdoll.Invoke(null); } } } // death by ragdoll else if (deathBy == DeathBy.Ragdoll) { onActiveRagdoll.Invoke(null); } } public void RemoveAnimatorTags() { animatorStateInfos.stateInfos.vToList().ForEach(infos => infos.tags.Clear()); } public override void ControlAnimatorRootMotion() { if (!this.enabled) { return; } if (isRolling) { RollBehavior(); return; } if (customAction || lockAnimMovement) { StopCharacterWithLerp(); transform.position = animator.rootPosition; transform.rotation = animator.rootRotation; } else if (IsAnimatorTag("Attack")) { StopCharacterWithLerp(); transform.position = animator.rootPosition; } // commented for test //else if (inputSmooth.magnitude == 0 && isGrounded && !isSliding) //{ // if (!ignoreAnimatorMovement) // { // animator.ApplyBuiltinRootMotion(); // transform.position = animator.rootPosition; // transform.rotation = animator.rootRotation; // } //} if (useRootMotion) { MoveCharacter(moveDirection); } } protected override void OnTriggerEnter(Collider other) { if (!m_ignoreTriggers) onActionEnter.Invoke(other); } /// /// Call this in OnTriggerEnter or OnTriggerStay to check if enter in triggerActions /// /// collider trigger protected override void OnTriggerStay(Collider other) { try { CheckForAutoCrouch(other); } catch (UnityException e) { Debug.LogWarning(e.Message); } if (!m_ignoreTriggers) base.OnTriggerStay(other); } /// /// Call this in OnTriggerExit to check if exit of triggerActions /// /// protected override void OnTriggerExit(Collider other) { AutoCrouchExit(other); if (!m_ignoreTriggers) base.OnTriggerExit(other); } //animation event handling void DrawWeaponLowLeft() { } } }