TrinityCore
MiscPackets.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 "MiscPackets.h"
19#include "Common.h"
20
22{
26
27 return &_worldPacket;
28}
29
31{
32 _worldPacket << Guid;
33
34 return &_worldPacket;
35}
36
38{
39 _worldPacket << ServerTime;
40 _worldPacket << GameTime;
41 _worldPacket << float(NewSpeed);
42 _worldPacket << uint32(ServerTimeHolidayOffset);
43 _worldPacket << uint32(GameTimeHolidayOffset);
44
45 return &_worldPacket;
46}
47
49{
50 _worldPacket << int32(Type);
51 _worldPacket << int32(Quantity);
52 _worldPacket << uint32(Flags);
53 _worldPacket << uint32(Toasts.size());
54
55 for (WorldPackets::Item::UiEventToast const& toast : Toasts)
56 _worldPacket << toast;
57
58 _worldPacket.WriteBit(WeeklyQuantity.has_value());
59 _worldPacket.WriteBit(TrackedQuantity.has_value());
60 _worldPacket.WriteBit(MaxQuantity.has_value());
61 _worldPacket.WriteBit(TotalEarned.has_value());
62 _worldPacket.WriteBit(SuppressChatLog);
63 _worldPacket.WriteBit(QuantityChange.has_value());
64 _worldPacket.WriteBit(QuantityGainSource.has_value());
65 _worldPacket.WriteBit(QuantityLostSource.has_value());
66 _worldPacket.WriteBit(FirstCraftOperationID.has_value());
67 _worldPacket.WriteBit(NextRechargeTime.has_value());
68 _worldPacket.WriteBit(RechargeCycleStartTime.has_value());
69 _worldPacket.WriteBit(OverflownCurrencyID.has_value());
70 _worldPacket.FlushBits();
71
72 if (WeeklyQuantity)
73 _worldPacket << int32(*WeeklyQuantity);
74
75 if (TrackedQuantity)
76 _worldPacket << int32(*TrackedQuantity);
77
78 if (MaxQuantity)
79 _worldPacket << int32(*MaxQuantity);
80
81 if (TotalEarned)
82 _worldPacket << int32(*TotalEarned);
83
84 if (QuantityChange)
85 _worldPacket << int32(*QuantityChange);
86
87 if (QuantityGainSource)
88 _worldPacket << int32(*QuantityGainSource);
89
90 if (QuantityLostSource)
91 _worldPacket << int32(*QuantityLostSource);
92
93 if (FirstCraftOperationID)
94 _worldPacket << uint32(*FirstCraftOperationID);
95
96 if (NextRechargeTime)
97 _worldPacket << *NextRechargeTime;
98
99 if (RechargeCycleStartTime)
100 _worldPacket << *RechargeCycleStartTime;
101
102 if (OverflownCurrencyID)
103 _worldPacket << int32(*OverflownCurrencyID);
104
105 return &_worldPacket;
106}
107
109{
110 _worldPacket >> Selection;
111}
112
114{
115 _worldPacket << uint32(Data.size());
116
117 for (Record const& data : Data)
118 {
119 _worldPacket << int32(data.Type);
120 _worldPacket << int32(data.Quantity);
121
122 _worldPacket.WriteBit(data.WeeklyQuantity.has_value());
123 _worldPacket.WriteBit(data.MaxWeeklyQuantity.has_value());
124 _worldPacket.WriteBit(data.TrackedQuantity.has_value());
125 _worldPacket.WriteBit(data.MaxQuantity.has_value());
126 _worldPacket.WriteBit(data.TotalEarned.has_value());
127 _worldPacket.WriteBit(data.NextRechargeTime.has_value());
128 _worldPacket.WriteBit(data.RechargeCycleStartTime.has_value());
129 _worldPacket.WriteBits(uint8(data.Flags), 5);
130 _worldPacket.FlushBits();
131
132 if (data.WeeklyQuantity)
133 _worldPacket << uint32(*data.WeeklyQuantity);
134 if (data.MaxWeeklyQuantity)
135 _worldPacket << uint32(*data.MaxWeeklyQuantity);
136 if (data.TrackedQuantity)
137 _worldPacket << uint32(*data.TrackedQuantity);
138 if (data.MaxQuantity)
139 _worldPacket << int32(*data.MaxQuantity);
140 if (data.TotalEarned)
141 _worldPacket << int32(*data.TotalEarned);
142 if (data.NextRechargeTime)
143 _worldPacket << *data.NextRechargeTime;
144 if (data.RechargeCycleStartTime)
145 _worldPacket << *data.RechargeCycleStartTime;
146 }
147
148 return &_worldPacket;
149}
150
152{
153 _worldPacket >> ViolenceLvl;
154}
155
157{
158 _worldPacket << SequenceIndex;
159
160 return &_worldPacket;
161}
162
164{
165 _worldPacket >> SequenceIndex;
166 _worldPacket >> ClientTime;
167}
168
170{
171 _worldPacket << Time;
172
173 return &_worldPacket;
174}
175
177{
178 _worldPacket << uint32(MovieID);
179
180 return &_worldPacket;
181}
183{
184 _worldPacket << uint32(CinematicID);
185 _worldPacket << ConversationGuid;
186
187 return &_worldPacket;
188}
189
191{
192 _worldPacket.append(TutorialData, MAX_ACCOUNT_TUTORIAL_VALUES);
193
194 return &_worldPacket;
195}
196
198{
199 Action = _worldPacket.ReadBits(2);
200
202 _worldPacket >> TutorialBit;
203}
204
206{
207 _worldPacket << uint32(DifficultyID);
208 _worldPacket.WriteBit(IsTournamentRealm);
209 _worldPacket.WriteBit(XRealmPvpAlert);
210 _worldPacket.WriteBit(BlockExitingLoadingScreen);
211 _worldPacket.WriteBit(RestrictedAccountMaxLevel.has_value());
212 _worldPacket.WriteBit(RestrictedAccountMaxMoney.has_value());
213 _worldPacket.WriteBit(InstanceGroupSize.has_value());
214
215 if (RestrictedAccountMaxLevel)
216 _worldPacket << uint32(*RestrictedAccountMaxLevel);
217
218 if (RestrictedAccountMaxMoney)
219 _worldPacket << uint64(*RestrictedAccountMaxMoney);
220
221 if (InstanceGroupSize)
222 _worldPacket << uint32(*InstanceGroupSize);
223
224 _worldPacket.FlushBits();
225
226 return &_worldPacket;
227}
228
230{
231 _worldPacket >> DifficultyID;
232}
233
235{
236 _worldPacket >> DifficultyID;
237 _worldPacket >> Legacy;
238}
239
241{
242 _worldPacket << int32(DifficultyID);
243 return &_worldPacket;
244}
245
247{
248 _worldPacket << int32(DifficultyID);
249 _worldPacket << uint8(Legacy);
250 return &_worldPacket;
251}
252
254{
255 _worldPacket << Remaining;
256
257 return &_worldPacket;
258}
259
261{
262 _worldPacket << MapID;
263 _worldPacket << Loc;
264
265 return &_worldPacket;
266}
267
269{
270 _worldPacket << PlayerGUID;
271
272 return &_worldPacket;
273}
274
276{
277 _worldPacket >> CorpseGUID;
278}
279
281{
282 CheckInstance = _worldPacket.ReadBit();
283}
284
286{
287 _worldPacket.WriteBit(IsGossipTriggered);
288 _worldPacket.FlushBits();
289
290 _worldPacket << uint32(CemeteryID.size());
291 for (uint32 cemetery : CemeteryID)
292 _worldPacket << cemetery;
293
294 return &_worldPacket;
295}
296
298{
299 _worldPacket >> Resurrecter;
300 _worldPacket >> Response;
301}
302
304
305WorldPackets::Misc::Weather::Weather(WeatherState weatherID, float intensity /*= 0.0f*/, bool abrupt /*= false*/)
306 : ServerPacket(SMSG_WEATHER, 4 + 4 + 1), Abrupt(abrupt), Intensity(intensity), WeatherID(weatherID) { }
307
309{
310 _worldPacket << uint32(WeatherID);
311 _worldPacket << float(Intensity);
312 _worldPacket.WriteBit(Abrupt);
313
314 _worldPacket.FlushBits();
315 return &_worldPacket;
316}
317
319{
320 uint32 state;
321 _worldPacket >> state;
322
323 StandState = UnitStandStateType(state);
324}
325
327{
328 _worldPacket << uint32(AnimKitID);
329 _worldPacket << uint8(State);
330
331 return &_worldPacket;
332}
333
335{
336 _worldPacket << Unit;
337 _worldPacket.WriteBits(Tier, 3);
338 _worldPacket.FlushBits();
339
340 return &_worldPacket;
341}
342
344{
345 _worldPacket << BinderID;
346 _worldPacket << uint32(AreaID);
347
348 return &_worldPacket;
349}
350
352{
353 _worldPacket << int32(Timer);
354 _worldPacket << int32(Value);
355 _worldPacket << int32(MaxValue);
356 _worldPacket << int32(Scale);
357 _worldPacket << int32(SpellID);
358 _worldPacket.WriteBit(Paused);
359 _worldPacket.FlushBits();
360
361 return &_worldPacket;
362}
363
365{
366 _worldPacket << int32(Timer);
367 _worldPacket.WriteBit(Paused);
368 _worldPacket.FlushBits();
369
370 return &_worldPacket;
371}
372
374{
375 _worldPacket << int32(Timer);
376
377 return &_worldPacket;
378}
379
381{
382 _worldPacket << int32(AreaID);
383 _worldPacket << int32(Experience);
384
385 return &_worldPacket;
386}
387
389{
390 _worldPacket << int32(Level);
391 _worldPacket << int32(HealthDelta);
392
393 for (int32 power : PowerDelta)
394 _worldPacket << power;
395
396 for (int32 stat : StatDelta)
397 _worldPacket << stat;
398
399 _worldPacket << int32(NumNewTalents);
400 _worldPacket << int32(NumNewPvpTalentSlots);
401
402 return &_worldPacket;
403}
404
406{
407 _worldPacket << uint32(SoundKitID);
408
409 return &_worldPacket;
410}
411
413{
414 bool hasPartyIndex = _worldPacket.ReadBit();
415 _worldPacket >> Min;
416 _worldPacket >> Max;
417 if (hasPartyIndex)
418 _worldPacket >> PartyIndex.emplace();
419}
420
422{
423 _worldPacket << Roller;
424 _worldPacket << RollerWowAccount;
425 _worldPacket << int32(Min);
426 _worldPacket << int32(Max);
427 _worldPacket << int32(Result);
428
429 return &_worldPacket;
430}
431
433{
434 _worldPacket << uint8(CustomizationScope);
435
436 return &_worldPacket;
437}
438
440{
441 data << uint32(phaseShiftDataPhase.PhaseFlags);
442 data << uint16(phaseShiftDataPhase.Id);
443 return data;
444}
445
447{
448 data << uint32(phaseShiftData.PhaseShiftFlags);
449 data << uint32(phaseShiftData.Phases.size());
450 data << phaseShiftData.PersonalGUID;
451 for (WorldPackets::Misc::PhaseShiftDataPhase const& phaseShiftDataPhase : phaseShiftData.Phases)
452 data << phaseShiftDataPhase;
453
454 return data;
455}
456
458{
459 _worldPacket << Client;
460 _worldPacket << Phaseshift;
461 _worldPacket << uint32(VisibleMapIDs.size() * 2); // size in bytes
462 for (uint16 visibleMapId : VisibleMapIDs)
463 _worldPacket << uint16(visibleMapId); // Active terrain swap map id
464
465 _worldPacket << uint32(PreloadMapIDs.size() * 2); // size in bytes
466 for (uint16 preloadMapId : PreloadMapIDs)
467 _worldPacket << uint16(preloadMapId); // Inactive terrain swap map id
468
469 _worldPacket << uint32(UiMapPhaseIDs.size() * 2); // size in bytes
470 for (uint16 uiMapPhaseId : UiMapPhaseIDs)
471 _worldPacket << uint16(uiMapPhaseId); // phase id, controls only map display (visible on all maps)
472
473 return &_worldPacket;
474}
475
477{
478 _worldPacket << int32(AreaID);
479
480 return &_worldPacket;
481}
482
484{
485 _worldPacket << int32(Percent);
486
487 return &_worldPacket;
488}
489
491{
492 _worldPacket >> ObjectGUID;
493}
494
496{
497 _worldPacket >> ObjectGUID;
498}
499
501{
502 _worldPacket << int32(SoundKitID);
503 _worldPacket << SourceObjectGUID;
504 _worldPacket << TargetObjectGUID;
505 _worldPacket << Position;
506 _worldPacket << int32(BroadcastTextID);
507
508 return &_worldPacket;
509}
510
512{
513 _worldPacket << int32(SoundKitID);
514 _worldPacket << SourceObjectGuid;
515 _worldPacket << int32(BroadcastTextID);
516
517 return &_worldPacket;
518}
519
521{
522 _worldPacket << SourceObjectGUID;
523 _worldPacket << int32(SoundKitID);
524
525 return &_worldPacket;
526}
527
529{
530 _worldPacket << SourceObjectGUID;
531
532 return &_worldPacket;
533}
534
536{
537 Enable = _worldPacket.ReadBit();
538}
539
541{
542 CUFProfiles.resize(_worldPacket.read<uint32>());
543 for (std::unique_ptr<CUFProfile>& cufProfile : CUFProfiles)
544 {
545 cufProfile = std::make_unique<CUFProfile>();
546
547 uint8 strLen = _worldPacket.ReadBits(7);
548
549 // Bool Options
550 for (uint8 option = 0; option < CUF_BOOL_OPTIONS_COUNT; option++)
551 cufProfile->BoolOptions.set(option, _worldPacket.ReadBit());
552
553 // Other Options
554 _worldPacket >> cufProfile->FrameHeight;
555 _worldPacket >> cufProfile->FrameWidth;
556
557 _worldPacket >> cufProfile->SortBy;
558 _worldPacket >> cufProfile->HealthText;
559
560 _worldPacket >> cufProfile->TopPoint;
561 _worldPacket >> cufProfile->BottomPoint;
562 _worldPacket >> cufProfile->LeftPoint;
563
564 _worldPacket >> cufProfile->TopOffset;
565 _worldPacket >> cufProfile->BottomOffset;
566 _worldPacket >> cufProfile->LeftOffset;
567
568 cufProfile->ProfileName = _worldPacket.ReadString(strLen);
569 }
570}
571
573{
574 _worldPacket << uint32(CUFProfiles.size());
575
576 for (CUFProfile const* cufProfile : CUFProfiles)
577 {
578 _worldPacket.WriteBits(cufProfile->ProfileName.size(), 7);
579
580 // Bool Options
581 for (uint8 option = 0; option < CUF_BOOL_OPTIONS_COUNT; option++)
582 _worldPacket.WriteBit(cufProfile->BoolOptions[option]);
583
584 // Other Options
585 _worldPacket << cufProfile->FrameHeight;
586 _worldPacket << cufProfile->FrameWidth;
587
588 _worldPacket << cufProfile->SortBy;
589 _worldPacket << cufProfile->HealthText;
590
591 _worldPacket << cufProfile->TopPoint;
592 _worldPacket << cufProfile->BottomPoint;
593 _worldPacket << cufProfile->LeftPoint;
594
595 _worldPacket << cufProfile->TopOffset;
596 _worldPacket << cufProfile->BottomOffset;
597 _worldPacket << cufProfile->LeftOffset;
598
599 _worldPacket.WriteString(cufProfile->ProfileName);
600 }
601
602 return &_worldPacket;
603}
604
606{
607 _worldPacket << Unit;
608 _worldPacket << uint16(AnimKitID);
609
610 return &_worldPacket;
611}
612
614{
615 _worldPacket << Unit;
616 _worldPacket << uint16(AnimKitID);
617
618 return &_worldPacket;
619}
620
622{
623 _worldPacket << Unit;
624 _worldPacket << uint16(AnimKitID);
625
626 return &_worldPacket;
627}
628
630{
631 _worldPacket << Unit;
632 _worldPacket << uint16(AnimKitID);
633
634 return &_worldPacket;
635}
636
638{
639 _worldPacket << UnitGUID;
640 _worldPacket.WriteBit(PlayHoverAnim);
641 _worldPacket.FlushBits();
642
643 return &_worldPacket;
644}
645
647{
648 EnablePVP = _worldPacket.ReadBit();
649}
650
652{
653 Enable = _worldPacket.ReadBit();
654}
655
657{
658 _worldPacket.WriteBit(IsFullUpdate);
659 _worldPacket.FlushBits();
660
661 _worldPacket << int32(Unk);
662
663 // both lists have to have the same size
664 _worldPacket << uint32(Heirlooms->size());
665 _worldPacket << uint32(Heirlooms->size());
666
667 for (auto const& item : *Heirlooms)
668 _worldPacket << int32(item.first);
669
670 for (auto const& flags : *Heirlooms)
671 _worldPacket << uint32(flags.second.flags);
672
673 return &_worldPacket;
674}
675
677{
678 SpellVisualKitIDs.resize(_worldPacket.read<uint32>());
679 _worldPacket >> SequenceVariation;
680 for (int32& spellVisualKitId : SpellVisualKitIDs)
681 _worldPacket >> spellVisualKitId;
682}
683
685{
686 _worldPacket << UnitGUID;
687 _worldPacket << uint32(SpellVisualKitIDs.size());
688 _worldPacket << int32(SequenceVariation);
689 if (!SpellVisualKitIDs.empty())
690 _worldPacket.append(SpellVisualKitIDs.data(), SpellVisualKitIDs.size());
691
692 return &_worldPacket;
693}
694
696{
697 _worldPacket << Guid;
698 _worldPacket << int32(Threshold);
699 _worldPacket << int32(ItemID);
700
701 return &_worldPacket;
702}
703
705{
706 Enable = _worldPacket.ReadBit();
707}
708
710{
711 _worldPacket << int32(AreaLightID);
712 _worldPacket << int32(OverrideLightID);
713 _worldPacket << int32(TransitionMilliseconds);
714
715 return &_worldPacket;
716}
717
719{
720 _worldPacket << uint32(Error);
721 _worldPacket.WriteBit(Arg.has_value());
722 _worldPacket.WriteBit(Arg2.has_value());
723 _worldPacket.FlushBits();
724
725 if (Arg)
726 _worldPacket << int32(*Arg);
727
728 if (Arg2)
729 _worldPacket << int32(*Arg2);
730
731 return &_worldPacket;
732}
733
735{
736 _worldPacket.WriteBit(IsFullUpdate);
737 _worldPacket << uint32(Mounts->size());
738
739 for (auto [spellId, flags] : *Mounts)
740 {
741 _worldPacket << int32(spellId);
742 _worldPacket.WriteBits(flags, 4);
743 }
744
745 _worldPacket.FlushBits();
746
747 return &_worldPacket;
748}
749
751{
752 _worldPacket >> MountSpellID;
753 IsFavorite = _worldPacket.ReadBit();
754}
755
757{
758 _worldPacket >> SourceGuid;
759}
760
762{
763 _worldPacket << TotalTime;
764 _worldPacket << TimeLeft;
765 _worldPacket << int32(Type);
766
767 return &_worldPacket;
768}
769
771{
772 TimerType = _worldPacket.read<CountdownTimerType, int32>();
773}
774
776{
777 _worldPacket >> ConversationGUID;
778 _worldPacket >> LineID;
779}
780
782{
783 _worldPacket << int32(UISplashScreenID);
784
785 return &_worldPacket;
786}
787
789{
790 _worldPacket << uint64(Quantity);
791 _worldPacket << uint8(AsUnderlyingType(DisplayToastMethod));
792 _worldPacket << uint32(QuestID);
793
794 _worldPacket.WriteBit(Mailed);
795 _worldPacket.WriteBits(AsUnderlyingType(Type), 2);
796 _worldPacket.WriteBit(IsSecondaryResult);
797
798 switch (Type)
799 {
801 _worldPacket.WriteBit(BonusRoll);
802 _worldPacket << Item;
803 _worldPacket << int32(LootSpec);
804 _worldPacket << int8(Gender);
805 break;
807 _worldPacket << uint32(CurrencyID);
808 break;
809 default:
810 break;
811 }
812
813 _worldPacket.FlushBits();
814
815 return &_worldPacket;
816}
@ CUF_BOOL_OPTIONS_COUNT
Definition: CUFProfile.h:59
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
uint16 flags
Definition: DisableMgr.cpp:49
CountdownTimerType
Definition: Group.h:176
DisplayToastMethod
Definition: Player.h:971
Gender
@ TUTORIAL_ACTION_UPDATE
#define MAX_ACCOUNT_TUTORIAL_VALUES
UnitStandStateType
Definition: UnitDefines.h:41
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition: Util.h:491
Action
void append(T value)
Definition: ByteBuffer.h:143
bool WriteBit(bool bit)
Definition: ByteBuffer.h:175
Definition: Item.h:170
Definition: Unit.h:627
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
Definition: MiscPackets.cpp:21
TaggedPosition< Position::XYZ > BindPosition
Definition: MiscPackets.h:51
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
Definition: MiscPackets.cpp:30
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
Definition: MiscPackets.cpp:37
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
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
Definition: MiscPackets.cpp:48
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
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 _worldPacket
Definition: Packet.h:43
@ SMSG_WEATHER
Definition: Opcodes.h:2069
WeatherState
Definition: Weather.h:46
time_t GameTime
Definition: GameTime.cpp:28
boost::beast::http::response< ResponseBody > Response
Definition: HttpCommon.h:31
ByteBuffer & operator<<(ByteBuffer &data, Movement::MonsterSplineFilterKey const &monsterSplineFilterKey)
Represents a CompactUnitFrame profile.
Definition: CUFProfile.h:64
std::vector< PhaseShiftDataPhase > Phases
Definition: MiscPackets.h:571