diff options
Diffstat (limited to 'src')
-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 ccbd6c88b0b..ba85aa17866 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -589,6 +589,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 63456d61402..4c4c359f0b9 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -1067,6 +1067,13 @@ void UpdateMissileTrajectory::Read() _worldPacket >> *Status; } +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 78af3cccc3b..8e0902bdf93 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -1088,6 +1088,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 d38df0c9d14..9075249dca4 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1014,7 +1014,7 @@ void OpcodeTable::InitializeClientOpcodes() DEFINE_HANDLER(CMSG_UPDATE_CRAFTING_NPC_RECIPES, 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_UPGRADE_GARRISON, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_UPGRADE_RUNEFORGE_LEGENDARY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 1bb63e2fd94..da6aa40a6ef 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -739,6 +739,7 @@ namespace WorldPackets class SpellClick; class MissileTrajectoryCollision; class UpdateMissileTrajectory; + class UpdateAuraVisual; class TradeSkillSetFavorite; class KeyboundOverride; class SetEmpowerMinHoldStagePercent; @@ -1545,6 +1546,7 @@ class TC_GAME_API WorldSession void HandleSpellEmpowerRestart(WorldPackets::Spells::SpellEmpowerRestart const& spellEmpowerRestart); void HandleMissileTrajectoryCollision(WorldPackets::Spells::MissileTrajectoryCollision& packet); void HandleUpdateMissileTrajectory(WorldPackets::Spells::UpdateMissileTrajectory& packet); + void HandleUpdateAuraVisual(WorldPackets::Spells::UpdateAuraVisual const& updateAuraVisual); void HandleLearnPvpTalentsOpcode(WorldPackets::Talent::LearnPvpTalents& packet); void HandleLearnTalentsOpcode(WorldPackets::Talent::LearnTalents& packet); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 5543b567555..04d8d846178 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -547,6 +547,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 ea0f6f0d73a..8be5278c95d 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; |