aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp78
-rw-r--r--src/server/game/Entities/Unit/Unit.h8
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp25
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h34
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/scripts/Spells/spell_warrior.cpp13
6 files changed, 145 insertions, 17 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index d0f579130fc..f9dcef634cd 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -12671,6 +12671,84 @@ void Unit::SetAuraStack(uint32 spellId, Unit* target, uint32 stack)
aura->SetStackAmount(stack);
}
+void Unit::SendCancelOrphanSpellVisual(uint32 id)
+{
+ WorldPackets::Spells::CancelOrphanSpellVisual cancelOrphanSpellVisual;
+ cancelOrphanSpellVisual.SpellVisualID = id;
+ SendMessageToSet(cancelOrphanSpellVisual.Write(), true);
+}
+
+void Unit::SendPlayOrphanSpellVisual(ObjectGuid const& target, uint32 spellVisualId, float travelSpeed, bool speedAsTime /*= false*/, bool withSourceOrientation /*= false*/)
+{
+ WorldPackets::Spells::PlayOrphanSpellVisual playOrphanSpellVisual;
+ playOrphanSpellVisual.SourceLocation = GetPosition();
+ if (withSourceOrientation)
+ playOrphanSpellVisual.SourceOrientation.z = GetOrientation();
+ playOrphanSpellVisual.Target = target; // exclusive with TargetLocation
+ playOrphanSpellVisual.SpellVisualID = spellVisualId;
+ playOrphanSpellVisual.TravelSpeed = travelSpeed;
+ playOrphanSpellVisual.SpeedAsTime = speedAsTime;
+ playOrphanSpellVisual.UnkZero = 0.0f;
+ SendMessageToSet(playOrphanSpellVisual.Write(), true);
+}
+
+void Unit::SendPlayOrphanSpellVisual(G3D::Vector3 const& targetLocation, uint32 spellVisualId, float travelSpeed, bool speedAsTime /*= false*/, bool withSourceOrientation /*= false*/)
+{
+ WorldPackets::Spells::PlayOrphanSpellVisual playOrphanSpellVisual;
+ playOrphanSpellVisual.SourceLocation = GetPosition();
+ if (withSourceOrientation)
+ playOrphanSpellVisual.SourceOrientation.z = GetOrientation();
+ playOrphanSpellVisual.TargetLocation = targetLocation; // exclusive with Target
+ playOrphanSpellVisual.SpellVisualID = spellVisualId;
+ playOrphanSpellVisual.TravelSpeed = travelSpeed;
+ playOrphanSpellVisual.SpeedAsTime = speedAsTime;
+ playOrphanSpellVisual.UnkZero = 0.0f;
+ SendMessageToSet(playOrphanSpellVisual.Write(), true);
+}
+
+void Unit::SendCancelSpellVisual(uint32 id)
+{
+ WorldPackets::Spells::CancelSpellVisual cancelSpellVisual;
+ cancelSpellVisual.Source = GetGUID();
+ cancelSpellVisual.SpellVisualID = id;
+ SendMessageToSet(cancelSpellVisual.Write(), true);
+}
+
+void Unit::SendPlaySpellVisual(ObjectGuid const& targetGuid, uint32 spellVisualId, uint16 missReason, uint16 reflectStatus, float travelSpeed, bool speedAsTime /*= false*/)
+{
+ WorldPackets::Spells::PlaySpellVisual playSpellVisual;
+ playSpellVisual.Source = GetGUID();
+ playSpellVisual.Target = targetGuid; // exclusive with TargetPosition
+ playSpellVisual.SpellVisualID = spellVisualId;
+ playSpellVisual.TravelSpeed = travelSpeed;
+ playSpellVisual.MissReason = missReason;
+ playSpellVisual.ReflectStatus = reflectStatus;
+ playSpellVisual.SpeedAsTime = speedAsTime;
+ SendMessageToSet(playSpellVisual.Write(), true);
+}
+
+void Unit::SendPlaySpellVisual(G3D::Vector3 const& targetPosition, float o, uint32 spellVisualId, uint16 missReason, uint16 reflectStatus, float travelSpeed, bool speedAsTime /*= false*/)
+{
+ WorldPackets::Spells::PlaySpellVisual playSpellVisual;
+ playSpellVisual.Source = GetGUID();
+ playSpellVisual.TargetPosition = targetPosition; // exclusive with Target
+ playSpellVisual.Orientation = o;
+ playSpellVisual.SpellVisualID = spellVisualId;
+ playSpellVisual.TravelSpeed = travelSpeed;
+ playSpellVisual.MissReason = missReason;
+ playSpellVisual.ReflectStatus = reflectStatus;
+ playSpellVisual.SpeedAsTime = speedAsTime;
+ SendMessageToSet(playSpellVisual.Write(), true);
+}
+
+void Unit::SendCancelSpellVisualKit(uint32 id)
+{
+ WorldPackets::Spells::CancelSpellVisualKit cancelSpellVisualKit;
+ cancelSpellVisualKit.Source = GetGUID();
+ cancelSpellVisualKit.SpellVisualKitID = id;
+ SendMessageToSet(cancelSpellVisualKit.Write(), true);
+}
+
void Unit::SendPlaySpellVisualKit(uint32 id, uint32 type, uint32 duration)
{
WorldPackets::Spells::PlaySpellVisualKit playSpellVisualKit;
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index d06a48b7992..56aa484c6d5 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1674,6 +1674,14 @@ class TC_GAME_API Unit : public WorldObject
Aura* AddAura(uint32 spellId, Unit* target);
Aura* AddAura(SpellInfo const* spellInfo, uint32 effMask, Unit* target);
void SetAuraStack(uint32 spellId, Unit* target, uint32 stack);
+
+ void SendCancelOrphanSpellVisual(uint32 id);
+ void SendPlayOrphanSpellVisual(ObjectGuid const& target, uint32 spellVisualId, float travelSpeed, bool speedAsTime = false, bool withSourceOrientation = false);
+ void SendPlayOrphanSpellVisual(G3D::Vector3 const& targetLocation, uint32 spellVisualId, float travelSpeed, bool speedAsTime = false, bool withSourceOrientation = false);
+ void SendCancelSpellVisual(uint32 id);
+ void SendPlaySpellVisual(ObjectGuid const& target, uint32 spellVisualId, uint16 missReason, uint16 reflectStatus, float travelSpeed, bool speedAsTime = false);
+ void SendPlaySpellVisual(G3D::Vector3 const& targetPosition, float o, uint32 spellVisualId, uint16 missReason, uint16 reflectStatus, float travelSpeed, bool speedAsTime = false);
+ void SendCancelSpellVisualKit(uint32 id);
void SendPlaySpellVisualKit(uint32 id, uint32 type, uint32 duration);
void DeMorph();
diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp
index a3eaca54052..2efbe0a4acd 100644
--- a/src/server/game/Server/Packets/SpellPackets.cpp
+++ b/src/server/game/Server/Packets/SpellPackets.cpp
@@ -759,11 +759,34 @@ WorldPacket const* WorldPackets::Spells::CancelSpellVisual::Write()
return &_worldPacket;
}
+WorldPacket const* WorldPackets::Spells::CancelSpellVisualKit::Write()
+{
+ _worldPacket << Source;
+ _worldPacket << int32(SpellVisualKitID);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Spells::PlayOrphanSpellVisual::Write()
+{
+ _worldPacket << SourceLocation;
+ _worldPacket << SourceOrientation;
+ _worldPacket << TargetLocation;
+ _worldPacket << Target;
+ _worldPacket << int32(SpellVisualID);
+ _worldPacket << float(TravelSpeed);
+ _worldPacket << float(UnkZero);
+ _worldPacket.WriteBit(SpeedAsTime);
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+}
+
WorldPacket const* WorldPackets::Spells::PlaySpellVisual::Write()
{
_worldPacket << Source;
_worldPacket << Target;
- _worldPacket << TargetPostion;
+ _worldPacket << TargetPosition;
_worldPacket << SpellVisualID;
_worldPacket << TravelSpeed;
_worldPacket << MissReason;
diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h
index e5f283710fc..bc0cd40713e 100644
--- a/src/server/game/Server/Packets/SpellPackets.h
+++ b/src/server/game/Server/Packets/SpellPackets.h
@@ -762,7 +762,35 @@ namespace WorldPackets
int32 SpellVisualID = 0;
};
- class TC_GAME_API PlaySpellVisual final : public ServerPacket
+ class CancelSpellVisualKit final : public ServerPacket
+ {
+ public:
+ CancelSpellVisualKit() : ServerPacket(SMSG_CANCEL_SPELL_VISUAL_KIT, 16 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Source;
+ int32 SpellVisualKitID = 0;
+ };
+
+ class PlayOrphanSpellVisual final : public ServerPacket
+ {
+ public:
+ PlayOrphanSpellVisual() : ServerPacket(SMSG_PLAY_ORPHAN_SPELL_VISUAL, 16 + 3 * 4 + 4 + 1 + 4 + 3 * 4 + 3 * 4) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Target; // Exclusive with TargetLocation
+ G3D::Vector3 SourceLocation;
+ int32 SpellVisualID = 0;
+ bool SpeedAsTime = false;
+ float TravelSpeed = 0.0f;
+ float UnkZero = 0.0f; // Always zero
+ G3D::Vector3 SourceOrientation; // Orientation is z
+ G3D::Vector3 TargetLocation; // Exclusive with Target
+ };
+
+ class PlaySpellVisual final : public ServerPacket
{
public:
PlaySpellVisual() : ServerPacket(SMSG_PLAY_SPELL_VISUAL, 16 + 16 + 2 + 4 + 1 + 2 + 4 + 4 * 4) { }
@@ -770,13 +798,13 @@ namespace WorldPackets
WorldPacket const* Write() override;
ObjectGuid Source;
- ObjectGuid Target;
+ ObjectGuid Target; // Exclusive with TargetPosition
uint16 MissReason = 0;
uint32 SpellVisualID = 0;
bool SpeedAsTime = false;
uint16 ReflectStatus = 0;
float TravelSpeed = 0.0f;
- G3D::Vector3 TargetPostion;
+ G3D::Vector3 TargetPosition; // Exclusive with Target
float Orientation = 0.0f;
};
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 1aaa848d64e..56f5cd1128d 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -1003,7 +1003,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_ORPHAN_SPELL_VISUAL, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SCENE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SPELL_VISUAL, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SPELL_VISUAL_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SPELL_VISUAL_KIT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAN_DUEL_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAST_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CATEGORY_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1523,7 +1523,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_MUSIC, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_OBJECT_SOUND, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_ONE_SHOT_ANIM_KIT, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_ORPHAN_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_ORPHAN_SPELL_VISUAL, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SCENE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SOUND, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SPEAKERBOT_SOUND, STATUS_NEVER, CONNECTION_TYPE_REALM);
diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp
index 5b0f82b44fc..69ab4a36095 100644
--- a/src/server/scripts/Spells/spell_warrior.cpp
+++ b/src/server/scripts/Spells/spell_warrior.cpp
@@ -27,7 +27,6 @@
#include "SpellHistory.h"
#include "SpellScript.h"
#include "SpellAuraEffects.h"
-#include "SpellPackets.h"
enum WarriorSpells
{
@@ -173,16 +172,8 @@ class spell_warr_charge_drop_fire_periodic : public SpellScriptLoader
for (uint32 i = 0; i < 5; ++i)
{
int32 timeOffset = 6 * i * aurEff->GetPeriod() / 25;
- WorldPackets::Spells::PlaySpellVisual playSpellVisual;
- playSpellVisual.Source = GetTarget()->GetGUID();
- playSpellVisual.TargetPostion = static_cast<G3D::Vector3>(GetTarget()->movespline->ComputePosition(timeOffset)); // slices
- playSpellVisual.SpellVisualID = SPELL_VISUAL_BLAZING_CHARGE;
- playSpellVisual.TravelSpeed = 1.0f;
- playSpellVisual.MissReason = 0;
- playSpellVisual.ReflectStatus = 0;
- playSpellVisual.Orientation = 0.0f;
- playSpellVisual.SpeedAsTime = true;
- GetTarget()->SendMessageToSet(playSpellVisual.Write(), true);
+ Movement::Location loc = GetTarget()->movespline->ComputePosition(timeOffset);
+ GetTarget()->SendPlaySpellVisual(loc, 0.f, SPELL_VISUAL_BLAZING_CHARGE, 0, 0, 1.f, true);
}
}
}