/// <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); }
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(); } }
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); }
/// <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); }
/// <summary> /// Broadcasts an alert. /// </summary> public void OnHit(Hit hit) { Alerts.Broadcast(hit.Position, Range, true, Actors.Get(hit.Attacker), false); }
/// <summary> /// Generates a hurt alert. /// </summary> public void OnHit(Hit hit) { Alerts.Broadcast(transform.position, Hurt, true, _actor, true); }
/// <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); } }