internal void HandleAbsorb(ref SpellHealInfo healInfo)
            {
                if (healInfo.Target.IsDead || healInfo.Heal == 0)
                {
                    return;
                }

                Unit target = healInfo.Target;
                IReadOnlyList <AuraEffect> absorbEffects = target.GetAuraEffects(AuraEffectType.AbsorbHeal);

                if (absorbEffects == null)
                {
                    return;
                }

                var absorbEffectCopies = new List <AuraEffect>(absorbEffects);

                for (int index = 0; index < absorbEffectCopies.Count; index++)
                {
                    AuraEffect absorbEffect = absorbEffectCopies[index];
                    if (!absorbEffect.Aura.ApplicationsByTargetId.ContainsKey(target.Id))
                    {
                        continue;
                    }
                    if (absorbEffect.Value <= 0.0f)
                    {
                        continue;
                    }

                    uint availableAbsorb = (uint)Mathf.CeilToInt(absorbEffect.Value);
                    uint effectiveAbsorb = System.Math.Min(availableAbsorb, healInfo.Heal);
                    healInfo.AbsorbHeal(effectiveAbsorb);
                    absorbEffect.ModifyValue(-effectiveAbsorb);

                    if (absorbEffect.Value <= 0.0f)
                    {
                        absorbEffect.Aura.Remove(AuraRemoveMode.Spell);
                    }
                }
            }
Beispiel #2
0
            internal void CalculateSpellHealingTaken(ref SpellHealInfo healInfo)
            {
                if (healInfo.Heal == 0 || !healInfo.Target.IsAlive)
                {
                    return;
                }

                Unit      healer    = healInfo.Healer;
                Unit      target    = healInfo.Target;
                SpellInfo spellInfo = healInfo.SpellInfo;

                healInfo.UpdateBase(healer.Spells.SpellHealingBonusDone(target, spellInfo, healInfo.Heal));
                healInfo.UpdateBase(target.Spells.SpellHealingBonusTaken(healer, spellInfo, healInfo.Heal));

                if (healInfo.HasCrit)
                {
                    uint criticalHeal = CalculateSpellCriticalHealing(healInfo.Heal);
                    healInfo.UpdateBase(criticalHeal);
                }

                HandleAbsorb(ref healInfo);
            }