Exemplo n.º 1
0
        // 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();
        }
Exemplo n.º 2
0
        // 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);
                }
            }
        }
Exemplo n.º 3
0
    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);
    }
Exemplo n.º 4
0
        public void AddHandler(IDamageHandler handler)
        {
            if (handler == null)
            {
                return;
            }

            _handlers.Add(handler);
        }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 6
0
    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);
            }
        }
Exemplo n.º 8
0
    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);
    }
Exemplo n.º 9
0
 private void Attack(IDamageHandler pTarget)
 {
     //Debug.Log("Attack " + pTarget);
     pTarget.OnReceivedDamage(damage);
 }
Exemplo n.º 10
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);
        }
Exemplo n.º 11
0
        // 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);
            }
        }
Exemplo n.º 12
0
    private void Awake()
    {
        damageHandler = GetComponent <IDamageHandler>();

        damageHandler.UndamagedHit += OnUndamagedHit;
    }