Example #1
0
 // Take Damage
 public override void TakeDamage(DamageInfo damageInfo)
 {
     if (checkHealth)
     {
         m_Health.TakeDamage(damageInfo.GetItByInfo(damageInfo.damage * damageModifier, damageInfo.source, damageInfo.owner, damageInfo.type));
     }
 }
Example #2
0
        // Explode
        private void Explode(ICharacter owner)
        {
            if (exploded)
            {
                return;
            }

            exploded = true;

            Transform m_Transform = transform;

            if (fragments != null)
            {
                fragments.SpawnCopy(m_Transform.position, m_Transform.rotation);
            }

            Collider m_Collider = GetComponent <Collider>();

            Collider[] overlapColliders = Physics.OverlapSphere(m_Transform.position, radius, hitMask);

            Vector3    direction = Vector3.zero;
            RaycastHit hitInfo;
            DamageInfo damageInfo = new DamageInfo();

            foreach (Collider hitCollider in overlapColliders)
            {
                if (hitCollider == m_Collider || hitCollider.isTrigger)
                {
                    continue;
                }

                direction = hitCollider.bounds.center - m_Transform.position;

                if (Physics.Raycast(m_Transform.position, direction, out hitInfo, radius, hitMask) == false || hitCollider != hitInfo.collider)
                {
                    continue;
                }

                float distance = Vector3.Distance(m_Transform.position, hitInfo.point);
                float percent  = (100f - (distance / radius * 100f)) / 100f;

                IDamageHandler handler = hitCollider.GetComponent <IDamageHandler>();
                if (handler != null)
                {
                    handler.TakeDamage(damageInfo.GetItByInfo(damage * percent, m_Transform, owner, EDamageType.Explosion));

                    if (handler.isPlayer)
                    {
                        PlayerCamera.Shake(percent / 2f, percent);
                    }
                }

                Rigidbody tmpRb = hitCollider.attachedRigidbody;
                if (tmpRb != null && tmpRb.isKinematic == false)
                {
                    percent *= 1.75f;
                    tmpRb.AddExplosionForce(force * percent / (tmpRb.mass > 1f ? tmpRb.mass : 1f), m_Transform.position, radius, upwardsModifier, ForceMode.Impulse);
                }
            }


            float lifetime = 0f;


            // Play SFX
            AudioSource m_Audio = GetComponent <AudioSource>();

            if (m_Audio != null)
            {
                m_Audio.SetupForSFX();

                AudioClip sfxClip = Audio.GetRandomClip(explosionSounds);
                m_Audio.PlayOneShot(sfxClip);

                if (sfxClip != null)
                {
                    lifetime = Mathf.Max(lifetime, sfxClip.length);
                }
            }
            else
            {
                Audio.PlayClipAtPoint(Audio.GetRandomClip(explosionSounds), m_Transform.position);
            }


            // Spawn FX
            ParticleSystem explosionFX = GetComponent <ParticleSystem>();

            if (explosionFX != null)
            {
#if UNITY_5_4_PLUS
                var main = explosionFX.main;
                main.playOnAwake = main.loop = false;
                float startLifetime = main.startLifetime.constant;
#else
                explosionFX.playOnAwake   = explosionFX.loop = false;
                explosionFX.playbackSpeed = Time.timeScale;
                float startLifetime = explosionFX.startLifetime;
#endif
                explosionFX.Play();

                lifetime = Mathf.Max(lifetime, startLifetime);
            }


            Destroy(gameObject.MoveToCache(), lifetime);
        }