// FinalStageShooting protected override void FinalStageShooting() { RaycastHit hitInfo; if (Physics.SphereCast(projectileOuter.position, swayRadius, projectileOuter.forward, out hitInfo, swayRange, hitMask)) { Collider hitCollider = hitInfo.collider; if (hitCollider.isTrigger) { return; } IDamageHandler handler = hitCollider.GetComponent <IDamageHandler>(); if (handler != null) { handler.TakeDamage(new DamageInfo(damage, projectileOuter.root, owner, EDamageType.Melee)); } HitEffect.SpawnHitEffect(hitEffect, hitInfo); Rigidbody tmpRb = hitCollider.attachedRigidbody; if (tmpRb != null && !tmpRb.isKinematic) { tmpRb.AddForce(projectileOuter.forward * (hitForce * 1.75f / (tmpRb.mass > 1f ? tmpRb.mass : 1f)), ForceMode.Impulse); } } base.FinalStageShooting(); }
// Set CrosshairColor private static void SetCrosshairColor() { if (GameSettings.DamageIndication == EDamageIndication.OFF || hitCollider == prevHitCollider) { return; } IDamageHandler handler = hitCollider.GetComponent <IDamageHandler>(); if (GameSettings.DamageIndication == EDamageIndication.ForAll) { if (handler != null && !handler.isPlayer && handler.isAlive) { HudElements.Crosshair.SetColor(ECrosshairColor.Damager); } else { HudElements.Crosshair.SetColor(ECrosshairColor.Normal); } } else if (GameSettings.DamageIndication == EDamageIndication.OnlyCharacters) { if (handler != null && handler.isNPC && handler.isAlive) { HudElements.Crosshair.SetColor(ECrosshairColor.Damager); } else { HudElements.Crosshair.SetColor(ECrosshairColor.Normal); } } }
private bool CheckPlayer() { var playerHit = Physics2D.CircleCast(transform.position, sightRange, Vector2.zero, 0, game.Layers.Player); if (!playerHit) { return(false); } Player player = playerHit.transform.GetComponent <Player>(); Debug.DrawLine(transform.position, (player.transform.position - transform.position).normalized * sightRange); //only target player if he is carrying a G bool hasG = player.Inventory.HasItem(EMapItem.GSource); if (!hasG) { return(false); } bool isWearingHat = player.TinFoilHat.IsActive; if (isWearingHat) { return(false); } attackTarget = playerHit.transform.GetComponent <Player>().Energy; attack = true; return(true); }
public void AddHandler(IDamageHandler handler) { if (handler == null) { return; } _handlers.Add(handler); }
/// <summary> /// Used to test if the reactor should process /// </summary> /// <returns></returns> public override bool TestActivate(IMessage rMessage) { if (!base.TestActivate(rMessage)) { return(false); } if (mActorCore == null || !mActorCore.IsAlive) { return(false); } DamageMessage lDamageMessage = rMessage as DamageMessage; if (lDamageMessage == null) { return(false); } if (lDamageMessage.Damage == 0f) { return(false); } if (lDamageMessage.ID != 0) { if (lDamageMessage.ID == CombatMessage.MSG_DEFENDER_KILLED) { return(false); } if (lDamageMessage.ID != CombatMessage.MSG_DEFENDER_ATTACKED) { return(false); } } CombatMessage lCombatMessage = rMessage as CombatMessage; if (lCombatMessage != null && lCombatMessage.Defender.transform.root.gameObject != mActorCore.gameObject) { return(false); } mDamageHandler = lCombatMessage.Defender.GetComponent <IDamageHandler>(); if (mDamageHandler == null) { Debug.LogError(mOwner + " recieved a damage message with a hit on " + lCombatMessage.Defender.transform + " but there is no IDamageHandler attached. Damage is ignored."); return(false); } mMessage = lDamageMessage; return(true); }
void FixedUpdate() { switch (gun_state) { case GunState.ready: break; case GunState.fire: float[] hsv = new float[3]; Color.RGBToHSV(StartColor, out hsv[0], out hsv[1], out hsv[2]); lr.startColor = UnityEngine.Random.ColorHSV(hsv[0] - ColorVarence, hsv[0] + ColorVarence); Color.RGBToHSV(EndColor, out hsv[0], out hsv[1], out hsv[2]); lr.endColor = UnityEngine.Random.ColorHSV(hsv[0] - ColorVarence, hsv[0] + ColorVarence); lr.SetPosition(0, this.transform.position); lr.SetPosition(1, this.transform.position + this.transform.up * WepponDist); this.transform.parent.gameObject.layer = LayerMask.NameToLayer("Ignore Raycast"); RaycastHit2D hit = Physics2D.Raycast(this.transform.position, this.transform.up, WepponDist); this.transform.parent.gameObject.layer = LayerMask.NameToLayer("Default"); if (hit) { lr.SetPosition(1, this.transform.position + this.transform.up * hit.distance); if (notify != null) { notify.Invoke(hit.transform.gameObject); IDamageHandler d = hit.transform.gameObject.GetComponent <IDamageHandler>(); if (d != null) { d.DealDamage(this.gameObject, WepponDamage); } } } CurrentFireDuration -= Time.deltaTime; if (CurrentFireDuration < 0) { gun_state = GunState.cooldown; CurrentGunCoolDownTime = TotalGunCoolDownTime; } break; case GunState.cooldown: CurrentGunCoolDownTime -= Time.deltaTime; if (CurrentGunCoolDownTime < 0) { gun_state = GunState.ready; } break; } }
/// <summary> /// Called when the effect collides with something. This will /// spawn the collision effects, impart damage and destroy the /// the attached object (if required). /// </summary> /// <param name="hit">The raycast that registered the hit.</param> void OnCollision(RaycastHit hit) { for (int i = 0; i < collisionEffects.Length; i++) { MagicEffect instance = Instantiate(collisionEffects[i], hit.point + hit.normal, new Quaternion()); instance.transform.LookAt(hit.point + hit.normal + hit.normal); IDamageHandler damageHandler = hit.collider.GetComponent <IDamageHandler>(); if (damageHandler != null) { damageHandler.AddDamage(damageAmount, hit, this); } IImpactHandler impactHandler = hit.collider.GetComponent <IImpactHandler>(); if (impactHandler != null) { impactHandler.HandlePointImpact(hit.point, transform.forward * impactForce); } Destroy(instance.gameObject, instance.duration); } }
private void Evaluate() { //Debug.Log("Evaluate "); attackTarget = null; targetPos = null; attack = false; idle = false; if (debug_idle) { Idle(); } var playerHit = Physics2D.CircleCast(transform.position, sightRange, Vector2.zero, 0, game.Layers.Player); //todo: only if he has G EReaction reaction = EReaction.None; if (CheckTrueNews()) { reaction = EReaction.What; } else if (CheckPlayer()) { reaction = EReaction.Trigger; } else if (WasBrodcastedRecently()) { attackTarget = lastTowerNoticed; reaction = EReaction.Trigger; attack = true; } else { if (Random.Range(0, 1f) > 0.5f) { Idle(); //todo: he doesnt stop //Debug.Log("Idle"); } else { float ranomX = Random.Range(-attackRange * 2, attackRange * 2); float ranomY = Random.Range(-attackRange * 2, attackRange * 2); targetPos = transform.position + new Vector3(ranomX, ranomY, 0); //Debug.Log("Mingle"); } } if (attack && attackTarget != null && GetDistanceTo(attackTarget.GetPosition()) < attackRange) { Attack(attackTarget); } bubble.SetReaction(reaction); if (reaction == EReaction.Trigger) { game.SoundManager.PlaySound(SoundManager.ESound.eAgro); } DoInTime(Evaluate, evaluateFrequency); }
private void Attack(IDamageHandler pTarget) { //Debug.Log("Attack " + pTarget); pTarget.OnReceivedDamage(damage); }
// 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); }
// Impact private void Impact() { movement = false; nextPosition = hitInfo.point; if (IsExplosionObject()) { return; } m_Transform.position = nextPosition; bool showHitTexture = (subType == EProjectileSubType.Bullet); IDamageHandler handler = hitInfo.collider.GetComponent <IDamageHandler>(); if (handler != null) { handler.TakeDamage(new DamageInfo(damage, m_Transform, owner, EDamageType.Impact)); showHitTexture = (handler.isPlayer == false && handler.isNPC == false); } HitEffect.SpawnHitEffect(decalObject, hitInfo, showHitTexture); Rigidbody tmpRb = hitInfo.collider.attachedRigidbody; if (tmpRb != null && tmpRb.isKinematic == false) { tmpRb.AddForce(m_Transform.forward * ((damage / 10f) * (damage * 20f) / 100f / (tmpRb.mass > 1f ? tmpRb.mass : 1f)), ForceMode.Impulse); } if (subType == EProjectileSubType.Arrow) { Collider tmpCollider = GetComponent <Collider>(); if (tmpCollider == null) { Debug.LogWarning("Collider is not found! Projectile(Arrow) has been destroyed! Warning in " + this.name); Destroy(gameObject); return; } tmpCollider.enabled = true; tmpRb = tmpCollider.attachedRigidbody; if (type == EProjectileType.Ballistic && tmpRb != null) { tmpRb.velocity = Vector3.zero; tmpRb.useGravity = false; tmpRb.isKinematic = true; tmpRb.Sleep(); } Pickup tmpPickup = GetComponent <Pickup>(); if (tmpPickup != null) { tmpPickup.enabled = true; } m_Transform.SetParent(hitInfo.transform); } else { Destroy(gameObject); } }
private void Awake() { damageHandler = GetComponent <IDamageHandler>(); damageHandler.UndamagedHit += OnUndamagedHit; }