예제 #1
0
        void ShowDamageText(object healthable, HealthChangeEventArgs args)
        {
            if (worldUiCanvas.worldUiObjects.damageTextFeed == null)
            {
                return;
            }

            Actor owner = args.modifier.GetOwner();

            // TODO hadcoded tag
            // Only player damage showing
            if (owner == null || !owner.CompareTag("Player"))
            {
                return;
            }

            GameObject damageText = worldUiCanvas.SpawnUi(worldUiCanvas.worldUiObjects.damageTextFeed, WorldUiType.DamageFeed);

            FloatingHealthChange healthChange = damageText.GetComponent <FloatingHealthChange>();

            if (healthChange == null)
            {
                return;
            }

            healthChange.Init(transform, args.modifier.GetValue().ToString(), args.modifier.IsCrit());
        }
예제 #2
0
        public virtual void TakeDamage(Damage damage)
        {
            if (currentHealth <= 0)
            {
                return;
            }

            int damageValue = Mathf.FloorToInt(damage.GetValue() * GetArmorMultiplier());

            damageValue = Mathf.Clamp(damageValue, 0, int.MaxValue);

            currentHealth -= damageValue;

            var finalDamage = new Damage(damageValue, damage.GetOwner(), damage.IsCrit());

            lastDamage = finalDamage;

            if (currentHealth <= 0)
            {
                Die();
            }

            onGetDamage?.Invoke(finalDamage);

            HealthChangeEventArgs args = new HealthChangeEventArgs
            {
                healthChange = -damageValue, actor = actor, modifier = finalDamage
            };

            OnHealthChange?.Invoke(this, args);
        }
예제 #3
0
        public void OnHealthUpdate(HealthChangeEventArgs e)
        {
            float perc = Mathf.Clamp01(1 - (float)e.CurrentHitPoints / e.MaxHitPoints);

            this._audioMixer.SetFloat(_DISTORTION_NAME, _distortionCurve.Evaluate(perc));
            this._audioMixer.SetFloat(_PITCH_NAME, _pitchCurve.Evaluate(perc));
        }
예제 #4
0
 private void PlayDamageSound(object sender, HealthChangeEventArgs e)
 {
     if (e.oldValue > e.newValue)
     {
         FindObjectOfType <AudioManager>().Play("attack");
     }
 }
예제 #5
0
        public virtual void TakeDamage(Damage damage)
        {
            if (currentHealth <= 0)
            {
                return;
            }
            int damageValue = Mathf.FloorToInt(damage.GetValue() * GetArmorMultiplier());

            damageValue    = Mathf.Clamp(damageValue, 0, int.MaxValue);
            currentHealth -= damageValue;
            lastDamage     = damage;
            if (currentHealth <= 0)
            {
                Die();
            }

            onGetDamage?.Invoke(damage);


            HealthChangeEventArgs args = new HealthChangeEventArgs();

            args.healthChange = -damageValue;
            args.initiator    = damage.GetOwner();
            args.modifier     = damage;

            OnHealthChange?.Invoke(this, args);
        }
예제 #6
0
 public void OnPlayerHealthChanged(HealthChangeEventArgs e)
 {
     if (e.CurrentHitPoints != 0)
     {
         return;
     }
     SceneManager.LoadScene(SceneManager.GetActiveScene().name);
 }
예제 #7
0
 void OnGetDamage(object obj, HealthChangeEventArgs arg)
 {
     if (IsDead())
     {
         mainCollider.enabled = false;
         aliveObject.SetActive(false);
         deadObject.SetActive(true);
     }
 }
예제 #8
0
    private void UpdateHealthText(object sender, HealthChangeEventArgs e)
    {
        this.healthText.text = healthSystem.health.ToString();

        if (e.oldValue > e.newValue)
        {
            DamageText.Create(transform.position, e.oldValue - e.newValue);
        }
    }
예제 #9
0
        void ShowDamageText(object healthable, HealthChangeEventArgs args)
        {
            Actor owner = args.modifier.GetOwner();

            if (owner == null || !owner.IsPlayer())
            {
                return;
            }

            Add(args.actor.transform, args.modifier.GetValue().ToString(), args.modifier.IsCrit());
        }
예제 #10
0
 void ShowHealChange(object healthable, HealthChangeEventArgs args)
 {
     if (args.healthChange > 0)
     {
         StartCoroutine(SpawnParticle(healParticle, transform, particleLifetime));
     }
     else if (args.healthChange < 0)
     {
         StartCoroutine(SpawnParticle(hitParticle, transform, particleLifetime));
     }
 }
예제 #11
0
        protected void UpdateCurrentStats()
        {
            currentMaxHealth = GetMaxHealth();

            if (currentHealth > currentMaxHealth)
            {
                currentHealth = currentMaxHealth;
            }

            HealthChangeEventArgs args = new HealthChangeEventArgs();

            OnHealthChange?.Invoke(this, args);
        }
예제 #12
0
        public void Heal(Heal heal)
        {
            float healAmount = heal.GetValue() / 100f * GetMaxHealth();

            currentHealth += Mathf.FloorToInt(healAmount);

            if (currentHealth > currentMaxHealth)
            {
                currentHealth = currentMaxHealth;
            }

            HealthChangeEventArgs args = new HealthChangeEventArgs();

            args.healthChange = Mathf.FloorToInt(healAmount);
            args.modifier     = heal;
            OnHealthChange?.Invoke(this, args);
        }
예제 #13
0
 void ShowHealChange(object healthable, HealthChangeEventArgs args)
 {
     if (args.healthChange > 0)
     {
         StartCoroutine(SpawnParticle(healParticle, target, particleLifetime));
     }
     else if (args.healthChange < 0)
     {
         if (args.initiator != null)
         {
             Quaternion quaternion = new Quaternion();
             quaternion.SetLookRotation(args.initiator.transform.position);
             StartCoroutine(SpawnParticle(hitParticle, target, particleLifetime, quaternion));
             return;
         }
         StartCoroutine(SpawnParticle(hitParticle, target, particleLifetime));
     }
 }
예제 #14
0
        private void ShowHealChange(object healthable, HealthChangeEventArgs args)
        {
            if (args.healthChange > 0)
            {
                StartCoroutine(SpawnParticle(healParticle, target, particleLifetime));
                return;
            }

            var damageInitiator = args.modifier.GetOwner();

            if (damageInitiator == null)
            {
                StartCoroutine(SpawnParticle(hitParticle, target, particleLifetime));
                return;
            }

            Quaternion quaternion = new Quaternion();

            quaternion.SetLookRotation(damageInitiator.transform.position);
            StartCoroutine(SpawnParticle(hitParticle, target, particleLifetime, quaternion));
        }
예제 #15
0
 public void OnHealthChanged(HealthChangeEventArgs e)
 {
     this._text.text       = $"{e.CurrentHitPoints}/{e.MaxHitPoints} hp";
     this._fill.fillAmount = (float)e.CurrentHitPoints / e.MaxHitPoints;
     this._color.color     = _gradientColor.Evaluate(this._fill.fillAmount);
 }
예제 #16
0
 private void OnGetHit(object obj, HealthChangeEventArgs eventArgs)
 {
     Stop();
     doing = false;
     healthable.OnHealthChange -= OnGetHit;
 }