diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-05-17 19:43:19 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2025-05-26 20:49:48 +0200 |
commit | feddd8e48608754f270fd399cb910215a71cb1fd (patch) | |
tree | 1f485fc830b8b9ffd571a8bcc772c3ff32365472 | |
parent | c73c7117ed820a69cbb3de64ffb1b9427a639455 (diff) |
Core/PacketIO: Implemented CMSG_UPDATE_SPELL_VISUAL
(cherry picked from commit 0d475eac5f2fdee58d79b1f3361da6d3f22b0232)
# Conflicts:
# src/server/game/Server/WorldSession.h
-rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 19 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 7 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 12 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.h | 3 |
7 files changed, 49 insertions, 2 deletions
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index eaa3a55ceba..9b39eb0b5f0 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -542,6 +542,25 @@ void WorldSession::HandleUpdateMissileTrajectory(WorldPackets::Spells::UpdateMis HandleMovementOpcode(CMSG_MOVE_STOP, *packet.Status); } +void WorldSession::HandleUpdateAuraVisual(WorldPackets::Spells::UpdateAuraVisual const& updateAuraVisual) +{ + Unit* target = ObjectAccessor::GetUnit(*_player, updateAuraVisual.TargetGUID); + if (!target) + return; + + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(updateAuraVisual.SpellID, _player->GetMap()->GetDifficultyID()); + if (!spellInfo) + return; + + uint32 spellXspellVisualId = _player->GetCastSpellXSpellVisualId(spellInfo); + for (auto const& [_, auraApp] : Trinity::Containers::MapEqualRange(target->GetAppliedAuras(), spellInfo->Id)) + if (auraApp->GetBase()->GetCasterGUID() == _player->GetGUID()) + auraApp->GetBase()->SetSpellVisual({ .SpellXSpellVisualID = spellXspellVisualId }); + + if (_player->GetChannelSpellId() == spellInfo->Id) + _player->SetChannelVisual({ .SpellXSpellVisualID = spellXspellVisualId }); +} + void WorldSession::HandleKeyboundOverride(WorldPackets::Spells::KeyboundOverride& keyboundOverride) { Player* player = GetPlayer(); diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index e7d27bde9f3..4f95126ca85 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -997,6 +997,13 @@ void UpdateMissileTrajectory::Read() _worldPacket >> Status.emplace(); } +void UpdateAuraVisual::Read() +{ + _worldPacket >> SpellID; + _worldPacket >> Visual; + _worldPacket >> TargetGUID; +} + WorldPacket const* SpellDelayed::Write() { _worldPacket << Caster; diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index b45fce9d706..bb059a28f92 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -1003,6 +1003,18 @@ namespace WorldPackets Optional<MovementInfo> Status; }; + class UpdateAuraVisual final : public ClientPacket + { + public: + explicit UpdateAuraVisual(WorldPacket&& packet) : ClientPacket(CMSG_UPDATE_SPELL_VISUAL, std::move(packet)) { } + + void Read() override; + + int32 SpellID = 0; + SpellCastVisual Visual; + ObjectGuid TargetGUID; + }; + class SpellDelayed final : public ServerPacket { public: diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index e1a1213359f..755054088eb 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -796,7 +796,7 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_UPDATE_CLIENT_SETTINGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory); DEFINE_HANDLER(CMSG_UPDATE_RAID_TARGET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateRaidTargetOpcode); - DEFINE_HANDLER(CMSG_UPDATE_SPELL_VISUAL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_UPDATE_SPELL_VISUAL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUpdateAuraVisual); DEFINE_HANDLER(CMSG_UPDATE_VAS_PURCHASE_STATES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_USE_CRITTER_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUseCritterItem); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 9384f99928d..e56f35ea44d 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -677,6 +677,7 @@ namespace WorldPackets class SpellClick; class MissileTrajectoryCollision; class UpdateMissileTrajectory; + class UpdateAuraVisual; class KeyboundOverride; } @@ -1444,6 +1445,7 @@ class TC_GAME_API WorldSession void HandleCancelQueuedSpellOpcode(WorldPackets::Spells::CancelQueuedSpell& cancelQueuedSpell); void HandleMissileTrajectoryCollision(WorldPackets::Spells::MissileTrajectoryCollision& packet); void HandleUpdateMissileTrajectory(WorldPackets::Spells::UpdateMissileTrajectory& packet); + void HandleUpdateAuraVisual(WorldPackets::Spells::UpdateAuraVisual const& updateAuraVisual); void HandleLearnTalentOpcode(WorldPackets::Talent::LearnTalent& packet); void HandleLearnPreviewTalentsOpcode(WorldPackets::Talent::LearnPreviewTalents& packet); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index a17f8d17819..20d2c2ea49a 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -553,6 +553,12 @@ Aura::~Aura() _DeleteRemovedApplications(); } +void Aura::SetSpellVisual(SpellCastVisual const& spellVisual) +{ + m_spellVisual = spellVisual; + SetNeedClientUpdateForTargets(); +} + Unit* Aura::GetCaster() const { if (GetOwner()->GetGUID() == GetCasterGUID()) diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h index c30e2bcdc29..2486b9e5b71 100644 --- a/src/server/game/Spells/Auras/SpellAuras.h +++ b/src/server/game/Spells/Auras/SpellAuras.h @@ -189,6 +189,7 @@ class TC_GAME_API Aura uint32 GetCastItemId() const { return m_castItemId; } int32 GetCastItemLevel() const { return m_castItemLevel; } SpellCastVisual GetSpellVisual() const { return m_spellVisual; } + void SetSpellVisual(SpellCastVisual const& spellVisual); Unit* GetCaster() const; WorldObject* GetWorldObjectCaster() const; WorldObject* GetOwner() const { return m_owner; } @@ -394,7 +395,7 @@ class TC_GAME_API Aura ObjectGuid const m_castItemGuid; // it is NOT safe to keep a pointer to the item because it may get deleted uint32 m_castItemId; int32 m_castItemLevel; - SpellCastVisual const m_spellVisual; + SpellCastVisual m_spellVisual; time_t const m_applyTime; WorldObject* const m_owner; |