TrinityCore
SpellPackets.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "MovementPackets.h"
19#include "CharacterPackets.h"
20#include "SpellPackets.h"
21
23{
25{
28}
29
31{
34}
35
37{
39}
40
42{
45}
46
48{
49 _worldPacket.reserve(1 + 4 * KnownSpells.size() + 4 * FavoriteSpells.size());
50
54
55 for (uint32 spellId : KnownSpells)
56 _worldPacket << uint32(spellId);
57
58 for (uint32 spellId : FavoriteSpells)
59 _worldPacket << uint32(spellId);
60
61 return &_worldPacket;
62}
63
65{
68
69 return &_worldPacket;
70}
71
73{
76}
77
79{
80 _worldPacket << uint32(Spells.size());
81 for (uint32 spellId : Spells)
82 _worldPacket << uint32(spellId);
83
84 return &_worldPacket;
85}
86
88{
89 data << auraData.CastID;
90 data << int32(auraData.SpellID);
91 data << auraData.Visual;
92 data << uint16(auraData.Flags);
93 data << uint32(auraData.ActiveFlags);
94 data << uint16(auraData.CastLevel);
95 data << uint8(auraData.Applications);
96 data << int32(auraData.ContentTuningID);
97 data.WriteBit(auraData.CastUnit.has_value());
98 data.WriteBit(auraData.Duration.has_value());
99 data.WriteBit(auraData.Remaining.has_value());
100 data.WriteBit(auraData.TimeMod.has_value());
101 data.WriteBits(auraData.Points.size(), 6);
102 data.WriteBits(auraData.EstimatedPoints.size(), 6);
103 data.WriteBit(auraData.ContentTuning.has_value());
104
105 if (auraData.ContentTuning)
106 data << *auraData.ContentTuning;
107
108 if (auraData.CastUnit)
109 data << *auraData.CastUnit;
110
111 if (auraData.Duration)
112 data << uint32(*auraData.Duration);
113
114 if (auraData.Remaining)
115 data << uint32(*auraData.Remaining);
116
117 if (auraData.TimeMod)
118 data << float(*auraData.TimeMod);
119
120 if (!auraData.Points.empty())
121 data.append(auraData.Points.data(), auraData.Points.size());
122
123 if (!auraData.EstimatedPoints.empty())
124 data.append(auraData.EstimatedPoints.data(), auraData.EstimatedPoints.size());
125
126 return data;
127}
128
130{
131 data << aura.Slot;
132 data.WriteBit(aura.AuraData.has_value());
133 data.FlushBits();
134
135 if (aura.AuraData)
136 data << *aura.AuraData;
137
138 return data;
139}
140
142{
144 _worldPacket.WriteBits(Auras.size(), 9);
145 for (AuraInfo const& aura : Auras)
146 _worldPacket << aura;
147
149
150 return &_worldPacket;
151}
152
154{
155 buffer >> location.Transport;
156 buffer >> location.Location;
157 return buffer;
158}
159
161{
162 buffer.ResetBitPos();
163
164 targetData.Flags = buffer.ReadBits(28);
165 bool hasSrcLocation = buffer.ReadBit();
166 bool hasDstLocation = buffer.ReadBit();
167 bool hasOrientation = buffer.ReadBit();
168 bool hasMapID = buffer.ReadBit();
169 uint32 nameLength = buffer.ReadBits(7);
170
171 buffer >> targetData.Unit;
172 buffer >> targetData.Item;
173
174 if (hasSrcLocation)
175 buffer >> targetData.SrcLocation.emplace();
176
177 if (hasDstLocation)
178 buffer >> targetData.DstLocation.emplace();
179
180 if (hasOrientation)
181 targetData.Orientation = buffer.read<float>();
182
183 if (hasMapID)
184 targetData.MapID = buffer.read<int32>();
185
186 targetData.Name = buffer.ReadString(nameLength);
187
188 return buffer;
189}
190
192{
193 buffer >> trajectory.Pitch;
194 buffer >> trajectory.Speed;
195 return buffer;
196}
197
199{
200 data >> optionalReagent.ItemID;
201 data >> optionalReagent.DataSlotIndex;
202 data >> optionalReagent.Quantity;
203 if (data.ReadBit())
204 optionalReagent.Unknown_1000 = data.read<uint8>();
205
206 return data;
207}
208
210{
211 data >> extraCurrencyCost.CurrencyID;
212 data >> extraCurrencyCost.Count;
213 return data;
214}
215
217{
218 buffer >> request.CastID;
219 buffer >> request.Misc[0];
220 buffer >> request.Misc[1];
221 buffer >> request.SpellID;
222 buffer >> request.Visual;
223 buffer >> request.MissileTrajectory;
224 buffer >> request.CraftingNPC;
225 request.OptionalCurrencies.resize(buffer.read<uint32>());
226 request.OptionalReagents.resize(buffer.read<uint32>());
227 request.RemovedModifications.resize(buffer.read<uint32>());
228
229 for (SpellExtraCurrencyCost& optionalCurrency : request.OptionalCurrencies)
230 buffer >> optionalCurrency;
231
232 request.SendCastFlags = buffer.ReadBits(5);
233 bool hasMoveUpdate = buffer.ReadBit();
234 request.Weight.resize(buffer.ReadBits(2));
235 bool hasCraftingOrderID = buffer.ReadBit();
236 buffer >> request.Target;
237
238 if (hasCraftingOrderID)
239 request.CraftingOrderID = buffer.read<uint64>();
240
241 for (SpellCraftingReagent& optionalReagent : request.OptionalReagents)
242 buffer >> optionalReagent;
243
244 for (SpellCraftingReagent& optionalReagent : request.RemovedModifications)
245 buffer >> optionalReagent;
246
247 if (hasMoveUpdate)
248 buffer >> request.MoveUpdate.emplace();
249
250 for (SpellWeight& weight : request.Weight)
251 {
252 buffer.ResetBitPos();
253 weight.Type = buffer.ReadBits(2);
254 buffer >> weight.ID;
255 buffer >> weight.Quantity;
256 }
257
258 return buffer;
259}
260
262{
264}
265
267{
270}
271
273{
278}
279
281{
284
285 return &_worldPacket;
286}
287
288ByteBuffer& operator<<(ByteBuffer& data, TargetLocation const& targetLocation)
289{
290 data << targetLocation.Transport;
291 data << targetLocation.Location;
292 return data;
293}
294
295ByteBuffer& operator<<(ByteBuffer& data, SpellTargetData const& spellTargetData)
296{
297 data.WriteBits(spellTargetData.Flags, 28);
298 data.WriteBit(spellTargetData.SrcLocation.has_value());
299 data.WriteBit(spellTargetData.DstLocation.has_value());
300 data.WriteBit(spellTargetData.Orientation.has_value());
301 data.WriteBit(spellTargetData.MapID.has_value());
302 data.WriteBits(spellTargetData.Name.size(), 7);
303 data.FlushBits();
304
305 data << spellTargetData.Unit;
306 data << spellTargetData.Item;
307
308 if (spellTargetData.SrcLocation)
309 data << *spellTargetData.SrcLocation;
310
311 if (spellTargetData.DstLocation)
312 data << *spellTargetData.DstLocation;
313
314 if (spellTargetData.Orientation)
315 data << *spellTargetData.Orientation;
316
317 if (spellTargetData.MapID)
318 data << *spellTargetData.MapID;
319
320 data.WriteString(spellTargetData.Name);
321
322 return data;
323}
324
325ByteBuffer& operator<<(ByteBuffer& data, SpellMissStatus const& spellMissStatus)
326{
327 data << uint8(spellMissStatus.Reason);
328 if (spellMissStatus.Reason == SPELL_MISS_REFLECT)
329 data << uint8(spellMissStatus.ReflectStatus);
330
331 return data;
332}
333
334ByteBuffer& operator<<(ByteBuffer& data, SpellHitStatus const& spellHitStatus)
335{
336 data << uint8(spellHitStatus.Reason);
337 return data;
338}
339
340ByteBuffer& operator<<(ByteBuffer& data, SpellPowerData const& spellPowerData)
341{
342 data << int32(spellPowerData.Cost);
343 data << int8(spellPowerData.Type);
344 return data;
345}
346
347ByteBuffer& operator<<(ByteBuffer& data, RuneData const& runeData)
348{
349 data << uint8(runeData.Start);
350 data << uint8(runeData.Count);
351 data << uint32(runeData.Cooldowns.size());
352 if (!runeData.Cooldowns.empty())
353 data.append(runeData.Cooldowns.data(), runeData.Cooldowns.size());
354
355 return data;
356}
357
359{
360 data << uint32(missileTrajectory.TravelTime);
361 data << float(missileTrajectory.Pitch);
362 return data;
363}
364
366{
367 data << int32(immunities.School);
368 data << int32(immunities.Value);
369 return data;
370}
371
373{
374 data << int32(spellPred.Points);
375 data << uint8(spellPred.Type);
376 data << spellPred.BeaconGUID;
377 return data;
378}
379
380ByteBuffer& operator<<(ByteBuffer& data, SpellCastData const& spellCastData)
381{
382 data << spellCastData.CasterGUID;
383 data << spellCastData.CasterUnit;
384 data << spellCastData.CastID;
385 data << spellCastData.OriginalCastID;
386 data << int32(spellCastData.SpellID);
387 data << spellCastData.Visual;
388 data << uint32(spellCastData.CastFlags);
389 data << uint32(spellCastData.CastFlagsEx);
390 data << uint32(spellCastData.CastTime);
391 data << spellCastData.MissileTrajectory;
392 data << int32(spellCastData.AmmoDisplayID);
393 data << uint8(spellCastData.DestLocSpellCastIndex);
394 data << spellCastData.Immunities;
395 data << spellCastData.Predict;
396 data.WriteBits(spellCastData.HitTargets.size(), 16);
397 data.WriteBits(spellCastData.MissTargets.size(), 16);
398 data.WriteBits(spellCastData.HitStatus.size(), 16);
399 data.WriteBits(spellCastData.MissStatus.size(), 16);
400 data.WriteBits(spellCastData.RemainingPower.size(), 9);
401 data.WriteBit(spellCastData.RemainingRunes.has_value());
402 data.WriteBits(spellCastData.TargetPoints.size(), 16);
403 data.FlushBits();
404
405 data << spellCastData.Target;
406
407 for (ObjectGuid const& hitTarget : spellCastData.HitTargets)
408 data << hitTarget;
409
410 for (ObjectGuid const& missTarget : spellCastData.MissTargets)
411 data << missTarget;
412
413 for (SpellHitStatus const& hitStatus : spellCastData.HitStatus)
414 data << hitStatus;
415
416 for (SpellMissStatus const& missStatus : spellCastData.MissStatus)
417 data << missStatus;
418
419 for (SpellPowerData const& power : spellCastData.RemainingPower)
420 data << power;
421
422 if (spellCastData.RemainingRunes)
423 data << *spellCastData.RemainingRunes;
424
425 for (TargetLocation const& targetLoc : spellCastData.TargetPoints)
426 data << targetLoc;
427
428 return data;
429}
430
432{
434
435 return &_worldPacket;
436}
437
439{
440 *this << Cast;
441
443 FlushBits();
444
445 WriteLogData();
446
447 return &_worldPacket;
448}
449
450ByteBuffer& operator<<(ByteBuffer& data, LearnedSpellInfo const& learnedSpellInfo)
451{
452 data << int32(learnedSpellInfo.SpellID);
453 data.WriteBit(learnedSpellInfo.IsFavorite);
454 data.WriteBit(learnedSpellInfo.field_8.has_value());
455 data.WriteBit(learnedSpellInfo.Superceded.has_value());
456 data.WriteBit(learnedSpellInfo.TraitDefinitionID.has_value());
457 data.FlushBits();
458
459 if (learnedSpellInfo.field_8)
460 data << int32(*learnedSpellInfo.field_8);
461
462 if (learnedSpellInfo.Superceded)
463 data << int32(*learnedSpellInfo.Superceded);
464
465 if (learnedSpellInfo.TraitDefinitionID)
466 data << int32(*learnedSpellInfo.TraitDefinitionID);
467
468 return data;
469}
470
472{
477
478 for (LearnedSpellInfo const& spell : ClientLearnedSpellData)
479 _worldPacket << spell;
480
481 return &_worldPacket;
482}
483
485{
487
488 for (LearnedSpellInfo const& spell : ClientLearnedSpellData)
489 _worldPacket << spell;
490
491 return &_worldPacket;
492}
493
495{
501
502 return &_worldPacket;
503}
504
506{
512
513 return &_worldPacket;
514}
515
517{
524
525 return &_worldPacket;
526}
527
529{
535
536 return &_worldPacket;
537}
538
539ByteBuffer& operator<<(ByteBuffer& data, SpellModifierData const& spellModifierData)
540{
541 data << float(spellModifierData.ModifierValue);
542 data << uint8(spellModifierData.ClassIndex);
543
544 return data;
545}
546
547ByteBuffer& operator<<(ByteBuffer& data, SpellModifier const& spellModifier)
548{
549 data << uint8(spellModifier.ModIndex);
550 data << uint32(spellModifier.ModifierData.size());
551 for (SpellModifierData const& modData : spellModifier.ModifierData)
552 data << modData;
553
554 return data;
555}
556
558{
559 _worldPacket << uint32(Modifiers.size());
560 for (SpellModifier const& spellMod : Modifiers)
561 _worldPacket << spellMod;
562
563 return &_worldPacket;
564}
565
567{
568 _worldPacket << uint32(SpellID.size());
569 for (uint32 spellId : SpellID)
570 _worldPacket << uint32(spellId);
571
574
575 return &_worldPacket;
576}
577
579{
583
584 return &_worldPacket;
585}
586
588{
589 _worldPacket << uint32(SpellID.size());
590 if (!SpellID.empty())
591 _worldPacket.append(SpellID.data(), SpellID.size());
592
595
596 return &_worldPacket;
597}
598
600{
605
606 return &_worldPacket;
607}
608
610{
616
617 return &_worldPacket;
618}
619
621{
622 data << uint32(cooldown.SrecID);
623 data << uint32(cooldown.ForcedCooldown);
624 data << float(cooldown.ModRate);
625 return data;
626}
627
629{
633 for (SpellCooldownStruct const& cooldown : SpellCooldowns)
634 _worldPacket << cooldown;
635
636 return &_worldPacket;
637}
638
640{
641 data << uint32(historyEntry.SpellID);
642 data << uint32(historyEntry.ItemID);
643 data << uint32(historyEntry.Category);
644 data << int32(historyEntry.RecoveryTime);
645 data << int32(historyEntry.CategoryRecoveryTime);
646 data << float(historyEntry.ModRate);
647 data.WriteBit(historyEntry.unused622_1.has_value());
648 data.WriteBit(historyEntry.unused622_2.has_value());
649 data.WriteBit(historyEntry.OnHold);
650 if (historyEntry.unused622_1)
651 data << uint32(*historyEntry.unused622_1);
652 if (historyEntry.unused622_2)
653 data << uint32(*historyEntry.unused622_2);
654 data.FlushBits();
655
656 return data;
657}
658
660{
661 _worldPacket << uint32(Entries.size());
662 for (SpellHistoryEntry const& historyEntry : Entries)
663 _worldPacket << historyEntry;
664
665 return &_worldPacket;
666}
667
669{
672
673 return &_worldPacket;
674}
675
677{
681
682 return &_worldPacket;
683}
684
686{
690 _worldPacket << float(ChargeModRate);
693
694 return &_worldPacket;
695}
696
698{
699 data << uint32(chargeEntry.Category);
700 data << uint32(chargeEntry.NextRecoveryTime);
701 data << float(chargeEntry.ChargeModRate);
702 data << uint8(chargeEntry.ConsumedCharges);
703 return data;
704}
705
707{
708 _worldPacket << uint32(Entries.size());
709 for (SpellChargeEntry const& chargeEntry : Entries)
710 _worldPacket << chargeEntry;
711
712 return &_worldPacket;
713}
714
716{
718
719 return &_worldPacket;
720}
721
723{
725
726 return &_worldPacket;
727}
728
730{
733
734 return &_worldPacket;
735}
736
738{
743
744 return &_worldPacket;
745}
746
748{
754 _worldPacket << float(TravelSpeed);
755 _worldPacket << float(LaunchDelay);
756 _worldPacket << float(MinDuration);
759
760 return &_worldPacket;
761}
762
764{
770 _worldPacket << float(TravelSpeed);
774 _worldPacket << float(LaunchDelay);
775 _worldPacket << float(MinDuration);
778
779 return &_worldPacket;
780}
781
783{
790
791 return &_worldPacket;
792}
793
795{
798
799 return &_worldPacket;
800}
801
803{
806}
807
809{
811 >> PackSlot;
812}
813
815{
816 data << int32(interruptImmunities.SchoolImmunities);
817 data << int32(interruptImmunities.Immunities);
818 return data;
819}
820
821ByteBuffer& operator<<(ByteBuffer& data, SpellTargetedHealPrediction const& targetedHealPrediction)
822{
823 data << targetedHealPrediction.TargetGUID;
824 data << targetedHealPrediction.Predict;
825 return data;
826}
827
829{
837
840
841 if (HealPrediction)
843
844 return &_worldPacket;
845}
846
848{
851 return &_worldPacket;
852}
853
855{
860 _worldPacket.WriteBits(Name.length(), 11);
864
866
867 return &_worldPacket;
868}
869
871{
873}
874
876{
878}
879
881{
883}
884
886 : ServerPacket(SMSG_MIRROR_IMAGE_COMPONENTED_DATA, 8 + 4 + 8 * 1 + 8 + 11 * 4)
887{
888}
889
891
893{
903
904 for (Character::ChrCustomizationChoice const& customization : Customizations)
905 _worldPacket << customization;
906
907 for (int32 itemDisplayId : ItemDisplayID)
908 _worldPacket << int32(itemDisplayId);
909
910 return &_worldPacket;
911}
912
914{
918
919 return &_worldPacket;
920}
921
923{
926}
927
929{
931
932 return &_worldPacket;
933}
934
936{
938
939 return &_worldPacket;
940}
941
943{
948}
949
951{
955
956 return &_worldPacket;
957}
958
960{
969 bool hasStatus = _worldPacket.ReadBit();
970
972 if (hasStatus)
973 _worldPacket >> Status.emplace();
974}
975
977{
980
981 return &_worldPacket;
982}
983
985{
990 if (!FailedSpells.empty())
992
993 return &_worldPacket;
994}
995
997{
1000 return &_worldPacket;
1001}
1002
1004{
1006
1007 return &_worldPacket;
1008}
1009
1011{
1016
1017 return &_worldPacket;
1018}
1019
1021{
1024}
1025
1027{
1029}
1030}
uint8_t uint8
Definition: Define.h:144
int8_t int8
Definition: Define.h:140
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint16_t uint16
Definition: Define.h:143
uint32_t uint32
Definition: Define.h:142
Spells
Definition: PlayerAI.cpp:32
Gender
@ SPELL_MISS_REFLECT
uint32 ReadBits(int32 bits)
Definition: ByteBuffer.h:209
void reserve(size_t ressize)
Definition: ByteBuffer.h:546
void WriteString(std::string const &str)
Definition: ByteBuffer.h:500
void append(T value)
Definition: ByteBuffer.h:143
void ResetBitPos()
Definition: ByteBuffer.h:166
bool WriteBit(bool bit)
Definition: ByteBuffer.h:175
void WriteBits(std::size_t value, int32 bits)
Definition: ByteBuffer.h:203
void FlushBits()
Definition: ByteBuffer.h:155
std::string ReadString(uint32 length, bool requireValidUtf8=true)
Definition: ByteBuffer.cpp:78
bool ReadBit()
Definition: ByteBuffer.h:191
WorldPacket _worldPacket
Definition: Packet.h:43
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< AuraInfo > Auras
Definition: SpellPackets.h:192
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< int32 > FailedSpells
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< LearnedSpellInfo > ClientLearnedSpellData
Definition: SpellPackets.h:414
std::vector< UF::ChrCustomizationChoice > Customizations
Definition: SpellPackets.h:893
WorldPacket const * Write() override
WorldPacket const * Write() override
TaggedPosition< Position::XYZ > CollisionPos
Definition: SpellPackets.h:952
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
TaggedPosition< Position::XYZ > SourceRotation
Definition: SpellPackets.h:722
TaggedPosition< Position::XYZ > TargetLocation
Definition: SpellPackets.h:723
TaggedPosition< Position::XYZ > SourceLocation
Definition: SpellPackets.h:716
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
TaggedPosition< Position::XYZ > TargetPosition
Definition: SpellPackets.h:736
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< uint32 > FavoriteSpells
Definition: SpellPackets.h:115
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
uint64 Action
two packed values (action and type)
Definition: SpellPackets.h:144
WorldPacket const * Write() override
std::vector< SpellModifier > Modifiers
Definition: SpellPackets.h:505
WorldPacket const * Write() override
Optional< SpellTargetedHealPrediction > HealPrediction
Definition: SpellPackets.h:818
Optional< SpellChannelStartInterruptImmunities > InterruptImmunities
Definition: SpellPackets.h:816
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< SpellCooldownStruct > SpellCooldowns
Definition: SpellPackets.h:584
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< LearnedSpellInfo > ClientLearnedSpellData
Definition: SpellPackets.h:426
WorldPacket const * Write() override
std::array< uint64, NumActionButtons > ActionButtons
Definition: SpellPackets.h:127
WorldPacket const * Write() override
TaggedPosition< Position::XYZ > ImpactPos
Definition: SpellPackets.h:981
TaggedPosition< Position::XYZ > FirePos
Definition: SpellPackets.h:980
@ SMSG_MIRROR_IMAGE_COMPONENTED_DATA
Definition: Opcodes.h:1537
ByteBuffer & operator>>(ByteBuffer &data, SpellCastVisual &visual)
ByteBuffer & operator<<(ByteBuffer &data, SpellCastLogData const &spellCastLogData)
std::vector< float > EstimatedPoints
Definition: SpellPackets.h:174
Optional< ObjectGuid > CastUnit
Definition: SpellPackets.h:169
Optional< ContentTuningParams > ContentTuning
Definition: SpellPackets.h:168
Optional< AuraDataInfo > AuraData
Definition: SpellPackets.h:180
std::vector< uint8 > Cooldowns
Definition: SpellPackets.h:330
std::vector< ObjectGuid > HitTargets
Definition: SpellPackets.h:363
Optional< RuneData > RemainingRunes
Definition: SpellPackets.h:369
std::vector< TargetLocation > TargetPoints
Definition: SpellPackets.h:373
std::vector< SpellMissStatus > MissStatus
Definition: SpellPackets.h:366
MissileTrajectoryResult MissileTrajectory
Definition: SpellPackets.h:370
std::vector< ObjectGuid > MissTargets
Definition: SpellPackets.h:364
std::vector< SpellHitStatus > HitStatus
Definition: SpellPackets.h:365
std::vector< SpellPowerData > RemainingPower
Definition: SpellPackets.h:368
Optional< MovementInfo > MoveUpdate
Definition: SpellPackets.h:248
Array< SpellCraftingReagent, 6 > OptionalReagents
Definition: SpellPackets.h:250
Array< SpellExtraCurrencyCost, 5 > OptionalCurrencies
Definition: SpellPackets.h:252
Array< SpellCraftingReagent, 6 > RemovedModifications
Definition: SpellPackets.h:251
MissileTrajectoryRequest MissileTrajectory
Definition: SpellPackets.h:247
std::vector< SpellWeight > Weight
Definition: SpellPackets.h:249
Optional< uint32 > unused622_1
This field is not used for anything in the client in 6.2.2.20444.
Definition: SpellPackets.h:598
Optional< uint32 > unused622_2
This field is not used for anything in the client in 6.2.2.20444.
Definition: SpellPackets.h:599
std::vector< SpellModifierData > ModifierData
Definition: SpellPackets.h:495
Optional< TargetLocation > SrcLocation
Definition: SpellPackets.h:206
Optional< TargetLocation > DstLocation
Definition: SpellPackets.h:207
TaggedPosition< Position::XYZ > Location
Definition: SpellPackets.h:198