Example #1
0
        /// <summary>
        /// Instantiates the hit effect when the character is hit.
        /// </summary>
        public void OnTakenHit(Hit hit)
        {
            if (!_motor.IsAlive)
            {
                return;
            }

            if (_hurtSoundTimer < float.Epsilon)
            {
                _hurtSoundTimer = 0.5f;
                instantiate(Hurt, hit.Position);
            }

            if (BigHit != null && hit.Damage >= BigDamageThreshold)
            {
                instantiate(BigHit, hit.Position);
            }
            else if (Hit != null)
            {
                instantiate(Hit, hit.Position);
            }
        }
 /// <summary>
 /// Reduce health on bullet hit.
 /// </summary>
 public void OnHit(Hit hit)
 {
     Deal(hit.Damage);
 }
        private void explode()
        {
            if (_hasExploded || !_isActivated)
            {
                return;
            }

            _hasExploded = true;

            if (Explosion != null)
            {
                var particle = GameObject.Instantiate(Explosion);
                particle.transform.parent   = null;
                particle.transform.position = transform.position;
                particle.SetActive(true);
            }

            var colliders = Physics.OverlapSphere(transform.position, ExplosionRadius);

            foreach (var collider in colliders)
            {
                if (!collider.isTrigger)
                {
                    var part = collider.GetComponent <BodyPartHealth>();

                    if (part == null)
                    {
                        var closest = collider.transform.position;

                        if (collider.GetType() == typeof(MeshCollider))
                        {
                            if (((MeshCollider)collider).convex)
                            {
                                closest = collider.ClosestPoint(transform.position);
                            }
                        }

                        var vector   = transform.position - closest;
                        var distance = vector.magnitude;

                        if (distance < ExplosionRadius)
                        {
                            Vector3 normal;

                            if (distance > float.Epsilon)
                            {
                                normal = vector / distance;
                            }
                            else
                            {
                                normal = (closest - collider.transform.position).normalized;
                            }

                            var hit = new Hit(closest, normal, CenterDamage * (1 - distance / ExplosionRadius), null);
                            collider.gameObject.SendMessage("OnHit", hit, SendMessageOptions.DontRequireReceiver);
                        }
                    }
                }
            }

            GameObject.Destroy(gameObject);
        }
Example #4
0
        private void OnTriggerEnter(Collider other)
        {
            if (!_isAttacking || !_isScanning)
            {
                return;
            }

            if (Character != null && other.gameObject == Character.gameObject)
            {
                return;
            }

            var shield = BulletShield.Get(other.gameObject);

            if (shield != null)
            {
                return;
            }

            var part = other.GetComponent <BodyPartHealth>();
            var obj  = (part == null || part.Target == null) ? other.gameObject : part.Target.gameObject;

            if (_receptors.Contains(obj))
            {
                return;
            }

            _receptors.Add(obj);

            var normal = (Character.transform.position - obj.transform.position).normalized;

            HitType type;

            switch (Type)
            {
            case WeaponType.Pistol: type = HitType.PistolMelee; break;

            case WeaponType.Rifle: type = HitType.RifleMelee; break;

            case WeaponType.Shotgun: type = HitType.ShotgunMelee; break;

            case WeaponType.Sniper: type = HitType.SniperMelee; break;

            case WeaponType.Fist: type = HitType.Fist; break;

            case WeaponType.Machete: type = HitType.Machete; break;

            default:
                type = HitType.Fist;
                Debug.Assert(false, "Invalid melee type");
                break;
            }

            var hit = new Hit(other.ClosestPointOnBounds(transform.position), normal, Damage, Character.gameObject, other.gameObject, type, DamageResponseWaitTime);

            other.SendMessage("OnHit", hit, SendMessageOptions.DontRequireReceiver);

            for (int i = 0; i < _listeners.Length; i++)
            {
                _listeners[i].OnMeleeHit();
            }
        }
Example #5
0
 public void OnBlock(Hit hit)
 {
     playSound(Block, hit.Position);
 }
 /// <summary>
 /// Generates a hurt alert.
 /// </summary>
 public void OnHit(Hit hit)
 {
     _hurt.Start(transform.position, Hurt);
 }
Example #7
0
 /// <summary>
 /// Instantiates the block event.
 /// </summary>
 public void OnBlock(Hit hit)
 {
     instantiate(Block, hit.Position);
 }
 /// <summary>
 /// Generates a hurt alert.
 /// </summary>
 public void OnHit(Hit hit)
 {
     _hurt.Start(transform.position, Hurt, true, _actor, true);
 }
Example #9
0
 /// <summary>
 /// Broadcasts an alert.
 /// </summary>
 public void OnHit(Hit hit)
 {
     Alerts.Broadcast(hit.Position, Range, true, Actors.Get(hit.Attacker), false);
 }
Example #10
0
 /// <summary>
 /// Generates a hurt alert.
 /// </summary>
 public void OnHit(Hit hit)
 {
     Alerts.Broadcast(transform.position, Hurt, true, _actor, true);
 }
Example #11
0
        /// <summary>
        /// Cast a single bullet using raycasting.
        /// </summary>
        private bool fire(float delay, bool consume)
        {
            bool isFriend;
            var  direction = calculateRaycastDirection();
            var  hit       = Raycast(RaycastOrigin, direction, out isFriend, true);

            if (Character != null)
            {
                Character.KeepAiming();
            }

            if (!isFriend)
            {
                var end = hit.point;

                if (consume)
                {
                    Consume();
                }

                if (hit.collider == null)
                {
                    end = RaycastOrigin + Distance * direction;
                }

                var damage = Damage * (Character != null ? Character.DamageMultiplier : 1);

                HitType type;

                switch (Type)
                {
                case WeaponType.Pistol: type = HitType.Pistol; break;

                case WeaponType.Rifle: type = HitType.Rifle; break;

                case WeaponType.Shotgun: type = HitType.Shotgun; break;

                case WeaponType.Sniper: type = HitType.Sniper; break;

                default:
                    type = HitType.Pistol;
                    Debug.Assert(false, "Invalid gun type");
                    break;
                }

                var hitStruct = new Hit(hit.point, -direction, damage, Character.gameObject, hit.collider == null ? null : hit.collider.gameObject, type, DamageResponseWaitTime);

                if (Bullet != null)
                {
                    var bullet = GameObject.Instantiate(Bullet);
                    bullet.transform.position = Origin;
                    bullet.transform.LookAt(end);

                    var projectile = bullet.GetComponent <Projectile>();
                    var vector     = end - Origin;

                    var trail = bullet.GetComponent <TrailRenderer>();
                    if (trail == null)
                    {
                        trail = bullet.GetComponentInChildren <TrailRenderer>();
                    }

                    if (trail != null)
                    {
                        trail.Clear();
                    }

                    if (projectile != null)
                    {
                        projectile.Distance  = vector.magnitude;
                        projectile.Direction = vector.normalized;

                        if (hit.collider != null)
                        {
                            projectile.Target = hit.collider.gameObject;
                            projectile.Hit    = hitStruct;
                        }
                    }
                    else if (hit.collider != null)
                    {
                        hit.collider.SendMessage("OnHit", hitStruct, SendMessageOptions.DontRequireReceiver);
                    }

                    bullet.SetActive(true);
                }
                else if (hit.collider != null)
                {
                    hit.collider.SendMessage("OnHit", hitStruct, SendMessageOptions.DontRequireReceiver);
                }

                _hasJustFired = true;
                return(true);
            }
            else
            {
                _hasJustFired = true;
                return(false);
            }
        }