diff options
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 78 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 8 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Server/Packets/SpellPackets.h | 34 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_warrior.cpp | 13 |
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); } } } |