void SpellHistory::LockSpellSchool(SpellSchoolMask schoolMask, uint32 lockoutTime) { Clock::time_point lockoutEnd = Clock::now() + std::chrono::duration_cast<Clock::duration>(std::chrono::milliseconds(lockoutTime)); for (uint32 i = 0; i < MAX_SPELL_SCHOOL; ++i) if (SpellSchoolMask(1 << i) & schoolMask) _schoolLockouts[i] = lockoutEnd; std::set<uint32> knownSpells; if (Player* plrOwner = _owner->ToPlayer()) { for (auto const& p : plrOwner->GetSpellMap()) if (p.second->state != PLAYERSPELL_REMOVED) knownSpells.insert(p.first); } else if (Pet* petOwner = _owner->ToPet()) { for (auto const& p : petOwner->m_spells) if (p.second.state != PETSPELL_REMOVED) knownSpells.insert(p.first); } else { Creature* creatureOwner = _owner->ToCreature(); for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i) if (creatureOwner->m_spells[i]) knownSpells.insert(creatureOwner->m_spells[i]); } PacketCooldowns cooldowns; WorldPacket spellCooldowns; for (uint32 spellId : knownSpells) { SpellInfo const* spellInfo = sSpellMgr->EnsureSpellInfo(spellId); if (spellInfo->IsCooldownStartedOnEvent()) continue; if (spellInfo->PreventionType != SPELL_PREVENTION_TYPE_SILENCE) continue; if ((schoolMask & spellInfo->GetSchoolMask()) && GetRemainingCooldown(spellId) < lockoutTime) { cooldowns[spellId] = lockoutTime; AddCooldown(spellId, 0, lockoutEnd); } } if (Player* player = GetPlayerOwner()) { if (!cooldowns.empty()) { BuildCooldownPacket(spellCooldowns, SPELL_COOLDOWN_FLAG_NONE, cooldowns); player->SendDirectMessage(&spellCooldowns); } } }
void SpellHistory::LockSpellSchool(SpellSchoolMask schoolMask, uint32 lockoutTime) { Clock::time_point now = Clock::now(); Clock::time_point lockoutEnd = now + std::chrono::duration_cast<Clock::duration>(std::chrono::milliseconds(lockoutTime)); for (uint32 i = 0; i < MAX_SPELL_SCHOOL; ++i) if (SpellSchoolMask(1 << i) & schoolMask) _schoolLockouts[i] = lockoutEnd; std::set<uint32> knownSpells; if (Player* plrOwner = _owner->ToPlayer()) { for (auto const& p : plrOwner->GetSpellMap()) if (p.second->state != PLAYERSPELL_REMOVED) knownSpells.insert(p.first); } else if (Pet* petOwner = _owner->ToPet()) { for (auto const& p : petOwner->m_spells) if (p.second.state != PETSPELL_REMOVED) knownSpells.insert(p.first); } else { Creature* creatureOwner = _owner->ToCreature(); for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i) if (creatureOwner->m_spells[i]) knownSpells.insert(creatureOwner->m_spells[i]); } WorldPackets::Spells::SpellCooldown spellCooldown; spellCooldown.Caster = _owner->GetGUID(); spellCooldown.Flags = SPELL_COOLDOWN_FLAG_NONE; for (uint32 spellId : knownSpells) { SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(spellId); if (spellInfo->IsCooldownStartedOnEvent()) continue; if (!(spellInfo->PreventionType & SPELL_PREVENTION_TYPE_SILENCE)) continue; if ((schoolMask & spellInfo->GetSchoolMask()) && GetRemainingCooldown(spellInfo) < lockoutTime) { spellCooldown.SpellCooldowns.emplace_back(spellId, lockoutTime); AddCooldown(spellId, 0, lockoutEnd, 0, now); } } if (Player* player = GetPlayerOwner()) if (!spellCooldown.SpellCooldowns.empty()) player->SendDirectMessage(spellCooldown.Write()); }