27static_assert(
sizeof(
ObjectGuid) ==
sizeof(
uint64) * 2,
"ObjectGuid must be exactly 16 bytes");
39 if (guid.
GetHigh() >= HighGuid::Count)
40 return "Uniq-WOWGUID_TO_STRING_FAILED";
43 if (!ClientFormatFunction[type])
44 return "Uniq-WOWGUID_TO_STRING_FAILED";
46 return (this->*ClientFormatFunction[type])(Names[type].c_str(), guid);
49 ObjectGuid Parse(std::string
const& guidString)
51 std::size_t typeEnd = guidString.find(
'-');
52 if (typeEnd == std::string::npos)
58 if (Names[type].length() < typeEnd)
61 if (guidString.compare(0, typeEnd, Names[type]) == 0)
68 return (this->*ClientParseFunction[type])(
HighGuid(type), &guidString[typeEnd + 1]);
71 std::string FormatNull(
char const*,
ObjectGuid)
73 return "0000000000000000";
81 std::string FormatUniq(
char const* typeName,
ObjectGuid guid)
83 constexpr char const* uniqNames[] =
86 "WOWGUID_UNIQUE_PROBED_DELETE",
87 "WOWGUID_UNIQUE_JAM_TEMP",
88 "WOWGUID_TO_STRING_FAILED",
89 "WOWGUID_FROM_STRING_FAILED",
90 "WOWGUID_UNIQUE_SERVER_SELF",
91 "WOWGUID_UNIQUE_MAGIC_SELF",
92 "WOWGUID_UNIQUE_MAGIC_PET",
93 "WOWGUID_UNIQUE_INVALID_TRANSPORT",
94 "WOWGUID_UNIQUE_AMMO_ID",
95 "WOWGUID_SPELL_TARGET_TRADE_ITEM",
96 "WOWGUID_SCRIPT_TARGET_INVALID",
97 "WOWGUID_SCRIPT_TARGET_NONE",
99 "WOWGUID_FAKE_MODERATOR",
102 "WOWGUID_UNIQUE_ACCOUNT_OBJ_INITIALIZATION",
104 "WOWGUID_PENDING_PERMANENT_CHARACTER_ASSIGNMENT"
108 if (
id >= std::size(uniqNames))
116 constexpr char const* uniqNames[] =
119 "WOWGUID_UNIQUE_PROBED_DELETE",
120 "WOWGUID_UNIQUE_JAM_TEMP",
121 "WOWGUID_TO_STRING_FAILED",
122 "WOWGUID_FROM_STRING_FAILED",
123 "WOWGUID_UNIQUE_SERVER_SELF",
124 "WOWGUID_UNIQUE_MAGIC_SELF",
125 "WOWGUID_UNIQUE_MAGIC_PET",
126 "WOWGUID_UNIQUE_INVALID_TRANSPORT",
127 "WOWGUID_UNIQUE_AMMO_ID",
128 "WOWGUID_SPELL_TARGET_TRADE_ITEM",
129 "WOWGUID_SCRIPT_TARGET_INVALID",
130 "WOWGUID_SCRIPT_TARGET_NONE",
132 "WOWGUID_FAKE_MODERATOR",
135 "WOWGUID_UNIQUE_ACCOUNT_OBJ_INITIALIZATION"
138 for (std::size_t
id = 0;
id < std::size(uniqNames); ++
id)
143 if (strcmp(guidString, uniqNames[
id]) == 0)
150 std::string FormatPlayer(
char const* typeName,
ObjectGuid guid)
160 if (std::sscanf(guidString,
"%u-%08" SCNx64, &realmId, &dbId) != 2)
166 std::string FormatItem(
char const* typeName,
ObjectGuid guid)
177 if (std::sscanf(guidString,
"%u-%u-%016" SCNx64, &realmId, &arg1, &dbId) != 3)
183 std::string FormatWorldObject(
char const* typeName,
ObjectGuid guid)
197 if (std::sscanf(guidString,
"%u-%u-%u-%u-%u-%010" SCNx64, &subType, &realmId, &mapId, &serverId, &
id, &counter) != 6)
203 std::string FormatTransport(
char const* typeName,
ObjectGuid guid)
213 if (std::sscanf(guidString,
"%u-%016" SCNx64, &
id, &counter) != 2)
219 std::string FormatClientActor(
char const* typeName,
ObjectGuid guid)
230 if (std::sscanf(guidString,
"%u-%u-%u", &ownerType, &ownerId, &counter) != 3)
236 std::string FormatChatChannel(
char const* typeName,
ObjectGuid guid)
251 uint32 factionGroupMask = 0;
254 if (std::sscanf(guidString,
"%u-%u-%u-%u-%u-%08" SCNx64, &realmId, &builtIn, &trade, &zoneId, &factionGroupMask, &
id) != 6)
260 std::string FormatGlobal(
char const* typeName,
ObjectGuid guid)
270 if (std::sscanf(guidString,
"%" SCNu64
"-%012" SCNx64, &dbIdHigh, &dbIdLow) != 2)
276 std::string FormatGuild(
char const* typeName,
ObjectGuid guid)
286 if (std::sscanf(guidString,
"%u-%012" SCNx64, &realmId, &dbId) != 2)
292 std::string FormatMobileSession(
char const* typeName,
ObjectGuid guid)
303 if (std::sscanf(guidString,
"%u-%u-%08" SCNx64, &realmId, &arg1, &counter) != 3)
309 std::string FormatWebObj(
char const* typeName,
ObjectGuid guid)
322 if (std::sscanf(guidString,
"%u-%u-%u-%012" SCNx64, &realmId, &arg1, &arg2, &counter) != 4)
328 std::string FormatLFGObject(
char const* typeName,
ObjectGuid guid)
345 if (std::sscanf(guidString,
"%u-%u-%u-%u-%u-%u-%06" SCNx64, &arg1, &arg2, &arg3, &arg4, &arg5, &arg6, &counter) != 7)
351 std::string FormatLFGList(
char const* typeName,
ObjectGuid guid)
361 if (std::sscanf(guidString,
"%u-%06" SCNx64, &arg1, &counter) != 2)
367 std::string FormatClient(
char const* typeName,
ObjectGuid guid)
378 if (std::sscanf(guidString,
"%u-%u-%012" SCNx64, &realmId, &arg1, &counter) != 3)
384 std::string FormatClubFinder(
char const* typeName,
ObjectGuid guid)
399 if (std::sscanf(guidString,
"%u-%n", &type, &consumed) != 1)
409 if (std::sscanf(guidString + consumed,
"%u-%016" SCNx64, &clubFinderId, &dbId) != 2)
413 if (std::sscanf(guidString + consumed,
"%u-%u-%016" SCNx64, &clubFinderId, &realmId, &dbId) != 3)
423 std::string FormatToolsClient(
char const* typeName,
ObjectGuid guid)
433 if (std::sscanf(guidString,
"%u-%u-%010" SCNx64, &mapId, &serverId, &counter) != 3)
439 std::string FormatWorldLayer(
char const* typeName,
ObjectGuid guid)
451 if (std::sscanf(guidString,
"%x-%hu-%hhu-%u", &arg1, &arg2, &arg3, &arg4) != 4)
457 std::string FormatLMMLobby(
char const* typeName,
ObjectGuid guid)
470 if (std::sscanf(guidString,
"%u-%u-%hhu-%hhu-%" SCNx64, &realmId, &arg2, &arg3, &arg4, &arg5) != 5)
479 ObjectGuidInfo::ObjectGuidInfo()
481#define SET_GUID_INFO(type, format, parse) \
482 Names[AsUnderlyingType(HighGuid::type)] = #type;\
483 ClientFormatFunction[AsUnderlyingType(HighGuid::type)] = &ObjectGuidInfo::format;\
484 ClientParseFunction[AsUnderlyingType(HighGuid::type)] = &ObjectGuidInfo::parse
548 if (high >= HighGuid::Count)
551 return Info.Names[
uint32(high)].c_str();
556 return Info.Format(*
this);
566 return Info.Parse(guidString);
571 std::size_t hashVal = 0;
579 std::vector<uint8> raw(16);
580 memcpy(raw.data(),
this,
sizeof(*
this));
586 ASSERT(guid.size() ==
sizeof(*
this));
587 memcpy(
this, guid.data(),
sizeof(*
this));
627 | (
uint64(mapId & 0x1FFF) << 29)
628 | (
uint64(entry & 0x7FFFFF) << 6)
629 | (
uint64(subType) & 0x3F)),
631 | (counter &
UI64LIT(0xFFFFFFFFFF))));
637 | (
uint64(counter) << 38)),
644 | (
uint64(ownerType & 0x1FFF) << 42)
645 | (
uint64(ownerId & 0xFFFFFF) << 26)),
655 | (
uint64(zoneId & 0x3FFF) << 10)
656 | (
uint64(factionGroupMask & 0x3F) << 4)),
678 | (
uint64(arg1 & 0x1FF) << 33)),
686 | (
uint64(arg1 & 0x1F) << 37)
687 | (
uint64(arg2 & 0x3) << 35)),
694 | (
uint64(arg1 & 0xF) << 54)
695 | (
uint64(arg2 & 0xF) << 50)
696 | (
uint64(arg3 & 0xF) << 46)
697 | (
uint64(arg4 & 0xFF) << 38)
698 | (
uint64(arg5 ? 1 : 0) << 37)
699 | (
uint64(arg6 & 0x3) << 35)),
706 | (
uint64(arg1 & 0xF) << 54)),
714 | (
uint64(arg1 & 0xFFFFFFFF) << 10)),
722 | (
uint64(type & 0xFF) << 33)
723 | (
uint64(clubFinderId & 0xFFFFFFFF))),
732 | (counter &
UI64LIT(0xFFFFFFFFFF))));
738 | (
uint64(arg1 & 0xFFFFFFFF) << 10)
739 | (
uint64(arg2 & 0x1FF))),
741 |
uint64(arg4 & 0x7FFFFF)));
748 | (
uint64(arg2 & 0xFFFFFFFF) << 26)
749 | (
uint64(arg3 & 0xFF) << 18)
750 | (
uint64(arg4 & 0xFF) << 10)),
763 std::size_t pos = buf.
wpos();
764 buf <<
uint8(lowMask);
765 buf <<
uint8(highMask);
769 buf.
append(packed, packedSize);
771 buf.
append(packed, packedSize);
773 buf.
put(pos, lowMask);
774 buf.
put(pos + 1, highMask);
781 uint8 lowMask, highMask;
782 buf >> lowMask >> highMask;
793 if (
_high == HighGuid::Creature ||
_high == HighGuid::Vehicle ||
_high == HighGuid::GameObject ||
_high == HighGuid::Transport)
808 sWorld->TriggerGuidAlert();
810 sWorld->TriggerGuidWarning();
#define TC_LOG_ERROR(filterType__,...)
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)
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
static size_t PackUInt64(uint64 value, uint8 *mask, uint8 *result)
void ReadPackedUInt64(uint64 &guid)
void put(std::size_t pos, T value)
static ObjectGuid CreateTransport(HighGuid type, uint32 counter)
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 CreateGuild(HighGuid type, uint32 realmId, uint64 dbId)
static ObjectGuid CreateUniq(uint64 id)
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 ObjectGuid CreatePlayer(uint32 realmId, uint64 dbId)
static ObjectGuid CreateNull()
static ObjectGuid CreateLFGList(uint8 arg1, uint64 counter)
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)
ObjectGuid::LowType _nextGuid
void HandleCounterOverflow()
ObjectGuid::LowType Generate()
LowType GetCounter() const
static ObjectGuid const Empty
static ObjectGuid FromString(std::string const &guidString)
uint64 GetRawValue(std::size_t i) const
static ObjectGuid const FromStringFailed
std::string ToHexString() const
std::size_t GetHash() const
std::string ToString() const
LowType GetMaxCounter() const
void SetRawValue(std::vector< uint8 > const &guid)
std::vector< uint8 > GetRawValue() const
std::array< uint64, 2 > _data
static ObjectGuid const TradeItem
uint32 GetSubType() const
char const * GetTypeName() const
uint32 GetRealmId() const
static void StopNow(uint8 exitcode)
@ CONFIG_RESPAWN_GUIDALERTLEVEL
@ CONFIG_RESPAWN_GUIDWARNLEVEL
void hash_combine(std::size_t &seed, T const &val)
std::string StringFormat(FormatString< Args... > fmt, Args &&... args)
Default TC string format function.
Battlenet::RealmHandle Id