TrinityCore
Loading...
Searching...
No Matches
ObjectGuid.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 "ObjectGuid.h"
19#include "ByteBuffer.h"
20#include "Errors.h"
21#include "RealmList.h"
22#include "StringFormat.h"
23#include "Util.h"
24#include <charconv>
25
26static_assert(sizeof(ObjectGuid) == sizeof(uint64) * 2, "ObjectGuid must be exactly 16 bytes");
27
28namespace
29{
30 struct ObjectGuidInfo
31 {
32 using FormatFunction = fmt::appender(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid);
33 using ParseFunction = ObjectGuid(HighGuid type, std::string_view guidString);
34
35 std::string_view Names[AsUnderlyingType(HighGuid::Count)];
36 std::array<FormatFunction*, AsUnderlyingType(HighGuid::Count)> ClientFormatFunction;
37 std::array<ParseFunction*, AsUnderlyingType(HighGuid::Count)> ClientParseFunction;
38
39 static std::string Format(ObjectGuid const& guid)
40 {
41 return Trinity::StringFormat("{}", guid);
42 }
43
44 ObjectGuid Parse(std::string_view guidString) const
45 {
46 std::size_t typeEnd = guidString.find('-');
47 if (typeEnd == std::string::npos)
48 {
49 if (guidString == "0000000000000000")
50 return ObjectGuid::Empty;
52 }
53
54 std::string_view typeStr = guidString.substr(0, typeEnd);
55 guidString.remove_prefix(typeEnd + 1);
56
57 // find correct parser for type name
58 for (int32 type = 0; type < AsUnderlyingType(HighGuid::Count); ++type)
59 if (typeStr == Names[type])
60 return ClientParseFunction[type](HighGuid(type), guidString);
61
63 }
64
65 struct FormatPadding { std::ptrdiff_t Value; constexpr operator std::ptrdiff_t() const { return Value; } };
66
67 template <std::ptrdiff_t Width>
68 static constexpr inline FormatPadding padding{ .Value = Width };
69 static constexpr inline FormatPadding no_padding{ .Value = 0 };
70
71 struct FormatBase { int32 Value; constexpr operator int32() const { return Value; } };
72
73 static constexpr inline FormatBase dec{ 10 };
74 static constexpr inline FormatBase hex{ 16 };
75
76 static fmt::appender AppendTypeName(fmt::format_context& ctx, std::string_view type)
77 {
78 return std::ranges::copy(type, ctx.out()).out;
79 }
80
81 template <FormatPadding Width, FormatBase Base>
82 static fmt::appender AppendComponent(fmt::format_context& ctx, uint64 component)
83 {
84 *ctx.out() = '-';
85
86 std::array<char, 20> buf;
87 auto [end, err] = std::to_chars(buf.data(), buf.data() + buf.size(), component, Base);
88
89 ASSERT(err == std::errc(), "Failed to convert guid part to string");
90
91 if constexpr (Width != 0)
92 {
93 if (std::ptrdiff_t written = std::distance(buf.data(), end); written < Width)
94 std::ranges::fill_n(ctx.out(), Width - written, '0');
95 }
96
97 if constexpr (Base > 10)
98 return std::ranges::transform(buf.data(), end, ctx.out(), charToUpper).out;
99 else
100 return std::ranges::copy(buf.data(), end, ctx.out()).out;
101 }
102
103 static fmt::appender AppendComponent(fmt::format_context& ctx, std::string_view component)
104 {
105 *ctx.out() = '-';
106 return std::ranges::copy(component, ctx.out()).out;
107 }
108
109 template <FormatBase Base, typename T>
110 static bool ParseComponent(std::string_view& input, T* component)
111 {
112 auto [end, err] = std::from_chars(input.data(), input.data() + input.length(), *component, Base);
113 if (err != std::errc())
114 return false;
115
116 input.remove_prefix(end - input.data());
117 if (!input.empty())
118 {
119 if (input[0] != '-')
120 return false;
121
122 input.remove_prefix(1);
123 }
124
125 return true;
126 }
127
128 static bool ParseDone(std::string_view const& sv) { return sv.empty(); }
129
130 static fmt::appender FormatNull(fmt::format_context& ctx, std::string_view /*typeName*/, ObjectGuid const& /*guid*/)
131 {
132 return std::ranges::fill_n(ctx.out(), 16, '0');
133 }
134
135 static ObjectGuid ParseNull(HighGuid, std::string_view)
136 {
137 return ObjectGuid::Empty;
138 }
139
140 static constexpr std::array<std::string_view, 20> UniqNames =
141 {
142 "",
143 "WOWGUID_UNIQUE_PROBED_DELETE",
144 "WOWGUID_UNIQUE_JAM_TEMP",
145 "WOWGUID_TO_STRING_FAILED",
146 "WOWGUID_FROM_STRING_FAILED",
147 "WOWGUID_UNIQUE_SERVER_SELF",
148 "WOWGUID_UNIQUE_MAGIC_SELF",
149 "WOWGUID_UNIQUE_MAGIC_PET",
150 "WOWGUID_UNIQUE_INVALID_TRANSPORT",
151 "WOWGUID_UNIQUE_AMMO_ID",
152 "WOWGUID_SPELL_TARGET_TRADE_ITEM",
153 "WOWGUID_SCRIPT_TARGET_INVALID",
154 "WOWGUID_SCRIPT_TARGET_NONE",
155 "",
156 "WOWGUID_FAKE_MODERATOR",
157 "",
158 "",
159 "WOWGUID_UNIQUE_ACCOUNT_OBJ_INITIALIZATION",
160 "",
161 "WOWGUID_PENDING_PERMANENT_CHARACTER_ASSIGNMENT"
162 };
163
164 static fmt::appender FormatUniq(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
165 {
167 if (id >= UniqNames.size() || UniqNames[id].empty())
168 id = 3;
169
170 ctx.advance_to(AppendTypeName(ctx, typeName));
171 ctx.advance_to(AppendComponent(ctx, UniqNames[id]));
172 return ctx.out();
173 }
174
175 static ObjectGuid ParseUniq(HighGuid /*type*/, std::string_view guidString)
176 {
177 for (std::size_t id = 0; id < UniqNames.size(); ++id)
178 {
179 if (UniqNames[id].empty())
180 continue;
181
182 if (guidString == UniqNames[id])
184 }
185
187 }
188
189 static fmt::appender FormatPlayer(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
190 {
191 ctx.advance_to(AppendTypeName(ctx, typeName));
192 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRealmId()));
193 switch (uint8 subType = (guid.GetRawValue(1) >> 40) & 0x3)
194 {
195 case 0:
196 // no subType
197 ctx.advance_to(AppendComponent<padding<8>, hex>(ctx, guid.GetRawValue(0)));
198 break;
199 case 1: // characterless (plunderstorm)
200 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, subType));
201 ctx.advance_to(AppendComponent<padding<16>, hex>(ctx, guid.GetRawValue(0)));
202 break;
203 case 2: // npc-as-player
204 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, subType));
205 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) >> 16 & 0xFFFFFF)); // creature id?
206 ctx.advance_to(AppendComponent<padding<16>, hex>(ctx, guid.GetRawValue(0)));
207 break;
208 default:
209 break;
210 }
211
212 return ctx.out();
213 }
214
215 static ObjectGuid ParsePlayer(HighGuid /*type*/, std::string_view guidString)
216 {
217 uint32 realmId = 0;
218 uint8 subType = 0;
219 uint32 arg1 = 0;
220 uint64 dbId = UI64LIT(0);
221
222 if (!ParseComponent<dec>(guidString, &realmId)
223 || !ParseComponent<hex>(guidString, &dbId))
225
226 if (!ParseDone(guidString))
227 {
228 // dbId holds playerType at this point
229 switch (dbId)
230 {
231 case 1: // characterless (plunderstorm)
232 break;
233 case 2: // npc-as-player
234 if (!ParseComponent<dec>(guidString, &arg1)) // creature id?
236 break;
237 default:
239 }
240
241 subType = dbId;
242 if (!ParseComponent<hex>(guidString, &dbId)
243 || !ParseDone(guidString))
245 }
246
247 return ObjectGuidFactory::CreatePlayer(realmId, subType, arg1, dbId);
248 }
249
250 static fmt::appender FormatItem(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
251 {
252 ctx.advance_to(AppendTypeName(ctx, typeName));
253 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRealmId()));
254 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) >> 18 & 0xFFFFFF));
255 ctx.advance_to(AppendComponent<padding<16>, hex>(ctx, guid.GetRawValue(0)));
256 return ctx.out();
257 }
258
259 static ObjectGuid ParseItem(HighGuid /*type*/, std::string_view guidString)
260 {
261 uint32 realmId = 0;
262 uint32 arg1 = 0;
263 uint64 dbId = UI64LIT(0);
264
265 if (!ParseComponent<dec>(guidString, &realmId)
266 || !ParseComponent<dec>(guidString, &arg1)
267 || !ParseComponent<hex>(guidString, &dbId)
268 || !ParseDone(guidString))
270
271 return ObjectGuidFactory::CreateItem(realmId, dbId);
272 }
273
274 static fmt::appender FormatWorldObject(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
275 {
276 ctx.advance_to(AppendTypeName(ctx, typeName));
277 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetSubType()));
278 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRealmId()));
279 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetMapId()));
280 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(0) >> 40 & 0xFFFFFF));
281 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetEntry()));
282 ctx.advance_to(AppendComponent<padding<10>, hex>(ctx, guid.GetCounter()));
283 return ctx.out();
284 }
285
286 static ObjectGuid ParseWorldObject(HighGuid type, std::string_view guidString)
287 {
288 uint8 subType = 0;
289 uint32 realmId = 0;
290 uint16 mapId = 0;
291 uint32 serverId = 0;
292 uint32 id = 0;
293 uint64 counter = UI64LIT(0);
294
295 if (!ParseComponent<dec>(guidString, &subType)
296 || !ParseComponent<dec>(guidString, &realmId)
297 || !ParseComponent<dec>(guidString, &mapId)
298 || !ParseComponent<dec>(guidString, &serverId)
299 || !ParseComponent<dec>(guidString, &id)
300 || !ParseComponent<hex>(guidString, &counter)
301 || !ParseDone(guidString))
303
304 return ObjectGuidFactory::CreateWorldObject(type, subType, realmId, mapId, serverId, id, counter);
305 }
306
307 static fmt::appender FormatTransport(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
308 {
309 ctx.advance_to(AppendTypeName(ctx, typeName));
310 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetEntry()));
311 ctx.advance_to(AppendComponent<padding<16>, hex>(ctx, guid.GetRawValue(0)));
312 return ctx.out();
313 }
314
315 static ObjectGuid ParseTransport(HighGuid type, std::string_view guidString)
316 {
317 uint32 id = 0;
318 uint32 counter = 0;
319
320 if (!ParseComponent<dec>(guidString, &id)
321 || !ParseComponent<hex>(guidString, &counter)
322 || !ParseDone(guidString))
324
325 return ObjectGuidFactory::CreateTransport(type, counter);
326 }
327
328 static fmt::appender FormatClientActor(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
329 {
330 ctx.advance_to(AppendTypeName(ctx, typeName));
331 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRealmId()));
332 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) >> 26 & 0xFFFFFF));
333 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(0) & 0xFFFFFFFF));
334 return ctx.out();
335 }
336
337 static ObjectGuid ParseClientActor(HighGuid /*type*/, std::string_view guidString)
338 {
339 uint16 ownerType = 0;
340 uint16 ownerId = 0;
341 uint32 counter = 0;
342
343 if (!ParseComponent<dec>(guidString, &ownerType)
344 || !ParseComponent<dec>(guidString, &ownerId)
345 || !ParseComponent<dec>(guidString, &counter)
346 || !ParseDone(guidString))
348
349 return ObjectGuidFactory::CreateClientActor(ownerType, ownerId, counter);
350 }
351
352 static fmt::appender FormatChatChannel(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
353 {
354 uint32 builtIn = (guid.GetRawValue(1) >> 25) & 0x1;
355 uint32 trade = (guid.GetRawValue(1) >> 24) & 0x1;
356 uint32 zoneId = (guid.GetRawValue(1) >> 10) & 0x3FFF;
357 uint32 factionGroupMask = (guid.GetRawValue(1) >> 4) & 0x3F;
358
359 ctx.advance_to(AppendTypeName(ctx, typeName));
360 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRealmId()));
361 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, builtIn));
362 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, trade));
363 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, zoneId));
364 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, factionGroupMask));
365 ctx.advance_to(AppendComponent<padding<8>, hex>(ctx, guid.GetRawValue(0)));
366 return ctx.out();
367 }
368
369 static ObjectGuid ParseChatChannel(HighGuid /*type*/, std::string_view guidString)
370 {
371 uint32 realmId = 0;
372 uint32 builtIn = 0;
373 uint32 trade = 0;
374 uint16 zoneId = 0;
375 uint8 factionGroupMask = 0;
376 uint64 id = UI64LIT(0);
377
378 if (!ParseComponent<dec>(guidString, &realmId)
379 || !ParseComponent<dec>(guidString, &builtIn)
380 || !ParseComponent<dec>(guidString, &trade)
381 || !ParseComponent<dec>(guidString, &zoneId)
382 || !ParseComponent<dec>(guidString, &factionGroupMask)
383 || !ParseComponent<hex>(guidString, &id)
384 || !ParseDone(guidString))
386
387 return ObjectGuidFactory::CreateChatChannel(realmId, builtIn != 0, trade != 0, zoneId, factionGroupMask, id);
388 }
389
390 static fmt::appender FormatGlobal(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
391 {
392 ctx.advance_to(AppendTypeName(ctx, typeName));
393 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) & 0x3FFFFFFFFFFFFFF));
394 ctx.advance_to(AppendComponent<padding<12>, hex>(ctx, guid.GetRawValue(0)));
395 return ctx.out();
396 }
397
398 static ObjectGuid ParseGlobal(HighGuid type, std::string_view guidString)
399 {
400 uint64 dbIdHigh = UI64LIT(0);
401 uint64 dbIdLow = UI64LIT(0);
402
403 if (!ParseComponent<dec>(guidString, &dbIdHigh)
404 || !ParseComponent<hex>(guidString, &dbIdLow)
405 || !ParseDone(guidString))
407
408 return ObjectGuidFactory::CreateGlobal(type, dbIdHigh, dbIdLow);
409 }
410
411 static fmt::appender FormatGuild(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
412 {
413 ctx.advance_to(AppendTypeName(ctx, typeName));
414 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRealmId()));
415 ctx.advance_to(AppendComponent<padding<12>, hex>(ctx, guid.GetRawValue(0)));
416 return ctx.out();
417 }
418
419 static ObjectGuid ParseGuild(HighGuid type, std::string_view guidString)
420 {
421 uint32 realmId = 0;
422 uint64 dbId = UI64LIT(0);
423
424 if (!ParseComponent<dec>(guidString, &realmId)
425 || !ParseComponent<hex>(guidString, &dbId)
426 || !ParseDone(guidString))
428
429 return ObjectGuidFactory::CreateGuild(type, realmId, dbId);
430 }
431
432 static fmt::appender FormatMobileSession(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
433 {
434 ctx.advance_to(AppendTypeName(ctx, typeName));
435 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRealmId()));
436 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) >> 33 & 0x1FF));
437 ctx.advance_to(AppendComponent<padding<8>, hex>(ctx, guid.GetRawValue(0)));
438 return ctx.out();
439 }
440
441 static ObjectGuid ParseMobileSession(HighGuid /*type*/, std::string_view guidString)
442 {
443 uint32 realmId = 0;
444 uint16 arg1 = 0;
445 uint64 counter = UI64LIT(0);
446
447 if (!ParseComponent<dec>(guidString, &realmId)
448 || !ParseComponent<dec>(guidString, &arg1)
449 || !ParseComponent<hex>(guidString, &counter)
450 || !ParseDone(guidString))
452
453 return ObjectGuidFactory::CreateMobileSession(realmId, arg1, counter);
454 }
455
456 static fmt::appender FormatWebObj(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
457 {
458 ctx.advance_to(AppendTypeName(ctx, typeName));
459 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRealmId()));
460 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) >> 37 & 0x1F));
461 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) >> 35 & 0x3));
462 ctx.advance_to(AppendComponent<padding<12>, hex>(ctx, guid.GetRawValue(0)));
463 return ctx.out();
464 }
465
466 static ObjectGuid ParseWebObj(HighGuid /*type*/, std::string_view guidString)
467 {
468 uint32 realmId = 0;
469 uint8 arg1 = 0;
470 uint8 arg2 = 0;
471 uint64 counter = UI64LIT(0);
472
473 if (!ParseComponent<dec>(guidString, &realmId)
474 || !ParseComponent<dec>(guidString, &arg1)
475 || !ParseComponent<dec>(guidString, &arg2)
476 || !ParseComponent<hex>(guidString, &counter)
477 || !ParseDone(guidString))
479
480 return ObjectGuidFactory::CreateWebObj(realmId, arg1, arg2, counter);
481 }
482
483 static fmt::appender FormatLFGObject(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
484 {
485 ctx.advance_to(AppendTypeName(ctx, typeName));
486 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) >> 54 & 0xF));
487 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) >> 50 & 0xF));
488 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) >> 46 & 0xF));
489 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) >> 38 & 0xFF));
490 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) >> 37 & 0x1));
491 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) >> 35 & 0x3));
492 ctx.advance_to(AppendComponent<padding<6>, hex>(ctx, guid.GetRawValue(0)));
493 return ctx.out();
494 }
495
496 static ObjectGuid ParseLFGObject(HighGuid /*type*/, std::string_view guidString)
497 {
498 uint8 arg1 = 0;
499 uint8 arg2 = 0;
500 uint8 arg3 = 0;
501 uint8 arg4 = 0;
502 uint8 arg5 = 0;
503 uint8 arg6 = 0;
504 uint64 counter = UI64LIT(0);
505
506 if (!ParseComponent<dec>(guidString, &arg1)
507 || !ParseComponent<dec>(guidString, &arg2)
508 || !ParseComponent<dec>(guidString, &arg3)
509 || !ParseComponent<dec>(guidString, &arg4)
510 || !ParseComponent<dec>(guidString, &arg5)
511 || !ParseComponent<dec>(guidString, &arg6)
512 || !ParseComponent<hex>(guidString, &counter)
513 || !ParseDone(guidString))
515
516 return ObjectGuidFactory::CreateLFGObject(arg1, arg2, arg3, arg4, arg5 != 0, arg6, counter);
517 }
518
519 static fmt::appender FormatLFGList(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
520 {
521 ctx.advance_to(AppendTypeName(ctx, typeName));
522 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) >> 54 & 0xF));
523 ctx.advance_to(AppendComponent<padding<6>, hex>(ctx, guid.GetRawValue(0)));
524 return ctx.out();
525 }
526
527 static ObjectGuid ParseLFGList(HighGuid /*type*/, std::string_view guidString)
528 {
529 uint8 arg1 = 0;
530 uint64 counter = UI64LIT(0);
531
532 if (!ParseComponent<dec>(guidString, &arg1)
533 || !ParseComponent<hex>(guidString, &counter)
534 || !ParseDone(guidString))
536
537 return ObjectGuidFactory::CreateLFGList(arg1, counter);
538 }
539
540 static fmt::appender FormatClient(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
541 {
542 ctx.advance_to(AppendTypeName(ctx, typeName));
543 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRealmId()));
544 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) >> 10 & 0xFFFFFFFF));
545 ctx.advance_to(AppendComponent<padding<12>, hex>(ctx, guid.GetRawValue(0)));
546 return ctx.out();
547 }
548
549 static ObjectGuid ParseClient(HighGuid type, std::string_view guidString)
550 {
551 uint32 realmId = 0;
552 uint32 arg1 = 0;
553 uint64 counter = UI64LIT(0);
554
555 if (!ParseComponent<dec>(guidString, &realmId)
556 || !ParseComponent<dec>(guidString, &arg1)
557 || !ParseComponent<hex>(guidString, &counter)
558 || !ParseDone(guidString))
560
561 return ObjectGuidFactory::CreateClient(type, realmId, arg1, counter);
562 }
563
564 static fmt::appender FormatClubFinder(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
565 {
566 uint32 type = uint32(guid.GetRawValue(1) >> 33) & 0xFF;
567 uint32 clubFinderId = uint32(guid.GetRawValue(1)) & 0xFFFFFFFF;
568
569 ctx.advance_to(AppendTypeName(ctx, typeName));
570 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, type));
571 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, clubFinderId));
572 switch (type)
573 {
574 case 0: // club
575 ctx.advance_to(AppendComponent<padding<16>, hex>(ctx, guid.GetRawValue(0))); // clubId
576 break;
577 case 1: // guild
578 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRealmId()));
579 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(0))); // guildId
580 break;
581 default:
582 break;
583 }
584
585 return ctx.out();
586 }
587
588 static ObjectGuid ParseClubFinder(HighGuid /*type*/, std::string_view guidString)
589 {
590 uint8 type = 0;
591 uint32 clubFinderId = 0;
592 uint32 realmId = 0;
593 uint64 dbId = UI64LIT(0);
594
595 if (!ParseComponent<dec>(guidString, &type)
596 || !ParseComponent<dec>(guidString, &clubFinderId))
598
599 switch (type)
600 {
601 case 0: // club
602 if (!ParseComponent<hex>(guidString, &dbId))
604 break;
605 case 1: // guild
606 if (!ParseComponent<dec>(guidString, &realmId)
607 || !ParseComponent<dec>(guidString, &dbId))
609 break;
610 default:
612 }
613
614 if (!ParseDone(guidString))
616
617 return ObjectGuidFactory::CreateClubFinder(realmId, type, clubFinderId, dbId);
618 }
619
620 static fmt::appender FormatToolsClient(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
621 {
622 ctx.advance_to(AppendTypeName(ctx, typeName));
623 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetMapId()));
624 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(0) >> 40 & 0xFFFFFF));
625 ctx.advance_to(AppendComponent<padding<10>, hex>(ctx, guid.GetCounter()));
626 return ctx.out();
627 }
628
629 static ObjectGuid ParseToolsClient(HighGuid /*type*/, std::string_view guidString)
630 {
631 uint16 mapId = 0;
632 uint32 serverId = 0;
633 uint64 counter = UI64LIT(0);
634
635 if (!ParseComponent<dec>(guidString, &mapId)
636 || !ParseComponent<dec>(guidString, &serverId)
637 || !ParseComponent<hex>(guidString, &counter)
638 || !ParseDone(guidString))
640
641 return ObjectGuidFactory::CreateToolsClient(mapId, serverId, counter);
642 }
643
644 static fmt::appender FormatWorldLayer(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
645 {
646 ctx.advance_to(AppendTypeName(ctx, typeName));
647 ctx.advance_to(AppendComponent<padding<0>, hex>(ctx, guid.GetRawValue(1) >> 10 & 0xFFFFFFFF));
648 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(1) & 0x1FF));
649 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(0) >> 24 & 0xFF));
650 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(0) & 0x7FFFFF));
651 return ctx.out();
652 }
653
654 static ObjectGuid ParseWorldLayer(HighGuid /*type*/, std::string_view guidString)
655 {
656 uint32 arg1 = 0;
657 uint16 arg2 = 0;
658 uint8 arg3 = 0;
659 uint32 arg4 = 0;
660
661 if (!ParseComponent<hex>(guidString, &arg1)
662 || !ParseComponent<dec>(guidString, &arg2)
663 || !ParseComponent<dec>(guidString, &arg3)
664 || !ParseComponent<dec>(guidString, &arg4)
665 || !ParseDone(guidString))
667
668 return ObjectGuidFactory::CreateWorldLayer(arg1, arg2, arg3, arg4);
669 }
670
671 static fmt::appender FormatLMMLobby(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
672 {
673 ctx.advance_to(AppendTypeName(ctx, typeName));
674 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRealmId()));
675 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, uint32(guid.GetRawValue(1) >> 26) & 0xFFFFFF));
676 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, uint32(guid.GetRawValue(1) >> 18) & 0xFF));
677 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, uint32(guid.GetRawValue(1) >> 10) & 0xFF));
678 ctx.advance_to(AppendComponent<padding<0>, hex>(ctx, guid.GetRawValue(0)));
679 return ctx.out();
680 }
681
682 static ObjectGuid ParseLMMLobby(HighGuid /*type*/, std::string_view guidString)
683 {
684 uint32 realmId = 0;
685 uint32 arg2 = 0;
686 uint8 arg3 = 0;
687 uint8 arg4 = 0;
688 uint64 arg5 = 0;
689
690 if (!ParseComponent<dec>(guidString, &realmId)
691 || !ParseComponent<dec>(guidString, &arg2)
692 || !ParseComponent<dec>(guidString, &arg3)
693 || !ParseComponent<dec>(guidString, &arg4)
694 || !ParseComponent<hex>(guidString, &arg5)
695 || !ParseDone(guidString))
697
698 return ObjectGuidFactory::CreateLMMLobby(realmId, arg2, arg3, arg4, arg5);
699 }
700
701 static fmt::appender FormatHousing(fmt::format_context& ctx, std::string_view typeName, ObjectGuid const& guid)
702 {
703 ctx.advance_to(AppendTypeName(ctx, typeName));
704 switch (uint32 subType = (guid.GetRawValue(1) >> 53) & 0x1F)
705 {
706 case 1:
707 case 4:
708 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, subType));
709 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, uint32(guid.GetRawValue(1) >> 32) & 0xFFFF));
710 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, uint32(guid.GetRawValue(1)) & 0xFFFFFFFF));
711 ctx.advance_to(AppendComponent<no_padding, hex>(ctx, guid.GetRawValue(0)));
712 break;
713 case 2:
714 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, subType));
715 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, uint32(guid.GetRawValue(1)) & 0xFFFFFFFF));
716 ctx.advance_to(AppendComponent<no_padding, hex>(ctx, guid.GetRawValue(0)));
717 break;
718 case 3:
719 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, subType));
720 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, uint32(guid.GetRawValue(1)) & 0x7FFF));
721 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, guid.GetRawValue(0)));
722 ctx.advance_to(AppendComponent<no_padding, dec>(ctx, uint32(guid.GetRawValue(1) >> 15) & 0x3F));
723 break;
724 default:
725 break;
726 }
727 return ctx.out();
728 }
729
730 static ObjectGuid ParseHousing(HighGuid /*type*/, std::string_view guidString)
731 {
732 uint32 subType = 0;
733
734 if (!ParseComponent<dec>(guidString, &subType))
736
737 uint32 arg1 = 0;
738 uint32 arg2 = 0;
739 uint64 arg3 = UI64LIT(0);
740
741 switch (subType)
742 {
743 case 1:
744 case 4:
745 if (!ParseComponent<dec>(guidString, &arg1)
746 || !ParseComponent<dec>(guidString, &arg2)
747 || !ParseComponent<hex>(guidString, &arg3)
748 || !ParseDone(guidString))
750 break;
751 case 2:
752 if (!ParseComponent<dec>(guidString, &arg2)
753 || !ParseComponent<hex>(guidString, &arg3)
754 || !ParseDone(guidString))
756 break;
757 case 3:
758 if (!ParseComponent<dec>(guidString, &arg2)
759 || !ParseComponent<dec>(guidString, &arg3)
760 || !ParseComponent<dec>(guidString, &arg1)
761 || !ParseDone(guidString))
763 break;
764 }
765
766 return ObjectGuidFactory::CreateHousing(subType, arg1, arg2, arg3);
767 }
768
769 ObjectGuidInfo();
770 } Info;
771
772 ObjectGuidInfo::ObjectGuidInfo()
773 {
774#define SET_GUID_INFO(type, format, parse) \
775 Names[AsUnderlyingType(HighGuid::type)] = #type ## sv;\
776 ClientFormatFunction[AsUnderlyingType(HighGuid::type)] = &ObjectGuidInfo::format;\
777 ClientParseFunction[AsUnderlyingType(HighGuid::type)] = &ObjectGuidInfo::parse
778
779 SET_GUID_INFO(Null, FormatNull, ParseNull);
780 SET_GUID_INFO(Uniq, FormatUniq, ParseUniq);
781 SET_GUID_INFO(Player, FormatPlayer, ParsePlayer);
782 SET_GUID_INFO(Item, FormatItem, ParseItem);
783 SET_GUID_INFO(WorldTransaction, FormatWorldObject, ParseWorldObject);
784 SET_GUID_INFO(StaticDoor, FormatTransport, ParseTransport);
785 SET_GUID_INFO(Transport, FormatTransport, ParseTransport);
786 SET_GUID_INFO(Conversation, FormatWorldObject, ParseWorldObject);
787 SET_GUID_INFO(Creature, FormatWorldObject, ParseWorldObject);
788 SET_GUID_INFO(Vehicle, FormatWorldObject, ParseWorldObject);
789 SET_GUID_INFO(Pet, FormatWorldObject, ParseWorldObject);
790 SET_GUID_INFO(GameObject, FormatWorldObject, ParseWorldObject);
791 SET_GUID_INFO(DynamicObject, FormatWorldObject, ParseWorldObject);
792 SET_GUID_INFO(AreaTrigger, FormatWorldObject, ParseWorldObject);
793 SET_GUID_INFO(Corpse, FormatWorldObject, ParseWorldObject);
794 SET_GUID_INFO(LootObject, FormatWorldObject, ParseWorldObject);
795 SET_GUID_INFO(SceneObject, FormatWorldObject, ParseWorldObject);
796 SET_GUID_INFO(Scenario, FormatWorldObject, ParseWorldObject);
797 SET_GUID_INFO(AIGroup, FormatWorldObject, ParseWorldObject);
798 SET_GUID_INFO(DynamicDoor, FormatWorldObject, ParseWorldObject);
799 SET_GUID_INFO(ClientActor, FormatClientActor, ParseClientActor);
800 SET_GUID_INFO(Vignette, FormatWorldObject, ParseWorldObject);
801 SET_GUID_INFO(CallForHelp, FormatWorldObject, ParseWorldObject);
802 SET_GUID_INFO(AIResource, FormatWorldObject, ParseWorldObject);
803 SET_GUID_INFO(AILock, FormatWorldObject, ParseWorldObject);
804 SET_GUID_INFO(AILockTicket, FormatWorldObject, ParseWorldObject);
805 SET_GUID_INFO(ChatChannel, FormatChatChannel, ParseChatChannel);
806 SET_GUID_INFO(Party, FormatGlobal, ParseGlobal);
807 SET_GUID_INFO(Guild, FormatGuild, ParseGuild);
808 SET_GUID_INFO(WowAccount, FormatGlobal, ParseGlobal);
809 SET_GUID_INFO(BNetAccount, FormatGlobal, ParseGlobal);
810 SET_GUID_INFO(GMTask, FormatGlobal, ParseGlobal);
811 SET_GUID_INFO(MobileSession, FormatMobileSession, ParseMobileSession);
812 SET_GUID_INFO(RaidGroup, FormatGlobal, ParseGlobal);
813 SET_GUID_INFO(Spell, FormatGlobal, ParseGlobal);
814 SET_GUID_INFO(Mail, FormatGlobal, ParseGlobal);
815 SET_GUID_INFO(WebObj, FormatWebObj, ParseWebObj);
816 SET_GUID_INFO(LFGObject, FormatLFGObject, ParseLFGObject);
817 SET_GUID_INFO(LFGList, FormatLFGList, ParseLFGList);
818 SET_GUID_INFO(UserRouter, FormatGlobal, ParseGlobal);
819 SET_GUID_INFO(PVPQueueGroup, FormatGlobal, ParseGlobal);
820 SET_GUID_INFO(UserClient, FormatGlobal, ParseGlobal);
821 SET_GUID_INFO(PetBattle, FormatClient, ParseClient);
822 SET_GUID_INFO(UniqUserClient, FormatClient, ParseClient);
823 SET_GUID_INFO(BattlePet, FormatGlobal, ParseGlobal);
824 SET_GUID_INFO(CommerceObj, FormatGlobal, ParseGlobal);
825 SET_GUID_INFO(ClientSession, FormatClient, ParseClient);
826 SET_GUID_INFO(Cast, FormatWorldObject, ParseWorldObject);
827 SET_GUID_INFO(ClientConnection, FormatClient, ParseClient);
828 SET_GUID_INFO(ClubFinder, FormatClubFinder, ParseClubFinder);
829 SET_GUID_INFO(ToolsClient, FormatToolsClient, ParseToolsClient);
830 SET_GUID_INFO(WorldLayer, FormatWorldLayer, ParseWorldLayer);
831 SET_GUID_INFO(ArenaTeam, FormatGuild, ParseGuild);
832 SET_GUID_INFO(LMMParty, FormatClient, ParseClient);
833 SET_GUID_INFO(LMMLobby, FormatLMMLobby, ParseLMMLobby);
834 SET_GUID_INFO(Housing, FormatHousing, ParseHousing);
835 SET_GUID_INFO(MeshObject, FormatWorldObject, ParseWorldObject);
836 SET_GUID_INFO(Entity, FormatWorldObject, ParseWorldObject);
837
838#undef SET_GUID_INFO
839 }
840}
841
842template <typename FormatContext>
843auto fmt::formatter<ObjectGuid>::format(ObjectGuid const& guid, FormatContext& ctx) const -> decltype(ctx.out())
844{
845 if (guid.GetHigh() >= HighGuid::Count)
846 return this->format(ObjectGuid::ToStringFailed, ctx);
847
848 int32 type = AsUnderlyingType(guid.GetHigh());
849 if (!Info.ClientFormatFunction[type])
850 return this->format(ObjectGuid::ToStringFailed, ctx);
851
852 return Info.ClientFormatFunction[type](ctx, Info.Names[type], guid);
853}
854
855template TC_GAME_API fmt::appender fmt::formatter<ObjectGuid>::format<fmt::format_context>(ObjectGuid const&, format_context&) const;
856
857std::string_view ObjectGuid::GetTypeName(HighGuid high)
858{
859 if (high >= HighGuid::Count)
860 return "<unknown>";
861
862 return Info.Names[uint32(high)];
863}
864
865std::string ObjectGuid::ToString() const
866{
867 return ObjectGuidInfo::Format(*this);
868}
869
870std::string ObjectGuid::ToHexString() const
871{
872 return Trinity::StringFormat("0x{:016X}{:016X}", _data[1], _data[0]);
873}
874
875ObjectGuid ObjectGuid::FromString(std::string_view guidString)
876{
877 return Info.Parse(guidString);
878}
879
880void ObjectGuid::SetRawValue(std::span<uint8 const> rawBytes)
881{
882 ASSERT(rawBytes.size() == BytesSize, SZFMTD " == " SZFMTD, rawBytes.size(), BytesSize);
883 memcpy(_data.data(), rawBytes.data(), BytesSize);
884}
885
887{
888 if (realmId)
889 return realmId;
890
891 return sRealmList->GetCurrentRealmId().Realm;
892}
893
895{
896 return ObjectGuid();
897}
898
904
906{
908 | (uint64(GetRealmIdForObjectGuid(realmId)) << 42)
909 | (uint64(subType & 0x3) << 40)
910 | (uint64(arg1 & 0xFFFFFF) << 16)),
911 dbId);
912}
913
915{
916 return ObjectGuid(uint64((uint64(HighGuid::Item) << 58)
917 | (uint64(GetRealmIdForObjectGuid(realmId)) << 42)),
918 dbId);
919}
920
922{
923 return ObjectGuid(uint64((uint64(type) << 58)
924 | (uint64(GetRealmIdForObjectGuid(realmId) & 0x1FFF) << 42)
925 | (uint64(mapId & 0x1FFF) << 29)
926 | (uint64(entry & 0x7FFFFF) << 6)
927 | (uint64(subType) & 0x3F)),
928 uint64((uint64(serverId & 0xFFFFFF) << 40)
929 | (counter & UI64LIT(0xFFFFFFFFFF))));
930}
931
933{
934 return ObjectGuid(uint64((uint64(type) << 58)
935 | (uint64(counter) << 38)),
936 UI64LIT(0));
937}
938
940{
942 | (uint64(ownerType & 0x1FFF) << 42)
943 | (uint64(ownerId & 0xFFFFFF) << 26)),
944 uint64(counter));
945}
946
947ObjectGuid ObjectGuidFactory::CreateChatChannel(uint32 realmId, bool builtIn, bool trade, uint16 zoneId, uint8 factionGroupMask, ObjectGuid::LowType counter)
948{
950 | (uint64(GetRealmIdForObjectGuid(realmId) & 0x1FFF) << 42)
951 | (uint64(builtIn) << 25)
952 | (uint64(trade) << 24)
953 | (uint64(zoneId & 0x3FFF) << 10)
954 | (uint64(factionGroupMask & 0x3F) << 4)),
955 counter);
956}
957
959{
960 return ObjectGuid(uint64((uint64(type) << 58)
961 | (uint64(dbIdHigh & UI64LIT(0x3FFFFFFFFFFFFFF)))),
962 dbId);
963}
964
966{
967 return ObjectGuid(uint64((uint64(type) << 58)
968 | (uint64(GetRealmIdForObjectGuid(realmId)) << 42)),
969 dbId);
970}
971
973{
975 | (uint64(GetRealmIdForObjectGuid(realmId)) << 42)
976 | (uint64(arg1 & 0x1FF) << 33)),
977 counter);
978}
979
981{
983 | (uint64(GetRealmIdForObjectGuid(realmId) & 0x1FFF) << 42)
984 | (uint64(arg1 & 0x1F) << 37)
985 | (uint64(arg2 & 0x3) << 35)),
986 counter);
987}
988
990{
992 | (uint64(arg1 & 0xF) << 54)
993 | (uint64(arg2 & 0xF) << 50)
994 | (uint64(arg3 & 0xF) << 46)
995 | (uint64(arg4 & 0xFF) << 38)
996 | (uint64(arg5 ? 1 : 0) << 37)
997 | (uint64(arg6 & 0x3) << 35)),
998 counter);
999}
1000
1002{
1004 | (uint64(arg1 & 0xF) << 54)),
1005 counter);
1006}
1007
1009{
1010 return ObjectGuid(uint64((uint64(type) << 58)
1011 | (uint64(GetRealmIdForObjectGuid(realmId) & 0x1FFF) << 42)
1012 | (uint64(arg1 & 0xFFFFFFFF) << 10)),
1013 counter);
1014}
1015
1017{
1019 | (type == 1 ? (uint64(GetRealmIdForObjectGuid(realmId) & 0x1FFF) << 42) : UI64LIT(0))
1020 | (uint64(type & 0xFF) << 33)
1021 | (uint64(clubFinderId & 0xFFFFFFFF))),
1022 dbId);
1023}
1024
1026{
1028 | uint64(mapId)),
1029 uint64((uint64(serverId & 0xFFFFFF) << 40)
1030 | (counter & UI64LIT(0xFFFFFFFFFF))));
1031}
1032
1034{
1036 | (uint64(arg1 & 0xFFFFFFFF) << 10)
1037 | (uint64(arg2 & 0x1FF))),
1038 uint64((uint64(arg3 & 0xFF) << 24)
1039 | uint64(arg4 & 0x7FFFFF)));
1040}
1041
1043{
1045 | (uint64(GetRealmIdForObjectGuid(realmId)) << 42)
1046 | (uint64(arg2 & 0xFFFFFFFF) << 26)
1047 | (uint64(arg3 & 0xFF) << 18)
1048 | (uint64(arg4 & 0xFF) << 10)),
1049 counter);
1050}
1051
1053{
1054 switch (subType)
1055 {
1056 case 1:
1057 case 4:
1059 | (uint64(subType & 0x1F) << 53)
1060 | (uint64(arg1 & 0xFFFF) << 32)
1061 | (uint64(arg2 & 0xFFFFFFFF))),
1062 arg3);
1063 case 2:
1065 | (uint64(subType & 0x1F) << 53)
1066 | (uint64(arg2 & 0xFFFFFFFF))),
1067 arg3);
1068 case 3:
1070 | (uint64(subType & 0x1F) << 53)
1071 | (uint64(arg1 & 0x3F) << 15)
1072 | (uint64(arg2 & 0x7FFF))),
1073 arg3);
1074 default:
1075 break;
1076 }
1077
1078 return ObjectGuid::Empty;
1079}
1080
1081ObjectGuid const ObjectGuid::Empty = ObjectGuid::Create<HighGuid::Null>();
1082ObjectGuid const ObjectGuid::ToStringFailed = ObjectGuid::Create<HighGuid::Uniq>(UI64LIT(3));
1083ObjectGuid const ObjectGuid::FromStringFailed = ObjectGuid::Create<HighGuid::Uniq>(UI64LIT(4));
1084ObjectGuid const ObjectGuid::TradeItem = ObjectGuid::Create<HighGuid::Uniq>(UI64LIT(10));
1085
1087{
1088 static constexpr std::size_t NumUInt64s = 2;
1089
1090 std::array<uint8, NumUInt64s + ObjectGuid::BytesSize> bytes;
1091 memset(bytes.data(), 0, NumUInt64s);
1092 size_t packedSize = guid._data.size();
1093
1094 for (std::size_t i = 0; i < guid._data.size(); ++i)
1095 {
1096 for (uint32 b = 0; b < 8; ++b)
1097 {
1098 if (uint8 byte = uint8((guid._data[i] >> (b * 8)) & 0xFF))
1099 {
1100 bytes[packedSize++] = byte;
1101 bytes[i] |= uint8(1 << b);
1102 }
1103 }
1104 }
1105
1106 buf.append(bytes.data(), packedSize);
1107
1108 return buf;
1109}
1110
1112{
1113 std::array<uint8, 2> mask;
1114 buf.read(mask);
1115
1116 for (std::size_t i = 0; i < guid._data.size(); ++i)
1117 for (uint32 b = 0; b < 8; ++b)
1118 if (mask[i] & (uint8(1) << b))
1119 guid._data[i] |= uint64(buf.read<uint8>()) << (b * 8);
1120
1121 return buf;
1122}
#define TC_GAME_API
Definition Define.h:129
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint64_t uint64
Definition Define.h:153
#define UI64LIT(N)
Definition Define.h:139
uint16_t uint16
Definition Define.h:155
uint32_t uint32
Definition Define.h:154
#define SZFMTD
Definition Define.h:144
#define ASSERT
Definition Errors.h:80
ByteBuffer & operator<<(ByteBuffer &buf, ObjectGuid const &guid)
ByteBuffer & operator>>(ByteBuffer &buf, ObjectGuid &guid)
static uint32 GetRealmIdForObjectGuid(uint32 realmId)
#define SET_GUID_INFO(type, format, parse)
HighGuid
Definition ObjectGuid.h:109
@ UniqUserClient
@ WorldTransaction
@ ClientConnection
#define sRealmList
Definition RealmList.h:93
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:565
struct CharToUpper charToUpper
void append(T value)
Definition ByteBuffer.h:130
Definition Guild.h:329
Definition Item.h:179
static ObjectGuid CreateTransport(HighGuid type, uint32 counter)
static ObjectGuid CreateHousing(uint32 subType, uint32 arg1, uint32 arg2, uint64 arg3)
static ObjectGuid CreateGlobal(HighGuid type, uint64 dbIdHigh, uint64 dbId)
static ObjectGuid CreateItem(uint32 realmId, uint64 dbId)
static ObjectGuid CreateWorldLayer(uint32 arg1, uint16 arg2, uint8 arg3, uint32 arg4)
static ObjectGuid CreateLMMLobby(uint32 realmId, uint32 arg2, uint8 arg3, uint8 arg4, uint64 counter)
static ObjectGuid CreateMobileSession(uint32 realmId, uint16 arg1, uint64 counter)
static ObjectGuid CreateClubFinder(uint32 realmId, uint8 type, uint32 clubFinderId, uint64 dbId)
static ObjectGuid CreateClient(HighGuid type, uint32 realmId, uint32 arg1, uint64 counter)
static ObjectGuid CreateClientActor(uint16 ownerType, uint16 ownerId, uint32 counter)
static ObjectGuid CreateToolsClient(uint16 mapId, uint32 serverId, uint64 counter)
static ObjectGuid CreatePlayer(uint32 realmId, uint8 subType, uint32 arg1, uint64 dbId)
static ObjectGuid CreateGuild(HighGuid type, uint32 realmId, uint64 dbId)
static ObjectGuid CreateWorldObject(HighGuid type, uint8 subType, uint32 realmId, uint16 mapId, uint32 serverId, uint32 entry, uint64 counter)
static ObjectGuid CreateChatChannel(uint32 realmId, bool builtIn, bool trade, uint16 zoneId, uint8 factionGroupMask, uint64 counter)
static constexpr ObjectGuid CreateUniq(uint64 id)
static ObjectGuid CreateLFGList(uint8 arg1, uint64 counter)
static constexpr ObjectGuid CreateNull()
static ObjectGuid CreateLFGObject(uint8 arg1, uint8 arg2, uint8 arg3, uint8 arg4, bool arg5, uint8 arg6, uint64 counter)
static ObjectGuid CreateWebObj(uint32 realmId, uint8 arg1, uint8 arg2, uint64 counter)
uint32 GetMapId() const
Definition ObjectGuid.h:333
LowType GetCounter() const
Definition ObjectGuid.h:336
static ObjectGuid const Empty
Definition ObjectGuid.h:314
static ObjectGuid const ToStringFailed
Definition ObjectGuid.h:315
uint64 GetRawValue(std::size_t i) const
Definition ObjectGuid.h:325
static ObjectGuid const FromStringFailed
Definition ObjectGuid.h:316
std::string ToHexString() const
std::string ToString() const
std::string_view GetTypeName() const
Definition ObjectGuid.h:396
void SetRawValue(std::span< uint8 const > rawBytes)
static ObjectGuid FromString(std::string_view guidString)
static constexpr std::size_t BytesSize
Definition ObjectGuid.h:319
std::array< uint64, 2 > _data
Definition ObjectGuid.h:428
uint32 GetEntry() const
Definition ObjectGuid.h:334
static ObjectGuid const TradeItem
Definition ObjectGuid.h:317
uint32 GetSubType() const
Definition ObjectGuid.h:335
uint64 LowType
Definition ObjectGuid.h:321
uint32 GetRealmId() const
Definition ObjectGuid.h:332
HighGuid GetHigh() const
Definition ObjectGuid.h:331
Definition Pet.h:40
Definition Spell.h:277
std::string StringFormat(FormatString< Args... > fmt, Args &&... args) noexcept
Default TC string format function.
Definition Mail.h:175