From fe7816bb71bba717b067cd0e38b430ba9d33fc32 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 8 Mar 2021 21:59:55 +0100 Subject: [PATCH] Core/Spells: fixed sending cooldown data in SMSG_SEND_KNOWN_SPELLS --- src/server/game/Entities/Player/Player.cpp | 10 ++---- src/server/game/Server/Packets/SpellPackets.h | 3 +- src/server/game/Spells/SpellHistory.cpp | 31 +++++++------------ src/server/game/Spells/SpellHistory.h | 10 ++++++ 4 files changed, 24 insertions(+), 30 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 51bd568dde7..0818af37c6e 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2627,16 +2627,10 @@ void Player::SendKnownSpells() knownSpells.KnownSpells.push_back(spell.first); - if (SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spell.first)) - { - uint32 cooldown = GetSpellHistory()->GetRemainingCooldown(spellInfo, false); - uint32 categoryCooldown = GetSpellHistory()->GetRemainingCategoryCooldown(spellInfo); - - if (cooldown || categoryCooldown) - knownSpells.SpellHistoryEntries.push_back({ spellInfo->Id, 0, uint16(spellInfo->GetCategory()), int32(cooldown), int32(categoryCooldown) }); - } } + GetSpellHistory()->WriteSpellHistoryEntries(knownSpells.SpellHistoryEntries); + SendDirectMessage(knownSpells.Write()); } diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 178f2643c73..732a7ba3169 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -265,8 +265,7 @@ namespace WorldPackets struct SpellHistoryEntry { - SpellHistoryEntry(uint32 spellId, uint32 itemId, uint16 category, int32 recoveryTime, int32 categoryRecoveryTime) : - SpellID(spellId), ItemID(itemId), Category(category), RecoveryTime(recoveryTime), CategoryRecoveryTime(categoryRecoveryTime) { } + SpellHistoryEntry() { } uint32 SpellID = 0; uint32 ItemID = 0; diff --git a/src/server/game/Spells/SpellHistory.cpp b/src/server/game/Spells/SpellHistory.cpp index 958ed21750e..e1268c3decc 100644 --- a/src/server/game/Spells/SpellHistory.cpp +++ b/src/server/game/Spells/SpellHistory.cpp @@ -26,6 +26,7 @@ #include "Spell.h" #include "SpellInfo.h" #include "SpellMgr.h" +#include "SpellPackets.h" #include "World.h" #include "WorldPacket.h" @@ -238,45 +239,35 @@ void SpellHistory::WritePacket(WorldPacket& packet) const } template<> -void SpellHistory::WritePacket(WorldPacket& packet) const +void SpellHistory::WriteSpellHistoryEntries(std::vector& spellHistoryEntries) const { Clock::time_point now = GameTime::GetGameTimeSystemPoint(); - packet << uint16(_spellCooldowns.size()); - for (auto const& spellCooldown : _spellCooldowns) { - packet << uint32(spellCooldown.first); - packet << uint32(spellCooldown.second.ItemId); // cast item id - packet << uint16(spellCooldown.second.CategoryId); // spell category + WorldPackets::Spells::SpellHistoryEntry& historyEntry = spellHistoryEntries.emplace_back(); + + historyEntry.SpellID = spellCooldown.first; + historyEntry.ItemID = spellCooldown.second.ItemId; + historyEntry.Category = spellCooldown.second.CategoryId; // send infinity cooldown in special format if (spellCooldown.second.OnHold) { - packet << uint32(1); // cooldown - packet << uint32(0x80000000); // category cooldown + historyEntry.RecoveryTime = 1; // cooldown + historyEntry.CategoryRecoveryTime = 0x80000000; // category cooldown continue; } std::chrono::milliseconds cooldownDuration = std::chrono::duration_cast(spellCooldown.second.CooldownEnd - now); if (cooldownDuration.count() <= 0) - { - packet << uint32(0); - packet << uint32(0); continue; - } std::chrono::milliseconds categoryDuration = std::chrono::duration_cast(spellCooldown.second.CategoryEnd - now); if (categoryDuration.count() >= 0) - { - packet << uint32(0); // cooldown - packet << uint32(categoryDuration.count()); // category cooldown - } + historyEntry.CategoryRecoveryTime = categoryDuration.count(); // category cooldown else - { - packet << uint32(cooldownDuration.count()); // cooldown - packet << uint32(0); // category cooldown - } + historyEntry.RecoveryTime = cooldownDuration.count(); // cooldown } } diff --git a/src/server/game/Spells/SpellHistory.h b/src/server/game/Spells/SpellHistory.h index cffc0458e4e..8d016f303ed 100644 --- a/src/server/game/Spells/SpellHistory.h +++ b/src/server/game/Spells/SpellHistory.h @@ -33,6 +33,14 @@ class Unit; class WorldPacket; struct SpellCategoryEntry; +namespace WorldPackets +{ + namespace Spells + { + struct SpellHistoryEntry; + } +} + /// Spell cooldown flags sent in SMSG_SPELL_COOLDOWN enum SpellCooldownFlags { @@ -75,6 +83,8 @@ public: bool IsReady(SpellInfo const* spellInfo, uint32 itemId = 0, bool ignoreCategoryCooldown = false) const; template void WritePacket(WorldPacket& packet) const; + template + void WriteSpellHistoryEntries(std::vector& spellHistoryEntries) const; // Cooldowns static Clock::duration const InfinityCooldownDelay; // used for set "infinity cooldowns" for spells and check