aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-05-17 19:43:19 +0200
committerOvahlord <dreadkiller@gmx.de>2025-05-26 20:49:48 +0200
commitfeddd8e48608754f270fd399cb910215a71cb1fd (patch)
tree1f485fc830b8b9ffd571a8bcc772c3ff32365472 /src
parentc73c7117ed820a69cbb3de64ffb1b9427a639455 (diff)
Core/PacketIO: Implemented CMSG_UPDATE_SPELL_VISUAL
(cherry picked from commit 0d475eac5f2fdee58d79b1f3361da6d3f22b0232) # Conflicts: # src/server/game/Server/WorldSession.h
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp19
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp7
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h12
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/WorldSession.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp6
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h3
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;