Пример #1
0
        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");
                }
            }
        }