Core/Auras: Implemented SPELL_AURA_MOD_SPELL_CATEGORY_COOLDOWN
This commit is contained in:
@@ -22176,9 +22176,26 @@ void Player::AddSpellAndCategoryCooldowns(SpellInfo const* spellInfo, uint32 ite
|
||||
if (catrec > 0 && !(spellInfo->AttributesEx6 & SPELL_ATTR6_IGNORE_CATEGORY_COOLDOWN_MODS))
|
||||
ApplySpellMod(spellInfo->Id, SPELLMOD_COOLDOWN, catrec, spell);
|
||||
|
||||
// Apply SPELL_AURA_MOD_SPELL_CATEGORY_COOLDOWN modifiers
|
||||
// Note: This aura applies its modifiers to all cooldowns of spells with set category, not to category cooldown only
|
||||
if (cat)
|
||||
{
|
||||
if (int32 categoryModifier = GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_SPELL_CATEGORY_COOLDOWN, cat))
|
||||
{
|
||||
if (rec > 0)
|
||||
rec += categoryModifier;
|
||||
|
||||
if (catrec > 0)
|
||||
catrec += categoryModifier;
|
||||
}
|
||||
}
|
||||
|
||||
// replace negative cooldowns by 0
|
||||
if (rec < 0) rec = 0;
|
||||
if (catrec < 0) catrec = 0;
|
||||
if (rec < 0)
|
||||
rec = 0;
|
||||
|
||||
if (catrec < 0)
|
||||
catrec = 0;
|
||||
|
||||
// no cooldown after applying spell mods
|
||||
if (rec == 0 && catrec == 0)
|
||||
|
||||
@@ -731,3 +731,27 @@ void WorldSession::HandleUpdateProjectilePosition(WorldPacket& recvPacket)
|
||||
data << float(z);
|
||||
caster->SendMessageToSet(&data, true);
|
||||
}
|
||||
|
||||
void WorldSession::HandleRequestCategoryCooldowns(WorldPacket& /*recvPacket*/)
|
||||
{
|
||||
std::map<uint32, int32> categoryMods;
|
||||
Unit::AuraEffectList const& categoryCooldownAuras = _player->GetAuraEffectsByType(SPELL_AURA_MOD_SPELL_CATEGORY_COOLDOWN);
|
||||
for (Unit::AuraEffectList::const_iterator itr = categoryCooldownAuras.begin(); itr != categoryCooldownAuras.end(); ++itr)
|
||||
{
|
||||
std::map<uint32, int32>::iterator cItr = categoryMods.find((*itr)->GetMiscValue());
|
||||
if (cItr == categoryMods.end())
|
||||
categoryMods[(*itr)->GetMiscValue()] = (*itr)->GetAmount();
|
||||
else
|
||||
cItr->second += (*itr)->GetAmount();
|
||||
}
|
||||
|
||||
WorldPacket data(SMSG_SPELL_CATEGORY_COOLDOWN, 11);
|
||||
data.WriteBits(categoryMods.size(), 23);
|
||||
for (std::map<uint32, int32>::const_iterator itr = categoryMods.begin(); itr != categoryMods.end(); ++itr)
|
||||
{
|
||||
data << uint32(itr->first);
|
||||
data << int32(-itr->second);
|
||||
}
|
||||
|
||||
SendPacket(&data);
|
||||
}
|
||||
|
||||
@@ -447,7 +447,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_OPCODE_HANDLER(CMSG_REPOP_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRepopRequestOpcode );
|
||||
DEFINE_OPCODE_HANDLER(CMSG_REPORT_PVP_AFK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReportPvPAFK );
|
||||
DEFINE_OPCODE_HANDLER(CMSG_REQUEST_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestAccountData );
|
||||
DEFINE_OPCODE_HANDLER(CMSG_REQUEST_CATEGORY_COOLDOWNS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||
DEFINE_OPCODE_HANDLER(CMSG_REQUEST_CATEGORY_COOLDOWNS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestCategoryCooldowns );
|
||||
DEFINE_OPCODE_HANDLER(CMSG_REQUEST_CEMETERY_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||
DEFINE_OPCODE_HANDLER(CMSG_REQUEST_HOTFIX, STATUS_AUTHED, PROCESS_INPLACE, &WorldSession::HandleRequestHotfix );
|
||||
DEFINE_OPCODE_HANDLER(CMSG_REQUEST_INSPECT_RATED_BG_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||
@@ -1180,7 +1180,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_OPCODE_HANDLER(SMSG_SPELLNONMELEEDAMAGELOG, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||
DEFINE_OPCODE_HANDLER(SMSG_SPELLORDAMAGE_IMMUNE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||
DEFINE_OPCODE_HANDLER(SMSG_SPELLSTEALLOG, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||
DEFINE_OPCODE_HANDLER(SMSG_SPELL_CATEGORY_COOLDOWN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||
DEFINE_OPCODE_HANDLER(SMSG_SPELL_CATEGORY_COOLDOWN, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||
DEFINE_OPCODE_HANDLER(SMSG_SPELL_COOLDOWN, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||
DEFINE_OPCODE_HANDLER(SMSG_SPELL_DELAYED, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||
DEFINE_OPCODE_HANDLER(SMSG_SPELL_FAILED_OTHER, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
|
||||
|
||||
@@ -944,6 +944,7 @@ class WorldSession
|
||||
void HandleUpdateMissileTrajectory(WorldPacket& recvPacket);
|
||||
void HandleViolenceLevel(WorldPacket& recvPacket);
|
||||
void HandleObjectUpdateFailedOpcode(WorldPacket& recvPacket);
|
||||
void HandleRequestCategoryCooldowns(WorldPacket& recvPacket);
|
||||
int32 HandleEnableNagleAlgorithm();
|
||||
|
||||
// Compact Unit Frames (4.x)
|
||||
|
||||
@@ -400,7 +400,7 @@ enum AuraType
|
||||
SPELL_AURA_MOD_DURABILITY_LOSS = 338,
|
||||
SPELL_AURA_INCREASE_SKILL_GAIN_CHANCE = 339, // NYI
|
||||
SPELL_AURA_MOD_RESURRECTED_HEALTH_BY_GUILD_MEMBER = 340, // Increases health gained when resurrected by a guild member by X
|
||||
SPELL_AURA_MOD_SPELL_CATEGORY_COOLDOWN = 341, // NYI
|
||||
SPELL_AURA_MOD_SPELL_CATEGORY_COOLDOWN = 341, // Modifies cooldown of all spells using affected category
|
||||
SPELL_AURA_MOD_MELEE_RANGED_HASTE_2 = 342,
|
||||
SPELL_AURA_343 = 343,
|
||||
SPELL_AURA_MOD_AUTOATTACK_DAMAGE = 344, // NYI
|
||||
|
||||
Reference in New Issue
Block a user