TrinityCore
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 "Player.h"
24#include "World.h"
25#include "WorldSession.h"
26
27ByteBuffer& operator<<(ByteBuffer& data, QuestPOIData const& questPOIData)
28{
29 data << int32(questPOIData.QuestID);
30 data << int32(questPOIData.Blobs.size());
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 << int32(questPOIBlobData.Points.size());
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.WriteBit(questPOIBlobData.AlwaysAllowMergingBlobs);
56 data.FlushBits();
57 }
58
59 return data;
60}
61
63{
65{
67}
68
70{
73
75
76 if (Allow)
77 {
78 _worldPacket.WriteBits(Stats.Title.length() + 1, 11);
79 _worldPacket.WriteBits(Stats.TitleAlt.length() + 1, 11);
80 _worldPacket.WriteBits(Stats.CursorName.length() + 1, 6);
82
83 for (std::size_t i = 0; i < Stats.Name.size(); ++i)
84 {
85 _worldPacket.WriteBits(Stats.Name[i].length() + 1, 11);
86 _worldPacket.WriteBits(Stats.NameAlt[i].length() + 1, 11);
87 }
88
89 for (std::size_t i = 0; i < Stats.Name.size(); ++i)
90 {
91 if (!Stats.Name[i].empty())
92 _worldPacket << Stats.Name[i];
93
94 if (!Stats.NameAlt[i].empty())
95 _worldPacket << Stats.NameAlt[i];
96 }
97
98 _worldPacket.append(Stats.Flags.data(), Stats.Flags.size());
99 _worldPacket << int32(Stats.CreatureType);
100 _worldPacket << int32(Stats.CreatureFamily);
101 _worldPacket << int32(Stats.Classification);
102 _worldPacket.append(Stats.ProxyCreatureID.data(), Stats.ProxyCreatureID.size());
103 _worldPacket << uint32(Stats.Display.CreatureDisplay.size());
104 _worldPacket << float(Stats.Display.TotalProbability);
105
106 for (CreatureXDisplay const& display : Stats.Display.CreatureDisplay)
107 {
109 _worldPacket << float(display.Scale);
110 _worldPacket << float(display.Probability);
111 }
112
113 _worldPacket << float(Stats.HpMulti);
114 _worldPacket << float(Stats.EnergyMulti);
115 _worldPacket << uint32(Stats.QuestItems.size());
116 _worldPacket << uint32(Stats.QuestCurrencies.size());
117 _worldPacket << int32(Stats.CreatureMovementInfoID);
118 _worldPacket << int32(Stats.HealthScalingExpansion);
119 _worldPacket << int32(Stats.RequiredExpansion);
120 _worldPacket << int32(Stats.VignetteID);
121 _worldPacket << int32(Stats.Class);
122 _worldPacket << int32(Stats.CreatureDifficultyID);
123 _worldPacket << int32(Stats.WidgetSetID);
124 _worldPacket << int32(Stats.WidgetSetUnitConditionID);
125
126 if (!Stats.Title.empty())
127 _worldPacket << Stats.Title;
128
129 if (!Stats.TitleAlt.empty())
130 _worldPacket << Stats.TitleAlt;
131
132 if (!Stats.CursorName.empty())
133 _worldPacket << Stats.CursorName;
134
135 if (!Stats.QuestItems.empty())
136 _worldPacket.append(Stats.QuestItems.data(), Stats.QuestItems.size());
137
138 if (!Stats.QuestCurrencies.empty())
139 _worldPacket.append(Stats.QuestCurrencies.data(), Stats.QuestCurrencies.size());
140 }
141
142 return &_worldPacket;
143}
144
146{
148 for (ObjectGuid& player : Players)
149 _worldPacket >> player;
150}
151
153{
154 data.WriteBit(lookupHint.VirtualRealmAddress.has_value());
155 data.WriteBit(lookupHint.NativeRealmAddress.has_value());
156 data.FlushBits();
157
158 if (lookupHint.VirtualRealmAddress)
159 data << uint32(*lookupHint.VirtualRealmAddress);
160
161 if (lookupHint.NativeRealmAddress)
162 data << uint32(*lookupHint.NativeRealmAddress);
163
164 return data;
165}
166
167bool PlayerGuidLookupData::Initialize(ObjectGuid const& guid, Player const* player /*= nullptr*/)
168{
169 CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(guid);
170 if (!characterInfo)
171 return false;
172
173 if (player)
174 {
175 ASSERT(player->GetGUID() == guid);
176
177 AccountID = player->GetSession()->GetAccountGUID();
179 Name = player->GetName();
180 Race = player->GetRace();
181 Sex = player->GetNativeGender();
182 ClassID = player->GetClass();
183 Level = player->GetLevel();
184
185 if (UF::DeclinedNames const* names = player->GetDeclinedNames())
186 DeclinedNames = *names;
187 }
188 else
189 {
190 uint32 accountId = sCharacterCache->GetCharacterAccountIdByGuid(guid);
191 uint32 bnetAccountId = ::Battlenet::AccountMgr::GetIdByGameAccount(accountId);
192
193 AccountID = ObjectGuid::Create<HighGuid::WowAccount>(accountId);
194 BnetAccountID = ObjectGuid::Create<HighGuid::BNetAccount>(bnetAccountId);
195 Name = characterInfo->Name;
196 Race = characterInfo->Race;
197 Sex = characterInfo->Sex;
198 ClassID = characterInfo->Class;
199 Level = characterInfo->Level;
200 }
201
202 IsDeleted = characterInfo->IsDeleted;
203 GuidActual = guid;
206
207 return true;
208}
209
211{
212 data.WriteBit(lookupData.IsDeleted);
213 data.WriteBits(lookupData.Name.length(), 6);
214
215 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
216 data.WriteBits(lookupData.DeclinedNames.name[i].length(), 7);
217
218 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
219 data.WriteString(lookupData.DeclinedNames.name[i]);
220
221 data << lookupData.AccountID;
222 data << lookupData.BnetAccountID;
223 data << lookupData.GuidActual;
224 data << uint64(lookupData.GuildClubMemberID);
225 data << uint32(lookupData.VirtualRealmAddress);
226 data << uint8(lookupData.Race);
227 data << uint8(lookupData.Sex);
228 data << uint8(lookupData.ClassID);
229 data << uint8(lookupData.Level);
230 data << uint8(lookupData.Unused915);
231 data.WriteString(lookupData.Name);
232
233 return data;
234}
235
237{
238 data << uint32(thing.Unused1);
239 data << thing.Unused2;
240 data.WriteBits(thing.Unused3.length(), 7);
241 data.FlushBits();
242
243 data.WriteString(thing.Unused3);
244
245 return data;
246}
247
249{
250 data << uint8(result.Result);
251 data << result.Player;
252 data.WriteBit(result.Data.has_value());
253 data.WriteBit(result.Unused920.has_value());
254 data.FlushBits();
255
256 if (result.Data)
257 data << *result.Data;
258
259 if (result.Unused920)
260 data << *result.Unused920;
261
262 return data;
263}
264
266{
267 _worldPacket << uint32(Players.size());
268 for (NameCacheLookupResult const& lookupResult : Players)
269 _worldPacket << lookupResult;
270
271 return &_worldPacket;
272}
273
275{
278}
279
281{
282 data << uint32(page.ID);
283 data << uint32(page.NextPageID);
284 data << int32(page.PlayerConditionID);
285 data << uint8(page.Flags);
286 data.WriteBits(page.Text.length(), 12);
287 data.FlushBits();
288
289 data.WriteString(page.Text);
290
291 return data;
292}
293
295{
298
300
301 if (Allow)
302 {
303 _worldPacket << uint32(Pages.size());
304 for (PageTextInfo const& pageText : Pages)
305 _worldPacket << pageText;
306 }
307
308 return &_worldPacket;
309}
310
312{
315}
316
318{
321
323
324 _worldPacket << int32(Allow ? (MAX_NPC_TEXT_OPTIONS * (sizeof(float) + sizeof(uint32))) : 0);
325
326 if (Allow)
327 {
330 }
331
332 return &_worldPacket;
333}
334
336{
339}
340
342{
347
348 ByteBuffer statsData;
349 if (Allow)
350 {
351 statsData << int32(Stats.Type);
352 statsData << int32(Stats.DisplayID);
353 for (int8 i = 0; i < 4; ++i)
354 statsData << Stats.Name[i];
355
356 statsData << Stats.IconName;
357 statsData << Stats.CastBarCaption;
358 statsData << Stats.UnkString;
359
360 for (uint32 i = 0; i < MAX_GAMEOBJECT_DATA; ++i)
361 statsData << int32(Stats.Data[i]);
362
363 statsData << float(Stats.Size);
364 statsData << uint8(Stats.QuestItems.size());
365 if (!Stats.QuestItems.empty())
366 statsData.append(Stats.QuestItems.data(), Stats.QuestItems.size());
367
368 statsData << int32(Stats.ContentTuningId);
369 }
370
371 _worldPacket << uint32(statsData.size());
372 if (!statsData.empty())
373 _worldPacket.append(statsData);
374
375 return &_worldPacket;
376}
377
379{
381}
382
384{
387
393
394 return &_worldPacket;
395}
396
398{
401}
402
404{
408
409 return &_worldPacket;
410}
411
413{
415
416 return &_worldPacket;
417}
418
420{
422
423 for (std::size_t i = 0; i < MissingQuestPOIs.size(); ++i)
425}
426
428{
431
432 bool useCache = sWorld->getBoolConfig(CONFIG_CACHE_DATA_QUERIES);
433
434 for (QuestPOIData const* questPOIData : QuestPOIDataStats)
435 {
436 if (useCache)
437 _worldPacket.append(questPOIData->QueryDataBuffer);
438 else
439 _worldPacket << *questPOIData;
440 }
441
442 return &_worldPacket;
443}
444
446{
450}
451
453{
455 for (auto& quest : QuestCompletionNPCs)
456 {
457 _worldPacket << int32(quest.QuestID);
458 _worldPacket << uint32(quest.NPCs.size());
459 if (!quest.NPCs.empty())
460 _worldPacket.append(quest.NPCs.data(), quest.NPCs.size());
461 }
462
463 return &_worldPacket;
464}
465
467{
469}
470
472{
475
476 if (Allow)
477 {
478 _worldPacket.WriteBits(Name.length(), 8);
480
481 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
483
484 for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i)
486
489 }
490
492
493 return &_worldPacket;
494}
495
497{
498 _worldPacket >> Id;
499}
500
501ByteBuffer& operator<<(ByteBuffer& data, ItemTextCache const& itemTextCache)
502{
503 data.WriteBits(itemTextCache.Text.length(), 13);
504 data.FlushBits();
505
506 data.WriteString(itemTextCache.Text);
507
508 return data;
509}
510
512{
516 _worldPacket << Id;
517
518 return &_worldPacket;
519}
520
522{
524}
525
527{
530 if (!LookupState)
532
533 return &_worldPacket;
534}
535}
#define sCharacterCache
uint8_t uint8
Definition: Define.h:144
int16_t int16
Definition: Define.h:139
int8_t int8
Definition: Define.h:140
int32_t int32
Definition: Define.h:138
uint64_t uint64
Definition: Define.h:141
uint32_t uint32
Definition: Define.h:142
#define ASSERT
Definition: Errors.h:68
#define MAX_NPC_TEXT_OPTIONS
Definition: NPCHandler.h:27
ByteBuffer & operator<<(ByteBuffer &data, QuestPOIData const &questPOIData)
#define MAX_GAMEOBJECT_DATA
Stats
#define MAX_DECLINED_NAME_CASES
Definition: UnitDefines.h:484
void WriteString(std::string const &str)
Definition: ByteBuffer.h:500
void append(T value)
Definition: ByteBuffer.h:143
bool WriteBit(bool bit)
Definition: ByteBuffer.h:175
void WriteBits(std::size_t value, int32 bits)
Definition: ByteBuffer.h:203
size_t size() const
Definition: ByteBuffer.h:536
bool empty() const
Definition: ByteBuffer.h:537
void FlushBits()
Definition: ByteBuffer.h:155
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
Gender GetNativeGender() const override
Definition: Player.h:1217
WorldSession * GetSession() const
Definition: Player.h:2101
UF::DeclinedNames const * GetDeclinedNames() const
Definition: Player.h:2641
uint8 GetClass() const
Definition: Unit.h:752
uint8 GetLevel() const
Definition: Unit.h:746
uint8 GetRace() const
Definition: Unit.h:749
std::string const & GetName() const
Definition: Object.h:555
size_type size() const
void resize(size_type newSize)
WorldPacket _worldPacket
Definition: Packet.h:43
WorldPacket const * Write() override
TaggedPosition<::Position::XYZ > Position
Definition: QueryPackets.h:275
TaggedPosition<::Position::XYZ > Position
Definition: QueryPackets.h:300
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
WorldPacket const * Write() override
std::array< float, MAX_NPC_TEXT_OPTIONS > Probabilities
Definition: QueryPackets.h:214
std::array< uint32, MAX_NPC_TEXT_OPTIONS > BroadcastTextID
Definition: QueryPackets.h:215
std::vector< PageTextInfo > Pages
Definition: QueryPackets.h:191
WorldPacket const * Write() override
WorldPacket const * Write() override
std::vector< NameCacheLookupResult > Players
Definition: QueryPackets.h:159
WorldPacket const * Write() override
Array< ObjectGuid, 50 > Players
Definition: QueryPackets.h:115
WorldPacket const * Write() override
std::vector< QuestCompletionNPC > QuestCompletionNPCs
Definition: QueryPackets.h:366
WorldPacket const * Write() override
std::vector< QuestPOIData const * > QuestPOIDataStats
Definition: QueryPackets.h:340
std::array< int32, 175 > MissingQuestPOIs
Definition: QueryPackets.h:330
WorldPackets::Auth::VirtualRealmNameInfo NameInfo
Definition: QueryPackets.h:441
WorldPacket const * Write() override
ObjectGuid GetBattlenetAccountGUID() const
ObjectGuid GetAccountGUID() const
#define sWorld
Definition: World.h:931
uint32 GetVirtualRealmAddress()
Definition: World.cpp:3968
@ CONFIG_CACHE_DATA_QUERIES
Definition: World.h:191
TC_GAME_API uint32 GetIdByGameAccount(uint32 gameAccountId)
uint64 CreateClubMemberId(ObjectGuid guid)
Definition: ClubUtils.cpp:22
ByteBuffer & operator<<(ByteBuffer &data, PlayerGuidLookupHint const &lookupHint)
std::string name[MAX_DECLINED_NAME_CASES]
Definition: UnitDefines.h:491
int32 NavigationPlayerConditionID
Definition: ObjectMgr.h:803
int32 PlayerConditionID
Definition: ObjectMgr.h:802
std::vector< QuestPOIBlobPoint > Points
Definition: ObjectMgr.h:805
int32 QuestObjectiveID
Definition: ObjectMgr.h:795
int32 QuestObjectID
Definition: ObjectMgr.h:796
int32 ObjectiveIndex
Definition: ObjectMgr.h:794
int32 WorldEffectID
Definition: ObjectMgr.h:801
int32 SpawnTrackingID
Definition: ObjectMgr.h:804
bool AlwaysAllowMergingBlobs
Definition: ObjectMgr.h:806
int32 QuestID
Definition: ObjectMgr.h:820
std::vector< QuestPOIBlobData > Blobs
Definition: ObjectMgr.h:821
Optional< NameCacheUnused920 > Unused920
Definition: QueryPackets.h:149
Optional< PlayerGuidLookupData > Data
Definition: QueryPackets.h:148
bool Initialize(ObjectGuid const &guid, Player const *player=nullptr)
Optional< uint32 > VirtualRealmAddress
current realm (?) (identifier made from the Index, BattleGroup and Region)
Definition: QueryPackets.h:104
Optional< uint32 > NativeRealmAddress
original realm (?) (identifier made from the Index, BattleGroup and Region)
Definition: QueryPackets.h:105