Core/Auras: Implemented EstimatedPoints for SMSG_AURA_UPDATE
Port From (https://github.com/TrinityCore/TrinityCore/commit/bda948fc5c3bd3675edb98f6807d8481bca50fb0)
This commit is contained in:
@@ -123,6 +123,24 @@ namespace Game.Spells
|
||||
GetBase().CallScriptEffectCalcAmountHandlers(this, ref amount, ref m_canBeRecalculated);
|
||||
if (!GetSpellEffectInfo().EffectAttributes.HasFlag(SpellEffectAttributes.NoScaleWithStack))
|
||||
amount *= GetBase().GetStackAmount();
|
||||
|
||||
if (caster)
|
||||
{
|
||||
uint stackAmountForBonuses = !GetSpellEffectInfo().EffectAttributes.HasFlag(SpellEffectAttributes.NoScaleWithStack) ? GetBase().GetStackAmount() : 1u;
|
||||
|
||||
switch (GetAuraType())
|
||||
{
|
||||
case AuraType.PeriodicDamage:
|
||||
case AuraType.PeriodicLeech:
|
||||
_estimatedAmount = caster.SpellDamageBonusDone(GetBase().GetUnitOwner(), GetSpellInfo(), (uint)amount, DamageEffectType.DOT, GetSpellEffectInfo(), stackAmountForBonuses);
|
||||
break;
|
||||
case AuraType.PeriodicHeal:
|
||||
_estimatedAmount = caster.SpellHealingBonusDone(GetBase().GetUnitOwner(), GetSpellInfo(), (uint)amount, DamageEffectType.DOT, GetSpellEffectInfo(), stackAmountForBonuses);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return amount;
|
||||
}
|
||||
|
||||
@@ -774,6 +792,8 @@ namespace Game.Spells
|
||||
public bool HasAmount() { return _amount != 0; }
|
||||
public void SetAmount(int amount) { _amount = amount; m_canBeRecalculated = false; }
|
||||
|
||||
public float? GetEstimatedAmount() { return _estimatedAmount; }
|
||||
|
||||
public int GetPeriodicTimer() { return _periodicTimer; }
|
||||
public void SetPeriodicTimer(int periodicTimer) { _periodicTimer = periodicTimer; }
|
||||
|
||||
@@ -820,6 +840,7 @@ namespace Game.Spells
|
||||
|
||||
public int m_baseAmount;
|
||||
int _amount;
|
||||
float? _estimatedAmount; // for periodic damage and healing auras this will include damage done bonuses
|
||||
|
||||
// periodic stuff
|
||||
int _periodicTimer;
|
||||
@@ -4893,6 +4914,8 @@ namespace Game.Spells
|
||||
|
||||
CleanDamage cleanDamage = new(0, 0, WeaponAttackType.BaseAttack, MeleeHitOutcome.Normal);
|
||||
|
||||
uint stackAmountForBonuses = !GetSpellEffectInfo().EffectAttributes.HasFlag(SpellEffectAttributes.NoScaleWithStack) ? GetBase().GetStackAmount() : 1u;
|
||||
|
||||
// ignore non positive values (can be result apply spellmods to aura damage
|
||||
uint damage = (uint)Math.Max(GetAmount(), 0);
|
||||
|
||||
@@ -4904,9 +4927,9 @@ namespace Game.Spells
|
||||
case AuraType.PeriodicDamage:
|
||||
{
|
||||
if (caster != null)
|
||||
damage = (uint)caster.SpellDamageBonusDone(target, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), GetBase().GetStackAmount());
|
||||
damage = caster.SpellDamageBonusDone(target, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), stackAmountForBonuses);
|
||||
|
||||
damage = target.SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), GetBase().GetStackAmount());
|
||||
damage = target.SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), stackAmountForBonuses);
|
||||
|
||||
// There is a Chance to make a Soul Shard when Drain soul does damage
|
||||
if (caster != null && GetSpellInfo().SpellFamilyName == SpellFamilyNames.Warlock && GetSpellInfo().SpellFamilyFlags[0].HasAnyFlag(0x00004000u))
|
||||
@@ -4946,7 +4969,7 @@ namespace Game.Spells
|
||||
case AuraType.PeriodicDamagePercent:
|
||||
// ceil obtained value, it may happen that 10 ticks for 10% damage may not kill owner
|
||||
damage = (uint)Math.Ceiling(MathFunctions.CalculatePct((float)target.GetMaxHealth(), (float)damage));
|
||||
damage = target.SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), GetBase().GetStackAmount());
|
||||
damage = target.SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), stackAmountForBonuses);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -5026,13 +5049,15 @@ namespace Game.Spells
|
||||
|
||||
CleanDamage cleanDamage = new(0, 0, WeaponAttackType.BaseAttack, MeleeHitOutcome.Normal);
|
||||
|
||||
uint stackAmountForBonuses = !GetSpellEffectInfo().EffectAttributes.HasFlag(SpellEffectAttributes.NoScaleWithStack) ? GetBase().GetStackAmount() : 1u;
|
||||
|
||||
// ignore negative values (can be result apply spellmods to aura damage
|
||||
uint damage = (uint)Math.Max(GetAmount(), 0);
|
||||
|
||||
if (caster)
|
||||
damage = caster.SpellDamageBonusDone(target, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), GetBase().GetStackAmount());
|
||||
damage = caster.SpellDamageBonusDone(target, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), stackAmountForBonuses);
|
||||
|
||||
damage = target.SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), GetBase().GetStackAmount());
|
||||
damage = target.SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), stackAmountForBonuses);
|
||||
|
||||
bool crit = RandomHelper.randChance(GetCritChanceFor(caster, target));
|
||||
if (crit)
|
||||
@@ -5093,8 +5118,8 @@ namespace Game.Spells
|
||||
|
||||
float gainMultiplier = GetSpellEffectInfo().CalcValueMultiplier(caster);
|
||||
|
||||
uint heal = (caster.SpellHealingBonusDone(caster, GetSpellInfo(), (uint)(new_damage * gainMultiplier), DamageEffectType.DOT, GetSpellEffectInfo(), GetBase().GetStackAmount()));
|
||||
heal = caster.SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DamageEffectType.DOT, GetSpellEffectInfo(), GetBase().GetStackAmount());
|
||||
uint heal = caster.SpellHealingBonusDone(caster, GetSpellInfo(), (uint)(new_damage * gainMultiplier), DamageEffectType.DOT, GetSpellEffectInfo(), stackAmountForBonuses);
|
||||
heal = caster.SpellHealingBonusTaken(caster, GetSpellInfo(), heal, DamageEffectType.DOT, GetSpellEffectInfo(), stackAmountForBonuses);
|
||||
|
||||
HealInfo healInfo = new(caster, caster, heal, GetSpellInfo(), GetSpellInfo().GetSchoolMask());
|
||||
caster.HealBySpell(healInfo);
|
||||
@@ -5157,17 +5182,17 @@ namespace Game.Spells
|
||||
if (GetBase().IsPermanent() && target.IsFullHealth())
|
||||
return;
|
||||
|
||||
uint stackAmountForBonuses = !GetSpellEffectInfo().EffectAttributes.HasFlag(SpellEffectAttributes.NoScaleWithStack) ? GetBase().GetStackAmount() : 1u;
|
||||
|
||||
// ignore negative values (can be result apply spellmods to aura damage
|
||||
uint damage = (uint)Math.Max(GetAmount(), 0);
|
||||
|
||||
if (GetAuraType() == AuraType.ObsModHealth)
|
||||
{
|
||||
damage = (uint)target.CountPctFromMaxHealth((int)damage);
|
||||
}
|
||||
else if (caster != null)
|
||||
damage = caster.SpellHealingBonusDone(target, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), GetBase().GetStackAmount());
|
||||
damage = caster.SpellHealingBonusDone(target, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), stackAmountForBonuses);
|
||||
|
||||
damage = target.SpellHealingBonusTaken(caster, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), GetBase().GetStackAmount());
|
||||
damage = target.SpellHealingBonusTaken(caster, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), stackAmountForBonuses);
|
||||
|
||||
bool crit = RandomHelper.randChance(GetCritChanceFor(caster, target));
|
||||
if (crit)
|
||||
|
||||
Reference in New Issue
Block a user