Core/Auras: Implemented SPELL_AURA_MOD_SPELL_CATEGORY_COOLDOWN

This commit is contained in:
Shauren
2013-06-07 20:35:30 +02:00
parent 3f5276501d
commit c3c66060f6
5 changed files with 47 additions and 5 deletions
+19 -2
View File
@@ -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)
+24
View File
@@ -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);
}
+2 -2
View File
@@ -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 );
+1
View File
@@ -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