WoW API: UnitGUID
Returns the GUID of the unit specified. Works on both players and NPC.
UnitGUID("unit")
What does it all mean?
The GUID is a unique hexadecimal string for each unit in the game.
The strings always begin with '0x', which is the normal prefix for hexadecimal numbers. The '0x' prefix isn't actually part of the string, it's just to say "this is a hex string."
Format for players
- The GUID is a simple number in the order characters are created. An older character has a lower number than a new.
It's possible that the first four to six digits are reserved and always has to be '0', which would limit the amount of characters able to be stored, but it's still a very very very high amount of available space. Reserving the first bits and always make them '0' would make it very easy to always identify a character.
Renaming and transfering to another server, or to another account gives your character a new GUID. It's possible that the GUIDs are stored globally, either per datacenter or even per region. It's also possible that there are some reserved bits in there which makes the number higher than it really is.
Restoring a character from backup is untested wether it restores the old GUID or not.
Format for non-pet NPCs
- The first two digits seems to be 'F1' or 'F3'.
- The next digit seems to always be '3'.
- The next three digits are unknown. It's usually '000'.
- The next four digits are the NPC id.
- The last six digits are the spawn counter.
I couldn't find any logic behind why some NPCs are 'F1' and some are 'F3'. From my testing it seems that 'F1' is more common, but there are some places where I found an 'F1' mob right next to an 'F3' mob. If you take the 'NPC id' and convert it to decimal you can check wowhead and see what NPC it is. See examples below.
Format for pets
- The first two digits seem to be 'F1'.
- The next digit is always '4'.
- The next seven digits are unknown.
- The last six digits are the spawn counter.
I haven't found any pet that starts with 'F3', like non-pet NPCs. It's possible that the seven digits that at this point are unknown are split into smaller pieces. The unknown seven digits seem to be some sort of counter, as repeatedly taming beasts with the same npc id will result in marginally higher numbers each subsequent tame. You must log out before the pet gets this GUID, if querried during the same session that you tamed it, your pet will have its pre-taming GUID.
Spawn counter
Spawn counter is a unique number given all non-player mobs. It's a simple incremental number, instances and outside world are probably handled differently. The number in itself is not relevant, but combined with the rest of the string it always give this exact mob a unique identifier.
An example of a GUID
We have a GUID: "0xF530004D2B008852".
From that we know the following: This is a non-pet NPC. It can't be a player because the first two characters are 'F5', players have '00'. The third character is not '3' for NPCs and not '4' for pets.
We can extract the Unit ID by taking the sixth to tenth digit and converting it to decimal form: "4D2B", or converted to decimal form "19755". A quick visit to wowhead shows that the NPC with that id is "Mo'arg Weaponsmith", [1]. All "Mo'arg Weaponsmiths" will have that id to identify them.
The last six digits, "008852" is the spawn counter. There will never be two "Mo'arg Weaponsmith", possible even never two mobs in the outside world, with the same spawn number.
Speculations
The value returned from players is how recent the player have been created. Someone with the number 1000 would be the 1000th created character on the server, a NPC would simply count up. Each NPC that respawns adds a number higher, so 4294967295 means that there have been 4294967294 NPC before that one that have respawned. Renaming does not change the player UnitGUID value so you can track players trough renames using this, unfortunately if you transfer you're character obtains a new GUID, the last value obtainable (as creating a new character). In instances spawned NPC/mobs return the same value, unlike outside a instance. Player pets keep their value when you despawn then spawn them back, so pets appear to have their own GUID counter like character GUID (creation) counter.
Returns
- GUID
- Returns the unit GUID in hexdecimal.
Example
local name = UnitName("target"); local guid = UnitGUID("target"); ChatFrame1:AddMessage(name.." has the GUID: "..guid);
Result
Cyan has the GUID: 0x00000000012729FD
Conversion to decimal?
GUIDs are 64-bit numbers, and are far too long to convert to decimal numbers using lua's libraries as a whole. E.g. running tonumber(guid, 16) will produce erronous results.