//Called when ability is created public override void Init(GameObject newOwner) { base.Init(newOwner); //Player should only be able to cancel attack on hit abilityData.canCancelActive = false; abilityData.canCancelRecover = false; //Get owner health _ownerHealth = owner.GetComponent <HealthBehaviour>(); }
/// <summary> /// Stuns the object that came in contact with a link /// </summary> /// <param name="args"></param> private void StunEntity(params object[] args) { //Get health beahviour GameObject entity = (GameObject)args[0]; HealthBehaviour entityHealth = entity.GetComponent <HealthBehaviour>(); //If there is a health behaviour... if (entityHealth) { //...stun the entity entityHealth.Stun(abilityData.GetCustomStatValue("StunTime")); } }
private void OnTriggerEnter(Collider other) { //If the object has already been hit or if the collider is multihit return if (Collisions.Contains(other.gameObject) || IsMultiHit) { return; } ColliderBehaviour otherCollider = null; if (other.attachedRigidbody) { if (other.attachedRigidbody.gameObject != Owner) { otherCollider = other.attachedRigidbody.gameObject.GetComponentInChildren <ColliderBehaviour>(); } else { return; } } if (other.CompareTag("ParryBox")) { return; } if (otherCollider && !other.CompareTag("Player") && !other.CompareTag("Entity")) { if (IgnoreColliders || otherCollider.IgnoreColliders || otherCollider.ColliderOwner == Owner) { return; } else if (otherCollider is HitColliderBehaviour) { if (((HitColliderBehaviour)otherCollider).Priority >= Priority && otherCollider.ColliderOwner != ColliderOwner) { Destroy(gameObject); return; } return; } } float newHitAngle = _hitAngle; //Calculates new angle if this object should change trajectory based on direction of hit if (_adjustAngleBasedOnCollision) { //Find a vector that point from the collider to the object hit Vector3 directionOfImpact = other.transform.position - transform.position; directionOfImpact.Normalize(); directionOfImpact.x = Mathf.Round(directionOfImpact.x); //Find the direction this collider was going to apply force originally Vector3 currentForceDirection = new Vector3(Mathf.Cos(newHitAngle), Mathf.Sin(newHitAngle), 0); currentForceDirection.x *= directionOfImpact.x; //Find the new angle based on the direction of the attack on the x axis float dotProduct = Vector3.Dot(currentForceDirection, Vector3.right); newHitAngle = Mathf.Acos(dotProduct); //Find if the angle should be negative or positive if (Vector3.Dot(currentForceDirection, Vector3.up) < 0) { newHitAngle *= -1; } } //Add the game object to the list of collisions so it is not collided with again Collisions.Add(other.gameObject); //Grab whatever health script is attached to this object HealthBehaviour damageScript = other.GetComponent <HealthBehaviour>(); if (Owner) { OwnerName = Owner.name; } //If the damage script wasn't null damage the object if (damageScript != null) { damageScript.TakeDamage(OwnerName, _damage, _knockBackScale, newHitAngle, damageType, _hitStunTime); } onHit?.Invoke(other.gameObject, otherCollider); if (DestroyOnHit) { Destroy(gameObject); } }
private void OnTriggerStay(Collider other) { //Only allow damage to be applied this way if the collider is a multi-hit collider if (!IsMultiHit || other.gameObject == Owner || !CheckHitTime()) { return; } ColliderBehaviour otherCollider = null; if (other.attachedRigidbody) { otherCollider = other.attachedRigidbody.gameObject.GetComponent <ColliderBehaviour>(); } if (other.CompareTag("ParryBox")) { return; } if (otherCollider && IgnoreColliders) { return; } else if (otherCollider is HitColliderBehaviour) { if (((HitColliderBehaviour)otherCollider).Priority >= Priority && otherCollider.ColliderOwner != ColliderOwner) { Destroy(gameObject); return; } return; } //Grab whatever health script is attached to this object. If none return HealthBehaviour damageScript = other.GetComponent <HealthBehaviour>(); float newHitAngle = _hitAngle; //Calculates new angle if this object should change trajectory based on direction of hit if (_adjustAngleBasedOnCollision) { //Find a vector that point from the collider to the object hit Vector3 directionOfImpact = other.transform.position - transform.position; directionOfImpact.Normalize(); directionOfImpact.x = Mathf.Round(directionOfImpact.x); //Find the direction this collider was going to apply force originally Vector3 currentForceDirection = new Vector3(Mathf.Cos(newHitAngle), Mathf.Sin(newHitAngle), 0); currentForceDirection.x *= directionOfImpact.x; //Find the new angle based on the direction of the attack on the x axis float dotProduct = Vector3.Dot(currentForceDirection, Vector3.right); newHitAngle = Mathf.Acos(dotProduct); //Find if the angle should be negative or positive if (Vector3.Dot(currentForceDirection, Vector3.up) < 0) { newHitAngle *= -1; } } if (Owner) { OwnerName = Owner.name; } //If the damage script wasn't null damage the object if (damageScript != null) { damageScript.TakeDamage(OwnerName, _damage, _knockBackScale, newHitAngle, damageType, _hitStunTime); } onHit?.Invoke(other.gameObject); if (DestroyOnHit) { Destroy(gameObject); } }