diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 11341c0b45f..8c825990d35 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2614,10 +2614,10 @@ void Player::InitStatsForLevel(bool reapplyMods) pet->SynchronizeLevelWithOwner(); } -void Player::SendKnownSpells() +void Player::SendKnownSpells(bool firstLogin /*= false*/) { WorldPackets::Spells::SendKnownSpells knownSpells; - knownSpells.InitialLogin = false; /// @todo + knownSpells.InitialLogin = firstLogin; knownSpells.KnownSpells.reserve(m_spells.size()); for (PlayerSpellMap::value_type const& spell : m_spells) @@ -23341,7 +23341,7 @@ void Player::SetGroup(Group* group, int8 subgroup) UpdateObjectVisibility(false); } -void Player::SendInitialPacketsBeforeAddToMap() +void Player::SendInitialPacketsBeforeAddToMap(bool firstLogin /*= false*/) { /// SMSG_CONTROL_UPDATE SetClientControl(this, true); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 3d8f9a0e8c1..e7bc89a564e 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1036,7 +1036,7 @@ class TC_GAME_API Player : public Unit, public GridObject bool IsInWater() const override { return m_isInWater; } bool IsInAreaTriggerRadius(AreaTriggerEntry const* trigger) const; - void SendInitialPacketsBeforeAddToMap(); + void SendInitialPacketsBeforeAddToMap(bool firstLogin = false); void SendInitialPacketsAfterAddToMap(); void SendSupercededSpell(uint32 oldSpell, uint32 newSpell) const; void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg = 0) const; @@ -1575,7 +1575,7 @@ class TC_GAME_API Player : public Unit, public GridObject bool IsCurrentSpecMasterySpell(SpellInfo const* spellInfo) const; void SendProficiency(ItemClass itemClass, uint32 itemSubclassMask) const; - void SendKnownSpells(); + void SendKnownSpells(bool firstLogin = false); bool AddSpell(uint32 spellId, bool active, bool learning, bool dependent, bool disabled, bool loading = false, uint32 fromSkill = 0); void LearnSpell(uint32 spell_id, bool dependent, uint32 fromSkill = 0); void RemoveSpell(uint32 spell_id, bool disabled = false, bool learn_low_rank = true); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 7d365d178bf..436ea45bf7d 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -862,7 +862,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder const& holder) hotfixInfo.Hotfixes = sDB2Manager.GetHotfixData(); SendPacket(hotfixInfo.Write()); - pCurrChar->SendInitialPacketsBeforeAddToMap(); + pCurrChar->SendInitialPacketsBeforeAddToMap(true); // Send MOTD { diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index ee3ca24843f..2750bb7abc2 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -981,3 +981,39 @@ void WorldPackets::Spells::UpdateMissileTrajectory::Read() _worldPacket.ReadByteSeq(Status->guid[6]); } } + +WorldPacket const* WorldPackets::Spells::ClearCooldown::Write() +{ + _worldPacket << int32(SpellID); + _worldPacket << CasterGUID; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::ClearCooldowns::Write() +{ + _worldPacket.WriteBit(Guid[1]); + _worldPacket.WriteBit(Guid[3]); + _worldPacket.WriteBit(Guid[6]); + _worldPacket.WriteBits(SpellID.size(), 24); + _worldPacket.WriteBit(Guid[7]); + _worldPacket.WriteBit(Guid[5]); + _worldPacket.WriteBit(Guid[2]); + _worldPacket.WriteBit(Guid[4]); + _worldPacket.WriteBit(Guid[0]); + + _worldPacket.WriteByteSeq(Guid[7]); + _worldPacket.WriteByteSeq(Guid[2]); + _worldPacket.WriteByteSeq(Guid[4]); + _worldPacket.WriteByteSeq(Guid[5]); + _worldPacket.WriteByteSeq(Guid[1]); + _worldPacket.WriteByteSeq(Guid[3]); + + if (!SpellID.empty()) + _worldPacket.append(SpellID.data(), SpellID.size()); + + _worldPacket.WriteByteSeq(Guid[0]); + _worldPacket.WriteByteSeq(Guid[6]); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 8a51f48d949..8ce635d6173 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -506,6 +506,28 @@ namespace WorldPackets TaggedPosition ImpactPos; Optional Status; }; + + class ClearCooldown final : public ServerPacket + { + public: + ClearCooldown() : ServerPacket(SMSG_CLEAR_COOLDOWN, 4 + 8) { } + + WorldPacket const* Write() override; + + ObjectGuid CasterGUID; + int32 SpellID = 0; + }; + + class ClearCooldowns final : public ServerPacket + { + public: + ClearCooldowns() : ServerPacket(SMSG_CLEAR_COOLDOWNS, 8) { } + + WorldPacket const* Write() override; + + ObjectGuid Guid; + std::vector SpellID; + }; } } diff --git a/src/server/game/Spells/SpellHistory.cpp b/src/server/game/Spells/SpellHistory.cpp index f264acc0663..0325304a3ec 100644 --- a/src/server/game/Spells/SpellHistory.cpp +++ b/src/server/game/Spells/SpellHistory.cpp @@ -467,10 +467,10 @@ void SpellHistory::ResetCooldown(CooldownStorageType::iterator& itr, bool update { if (Player* playerOwner = GetPlayerOwner()) { - WorldPacket data(SMSG_CLEAR_COOLDOWN, 4 + 8); - data << uint32(itr->first); - data << uint64(_owner->GetGUID()); - playerOwner->SendDirectMessage(&data); + WorldPackets::Spells::ClearCooldown packet; + packet.SpellID = itr->first; + packet.CasterGUID = _owner->GetGUID(); + playerOwner->SendDirectMessage(packet.Write()); } } @@ -664,33 +664,10 @@ void SpellHistory::SendClearCooldowns(std::vector const& cooldowns) const { if (Player* playerOwner = GetPlayerOwner()) { - ObjectGuid guid = playerOwner->GetGUID(); - WorldPacket data(SMSG_CLEAR_COOLDOWNS, 4 + 8); - data.WriteBit(guid[1]); - data.WriteBit(guid[3]); - data.WriteBit(guid[6]); - data.WriteBits(cooldowns.size(), 24); // Spell Count - data.WriteBit(guid[7]); - data.WriteBit(guid[5]); - data.WriteBit(guid[2]); - data.WriteBit(guid[4]); - data.WriteBit(guid[0]); - - data.FlushBits(); - - data.WriteByteSeq(guid[7]); - data.WriteByteSeq(guid[2]); - data.WriteByteSeq(guid[4]); - data.WriteByteSeq(guid[5]); - data.WriteByteSeq(guid[1]); - data.WriteByteSeq(guid[3]); - for (int32 spell : cooldowns) - data << uint32(spell); // Spell ID - - data.WriteByteSeq(guid[0]); - data.WriteByteSeq(guid[6]); - - playerOwner->SendDirectMessage(&data); + WorldPackets::Spells::ClearCooldowns packet; + packet.Guid = playerOwner->GetGUID(); + packet.SpellID = cooldowns; + playerOwner->SendDirectMessage(packet.Write()); } }