Exemple #1
0
        private void Update()
        {
            Damageable.DamageMessage data = new Damageable.DamageMessage
            {
                damageSource = transform.position,
                amount       = 1,
                damager      = this,
                stopCamera   = false,
                throwing     = true
            };

            int count = Physics.OverlapSphereNonAlloc(transform.position, m_Collider.radius * transform.localScale.x,
                                                      sOverlapCache, m_PlayerMask);

            for (int i = 0; i < count; ++i)
            {
                Damageable d = sOverlapCache[i].GetComponent <Damageable>();

                if (d != null)
                {
                    data.direction = d.transform.position - transform.position;
                    d.ApplyDamage(data);
                }
            }
        }
Exemple #2
0
        private bool CheckDamage(Collider other, AttackPoint pts)
        {
            Damageable damageable = other.GetComponent <Damageable>();

            if (damageable == null)
            {
                return(false);
            }

            if (damageable.gameObject == m_Owner)
            {
                return(true); //ignore self harm, but do not end the attack (we don't "bounce" off ourselves)
            }
            if ((targetLayers.value & (1 << other.gameObject.layer)) == 0)
            {
                //hit an object that is not in our layer, this end the attack. we "bounce" off it
                return(false);
            }

            if (hitAudio != null)
            {
                var renderer = other.GetComponent <Renderer>();
                if (!renderer)
                {
                    renderer = other.GetComponentInChildren <Renderer> ();
                }
                if (renderer)
                {
                    hitAudio.PlayRandomClip(renderer.sharedMaterial);
                }
                else
                {
                    hitAudio.PlayRandomClip();
                }
            }

            Damageable.DamageMessage data = new Damageable.DamageMessage
            {
                amount       = damage,
                damager      = this,
                direction    = m_Direction.normalized,
                damageSource = m_Owner.transform.position,
                throwing     = m_IsThrowingHit,
                stopCamera   = false
            };

            damageable.ApplyDamage(data);

            if (hitParticlePrefab != null)
            {
                m_ParticlesPool[m_CurrentParticle].transform.position = pts.attackRoot.transform.position;
                m_ParticlesPool[m_CurrentParticle].time = 0;
                m_ParticlesPool[m_CurrentParticle].Play();
                m_CurrentParticle = (m_CurrentParticle + 1) % PARTICLE_COUNT;
            }

            return(true);
        }
        public void BeHit(int decHP, ICreatureBehavior source)
        {
            var msg = new Damageable.DamageMessage()
            {
                amount     = decHP,
                damager    = this,
                direction  = Vector3.up,
                stopCamera = false
            };

            m_damageable.ApplyDamage(msg);
        }
        public void Explosion()
        {
            if (explosionPlayer)
            {
                explosionPlayer.transform.SetParent(null);
                explosionPlayer.PlayRandomClip();
            }

            int count = Physics.OverlapSphereNonAlloc(transform.position, explosionRadius, m_ExplosionHitCache,
                                                      damageMask.value);

            Damageable.DamageMessage message = new Damageable.DamageMessage
            {
                amount       = damageAmount,
                damageSource = transform.position,
                damager      = this,
                stopCamera   = false,
                throwing     = true
            };


            for (int i = 0; i < count; ++i)
            {
                Damageable d = m_ExplosionHitCache[i].GetComponentInChildren <Damageable>();

                if (d != null)
                {
                    d.ApplyDamage(message);
                }
            }

            pool.Free(this);

            Vector3 playPosition = transform.position;
            Vector3 playNormal   = Vector3.up;

            if (vfxOnGround)
            {
                RaycastHit hit;
                if (Physics.Raycast(transform.position, Vector3.down, out hit, 100.0f, m_EnvironmentLayer))
                {
                    playPosition = hit.point + hit.normal * 0.1f;
                    playNormal   = hit.normal;
                }
            }

            m_VFXInstance.gameObject.transform.position = playPosition;
            m_VFXInstance.gameObject.transform.up       = playNormal;
            m_VFXInstance.time = 0.0f;
            m_VFXInstance.gameObject.SetActive(true);
            m_VFXInstance.Play(true);
        }
Exemple #5
0
        public void BeHit(int decHP, ICreatureBehavior source)
        {
            m_Animator.SetTrigger(m_HashHurt);

            // Find the direction of the damage.
            Vector3 forward = source.GetTransform().position - transform.position;

            forward.y = 0f;

            Vector3 localHurt = transform.InverseTransformDirection(forward);

            // Set the HurtFromX and HurtFromY parameters of the animator based on the direction of the damage.
            m_Animator.SetFloat(m_HashHurtFromX, localHurt.x);
            m_Animator.SetFloat(m_HashHurtFromY, localHurt.z);

            var msg = new Damageable.DamageMessage()
            {
                amount     = decHP,
                damager    = this,
                direction  = Vector3.up,
                stopCamera = false
            };

            m_Damageable.ApplyDamage(msg);

            if (IsMine)
            {
                // Shake the camera.
                CameraShake.Shake(CameraShake.k_PlayerHitShakeAmount, CameraShake.k_PlayerHitShakeTime);

                // Play an audio clip of being hurt.
                if (hurtAudioPlayer != null)
                {
                    hurtAudioPlayer.PlayRandomClip();
                }
                if (m_healthUI != null)
                {
                    m_healthUI.ChangeHitPointUI(m_Damageable);
                }
            }
        }
        public void Explosion()
        {
            if (explosionPlayer)
            {
                explosionPlayer.transform.SetParent(null);
                explosionPlayer.PlayRandomClip();
            }

            int count = Physics.OverlapSphereNonAlloc(transform.position, explosionRadius, m_ExplosionHitCache,
                                                      damageMask.value);

            Damageable.DamageMessage message = new Damageable.DamageMessage
            {
                amount       = damageAmount,
                damageSource = transform.position,
                damager      = this,
                stopCamera   = false,
                throwing     = true
            };


            for (int i = 0; i < count; ++i)
            {
                Damageable d = m_ExplosionHitCache[i].GetComponentInChildren <Damageable>();

                if (d != null)
                {
                    d.ApplyDamage(message);
                }
            }

            pool.Free(this);

            m_VFXInstance.gameObject.transform.position = transform.position;
            m_VFXInstance.time = 0.0f;
            m_VFXInstance.gameObject.SetActive(true);
            m_VFXInstance.Play(true);
        }
        private void OnTriggerStay(Collider other)
        {
            if ((damagedLayers.value & 1 << other.gameObject.layer) == 0)
            {
                return;
            }

            Damageable d = other.GetComponentInChildren <Damageable>();

            if (d != null && !d.isInvulnerable)
            {
                Damageable.DamageMessage message = new Damageable.DamageMessage
                {
                    damageSource = transform.position,
                    damager      = this,
                    amount       = amount,
                    direction    = (other.transform.position - transform.position).normalized,
                    throwing     = false
                };

                d.ApplyDamage(message);
            }
        }