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); } } }
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); }