From 4420d35bfeb3f2d66605b18ecfd8875642739c90 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Fri, 15 Jan 2021 12:08:32 +0100 Subject: [PATCH] Core/Players: correct packet content of SMSG_RESYNC_RUNES and send converted runes that have been converted previously since the effect handler for SPELL_AURA_CONVERT_RUNE only sends it when converting an unconverted rune closes #214 --- src/server/game/Entities/Player/Player.cpp | 37 ++++++++++++++++--- src/server/game/Entities/Player/Player.h | 3 +- src/server/game/Server/Packets/SpellPackets.h | 15 ++++---- .../game/Spells/Auras/SpellAuraEffects.cpp | 12 +++++- 4 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a68b0ff9fff..da64b5a83c5 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -23401,7 +23401,13 @@ void Player::SendInitialPacketsBeforeAddToMap() /// SMSG_RESYNC_RUNES if (getClass() == CLASS_DEATH_KNIGHT) - ResyncRunes(0); + { + // Initialize rune cooldowns + ResyncRunes(); + + // Send already converted runes + SendConvertedRunes(); + } // Spell modifiers SendSpellModifiers(); @@ -25448,7 +25454,7 @@ void Player::RestoreBaseRune(uint8 index) } ConvertRune(index, GetBaseRune(index)); - SetRuneConvertAura(index, NULL, SPELL_AURA_NONE, NULL); + SetRuneConvertAura(index, nullptr, SPELL_AURA_NONE, nullptr); } void Player::ConvertRune(uint8 index, RuneType newType) @@ -25462,15 +25468,34 @@ void Player::ConvertRune(uint8 index, RuneType newType) SendDirectMessage(packet.Write()); } -void Player::ResyncRunes(uint8 count) +void Player::ResyncRunes() { - WorldPackets::Spells::ResyncRunes packet(count); - for (uint32 i = 0; i < count; ++i) - packet.Runes.push_back({ uint8(GetCurrentRune(i)), uint8(255 - (GetRuneCooldown(i) * 51)) }); + WorldPackets::Spells::ResyncRunes packet; + for (uint8 i = 0; i < MAX_RUNES; ++i) + { + WorldPackets::Spells::ResyncRune resyncRune; + resyncRune.RuneType = GetCurrentRune(i); + resyncRune.Cooldown = uint8(GetRuneCooldown(i) * uint32(255) / uint32(RUNE_BASE_COOLDOWN)); + packet.Runes.emplace_back(resyncRune); + } SendDirectMessage(packet.Write()); } +void Player::SendConvertedRunes() +{ + for (uint8 i = 0; i < MAX_RUNES; ++i) + { + if (GetBaseRune(i) != GetCurrentRune(i)) + { + WorldPackets::Spells::ConvertRune convertRune; + convertRune.Index = i; + convertRune.Rune = GetCurrentRune(i); + SendDirectMessage(convertRune.Write()); + } + } +} + void Player::AddRunePower(uint8 mask) { WorldPackets::Spells::AddRunePower packet; diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 35d88415c5d..eb1258f6583 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -2327,7 +2327,8 @@ class TC_GAME_API Player : public Unit, public GridObject void RemoveRunesByAuraEffect(AuraEffect const* aura); void RestoreBaseRune(uint8 index); void ConvertRune(uint8 index, RuneType newType); - void ResyncRunes(uint8 count); + void ResyncRunes(); + void SendConvertedRunes(); void AddRunePower(uint8 mask); void InitRunes(); diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 275d83c7b80..56d65be4eca 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -362,18 +362,19 @@ namespace WorldPackets uint8 Rune = 0; }; + struct ResyncRune + { + uint8 RuneType = 0; + uint8 Cooldown = 0; + }; + class ResyncRunes final : public ServerPacket { public: - struct ResyncRune - { - uint8 RuneType = 0; - uint8 Cooldown = 0; - }; - - ResyncRunes(size_t size) : ServerPacket(SMSG_RESYNC_RUNES, 4 + 2 * size) { } + ResyncRunes() : ServerPacket(SMSG_RESYNC_RUNES, 4) { } WorldPacket const* Write() override; + std::vector Runes; }; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 949e2f2ca79..db3db8c766b 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -4982,14 +4982,22 @@ void AuraEffect::HandleAuraConvertRune(AuraApplication const* aurApp, uint8 mode if (player->getClass() != CLASS_DEATH_KNIGHT) return; + /* + * Converts a rune into a new rune type. + * MiscValueA describes what rune type can be converted + * MiscValueB describes into what rune the eligible rune will be converted into + * Amount is the number of runes that will be converted if available + */ + uint32 runes = m_amount; - // convert number of runes specified in aura amount of rune type in miscvalue to runetype in miscvalueb + if (apply) { for (uint32 i = 0; i < MAX_RUNES && runes; ++i) { - if (GetMiscValue() != player->GetCurrentRune(i)) + if (RuneType(GetMiscValue()) != player->GetCurrentRune(i)) continue; + if (!player->GetRuneCooldown(i)) { player->AddRuneByAuraEffect(i, RuneType(GetMiscValueB()), this, GetAuraType(), GetSpellInfo());