/* * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 2 of the License, or (at your * option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #ifndef TRINITYCORE_SPELL_PACKETS_H #define TRINITYCORE_SPELL_PACKETS_H #include "CombatLogPacketsCommon.h" #include "MovementInfo.h" #include "ObjectGuid.h" #include "Optional.h" #include "PacketUtilities.h" #include "Position.h" #include namespace UF { struct ChrCustomizationChoice; } namespace WorldPackets { namespace Spells { class CancelAura final : public ClientPacket { public: explicit CancelAura(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_AURA, std::move(packet)) { } void Read() override; ObjectGuid CasterGUID; int32 SpellID = 0; }; class CancelAutoRepeatSpell final : public ClientPacket { public: explicit CancelAutoRepeatSpell(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_AUTO_REPEAT_SPELL, std::move(packet)) { } void Read() override { } }; class CancelChannelling final : public ClientPacket { public: explicit CancelChannelling(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_CHANNELLING, std::move(packet)) { } void Read() override; int32 ChannelSpell = 0; int32 Reason = 0; // 40 = /run SpellStopCasting(), 16 = movement/SpellAuraInterruptFlags::Moving, 41 = turning/SpellAuraInterruptFlags::Turning // does not match SpellCastResult enum }; class CancelGrowthAura final : public ClientPacket { public: explicit CancelGrowthAura(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_GROWTH_AURA, std::move(packet)) { } void Read() override { } }; class CancelMountAura final : public ClientPacket { public: explicit CancelMountAura(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_MOUNT_AURA, std::move(packet)) { } void Read() override { } }; class CancelModSpeedNoControlAuras final : public ClientPacket { public: explicit CancelModSpeedNoControlAuras(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS, std::move(packet)) { } void Read() override; ObjectGuid TargetGUID; }; class PetCancelAura final : public ClientPacket { public: explicit PetCancelAura(WorldPacket&& packet) : ClientPacket(CMSG_PET_CANCEL_AURA, std::move(packet)) { } void Read() override; ObjectGuid PetGUID; uint32 SpellID = 0; }; class SendKnownSpells final : public ServerPacket { public: explicit SendKnownSpells() : ServerPacket(SMSG_SEND_KNOWN_SPELLS, 5) { } WorldPacket const* Write() override; bool InitialLogin = false; std::vector KnownSpells; std::vector FavoriteSpells; // tradeskill recipes }; class UpdateActionButtons final : public ServerPacket { public: static std::size_t constexpr NumActionButtons = 180; explicit UpdateActionButtons() : ServerPacket(SMSG_UPDATE_ACTION_BUTTONS, NumActionButtons * 8 + 1) { } WorldPacket const* Write() override; std::array ActionButtons = { }; uint8 Reason = 0; /* Reason can be 0, 1, 2 0 - Sends initial action buttons, client does not validate if we have the spell or not 1 - Used used after spec swaps, client validates if a spell is known. 2 - Clears the action bars client sided. This is sent during spec swap before unlearning and before sending the new buttons */ }; class SetActionButton final : public ClientPacket { public: explicit SetActionButton(WorldPacket&& packet) : ClientPacket(CMSG_SET_ACTION_BUTTON, std::move(packet)) {} void Read() override; uint64 Action = 0; ///< two packed values (action and type) uint8 Index = 0; }; class SendUnlearnSpells final : public ServerPacket { public: explicit SendUnlearnSpells() : ServerPacket(SMSG_SEND_UNLEARN_SPELLS, 4) { } WorldPacket const* Write() override; std::vector Spells; }; struct AuraDataInfo { ObjectGuid CastID; int32 SpellID = 0; SpellCastVisual Visual; uint16 Flags = 0; uint32 ActiveFlags = 0; uint16 CastLevel = 1; uint8 Applications = 1; int32 ContentTuningID = 0; Optional ContentTuning; Optional CastUnit; Optional CastItem; Optional Duration; Optional Remaining; Optional TimeMod; std::vector Points; std::vector EstimatedPoints; TaggedPosition DstLocation; }; struct AuraInfo { uint16 Slot = 0; Optional AuraData; }; class AuraUpdate final : public ServerPacket { public: explicit AuraUpdate() : ServerPacket(SMSG_AURA_UPDATE) { } WorldPacket const* Write() override; bool UpdateAll = false; ObjectGuid UnitGUID; std::vector Auras; }; struct TargetLocation { ObjectGuid Transport; TaggedPosition Location; }; struct SpellTargetData { uint32 Flags = 0; bool Unknown1127_2 = false; ObjectGuid Unit; ObjectGuid Item; ObjectGuid Unknown1127_1; Optional SrcLocation; Optional DstLocation; Optional Orientation; Optional MapID; std::string Name; }; struct MissileTrajectoryRequest { float Pitch = 0.0f; float Speed = 0.0f; }; struct SpellWeight { uint32 Type = 0; int32 ID = 0; uint32 Quantity = 0; }; struct SpellCraftingReagent { int32 ItemID = 0; int32 DataSlotIndex = 0; int32 Quantity = 0; Optional Source; }; struct SpellExtraCurrencyCost { int32 CurrencyID = 0; int32 Count = 0; }; struct SpellCastRequest { ObjectGuid CastID; int32 SpellID = 0; SpellCastVisual Visual; uint8 SendCastFlags = 0; SpellTargetData Target; MissileTrajectoryRequest MissileTrajectory; Optional MoveUpdate; std::vector Weight; Array OptionalReagents; Array RemovedModifications; Array OptionalCurrencies; Optional CraftingOrderID; uint8 CraftingFlags = 0; // 1 = ApplyConcentration ObjectGuid CraftingNPC; int32 Misc[2] = { }; }; class CastSpell final : public ClientPacket { public: explicit CastSpell(WorldPacket&& packet) : ClientPacket(CMSG_CAST_SPELL, std::move(packet)) { } void Read() override; SpellCastRequest Cast; }; class PetCastSpell final : public ClientPacket { public: explicit PetCastSpell(WorldPacket&& packet) : ClientPacket(CMSG_PET_CAST_SPELL, std::move(packet)) { } void Read() override; ObjectGuid PetGUID; SpellCastRequest Cast; }; class UseItem final : public ClientPacket { public: explicit UseItem(WorldPacket&& packet) : ClientPacket(CMSG_USE_ITEM, std::move(packet)) { } void Read() override; uint8 PackSlot = 0; uint8 Slot = 0; ObjectGuid CastItem; SpellCastRequest Cast; }; class SpellPrepare final : public ServerPacket { public: explicit SpellPrepare() : ServerPacket(SMSG_SPELL_PREPARE, 16 + 16) { } WorldPacket const* Write() override; ObjectGuid ClientCastID; ObjectGuid ServerCastID; }; struct SpellHitStatus { SpellHitStatus() { } SpellHitStatus(uint8 reason) : Reason(reason) { } uint8 Reason = 0; }; struct SpellMissStatus { SpellMissStatus() { } SpellMissStatus(uint8 reason, uint8 reflectStatus) : Reason(reason), ReflectStatus(reflectStatus) { } uint8 Reason = 0; uint8 ReflectStatus = 0; }; struct SpellPowerData { int32 Cost = 0; int8 Type = 0; }; struct RuneData { uint8 Start = 0; uint8 Count = 0; std::vector Cooldowns; }; struct MissileTrajectoryResult { uint32 TravelTime = 0; float Pitch = 0.0f; }; struct CreatureImmunities { uint32 School = 0; uint32 Value = 0; }; struct SpellHealPrediction { ObjectGuid BeaconGUID; uint32 Points = 0; uint32 Type = 0; }; struct SpellCastData { ObjectGuid CasterGUID; ObjectGuid CasterUnit; ObjectGuid CastID; ObjectGuid OriginalCastID; int32 SpellID = 0; SpellCastVisual Visual; uint32 CastFlags = 0; uint32 CastFlagsEx = 0; uint32 CastFlagsEx2 = 0; uint32 CastTime = 0; std::vector HitTargets; std::vector MissTargets; std::vector HitStatus; std::vector MissStatus; SpellTargetData Target; std::vector RemainingPower; Optional RemainingRunes; MissileTrajectoryResult MissileTrajectory; int32 AmmoDisplayID = 0; uint8 DestLocSpellCastIndex = 0; std::vector TargetPoints; CreatureImmunities Immunities; SpellHealPrediction Predict; }; class SpellStart final : public ServerPacket { public: explicit SpellStart() : ServerPacket(SMSG_SPELL_START) { } WorldPacket const* Write() override; SpellCastData Cast; }; class SpellGo final : public CombatLog::CombatLogServerPacket { public: explicit SpellGo() : CombatLog::CombatLogServerPacket(SMSG_SPELL_GO) { } WorldPacket const* Write() override; SpellCastData Cast; }; struct LearnedSpellInfo { int32 SpellID = 0; bool Favorite = false; Optional EquipableSpellInvSlot; Optional Superceded; Optional TraitDefinitionID; }; class LearnedSpells final : public ServerPacket { public: explicit LearnedSpells() : ServerPacket(SMSG_LEARNED_SPELLS, 9) { } WorldPacket const* Write() override; std::vector ClientLearnedSpellData; uint32 SpecializationID = 0; bool SuppressMessaging = false; }; class SupercededSpells final : public ServerPacket { public: explicit SupercededSpells() : ServerPacket(SMSG_SUPERCEDED_SPELLS, 4 + 4 + 4 + 4) { } WorldPacket const* Write() override; std::vector ClientLearnedSpellData; }; class SpellFailure final : public ServerPacket { public: explicit SpellFailure() : ServerPacket(SMSG_SPELL_FAILURE, 16 + 4 + 8 + 2 + 16) { } WorldPacket const* Write() override; ObjectGuid CasterUnit; uint32 SpellID = 0; SpellCastVisual Visual; uint16 Reason = 0; ObjectGuid CastID; }; class SpellFailedOther final : public ServerPacket { public: explicit SpellFailedOther() : ServerPacket(SMSG_SPELL_FAILED_OTHER, 16 + 4 + 8 + 1 + 16) { } WorldPacket const* Write() override; ObjectGuid CasterUnit; uint32 SpellID = 0; SpellCastVisual Visual; uint8 Reason = 0; ObjectGuid CastID; }; class TC_GAME_API CastFailed final : public ServerPacket { public: explicit CastFailed() : ServerPacket(SMSG_CAST_FAILED, 4 + 4 + 4 + 4 + 1) { } WorldPacket const* Write() override; ObjectGuid CastID; int32 SpellID = 0; SpellCastVisual Visual; int32 Reason = 0; int32 FailedArg1 = -1; int32 FailedArg2 = -1; }; class TC_GAME_API PetCastFailed final : public ServerPacket { public: explicit PetCastFailed() : ServerPacket(SMSG_PET_CAST_FAILED, 4 + 4 + 4 + 1) { } WorldPacket const* Write() override; ObjectGuid CastID; int32 SpellID = 0; int32 Reason = 0; int32 FailedArg1 = -1; int32 FailedArg2 = -1; }; struct SpellModifierData { float ModifierValue = 0.0f; uint8 ClassIndex = 0; }; struct SpellModifier { uint8 ModIndex = 0; std::vector ModifierData; }; class TC_GAME_API SetSpellModifier final : public ServerPacket { public: explicit SetSpellModifier(OpcodeServer opcode) : ServerPacket(opcode, 20) { } WorldPacket const* Write() override; std::vector Modifiers; }; class UnlearnedSpells final : public ServerPacket { public: explicit UnlearnedSpells() : ServerPacket(SMSG_UNLEARNED_SPELLS, 4) { } WorldPacket const* Write() override; std::vector SpellID; bool SuppressMessaging = false; }; class CooldownEvent final : public ServerPacket { public: explicit CooldownEvent() : ServerPacket(SMSG_COOLDOWN_EVENT, 1 + 4) { } explicit CooldownEvent(bool isPet, int32 spellId) : ServerPacket(SMSG_COOLDOWN_EVENT, 1 + 4), IsPet(isPet), SpellID(spellId) { } WorldPacket const* Write() override; bool IsPet = false; int32 SpellID = 0; }; class ClearCooldowns final : public ServerPacket { public: explicit ClearCooldowns() : ServerPacket(SMSG_CLEAR_COOLDOWNS, 4 + 1) { } WorldPacket const* Write() override; std::vector SpellID; bool IsPet = false; }; class ClearCooldown final : public ServerPacket { public: explicit ClearCooldown() : ServerPacket(SMSG_CLEAR_COOLDOWN, 1 + 4 + 1) { } WorldPacket const* Write() override; bool IsPet = false; int32 SpellID = 0; bool ClearOnHold = false; }; class ModifyCooldown final : public ServerPacket { public: explicit ModifyCooldown() : ServerPacket(SMSG_MODIFY_COOLDOWN, 1 + 4 + 4) { } WorldPacket const* Write() override; bool IsPet = false; bool SkipCategory = false; int32 DeltaTime = 0; int32 SpellID = 0; }; class UpdateCooldown final : public ServerPacket { public: explicit UpdateCooldown() : ServerPacket(SMSG_UPDATE_COOLDOWN, 4 + 4 + 4) { } WorldPacket const* Write() override; int32 SpellID = 0; float ModChange = 1.0f; float ModRate = 1.0f; }; struct SpellCooldownStruct { SpellCooldownStruct() { } SpellCooldownStruct(uint32 spellId, uint32 forcedCooldown) : SrecID(spellId), ForcedCooldown(forcedCooldown) { } uint32 SrecID = 0; uint32 ForcedCooldown = 0; float ModRate = 1.0f; }; class TC_GAME_API SpellCooldown : public ServerPacket { public: explicit SpellCooldown() : ServerPacket(SMSG_SPELL_COOLDOWN, 4 + 16 + 1) { } WorldPacket const* Write() override; std::vector SpellCooldowns; ObjectGuid Caster; uint8 Flags = 0; }; struct SpellHistoryEntry { uint32 SpellID = 0; uint32 ItemID = 0; uint32 Category = 0; int32 RecoveryTime = 0; int32 CategoryRecoveryTime = 0; float ModRate = 1.0f; bool OnHold = false; Optional RecoveryTimeStartOffset; Optional CategoryRecoveryTimeStartOffset; }; class SendSpellHistory final : public ServerPacket { public: explicit SendSpellHistory() : ServerPacket(SMSG_SEND_SPELL_HISTORY, 4) { } WorldPacket const* Write() override; std::vector Entries; }; class ClearAllSpellCharges final : public ServerPacket { public: explicit ClearAllSpellCharges() : ServerPacket(SMSG_CLEAR_ALL_SPELL_CHARGES, 1) { } WorldPacket const* Write() override; bool IsPet = false; }; class ClearSpellCharges final : public ServerPacket { public: explicit ClearSpellCharges() : ServerPacket(SMSG_CLEAR_SPELL_CHARGES, 1 + 4) { } WorldPacket const* Write() override; bool IsPet = false; int32 Category = 0; }; class SetSpellCharges final : public ServerPacket { public: explicit SetSpellCharges() : ServerPacket(SMSG_SET_SPELL_CHARGES, 4 + 4 + 1 + 4 + 1) { } WorldPacket const* Write() override; bool IsPet = false; uint32 Category = 0; uint32 NextRecoveryTime = 0; uint8 ConsumedCharges = 0; float ChargeModRate = 1.0f; }; class UpdateChargeCategoryCooldown final : public ServerPacket { public: explicit UpdateChargeCategoryCooldown() : ServerPacket(SMSG_UPDATE_CHARGE_CATEGORY_COOLDOWN, 4 + 4 + 4 + 1) { } WorldPacket const* Write() override; int32 Category = 0; float ModChange = 1.0f; float ModRate = 1.0f; bool Snapshot = false; }; struct SpellChargeEntry { uint32 Category = 0; uint32 NextRecoveryTime = 0; float ChargeModRate = 1.0f; uint8 ConsumedCharges = 0; }; class SendSpellCharges final : public ServerPacket { public: explicit SendSpellCharges() : ServerPacket(SMSG_SEND_SPELL_CHARGES, 4) { } WorldPacket const* Write() override; std::vector Entries; }; class ClearTarget final : public ServerPacket { public: explicit ClearTarget() : ServerPacket(SMSG_CLEAR_TARGET, 8) { } WorldPacket const* Write() override; ObjectGuid Guid; }; class CancelOrphanSpellVisual final : public ServerPacket { public: explicit CancelOrphanSpellVisual() : ServerPacket(SMSG_CANCEL_ORPHAN_SPELL_VISUAL, 4) { } WorldPacket const* Write() override; int32 SpellVisualID = 0; }; class CancelSpellVisual final : public ServerPacket { public: explicit CancelSpellVisual() : ServerPacket(SMSG_CANCEL_SPELL_VISUAL, 16 + 4) { } WorldPacket const* Write() override; ObjectGuid Source; int32 SpellVisualID = 0; }; class CancelSpellVisualKit final : public ServerPacket { public: explicit CancelSpellVisualKit() : ServerPacket(SMSG_CANCEL_SPELL_VISUAL_KIT, 16 + 4) { } WorldPacket const* Write() override; ObjectGuid Source; int32 SpellVisualKitID = 0; bool MountedVisual = false; }; class PlayOrphanSpellVisual final : public ServerPacket { public: explicit 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 ObjectGuid TargetTransport; TaggedPosition SourceLocation; int32 SpellVisualID = 0; bool SpeedAsTime = false; float TravelSpeed = 0.0f; float LaunchDelay = 0.0f; float MinDuration = 0.0f; TaggedPosition SourceRotation; // Vector of rotations, Orientation is z TaggedPosition TargetLocation; // Exclusive with Target }; class PlaySpellVisual final : public ServerPacket { public: explicit PlaySpellVisual() : ServerPacket(SMSG_PLAY_SPELL_VISUAL, 16 + 16 + 2 + 4 + 1 + 2 + 4 + 4 * 4) { } WorldPacket const* Write() override; ObjectGuid Source; ObjectGuid Target; ObjectGuid Transport; // Used when Target = Empty && (SpellVisual::Flags & 0x400) == 0 TaggedPosition TargetPosition; // Overrides missile destination for SpellVisual::SpellVisualMissileSetID uint32 SpellVisualID = 0; float TravelSpeed = 0.0f; uint8 HitReason = 0; uint8 MissReason = 0; uint8 ReflectStatus = 0; float LaunchDelay = 0.0f; float MinDuration = 0.0f; bool SpeedAsTime = false; }; class PlaySpellVisualKit final : public ServerPacket { public: explicit PlaySpellVisualKit() : ServerPacket(SMSG_PLAY_SPELL_VISUAL_KIT, 16 + 4 + 4 + 4) { } WorldPacket const* Write() override; ObjectGuid Unit; int32 KitRecID = 0; int32 KitType = 0; uint32 Duration = 0; bool MountedVisual = false; }; class SpellVisualLoadScreen final : public ServerPacket { public: explicit SpellVisualLoadScreen(int32 spellVisualKitId, int32 delay) : ServerPacket(SMSG_SPELL_VISUAL_LOAD_SCREEN, 4 + 4), SpellVisualKitID(spellVisualKitId), Delay(delay) { } WorldPacket const* Write() override; int32 SpellVisualKitID = 0; int32 Delay = 0; }; class CancelCast final : public ClientPacket { public: explicit CancelCast(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_CAST, std::move(packet)) { } void Read() override; uint32 SpellID = 0; ObjectGuid CastID; }; class OpenItem final : public ClientPacket { public: explicit OpenItem(WorldPacket&& packet) : ClientPacket(CMSG_OPEN_ITEM, std::move(packet)) { } void Read() override; uint8 Slot = 0; uint8 PackSlot = 0; }; struct SpellChannelStartInterruptImmunities { int32 SchoolImmunities = 0; int32 Immunities = 0; }; struct SpellTargetedHealPrediction { ObjectGuid TargetGUID; SpellHealPrediction Predict; }; class SpellChannelStart final : public ServerPacket { public: explicit SpellChannelStart() : ServerPacket(SMSG_SPELL_CHANNEL_START, 4 + 16 + 4) { } WorldPacket const* Write() override; int32 SpellID = 0; SpellCastVisual Visual; Optional InterruptImmunities; ObjectGuid CasterGUID; Optional HealPrediction; uint32 ChannelDuration = 0; }; class SpellChannelUpdate final : public ServerPacket { public: explicit SpellChannelUpdate() : ServerPacket(SMSG_SPELL_CHANNEL_UPDATE, 16 + 4) { } WorldPacket const* Write() override; ObjectGuid CasterGUID; int32 TimeRemaining = 0; }; class SpellEmpowerStart final : public ServerPacket { public: explicit SpellEmpowerStart() : ServerPacket(SMSG_SPELL_EMPOWER_START, 16 + 16 + 4 + 8 + 4 + 4 + 4 + 1) { } WorldPacket const* Write() override; ObjectGuid CastID; ObjectGuid CasterGUID; int32 SpellID = 0; SpellCastVisual Visual; Duration EmpowerDuration; Duration MinHoldTime; Duration HoldAtMaxTime; std::vector Targets; std::vector> StageDurations; Optional InterruptImmunities; Optional HealPrediction; }; class SpellEmpowerUpdate final : public ServerPacket { public: explicit SpellEmpowerUpdate() : ServerPacket(SMSG_SPELL_EMPOWER_UPDATE, 16 + 16 + 4 + 4 + 1) { } WorldPacket const* Write() override; ObjectGuid CastID; ObjectGuid CasterGUID; Duration TimeRemaining; std::vector> StageDurations; uint8 Status = 0; }; class SetEmpowerMinHoldStagePercent final : public ClientPacket { public: explicit SetEmpowerMinHoldStagePercent(WorldPacket&& packet) : ClientPacket(CMSG_SET_EMPOWER_MIN_HOLD_STAGE_PERCENT, std::move(packet)) { } void Read() override; float MinHoldStagePercent = 1.0f; }; class SpellEmpowerRelease final : public ClientPacket { public: explicit SpellEmpowerRelease(WorldPacket&& packet) : ClientPacket(CMSG_SPELL_EMPOWER_RELEASE, std::move(packet)) { } void Read() override; int32 SpellID = 0; }; class SpellEmpowerRestart final : public ClientPacket { public: explicit SpellEmpowerRestart(WorldPacket&& packet) : ClientPacket(CMSG_SPELL_EMPOWER_RESTART, std::move(packet)) { } void Read() override; int32 SpellID = 0; }; class SpellEmpowerSetStage final : public ServerPacket { public: explicit SpellEmpowerSetStage() : ServerPacket(SMSG_SPELL_EMPOWER_SET_STAGE, 16 + 16 + 4) { } WorldPacket const* Write() override; ObjectGuid CastID; ObjectGuid CasterGUID; int32 Stage = 0; }; class ResurrectRequest final : public ServerPacket { public: explicit ResurrectRequest() : ServerPacket(SMSG_RESURRECT_REQUEST, 16 + 4 + 4 + 4 + 1) { } WorldPacket const* Write() override; ObjectGuid ResurrectOffererGUID; uint32 ResurrectOffererVirtualRealmAddress = 0; uint32 PetNumber = 0; int32 SpellID = 0; bool UseTimer = false; bool Sickness = false; std::string Name; }; class UnlearnSkill final : public ClientPacket { public: explicit UnlearnSkill(WorldPacket&& packet) : ClientPacket(CMSG_UNLEARN_SKILL, std::move(packet)) { } void Read() override; uint32 SkillLine = 0; }; class SelfRes final : public ClientPacket { public: explicit SelfRes(WorldPacket&& packet) : ClientPacket(CMSG_SELF_RES, std::move(packet)) { } void Read() override; int32 SpellID = 0; }; class GetMirrorImageData final : public ClientPacket { public: explicit GetMirrorImageData(WorldPacket&& packet) : ClientPacket(CMSG_GET_MIRROR_IMAGE_DATA, std::move(packet)) {} void Read() override; ObjectGuid UnitGUID; }; class MirrorImageComponentedData final : public ServerPacket { public: explicit MirrorImageComponentedData(); ~MirrorImageComponentedData(); WorldPacket const* Write() override; ObjectGuid UnitGUID; int32 ChrModelID = 0; int32 SpellVisualKitID = 0; int32 Unused_1115 = 0; uint8 RaceID = 0; uint8 Gender = 0; uint8 ClassID = 0; std::vector Customizations; ObjectGuid GuildGUID; std::vector ItemDisplayID; }; class MirrorImageCreatureData final : public ServerPacket { public: explicit MirrorImageCreatureData() : ServerPacket(SMSG_MIRROR_IMAGE_CREATURE_DATA, 8 + 4) { } WorldPacket const* Write() override; ObjectGuid UnitGUID; int32 DisplayID = 0; int32 SpellVisualKitID = 0; }; class SpellClick final : public ClientPacket { public: explicit SpellClick(WorldPacket&& packet) : ClientPacket(CMSG_SPELL_CLICK, std::move(packet)) { } void Read() override; ObjectGuid SpellClickUnitGuid; bool TryAutoDismount = false; }; class ResyncRunes final : public ServerPacket { public: explicit ResyncRunes(size_t size) : ServerPacket(SMSG_RESYNC_RUNES, 1 + 1 + 4 + size) { } WorldPacket const* Write() override; RuneData Runes; }; class AddRunePower final : public ServerPacket { public: explicit AddRunePower() : ServerPacket(SMSG_ADD_RUNE_POWER, 4) { } WorldPacket const* Write() override; uint32 AddedRunesMask = 0; }; class MissileTrajectoryCollision final : public ClientPacket { public: explicit MissileTrajectoryCollision(WorldPacket&& packet) : ClientPacket(CMSG_MISSILE_TRAJECTORY_COLLISION, std::move(packet)) { } void Read() override; ObjectGuid Target; int32 SpellID = 0; ObjectGuid CastID; TaggedPosition CollisionPos; }; class NotifyMissileTrajectoryCollision final : public ServerPacket { public: explicit NotifyMissileTrajectoryCollision() : ServerPacket(SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION, 8 + 1 + 12) { } WorldPacket const* Write() override; ObjectGuid Caster; ObjectGuid CastID; TaggedPosition CollisionPos; }; class UpdateMissileTrajectory final : public ClientPacket { public: explicit UpdateMissileTrajectory(WorldPacket&& packet) : ClientPacket(CMSG_UPDATE_MISSILE_TRAJECTORY, std::move(packet)) { } void Read() override; ObjectGuid Guid; ObjectGuid CastID; uint32 MoveMsgID = 0; int32 SpellID = 0; float Pitch = 0.0f; float Speed = 0.0f; TaggedPosition FirePos; TaggedPosition ImpactPos; Optional 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: explicit SpellDelayed() : ServerPacket(SMSG_SPELL_DELAYED, sizeof(ObjectGuid) + 4) { } WorldPacket const* Write() override; ObjectGuid Caster; int32 ActualDelay = 0; }; class DispelFailed final : public ServerPacket { public: explicit DispelFailed() : ServerPacket(SMSG_DISPEL_FAILED, 16 + 16 + 4 + 4 + 4 /* predict a single failure on average */) { } WorldPacket const* Write() override; ObjectGuid CasterGUID; ObjectGuid VictimGUID; uint32 SpellID = 0; std::vector FailedSpells; }; class CustomLoadScreen final : public ServerPacket { public: explicit CustomLoadScreen(uint32 teleportSpellId, uint32 loadingScreenId) : ServerPacket(SMSG_CUSTOM_LOAD_SCREEN, 4 + 4), TeleportSpellID(teleportSpellId), LoadingScreenID(loadingScreenId) { } WorldPacket const* Write() override; uint32 TeleportSpellID; uint32 LoadingScreenID; }; class MountResult final : public ServerPacket { public: explicit MountResult() : ServerPacket(SMSG_MOUNT_RESULT, 4) { } WorldPacket const* Write() override; uint32 Result = 0; }; class ApplyMountEquipmentResult final : public ServerPacket { public: enum ApplyResult : int32 { Success = 0, Failure = 1 }; explicit ApplyMountEquipmentResult() : ServerPacket(SMSG_APPLY_MOUNT_EQUIPMENT_RESULT, 16 + 4 + 1) { } WorldPacket const* Write() override; ObjectGuid ItemGUID; int32 ItemID = 0; ApplyResult Result = Success; }; class MissileCancel final : public ServerPacket { public: explicit MissileCancel() : ServerPacket(SMSG_MISSILE_CANCEL, 21) { } WorldPacket const* Write() override; ObjectGuid OwnerGUID; bool Reverse = false; int32 SpellID = 0; }; class TradeSkillSetFavorite final : public ClientPacket { public: explicit TradeSkillSetFavorite(WorldPacket&& packet) : ClientPacket(CMSG_TRADE_SKILL_SET_FAVORITE, std::move(packet)) { } void Read() override; int32 RecipeID = 0; bool IsFavorite = false; }; class KeyboundOverride final : public ClientPacket { public: explicit KeyboundOverride(WorldPacket&& packet) : ClientPacket(CMSG_KEYBOUND_OVERRIDE, std::move(packet)) { } void Read() override; uint16 OverrideID = 0; }; class CancelQueuedSpell final : public ClientPacket { public: explicit CancelQueuedSpell(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_QUEUED_SPELL, std::move(packet)) { } void Read() override { } }; ByteBuffer& operator>>(ByteBuffer& buffer, SpellCastRequest& request); } } #endif // TRINITYCORE_SPELL_PACKETS_H