Core/Auras: Implemented SPELL_AURA_MOD_SPELL_COOLDOWN_BY_HASTE, SPELL_AURA_MOD_GLOBAL_COOLDOWN_BY_HASTE, SPELL_AURA_MOD_COOLDOWN_BY_HASTE_REGEN and SPELL_AURA_MOD_GLOBAL_COOLDOWN_BY_HASTE_REGEN
(cherry picked from commit 6c71c8694f91f6254e8a913f0550e4ff78cb6875) Conflicts: src/server/game/Spells/Auras/SpellAuraDefines.h src/server/game/Spells/Auras/SpellAuraEffects.cpp src/server/game/Spells/SpellHistory.cpp
This commit is contained in:
1 parent
0c51829cc4
commit
79b3fa5862
4 files changed
+25
-8
No files matched your search
@@ -406,7 +406,7 @@ enum AuraType
|
||||
SPELL_AURA_MOD_AUTOATTACK_DAMAGE = 344, // NYI
|
||||
SPELL_AURA_BYPASS_ARMOR_FOR_CASTER = 345,
|
||||
SPELL_AURA_ENABLE_ALT_POWER = 346, // NYI
|
||||
SPELL_AURA_MOD_SPELL_COOLDOWN_BY_HASTE = 347, // NYI
|
||||
SPELL_AURA_MOD_SPELL_COOLDOWN_BY_HASTE = 347,
|
||||
SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT = 348,
|
||||
SPELL_AURA_MOD_CURRENCY_GAIN = 349,
|
||||
SPELL_AURA_MOD_GATHERING_ITEMS_GAINED_PERCENT = 350, // NYI
|
||||
|
||||
@@ -405,7 +405,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]=
|
||||
&AuraEffect::HandleNULL, //344 SPELL_AURA_MOD_AUTOATTACK_DAMAGE
|
||||
&AuraEffect::HandleNoImmediateEffect, //345 SPELL_AURA_BYPASS_ARMOR_FOR_CASTER
|
||||
&AuraEffect::HandleEnableAltPower, //346 SPELL_AURA_ENABLE_ALT_POWER
|
||||
&AuraEffect::HandleNULL, //347 SPELL_AURA_MOD_SPELL_COOLDOWN_BY_HASTE
|
||||
&AuraEffect::HandleNoImmediateEffect, //347 SPELL_AURA_MOD_SPELL_COOLDOWN_BY_HASTE implemented in SpellHistory::StartCooldown
|
||||
&AuraEffect::HandleNoImmediateEffect, //348 SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT implemented in WorldSession::HandleLootMoneyOpcode
|
||||
&AuraEffect::HandleNoImmediateEffect, //349 SPELL_AURA_MOD_CURRENCY_GAIN implemented in Player::ModifyCurrency
|
||||
&AuraEffect::HandleNULL, //350 SPELL_AURA_MOD_GATHERING_ITEMS_GAINED_PERCENT
|
||||
|
||||
@@ -7476,7 +7476,7 @@ bool Spell::HasGlobalCooldown() const
|
||||
void Spell::TriggerGlobalCooldown()
|
||||
{
|
||||
int32 gcd = m_spellInfo->StartRecoveryTime;
|
||||
if (!gcd)
|
||||
if (!gcd || !m_spellInfo->StartRecoveryCategory)
|
||||
return;
|
||||
|
||||
// Only players or controlled units have global cooldown
|
||||
@@ -7496,12 +7496,17 @@ void Spell::TriggerGlobalCooldown()
|
||||
if (m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||
m_caster->ToPlayer()->ApplySpellMod(m_spellInfo->Id, SPELLMOD_GLOBAL_COOLDOWN, gcd, this);
|
||||
|
||||
bool isMeleeOrRangedSpell = m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MELEE ||
|
||||
m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED ||
|
||||
m_spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO) ||
|
||||
m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY);
|
||||
|
||||
// Apply haste rating
|
||||
gcd = int32(float(gcd) * m_caster->GetFloatValue(UNIT_MOD_CAST_SPEED));
|
||||
if (gcd < MIN_GCD)
|
||||
gcd = MIN_GCD;
|
||||
else if (gcd > MAX_GCD)
|
||||
gcd = MAX_GCD;
|
||||
if (gcd > MIN_GCD && ((m_spellInfo->StartRecoveryCategory == 133 && !isMeleeOrRangedSpell) || m_caster->HasAuraTypeWithAffectMask(SPELL_AURA_MOD_GLOBAL_COOLDOWN_BY_HASTE, m_spellInfo)))
|
||||
gcd = std::min<int32>(std::max<int32>(int32(float(gcd) * m_caster->GetFloatValue(UNIT_MOD_CAST_HASTE)), MIN_GCD), MAX_GCD);
|
||||
|
||||
if (gcd > MIN_GCD && m_caster->HasAuraTypeWithAffectMask(SPELL_AURA_MOD_GLOBAL_COOLDOWN_BY_HASTE_REGEN, m_spellInfo))
|
||||
gcd = std::min<int32>(std::max<int32>(int32(float(gcd) * m_caster->GetFloatValue(UNIT_FIELD_MOD_HASTE_REGEN)), MIN_GCD), MAX_GCD);
|
||||
}
|
||||
|
||||
m_caster->GetSpellHistory()->AddGlobalCooldown(m_spellInfo, gcd);
|
||||
|
||||
@@ -311,6 +311,18 @@ void SpellHistory::StartCooldown(SpellInfo const* spellInfo, uint32 itemId, Spel
|
||||
modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, categoryCooldown, spell);
|
||||
}
|
||||
|
||||
if (_owner->HasAuraTypeWithAffectMask(SPELL_AURA_MOD_SPELL_COOLDOWN_BY_HASTE, spellInfo))
|
||||
{
|
||||
cooldown = int32(cooldown * _owner->GetFloatValue(UNIT_MOD_CAST_HASTE));
|
||||
categoryCooldown = int32(categoryCooldown * _owner->GetFloatValue(UNIT_MOD_CAST_HASTE));
|
||||
}
|
||||
|
||||
if (_owner->HasAuraTypeWithAffectMask(SPELL_AURA_MOD_COOLDOWN_BY_HASTE_REGEN, spellInfo))
|
||||
{
|
||||
cooldown = int32(cooldown * _owner->GetFloatValue(UNIT_FIELD_MOD_HASTE_REGEN));
|
||||
categoryCooldown = int32(categoryCooldown * _owner->GetFloatValue(UNIT_FIELD_MOD_HASTE_REGEN));
|
||||
}
|
||||
|
||||
if (int32 cooldownMod = _owner->GetTotalAuraModifier(SPELL_AURA_MOD_COOLDOWN))
|
||||
{
|
||||
// Apply SPELL_AURA_MOD_COOLDOWN only to own spells
|
||||
|
||||
Reference in new issue
Block a user