TrinityCore
Loading...
Searching...
No Matches
QueryPackets.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 "QueryPackets.h"
19#include "BattlenetAccountMgr.h"
20#include "CharacterCache.h"
21#include "ClubUtils.h"
22#include "ObjectMgr.h"
23#include "PacketOperators.h"
24#include "Player.h"
25#include "World.h"
26
27ByteBuffer& operator<<(ByteBuffer& data, QuestPOIData const& questPOIData)
28{
29 data << int32(questPOIData.QuestID);
30 data << WorldPackets::Size<int32>(questPOIData.Blobs);
31
32 for (QuestPOIBlobData const& questPOIBlobData : questPOIData.Blobs)
33 {
34 data << int32(questPOIBlobData.BlobIndex);
35 data << int32(questPOIBlobData.ObjectiveIndex);
36 data << int32(questPOIBlobData.QuestObjectiveID);
37 data << int32(questPOIBlobData.QuestObjectID);
38 data << int32(questPOIBlobData.MapID);
39 data << int32(questPOIBlobData.UiMapID);
40 data << int32(questPOIBlobData.Priority);
41 data << int32(questPOIBlobData.Flags);
42 data << int32(questPOIBlobData.WorldEffectID);
43 data << int32(questPOIBlobData.PlayerConditionID);
44 data << int32(questPOIBlobData.NavigationPlayerConditionID);
45 data << int32(questPOIBlobData.SpawnTrackingID);
46 data << WorldPackets::Size<int32>(questPOIBlobData.Points);
47
48 for (QuestPOIBlobPoint const& questPOIBlobPoint : questPOIBlobData.Points)
49 {
50 data << int16(questPOIBlobPoint.X);
51 data << int16(questPOIBlobPoint.Y);
52 data << int16(questPOIBlobPoint.Z);
53 }
54
55 data << WorldPackets::Bits<1>(questPOIBlobData.AlwaysAllowMergingBlobs);
56 data.FlushBits();
57 }
58
59 return data;
60}
61
63{
68
70{
72 _worldPacket << Bits<1>(Allow);
73
75
76 if (Allow)
77 {
78 _worldPacket << SizedCString::BitsSize<11>(Stats.Title);
79 _worldPacket << SizedCString::BitsSize<11>(Stats.TitleAlt);
80 _worldPacket << SizedCString::BitsSize<6>(Stats.CursorName);
81 _worldPacket << Bits<1>(Stats.Leader);
82
83 for (std::size_t i = 0; i < Stats.Name.size(); ++i)
84 {
85 _worldPacket << SizedCString::BitsSize<11>(Stats.Name[i]);
86 _worldPacket << SizedCString::BitsSize<11>(Stats.NameAlt[i]);
87 }
88
89 for (std::size_t i = 0; i < Stats.Name.size(); ++i)
90 {
93 }
94
95 _worldPacket.append(Stats.Flags.data(), Stats.Flags.size());
96 _worldPacket << uint8(Stats.CreatureType);
97 _worldPacket << int32(Stats.CreatureFamily);
98 _worldPacket << int8(Stats.Classification);
99 _worldPacket.append(Stats.ProxyCreatureID.data(), Stats.ProxyCreatureID.size());
100 _worldPacket << Size<uint32>(Stats.Display.CreatureDisplay);
101 _worldPacket << float(Stats.Display.TotalProbability);
102
103 for (CreatureXDisplay const& display : Stats.Display.CreatureDisplay)
104 {
105 _worldPacket << uint32(display.CreatureDisplayID);
106 _worldPacket << float(display.Scale);
107 _worldPacket << float(display.Probability);
108 }
109
110 _worldPacket << float(Stats.HpMulti);
111 _worldPacket << float(Stats.EnergyMulti);
112 _worldPacket << Size<uint32>(Stats.QuestItems);
113 _worldPacket << Size<uint32>(Stats.QuestCurrencies);
114 _worldPacket << int32(Stats.CreatureMovementInfoID);
115 _worldPacket << int32(Stats.HealthScalingExpansion);
116 _worldPacket << int32(Stats.RequiredExpansion);
117 _worldPacket << int32(Stats.VignetteID);
118 _worldPacket << int32(Stats.Class);
119 _worldPacket << int32(Stats.CreatureDifficultyID);
120 _worldPacket << int32(Stats.WidgetSetID);
121 _worldPacket << int32(Stats.WidgetSetUnitConditionID);
122
126
127 if (!Stats.QuestItems.empty())
128 _worldPacket.append(Stats.QuestItems.data(), Stats.QuestItems.size());
129
130 if (!Stats.QuestCurrencies.empty())
131 _worldPacket.append(Stats.QuestCurrencies.data(), Stats.QuestCurrencies.size());
132 }
133
134 return &_worldPacket;
135}
136
138{
139 _worldPacket >> Size<uint32>(Players);
140 for (ObjectGuid& player : Players)
141 _worldPacket >> player;
142}
143
144bool PlayerGuidLookupData::Initialize(ObjectGuid const& guid, Player const* player /*= nullptr*/)
145{
146 CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(guid);
147 if (!characterInfo)
148 return false;
149
150 if (player)
151 {
152 ASSERT(player->GetGUID() == guid);
153
154 AccountID = player->m_playerData->WowAccount;
155 BnetAccountID = player->m_playerData->BnetAccount;
156 Name = player->GetName();
157 Race = player->GetRace();
158 Sex = player->GetNativeGender();
159 ClassID = player->GetClass();
160 Level = player->GetLevel();
161 PvpFaction = player->GetTeamId() == TEAM_ALLIANCE ? 1 : 0;
162 TimerunningSeasonID = player->m_activePlayerData->TimerunningSeasonID;
163
164 if (UF::DeclinedNames const* names = player->GetDeclinedNames())
165 DeclinedNames = *names;
166 }
167 else
168 {
169 uint32 accountId = sCharacterCache->GetCharacterAccountIdByGuid(guid);
170 uint32 bnetAccountId = ::Battlenet::AccountMgr::GetIdByGameAccount(accountId);
171
172 AccountID = ObjectGuid::Create<HighGuid::WowAccount>(accountId);
173 BnetAccountID = ObjectGuid::Create<HighGuid::BNetAccount>(bnetAccountId);
174 Name = characterInfo->Name;
175 Race = characterInfo->Race;
176 Sex = characterInfo->Sex;
177 ClassID = characterInfo->Class;
178 Level = characterInfo->Level;
179 PvpFaction = Player::TeamIdForRace(characterInfo->Race) == TEAM_ALLIANCE ? 1 : 0;
180 }
181
182 IsDeleted = characterInfo->IsDeleted;
183 GuidActual = guid;
186
187 return true;
188}
189
191{
192 data << Bits<1>(lookupData.IsDeleted);
193 data << SizedString::BitsSize<6>(lookupData.Name);
194
195 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
196 data << SizedString::BitsSize<7>(lookupData.DeclinedNames.name[i]);
197
198 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
199 data << SizedString::Data(lookupData.DeclinedNames.name[i]);
200
201 data << lookupData.AccountID;
202 data << lookupData.BnetAccountID;
203 data << lookupData.GuidActual;
204 data << uint64(lookupData.GuildClubMemberID);
205 data << uint32(lookupData.VirtualRealmAddress);
206 data << uint8(lookupData.Race);
207 data << uint8(lookupData.Sex);
208 data << uint8(lookupData.ClassID);
209 data << uint8(lookupData.Level);
210 data << uint8(lookupData.PvpFaction);
211 data << int32(lookupData.TimerunningSeasonID);
212 data << SizedString::Data(lookupData.Name);
213
214 return data;
215}
216
218{
219 data << uint32(lookupData.VirtualRealmAddress);
220 data << lookupData.Guid;
221 data << SizedString::BitsSize<7>(lookupData.Name);
222 data.FlushBits();
223
224 data << SizedString::Data(lookupData.Name);
225
226 return data;
227}
228
230{
231 data << lookupData.Guid;
232 data << SizedString::BitsSize<8>(lookupData.Name);
233 data.FlushBits();
234
235 data << SizedString::Data(lookupData.Name);
236
237 return data;
238}
239
241{
242 data << uint8(result.Result);
243 data << result.Player;
244 data << OptionalInit(result.Data);
245 data << OptionalInit(result.GuildData);
246 data << OptionalInit(result.HouseData);
247 data.FlushBits();
248
249 if (result.Data)
250 data << *result.Data;
251
252 if (result.GuildData)
253 data << *result.GuildData;
254
255 if (result.HouseData)
256 data << *result.HouseData;
257
258 return data;
259}
260
262{
263 _worldPacket << Size<uint32>(Players);
264 for (NameCacheLookupResult const& lookupResult : Players)
265 _worldPacket << lookupResult;
266
267 return &_worldPacket;
268}
269
275
277{
278 data << uint32(page.ID);
279 data << uint32(page.NextPageID);
280 data << int32(page.PlayerConditionID);
281 data << uint8(page.Flags);
282 data << SizedString::BitsSize<12>(page.Text);
283 data.FlushBits();
284
285 data << SizedString::Data(page.Text);
286
287 return data;
288}
289
291{
293 _worldPacket << Bits<1>(Allow);
295
296 if (Allow)
297 {
298 _worldPacket << Size<uint32>(Pages);
299 for (PageTextInfo const& pageText : Pages)
300 _worldPacket << pageText;
301 }
302
303 return &_worldPacket;
304}
305
307{
310}
311
313{
315 _worldPacket << Bits<1>(Allow);
317
318 _worldPacket << int32(Allow ? (MAX_NPC_TEXT_OPTIONS * (sizeof(float) + sizeof(uint32))) : 0);
319
320 if (Allow)
321 {
324 }
325
326 return &_worldPacket;
327}
328
334
336{
339 _worldPacket << Bits<1>(Allow);
341
342 ByteBuffer statsData;
343 if (Allow)
344 {
345 statsData << int32(Stats.Type);
346 statsData << int32(Stats.DisplayID);
347 for (int8 i = 0; i < 4; ++i)
348 statsData << Stats.Name[i];
349
350 statsData << Stats.IconName;
351 statsData << Stats.CastBarCaption;
352 statsData << Stats.UnkString;
353
354 for (uint32 i = 0; i < MAX_GAMEOBJECT_DATA; ++i)
355 statsData << int32(Stats.Data[i]);
356
357 statsData << float(Stats.Size);
358 statsData << Size<uint8>(Stats.QuestItems);
359 if (!Stats.QuestItems.empty())
360 statsData.append(Stats.QuestItems.data(), Stats.QuestItems.size());
361
362 statsData << int32(Stats.ContentTuningId);
363 statsData << int32(Stats.RequiredLevel);
364 }
365
366 _worldPacket << Size<uint32>(statsData);
367 if (!statsData.empty())
368 _worldPacket.append(statsData);
369
370 return &_worldPacket;
371}
372
377
379{
380 _worldPacket << Bits<1>(Valid);
382
388
389 return &_worldPacket;
390}
391
397
406
413
415{
417
418 if (MissingQuestCount > std::ssize(MissingQuestPOIs))
420
421 for (std::size_t i = 0; i < MissingQuestPOIs.size(); ++i)
423}
424
426{
427 _worldPacket << Size<int32>(QuestPOIDataStats);
428 _worldPacket << Size<int32>(QuestPOIDataStats);
429
430 for (QuestPOIData const* questPOIData : QuestPOIDataStats)
431 {
432 if (!questPOIData->QueryDataBuffer.empty())
433 _worldPacket.append(questPOIData->QueryDataBuffer.data(), questPOIData->QueryDataBuffer.size());
434 else
435 _worldPacket << *questPOIData;
436 }
437
438 return &_worldPacket;
439}
440
447
449{
450 _worldPacket << Size<uint32>(QuestCompletionNPCs);
452 {
453 _worldPacket << int32(quest.QuestID);
454 _worldPacket << Size<uint32>(quest.NPCs);
455 if (!quest.NPCs.empty())
456 _worldPacket.append(quest.NPCs.data(), quest.NPCs.size());
457 }
458
459 return &_worldPacket;
460}
461
463{
465}
466
468{
470 _worldPacket << Bits<1>(Allow);
471
472 if (Allow)
473 {
474 _worldPacket << SizedString::BitsSize<8>(Name);
475 _worldPacket << Bits<1>(HasDeclined);
476
477 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
478 _worldPacket << SizedString::BitsSize<7>(DeclinedNames.name[i]);
479
480 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
482
485 }
486 else
488
489 return &_worldPacket;
490}
491
493{
494 _worldPacket >> Id;
495}
496
497ByteBuffer& operator<<(ByteBuffer& data, ItemTextCache const& itemTextCache)
498{
499 data << SizedString::BitsSize<13>(itemTextCache.Text);
500 data.FlushBits();
501
502 data << SizedString::Data(itemTextCache.Text);
503
504 return data;
505}
506
508{
509 _worldPacket << Bits<1>(Valid);
512 _worldPacket << Id;
513
514 return &_worldPacket;
515}
516
521
531
537
538ByteBuffer& operator<<(ByteBuffer& data, TreasurePickItem const& treasurePickItem)
539{
540 data << treasurePickItem.Item;
541 data << uint32(treasurePickItem.Quantity);
542 data << OptionalInit(treasurePickItem.ContextFlags);
543 data.FlushBits();
544
545 if (treasurePickItem.ContextFlags)
546 data << As<int32>(*treasurePickItem.ContextFlags);
547
548 return data;
549}
550
551ByteBuffer& operator<<(ByteBuffer& data, TreasurePickCurrency const& treasurePickCurrency)
552{
553 data << uint32(treasurePickCurrency.CurrencyID);
554 data << uint32(treasurePickCurrency.Quantity);
555 data << OptionalInit(treasurePickCurrency.ContextFlags);
556 data.FlushBits();
557
558 if (treasurePickCurrency.ContextFlags)
559 data << As<int32>(*treasurePickCurrency.ContextFlags);
560
561 return data;
562}
563
564ByteBuffer& operator<<(ByteBuffer& data, TreasurePickerBonus const& treasurePickerBonus)
565{
566 data << Size<uint32>(treasurePickerBonus.ItemPicks);
567 data << Size<uint32>(treasurePickerBonus.CurrencyPicks);
568 data << uint64(treasurePickerBonus.Gold);
569 data << Bits<1>(treasurePickerBonus.Context);
570 data.FlushBits();
571
572 for (TreasurePickItem const& treasurePickerItem : treasurePickerBonus.ItemPicks)
573 data << treasurePickerItem;
574
575 for (TreasurePickCurrency const& treasurePickCurrency : treasurePickerBonus.CurrencyPicks)
576 data << treasurePickCurrency;
577
578 return data;
579}
580
581ByteBuffer& operator<<(ByteBuffer& data, TreasurePickerPick const& treasurePickerPick)
582{
583 data << Size<uint32>(treasurePickerPick.ItemPicks);
584 data << Size<uint32>(treasurePickerPick.CurrencyPicks);
585 data << uint64(treasurePickerPick.Gold);
586 data << Size<uint32>(treasurePickerPick.Bonuses);
587 data << int32(treasurePickerPick.Flags);
588 data << Bits<1>(treasurePickerPick.IsChoice);
589 data.FlushBits();
590
591 for (TreasurePickItem const& treasurePickItem : treasurePickerPick.ItemPicks)
592 data << treasurePickItem;
593
594 for (TreasurePickCurrency const& treasurePickCurrency : treasurePickerPick.CurrencyPicks)
595 data << treasurePickCurrency;
596
597 for (TreasurePickerBonus const& treasurePickerBonus : treasurePickerPick.Bonuses)
598 data << treasurePickerBonus;
599
600 return data;
601}
602
611}
#define sCharacterCache
uint8_t uint8
Definition Define.h:156
int16_t int16
Definition Define.h:151
int8_t int8
Definition Define.h:152
int32_t int32
Definition Define.h:150
uint64_t uint64
Definition Define.h:153
uint32_t uint32
Definition Define.h:154
#define ASSERT
Definition Errors.h:80
#define MAX_NPC_TEXT_OPTIONS
Definition NPCHandler.h:27
ByteBuffer & operator<<(ByteBuffer &data, QuestPOIData const &questPOIData)
@ TEAM_ALLIANCE
#define MAX_GAMEOBJECT_DATA
Stats
#define MAX_DECLINED_NAME_CASES
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
void append(T value)
Definition ByteBuffer.h:130
bool empty() const
Definition ByteBuffer.h:569
void FlushBits()
Definition ByteBuffer.h:141
UF::UpdateField< UF::PlayerData, int32(WowCS::EntityFragment::CGObject), TYPEID_PLAYER > m_playerData
Definition Player.h:3061
static TeamId TeamIdForRace(uint8 race)
Definition Player.cpp:6479
Gender GetNativeGender() const override
Definition Player.h:1350
UF::UpdateField< UF::ActivePlayerData, int32(WowCS::EntityFragment::CGObject), TYPEID_ACTIVE_PLAYER > m_activePlayerData
Definition Player.h:3062
UF::DeclinedNames const * GetDeclinedNames() const
Definition Player.h:2831
TeamId GetTeamId() const
Definition Player.h:2424
uint8 GetClass() const
Definition Unit.h:764
uint8 GetLevel() const
Definition Unit.h:757
uint8 GetRace() const
Definition Unit.h:761
std::string const & GetName() const
Definition Object.h:342
size_type size() const
WorldPacket _worldPacket
Definition Packet.h:43
WorldPacket const * Write() override
TaggedPosition<::Position::XYZ > Position
TaggedPosition<::Position::XYZ > Position
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
std::array< float, MAX_NPC_TEXT_OPTIONS > Probabilities
std::array< uint32, MAX_NPC_TEXT_OPTIONS > BroadcastTextID
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< NameCacheLookupResult > Players
WorldPacket const * Write() override
std::vector< QuestCompletionNPC > QuestCompletionNPCs
WorldPacket const * Write() override
std::vector< QuestPOIData const * > QuestPOIDataStats
std::array< int32, 175 > MissingQuestPOIs
WorldPackets::Auth::VirtualRealmNameInfo NameInfo
WorldPacket const * Write() override
WorldPacket const * Write() override
uint32 GetVirtualRealmAddress()
Definition World.cpp:3526
TC_GAME_API uint32 GetIdByGameAccount(uint32 gameAccountId)
uint64 CreateClubMemberId(ObjectGuid guid)
Definition ClubUtils.cpp:21
ByteBuffer & operator<<(ByteBuffer &data, PlayerGuidLookupData const &lookupData)
DataWriter< Container > Data(Container const &value)
DataWriter< Container > Data(Container const &value)
void OnInvalidArraySize(std::size_t requestedSize, std::size_t sizeLimit)
OptionalInitWriter< T > OptionalInit(Optional< T > const &value)
std::string name[MAX_DECLINED_NAME_CASES]
int32 QuestID
Definition ObjectMgr.h:821
std::vector< QuestPOIBlobData > Blobs
Definition ObjectMgr.h:822
Optional< HouseLookupData > HouseData
Optional< PlayerGuidLookupData > Data
Optional< GuildGuidLookupData > GuildData
bool Initialize(ObjectGuid const &guid, Player const *player=nullptr)
Optional< QuestRewardContextFlags > ContextFlags
Optional< QuestRewardContextFlags > ContextFlags
TreasurePickerBonusContext Context
std::vector< TreasurePickCurrency > CurrencyPicks
std::vector< TreasurePickItem > ItemPicks
std::vector< TreasurePickerBonus > Bonuses
std::vector< TreasurePickItem > ItemPicks
std::vector< TreasurePickCurrency > CurrencyPicks