Пример #1
0
    void TakeDamage(float damage)
    {
        if (IsInvulnerable)
        {
            return;
        }
        damage *= entityStats.GetDamageReceivedModifier();
        LowerHealthAmount(damage);

        // Trigger floating damage text.
        Vector3 damageTextPosition = mainCamera.WorldToScreenPoint(transform.position);

        damageTextPosition.y += 15f;
        Transform          instantiatedDamageText = Instantiate(floatingDamageTextPrefab, GameManager.HUD.transform);
        FloatingDamageText floatingDamageText     = instantiatedDamageText.GetComponent <FloatingDamageText>();

        floatingDamageText.DamageValue       = damage;
        floatingDamageText.attachedTransform = transform;

        // Expose & update attached health bar.
        unitHealthBarObject.SetActive(true);
        unitHealthBar.UpdateHealth(currentHealth);

        entityEmitter.EmitEvent(EntityEvents.HealthChanged);
    }
Пример #2
0
 public static void Initialize()
 {
     canvas = GameObject.Find("HubGUI");
     if (!popupText)
     {
         popupText = Resources.Load <FloatingDamageText>("Prefabs/DTextParent");
     }
 }
Пример #3
0
    public static void CreateFloatingText(string text, Transform location)
    {
        FloatingDamageText instance       = Instantiate(popupText);
        Vector2            screenPosition = Camera.main.WorldToScreenPoint(new Vector2(location.position.x + Random.Range(0f, 2.5f), location.position.y + Random.Range(1f, 1.5f)));

        instance.transform.SetParent(canvas.transform, false);
        instance.transform.position = screenPosition;
        instance.SetText(text);
    }
Пример #4
0
    public void GetHealed(float healing)
    {
        RaiseHealthAmount(healing);

        // Trigger floating damage text.
        Vector3 damageTextPosition = mainCamera.WorldToScreenPoint(transform.position);

        damageTextPosition.y += 15f;
        Transform          instantiatedDamageText = Instantiate(floatingDamageTextPrefab, GameManager.HUD.transform);
        FloatingDamageText floatingDamageText     = instantiatedDamageText.GetComponent <FloatingDamageText>();

        floatingDamageText.isHealing         = true;
        floatingDamageText.DamageValue       = healing;
        floatingDamageText.attachedTransform = transform;

        // Expose & update attached health bar.
        unitHealthBarObject.SetActive(true);
        unitHealthBar.UpdateHealth(currentHealth);
    }
Пример #5
0
    protected override void Start()
    {
        moveSpeed = 5.0f;
        control = GetComponent<CharacterController>();
        base.Start(); //gets reference to weapon, among other things.
        healthBar = (Transform) GameObject.Instantiate(healthBarStatic, transform.position, Quaternion.identity);
        floatingDamageText = (GameObject) GameObject.Instantiate(Resources.Load("FloatingDamageText"), transform.position, Quaternion.identity);
        floatingDamageTextScript = floatingDamageText.GetComponent<FloatingDamageText>();
        floatingDamageTextScript.parent = transform;

        floatingXPText = (GameObject) GameObject.Instantiate(Resources.Load("FloatingXPText"), transform.position, Quaternion.identity);
        floatingXPTextScript = floatingXPText.GetComponent<FloatingXPText>();
        floatingXPTextScript.parent2 = transform;
    }
Пример #6
0
    public void ApplyDamage(Dictionary <ElementType, float> damage, OnHitDataContainer onHitData, bool isHit,
                            bool isFromSecondaryEffect, EffectType?sourceType = null,
                            EffectApplicationFlags restrictionFlags           = EffectApplicationFlags.NONE)
    {
        float total = 0;

        if (Data.IsDead)
        {
            return;
        }

        if (Data.IsDead && isHit)
        {
            return;
        }

        Dictionary <ElementType, float> damageTaken = new Dictionary <ElementType, float>(damage);

        float damageTakenModifier  = Data.DamageTakenModifier;
        float blockDamageReduction = 1f;

        if (isHit)
        {
            if (!isFromSecondaryEffect)
            {
                damageTakenModifier *= onHitData.directHitDamage;
            }

            if (DidTargetBlock(this))
            {
                blockDamageReduction *= 1f - Data.BlockProtection;
                damageTakenModifier  *= blockDamageReduction;
                Data.OnHitData.ApplyTriggerEffects(TriggerType.ON_BLOCK, onHitData.SourceActor);
            }

            //if (isBoss)
            //damageTakenModifier *= onHitData.vsBossDamage;
        }

        foreach (ElementType elementType in damage.Keys)
        {
            bool isDamageTakenNonZero = false;
            if (elementType == ElementType.PHYSICAL && damage.ContainsKey(ElementType.PHYSICAL))
            {
                float armorReductionRate = 1.0f;
                if (isHit && Data.Armor > 0)
                {
                    armorReductionRate = 1.0f - (Data.Armor / (Data.Armor + damage[ElementType.PHYSICAL]));
                }
                float resistanceReductionRate = 1.0f - (Data.GetResistance(ElementType.PHYSICAL) / 100f);
                float physicalReduction       = (armorReductionRate * resistanceReductionRate) + (onHitData.GetNegation(ElementType.PHYSICAL) / 100f);
                //Debug.Log(Data.GetResistance(ElementType.PHYSICAL) + " " + onHitData.physicalNegation + " " + damage[ElementType.PHYSICAL]);
                float physicalDamage = physicalReduction * damage[ElementType.PHYSICAL] * damageTakenModifier;
                total += Math.Max(0, physicalDamage);
                damageTaken[ElementType.PHYSICAL] = (damage[ElementType.PHYSICAL] * blockDamageReduction);
                isDamageTakenNonZero = physicalDamage > 0;
            }
            else
            {
                if (damage.ContainsKey(elementType))
                {
                    float nonPhysicalDamage = (1f - (Data.GetResistance(elementType) - onHitData.GetNegation(elementType)) / 100f) * damage[elementType] * damageTakenModifier;
                    total += Math.Max(0, nonPhysicalDamage);
                    damageTaken[elementType] = (damage[elementType] * blockDamageReduction);
                    isDamageTakenNonZero     = nonPhysicalDamage > 0;
                }
            }

            if (isHit && isDamageTakenNonZero)
            {
                ParticleManager.Instance.EmitOnHitEffect(elementType, transform.position);
            }
        }

        float actualDamageTaken = total;

        if (sourceType == EffectType.POISON)
        {
            total = ModifyCurrentShield(total * Data.PoisonResistance, true) + (total * (1f - Data.PoisonResistance));
        }
        else
        {
            total = ModifyCurrentShield(total, true);
        }

        actualDamageTaken -= total;

        if (Data.HealthIsHitsToKill && isHit && total >= 1f)
        {
            ModifyCurrentHealth(1);

            actualDamageTaken += 1;
        }
        else if (total > 0)
        {
            MassShieldAura massShield = (MassShieldAura)GetStatusEffect(EffectType.MASS_SHIELD_AURA);
            if (massShield != null && massShield.Source != this)
            {
                total = massShield.TransferDamage(total * massShield.DamageTransferRate) + total * (1f - massShield.DamageTransferRate);
            }

            BodyguardAura bodyguard = (BodyguardAura)GetStatusEffect(EffectType.BODYGUARD_AURA);
            if (isHit && bodyguard != null && bodyguard.Source != this)
            {
                if (bodyguard.TransferDamage(total, out float damageMod))
                {
                    total *= 1f - bodyguard.DamageTransferRate;
                    foreach (ElementType element in Enum.GetValues(typeof(ElementType)))
                    {
                        if (damage.ContainsKey(element))
                        {
                            damage[element] *= damageMod;
                        }
                    }
                    bodyguard.Source.ApplyAfterHitEffects(damage, onHitData, restrictionFlags);
                }
            }

            actualDamageTaken += total;

            ModifyCurrentHealth(total);
        }

        if (onHitData.SourceActor != this)
        {
            if (Data.IsDead)
            {
                if (onHitData.SourceActor is HeroActor hero)
                {
                    hero.Data.killCount++;
                }

                onHitData.ApplyTriggerEffects(TriggerType.ON_KILL, this);

                if (isHit)
                {
                    onHitData.ApplyTriggerEffects(TriggerType.ON_HIT_KILL, this);
                }
            }
            else if (isHit)
            {
                Data.OnHitData.ApplyTriggerEffects(TriggerType.WHEN_HIT_BY, onHitData.SourceActor);
            }
        }

        if ((GameManager.Instance.PlayerStats.showDamageNumbers) && (isHit || sourceType == EffectType.RETALIATION_DAMAGE))
        {
            FloatingDamageText damageText = StageManager.Instance.BattleManager.DamageTextPool.GetDamageText();
            damageText.transform.SetParent(StageManager.Instance.WorldCanvas.transform, false);
            damageText.transform.position = this.transform.position;


            if (sourceType == EffectType.RETALIATION_DAMAGE)
            {
                damageText.SetDamageText(actualDamageTaken, Color.gray);
            }
            else
            {
                damageText.SetDamageText(actualDamageTaken, Color.white);
            }
        }

        if (isHit)
        {
            ApplyAfterHitEffects(damageTaken, onHitData, restrictionFlags);
        }
    }