//Initialize our damage over time spell public void Initialize(string AbilityName, int DamageAmount, float DamageIncrement, float AbilityLength, GameObject DamageOverTimeEffect, float DamageOvertimeTimeout, AudioClip DamageOverTimeSound, EmeraldAINonAIDamage NonAIDamageComponent, EmeraldAIPlayerDamage PlayerDamageComponent, EmeraldAISystem TargetEmeraldComponent, EmeraldAISystem AttackerEmeraldComponent, Transform TargetTransform, EmeraldAISystem.TargetType TargetType) { m_DamageOverTimeEffect = DamageOverTimeEffect; m_DamageOverTimeTimeout = DamageOvertimeTimeout; m_DamageOverTimeSound = DamageOverTimeSound; m_AbilityName = AbilityName; m_DamageAmount = DamageAmount; m_DamageIncrement = DamageIncrement; m_AbilityLength = AbilityLength; m_TargetEmeraldComponent = TargetEmeraldComponent; m_AttackerEmeraldComponent = AttackerEmeraldComponent; m_TargetType = TargetType; m_TargetTransform = TargetTransform; m_EmeraldAIPlayerDamage = PlayerDamageComponent; m_NonAIDamageComponent = NonAIDamageComponent; }
//Handle all of our collision related calculations here. When this happens, effects and sound can be played before the object is despawned. void OnTriggerEnter(Collider C) { if (!Collided && EmeraldSystem != null && ProjectileCurrentTarget != null && C.gameObject == ProjectileCurrentTarget.gameObject && C.gameObject.layer != 2) { if (EffectOnCollisionRef == EffectOnCollision.Yes) { if (CollisionEffect != null) { SpawnedEffect = EmeraldAIObjectPool.SpawnEffect(CollisionEffect, transform.position, Quaternion.identity, 2); SpawnedEffect.transform.SetParent(EmeraldAISystem.ObjectPool.transform); } } if (ImpactSound != null && SoundOnCollisionRef == EffectOnCollision.Yes) { CollisionSound = EmeraldAIObjectPool.SpawnEffect(CollisionSoundObject, transform.position, Quaternion.identity, 2); CollisionSound.transform.SetParent(EmeraldAISystem.ObjectPool.transform); AudioSource CollisionAudioSource = CollisionSound.GetComponent <AudioSource>(); CollisionAudioSource.PlayOneShot(ImpactSound); } //Damage AI target with damage based off of currently applied ability if (TargetTypeRef == TargetType.AI && TargetEmeraldSystem != null) { if (AbilityType == AbilityTypeEnum.Damage && DamageType == DamageTypeEnum.Instant) { TargetEmeraldSystem.Damage(Damage, EmeraldAISystem.TargetType.AI, EmeraldSystem.transform, EmeraldSystem.SentRagdollForceAmount, CriticalHit); EmeraldSystem.OnDoDamageEvent.Invoke(); } else if (AbilityType == AbilityTypeEnum.Damage && DamageType == DamageTypeEnum.OverTime) { //Apply the initial damage to our target TargetEmeraldSystem.Damage(AbilityImpactDamage, EmeraldAISystem.TargetType.AI, EmeraldSystem.transform, EmeraldSystem.SentRagdollForceAmount); EmeraldSystem.OnDoDamageEvent.Invoke(); if (AbilityStacksRef == Yes_No.No && !TargetEmeraldSystem.ActiveEffects.Contains(EmeraldSystem.CurrentlyCreatedAbility.AbilityName) && AbilityName != string.Empty || AbilityStacksRef == Yes_No.Yes) { //Initialize the damage over time component GameObject SpawnedDamageOverTimeComponent = EmeraldAIObjectPool.Spawn(DamageOverTimeComponent, ProjectileCurrentTarget.position, Quaternion.identity); SpawnedDamageOverTimeComponent.transform.SetParent(EmeraldAISystem.ObjectPool.transform); SpawnedDamageOverTimeComponent.GetComponent <EmeraldAIDamageOverTime>().Initialize(AbilityName, AbilityDamagePerIncrement, AbilityDamageIncrement, AbilityLength, DamageOverTimeEffect, DamageOvertimeTimeout, DamageOverTimeSound, null, m_EmeraldAIPlayerDamage, TargetEmeraldSystem, EmeraldSystem, EmeraldSystem.CurrentTarget, (EmeraldAISystem.TargetType)TargetTypeRef); TargetEmeraldSystem.ActiveEffects.Add(AbilityName); } } } else if (TargetTypeRef == TargetType.Player) //Damage the Player with damage based off of currently applied ability { if (AbilityType == AbilityTypeEnum.Damage && DamageType == DamageTypeEnum.Instant) { DamagePlayer(Damage); } else if (AbilityType == AbilityTypeEnum.Damage && DamageType == DamageTypeEnum.OverTime) { //Apply the initial damage to our target DamagePlayer(AbilityImpactDamage); if (AbilityStacksRef == Yes_No.No && !EmeraldSystem.CurrentTarget.GetComponent <EmeraldAIPlayerDamage>().ActiveEffects.Contains(EmeraldSystem.CurrentlyCreatedAbility.AbilityName) && AbilityName != string.Empty || AbilityStacksRef == Yes_No.Yes) { //Initialize the damage over time component GameObject SpawnedDamageOverTimeComponent = EmeraldAIObjectPool.Spawn(DamageOverTimeComponent, ProjectileCurrentTarget.position, Quaternion.identity); SpawnedDamageOverTimeComponent.transform.SetParent(EmeraldAISystem.ObjectPool.transform); SpawnedDamageOverTimeComponent.GetComponent <EmeraldAIDamageOverTime>().Initialize(AbilityName, AbilityDamagePerIncrement, AbilityDamageIncrement, AbilityLength, DamageOverTimeEffect, DamageOvertimeTimeout, DamageOverTimeSound, null, m_EmeraldAIPlayerDamage, TargetEmeraldSystem, EmeraldSystem, EmeraldSystem.CurrentTarget, (EmeraldAISystem.TargetType)TargetTypeRef); EmeraldSystem.CurrentTarget.GetComponent <EmeraldAIPlayerDamage>().ActiveEffects.Add(AbilityName); } } } else if (TargetTypeRef == TargetType.NonAITarget) //Damage a non-AI target with damage based off of currently applied ability { if (AbilityType == AbilityTypeEnum.Damage && DamageType == DamageTypeEnum.Instant) { DamageNonAITarget(Damage); } else if (AbilityType == AbilityTypeEnum.Damage && DamageType == DamageTypeEnum.OverTime) { //Apply the initial damage to our target DamageNonAITarget(AbilityImpactDamage); //Get a reference to the Non-AI Target component EmeraldAINonAIDamage m_EmeraldAINonAIDamage = StartingTarget.GetComponent <EmeraldAINonAIDamage>(); if (AbilityStacksRef == Yes_No.No && !m_EmeraldAINonAIDamage.ActiveEffects.Contains(EmeraldSystem.CurrentlyCreatedAbility.AbilityName) && AbilityName != string.Empty || AbilityStacksRef == Yes_No.Yes) { //Initialize the damage over time component GameObject SpawnedDamageOverTimeComponent = EmeraldAIObjectPool.Spawn(DamageOverTimeComponent, ProjectileCurrentTarget.position, Quaternion.identity); SpawnedDamageOverTimeComponent.transform.SetParent(EmeraldAISystem.ObjectPool.transform); SpawnedDamageOverTimeComponent.GetComponent <EmeraldAIDamageOverTime>().Initialize(AbilityName, AbilityDamagePerIncrement, AbilityDamageIncrement, AbilityLength, DamageOverTimeEffect, DamageOvertimeTimeout, DamageOverTimeSound, m_EmeraldAINonAIDamage, m_EmeraldAIPlayerDamage, TargetEmeraldSystem, EmeraldSystem, EmeraldSystem.CurrentTarget, (EmeraldAISystem.TargetType)TargetTypeRef); m_EmeraldAINonAIDamage.ActiveEffects.Add(AbilityName); } } } if (ObjectToDisableOnCollision != null) { ObjectToDisableOnCollision.SetActive(false); } if (ArrowProjectileRef == ArrowObject.Yes) { CollisionTime = 0; } Collided = true; ProjectileCollider.enabled = false; } else if (!Collided && EmeraldSystem != null && ProjectileCurrentTarget != null && C.gameObject != ProjectileCurrentTarget.gameObject && C.gameObject != EmeraldSystem.gameObject && C.gameObject.layer != 2) { Collided = true; ProjectileCollider.enabled = false; if (ObjectToDisableOnCollision != null) { ObjectToDisableOnCollision.SetActive(false); } if (EffectOnCollisionRef == EffectOnCollision.Yes) { if (CollisionEffect != null) { SpawnedEffect = EmeraldAIObjectPool.SpawnEffect(CollisionEffect, transform.position, Quaternion.identity, 2); SpawnedEffect.transform.SetParent(EmeraldAISystem.ObjectPool.transform); } } if (ImpactSound != null && SoundOnCollisionRef == EffectOnCollision.Yes) { CollisionSound = EmeraldAIObjectPool.SpawnEffect(CollisionSoundObject, transform.position, Quaternion.identity, 2); CollisionSound.transform.SetParent(EmeraldAISystem.ObjectPool.transform); AudioSource CollisionAudioSource = CollisionSound.GetComponent <AudioSource>(); CollisionAudioSource.PlayOneShot(ImpactSound); } if (ArrowProjectileRef == ArrowObject.Yes && !C.CompareTag(EmeraldSystem.EmeraldTag)) { CollisionTime = 10; } else if (ArrowProjectileRef == ArrowObject.Yes && C.CompareTag(EmeraldSystem.EmeraldTag)) { CollisionTime = 0; } } }