Code:
// Look https://github.com/TrinityCore/TrinityCore/blob/c674a3a18843c79b133600667f0b2bfc4c3d6594/src/server/game/Entities/Object/ObjectGuid.h#L79
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SmartGuid
{
public ulong Low;
public ulong High;
public GuidType Type
{
get { return (GuidType)(High >> 58); }
set { High |= (ulong)value << 58; }
}
public int SubType
{
get { return (int)(Low >> 56); }
set { Low |= (ulong)value << 56; }
}
public ushort RealmId
{
get { return (ushort)((High >> 42) & 0x1FFF); }
set { High |= (ulong)value << 42; }
}
public ushort ServerId
{
get { return (ushort)((Low >> 40) & 0x1FFF); }
set { Low |= (ulong)value << 40; }
}
public ushort MapId
{
get { return (ushort)((High >> 29) & 0x1FFF); }
set { High |= (ulong)value << 29; }
}
public uint Id
{
get { return (uint)(High & 0xFFFFFF) >> 6; }
set { High |= (ulong)value << 6; }
}
public ulong CreationBits
{
get { return Low & 0xFFFFFFFFFF; }
set { Low |= value; }
}
public override string ToString()
{
if (Type == GuidType.Player)
return $"{Type}-{RealmId}-{CreationBits:X8}";
return $"{High:X16}{Low:X16}";
}
}
public enum GuidType
{
None = 0,
Uniq = 1,
Player = 2,
Item = 3,
WorldTransaction = 4,
StaticDoor = 5,
Transport = 6,
Conversation = 7,
Creature = 8,
Vehicle = 9,
Pet = 10,
GameObject = 11,
DynamicObject = 12,
AreaTrigger = 13,
Corpse = 14,
LootObject = 15,
SceneObject = 16,
Scenario = 17,
AIGroup = 18,
DynamicDoor = 19,
ClientActor = 20,
Vignette = 21,
CallForHelp = 22,
AIResource = 23,
AILock = 24,
AILockTicket = 25,
ChatChannel = 26,
Party = 27,
Guild = 28,
WowAccount = 29,
BNetAccount = 30,
GMTask = 31,
MobileSession = 32,
RaidGroup = 33,
Spell = 34,
Mail = 35,
WebObj = 36,
LFGObject = 37,
LFGList = 38,
UserRouter = 39,
PVPQueueGroup = 40,
UserClient = 41,
PetBattle = 42,
UniqUserClient = 43,
BattlePet = 44,
CommerceObj = 45,
ClientSession = 46,
Cast = 47,
}