private void SendDamage(GameObject receiver, Object data) { StatsHandler receiverHandler = receiver.GetComponent <StatsHandler>(); DamageData damageData = data as DamageData; //Exclude self tag, needs some kind of frieds tag system if (gameObject.tag == receiver.tag) { return; } if (receiverHandler != null && receiverHandler.enabled && damageData != null) { Stat sendingStat = this.m_Stats.FirstOrDefault(x => x.Name == damageData.sendingStat); if (sendingStat == null) { return; } Stat criticalStrikeStat = this.m_Stats.FirstOrDefault(x => x.Name == damageData.criticalStrikeStat); bool criticaleStrike = criticalStrikeStat != null && criticalStrikeStat.Value > UnityEngine.Random.Range(0f, 100f); sendingStat.CalculateValue(); float damage = sendingStat.Value; if (criticaleStrike) { damage *= 2f; } receiverHandler.ApplyDamage(damageData.receivingStat, damage); EventHandler.Execute(receiver, "OnGetHit", gameObject, damageData.receivingStat, damage); SendMessage("UseItem", SendMessageOptions.DontRequireReceiver); if (damageData.particleEffect != null) { Vector3 pos = receiver.GetComponent <Collider>().ClosestPoint(transform.position + damageData.offset); Vector3 right = UnityEngine.Random.Range(-damageData.randomize.x, damageData.randomize.x) * transform.right; Vector3 up = UnityEngine.Random.Range(-damageData.randomize.y, damageData.randomize.y) * transform.up; Vector3 forward = UnityEngine.Random.Range(-damageData.randomize.z, damageData.randomize.z) * transform.forward; Vector3 relativePos = (transform.position + damageData.offset + right + up + forward) - pos; GameObject effect = Instantiate(damageData.particleEffect, pos, Quaternion.LookRotation(relativePos, Vector3.up)); Destroy(effect, damageData.lifeTime); } if (damageData.enableShake) { CameraEffects.Shake(damageData.duration, damageData.speed, damageData.amount); } if (damageData.hitSounds.Length > 0) { receiverHandler.PlaySound(damageData.hitSounds[UnityEngine.Random.Range(0, damageData.hitSounds.Length)], damageData.audioMixerGroup, damageData.volumeScale); } if (damageData.displayDamage) { receiverHandler.DisplayDamage(damageData.damagePrefab, damage, criticaleStrike?damageData.criticalDamageColor:damageData.damageColor, damageData.intensity); } if (damageData.enableKnockback && damageData.knockbackChance > Random.Range(0f, 1f)) { StartCoroutine(Knockback(receiver, damageData)); } Animator animator = receiver.GetComponent <Animator>(); if (animator != null && animator.GetCurrentAnimatorStateInfo(0).IsName("Locomotion") && !animator.IsInTransition(0)) { animator.SetTrigger("Hit"); } } }