Core/Auras: Implemented SPELL_AURA_PERIODIC_WEAPON_PERCENT_DAMAGE

Port From (https://github.com/TrinityCore/TrinityCore/commit/5ed75bb2d3fdc5bd2ee4dddb748db291fe3b1541)
This commit is contained in:
hondacrx
2021-02-22 15:29:14 -05:00
parent 253fd8b976
commit f15cc130fa
7 changed files with 100 additions and 46 deletions
@@ -1920,7 +1920,7 @@ namespace Framework.Constants
Unk6 = 0x40, // 6
Unk7 = 0x80, // 7
Unk8 = 0x100, // 8
Unk9 = 0x200, // 9
IgnoreCastingDisabled = 0x200, // 9
Unk10 = 0x400, // 10
Unk11 = 0x800, // 11
Unk12 = 0x1000, // 12
@@ -2023,7 +2023,7 @@ namespace Framework.Constants
IncreseCurrencyCap = 14,
RitualActivatePortal = 15, // Unused (4.3.4)
QuestComplete = 16,
WeaponDamageNoschool = 17,
WeaponDamageNoSchool = 17,
Resurrect = 18,
AddExtraAttacks = 19,
Dodge = 20,
+8
View File
@@ -1425,6 +1425,14 @@ namespace Game.Entities
return true;
}
public bool HasAuraTypeWithFamilyFlags(AuraType auraType, uint familyName, FlagArray128 familyFlags)
{
foreach (AuraEffect aura in GetAuraEffectsByType(auraType))
if (aura.GetSpellInfo().SpellFamilyName == (SpellFamilyNames)familyName && aura.GetSpellInfo().SpellFamilyFlags & familyFlags)
return true;
return false;
}
bool HasBreakableByDamageAuraType(AuraType type, uint excludeAura)
{
var auras = GetAuraEffectsByType(type);
+54 -33
View File
@@ -579,6 +579,7 @@ namespace Game.Spells
HandlePeriodicTriggerSpellWithValueAuraTick(target, caster);
break;
case AuraType.PeriodicDamage:
case AuraType.PeriodicWeaponPercentDamage:
case AuraType.PeriodicDamagePercent:
HandlePeriodicDamageAurasTick(target, caster);
break;
@@ -5299,43 +5300,63 @@ namespace Game.Spells
if (isAreaAura)
Global.ScriptMgr.ModifyPeriodicDamageAurasTick(target, caster, ref damage);
if (GetAuraType() == AuraType.PeriodicDamage)
switch (GetAuraType())
{
if (isAreaAura)
damage = (uint)(caster.SpellDamageBonusDone(target, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), GetBase().GetStackAmount()) * caster.SpellDamagePctDone(target, m_spellInfo, DamageEffectType.DOT));
damage = target.SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), GetBase().GetStackAmount());
// Calculate armor mitigation
if (caster.IsDamageReducedByArmor(GetSpellInfo().GetSchoolMask(), GetSpellInfo(), (sbyte)GetEffIndex()))
{
uint damageReductedArmor = caster.CalcArmorReducedDamage(caster, target, damage, GetSpellInfo());
cleanDamage.mitigated_damage += damage - damageReductedArmor;
damage = damageReductedArmor;
}
// There is a Chance to make a Soul Shard when Drain soul does damage
if (GetSpellInfo().SpellFamilyName == SpellFamilyNames.Warlock && GetSpellInfo().SpellFamilyFlags[0].HasAnyFlag(0x00004000u))
{
if (caster.IsTypeId(TypeId.Player) && caster.ToPlayer().IsHonorOrXPTarget(target))
caster.CastSpell(caster, 95810, true, null, this);
}
if (GetSpellInfo().SpellFamilyName == SpellFamilyNames.Generic)
{
switch (GetId())
case AuraType.PeriodicDamage:
{
case 70911: // Unbound Plague
case 72854: // Unbound Plague
case 72855: // Unbound Plague
case 72856: // Unbound Plague
damage *= (uint)Math.Pow(1.25f, m_tickNumber);
break;
default:
break;
if (isAreaAura)
damage = (uint)(caster.SpellDamageBonusDone(target, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), GetBase().GetStackAmount()) * caster.SpellDamagePctDone(target, m_spellInfo, DamageEffectType.DOT));
damage = target.SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DamageEffectType.DOT, GetSpellEffectInfo(), GetBase().GetStackAmount());
// Calculate armor mitigation
if (caster.IsDamageReducedByArmor(GetSpellInfo().GetSchoolMask(), GetSpellInfo(), (sbyte)GetEffIndex()))
{
uint damageReductedArmor = caster.CalcArmorReducedDamage(caster, target, damage, GetSpellInfo());
cleanDamage.mitigated_damage += damage - damageReductedArmor;
damage = damageReductedArmor;
}
// There is a Chance to make a Soul Shard when Drain soul does damage
if (GetSpellInfo().SpellFamilyName == SpellFamilyNames.Warlock && GetSpellInfo().SpellFamilyFlags[0].HasAnyFlag(0x00004000u))
{
if (caster.IsTypeId(TypeId.Player) && caster.ToPlayer().IsHonorOrXPTarget(target))
caster.CastSpell(caster, 95810, true, null, this);
}
if (GetSpellInfo().SpellFamilyName == SpellFamilyNames.Generic)
{
switch (GetId())
{
case 70911: // Unbound Plague
case 72854: // Unbound Plague
case 72855: // Unbound Plague
case 72856: // Unbound Plague
damage *= (uint)Math.Pow(1.25f, m_tickNumber);
break;
default:
break;
}
}
break;
}
}
case AuraType.PeriodicWeaponPercentDamage:
{
WeaponAttackType attackType = GetSpellInfo().GetAttackType();
uint weaponDamage = MathFunctions.CalculatePct(caster.CalculateDamage(attackType, false, true), GetAmount());
// Add melee damage bonuses (also check for negative)
uint damageBonusDone = caster.MeleeDamageBonusDone(target, Math.Max(weaponDamage, 0), attackType, GetSpellInfo());
damage = target.MeleeDamageBonusTaken(caster, damageBonusDone, attackType, DamageEffectType.DOT, GetSpellInfo());
break;
}
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));
break;
default:
break;
}
else // ceil obtained value, it may happen that 10 ticks for 10% damage may not kill owner
damage = (uint)Math.Ceiling((float)MathFunctions.CalculatePct(target.GetMaxHealth(), damage));
if (!m_spellInfo.HasAttribute(SpellAttr4.FixedDamage))
{
+28 -3
View File
@@ -4448,8 +4448,33 @@ namespace Game.Spells
if (m_caster.IsTypeId(TypeId.Player))
{
//can cast triggered (by aura only?) spells while have this flag
if (!_triggeredCastFlags.HasAnyFlag(TriggerCastFlags.IgnoreCasterAurastate) && m_caster.ToPlayer().HasPlayerFlag(PlayerFlags.AllowOnlyAbility))
return SpellCastResult.SpellInProgress;
if (!_triggeredCastFlags.HasAnyFlag(TriggerCastFlags.IgnoreCasterAurastate))
{
// These two auras check SpellFamilyName defined by db2 class data instead of current spell SpellFamilyName
if (m_caster.HasAuraType(AuraType.DisableCastingExceptAbilities)
&& !m_spellInfo.HasAttribute(SpellAttr0.ReqAmmo)
&& !m_spellInfo.HasEffect(SpellEffectName.Attack)
&& !m_spellInfo.HasAttribute(SpellAttr12.IgnoreCastingDisabled)
&& !m_caster.HasAuraTypeWithFamilyFlags(AuraType.DisableCastingExceptAbilities, CliDB.ChrClassesStorage.LookupByKey(m_caster.GetClass()).SpellClassSet, m_spellInfo.SpellFamilyFlags))
return SpellCastResult.CantDoThatRightNow;
if (m_caster.HasAuraType(AuraType.DisableAttackingExceptAbilities))
{
if (!m_caster.HasAuraTypeWithFamilyFlags(AuraType.DisableAttackingExceptAbilities, CliDB.ChrClassesStorage.LookupByKey(m_caster.GetClass()).SpellClassSet, m_spellInfo.SpellFamilyFlags))
{
if (m_spellInfo.HasAttribute(SpellAttr0.ReqAmmo)
|| m_spellInfo.IsNextMeleeSwingSpell()
|| m_spellInfo.HasAttribute(SpellAttr1.MeleeCombatStart)
|| m_spellInfo.HasAttribute(SpellAttr2.Unk20)
|| m_spellInfo.HasEffect(SpellEffectName.Attack)
|| m_spellInfo.HasEffect(SpellEffectName.NormalizedWeaponDmg)
|| m_spellInfo.HasEffect(SpellEffectName.WeaponDamageNoSchool)
|| m_spellInfo.HasEffect(SpellEffectName.WeaponPercentDamage)
|| m_spellInfo.HasEffect(SpellEffectName.WeaponDamage))
return SpellCastResult.CantDoThatRightNow;
}
}
}
// check if we are using a potion in combat for the 2nd+ time. Cooldown is added only after caster gets out of combat
if (!IsIgnoringCooldowns() && m_caster.ToPlayer().GetLastPotionId() != 0 && m_CastItem && (m_CastItem.IsPotion() || m_spellInfo.IsCooldownStartedOnEvent()))
@@ -6306,7 +6331,7 @@ namespace Game.Spells
break;
}
case SpellEffectName.WeaponDamage:
case SpellEffectName.WeaponDamageNoschool:
case SpellEffectName.WeaponDamageNoSchool:
{
if (!m_caster.IsTypeId(TypeId.Player))
return SpellCastResult.TargetNotPlayer;
+4 -4
View File
@@ -2454,7 +2454,7 @@ namespace Game.Spells
unitTarget.ToCreature().GetAI().AttackStart(m_caster);
}
[SpellEffectHandler(SpellEffectName.WeaponDamageNoschool)]
[SpellEffectHandler(SpellEffectName.WeaponDamageNoSchool)]
[SpellEffectHandler(SpellEffectName.WeaponPercentDamage)]
[SpellEffectHandler(SpellEffectName.WeaponDamage)]
[SpellEffectHandler(SpellEffectName.NormalizedWeaponDmg)]
@@ -2478,7 +2478,7 @@ namespace Game.Spells
switch (effect.Effect)
{
case SpellEffectName.WeaponDamage:
case SpellEffectName.WeaponDamageNoschool:
case SpellEffectName.WeaponDamageNoSchool:
case SpellEffectName.NormalizedWeaponDmg:
case SpellEffectName.WeaponPercentDamage:
return; // we must calculate only at last weapon effect
@@ -2588,7 +2588,7 @@ namespace Game.Spells
switch (effect.Effect)
{
case SpellEffectName.WeaponDamage:
case SpellEffectName.WeaponDamageNoschool:
case SpellEffectName.WeaponDamageNoSchool:
fixed_bonus += CalculateDamage(effect.EffectIndex, unitTarget);
break;
case SpellEffectName.NormalizedWeaponDmg:
@@ -2643,7 +2643,7 @@ namespace Game.Spells
switch (effect.Effect)
{
case SpellEffectName.WeaponDamage:
case SpellEffectName.WeaponDamageNoschool:
case SpellEffectName.WeaponDamageNoSchool:
case SpellEffectName.NormalizedWeaponDmg:
weaponDamage += (uint)fixed_bonus;
break;
+2 -2
View File
@@ -273,7 +273,7 @@ namespace Game.Spells
switch (effect.Effect)
{
case SpellEffectName.WeaponDamage:
case SpellEffectName.WeaponDamageNoschool:
case SpellEffectName.WeaponDamageNoSchool:
case SpellEffectName.NormalizedWeaponDmg:
case SpellEffectName.WeaponPercentDamage:
case SpellEffectName.SchoolDamage:
@@ -4008,7 +4008,7 @@ namespace Game.Spells
case SpellEffectName.SchoolDamage:
case SpellEffectName.EnvironmentalDamage:
case SpellEffectName.HealthLeech:
case SpellEffectName.WeaponDamageNoschool:
case SpellEffectName.WeaponDamageNoSchool:
case SpellEffectName.WeaponDamage:
return ExpectedStatType.CreatureSpellDamage;
case SpellEffectName.Heal:
+2 -2
View File
@@ -2442,7 +2442,7 @@ namespace Game.Entities
{
case SpellEffectName.SchoolDamage:
case SpellEffectName.WeaponDamage:
case SpellEffectName.WeaponDamageNoschool:
case SpellEffectName.WeaponDamageNoSchool:
case SpellEffectName.NormalizedWeaponDmg:
case SpellEffectName.WeaponPercentDamage:
case SpellEffectName.Heal:
@@ -2519,7 +2519,7 @@ namespace Game.Entities
{
case SpellEffectName.SchoolDamage:
case SpellEffectName.WeaponDamage:
case SpellEffectName.WeaponDamageNoschool:
case SpellEffectName.WeaponDamageNoSchool:
case SpellEffectName.NormalizedWeaponDmg:
case SpellEffectName.WeaponPercentDamage:
case SpellEffectName.TriggerSpell: