public class GUIDGenerator { private static uint GetFirstAvailableLowGUID(GUIDType guidType) { if (m_unusedLowGuids.ContainsKey(guidType)) { if (m_unusedLowGuids[guidType].Count > 0) { uint low = m_unusedLowGuids[guidType].Dequeue(); return low; } } if (!m_keyHolder.ContainsKey(guidType)) { m_keyHolder.Add(guidType, 0); } return ++m_keyHolder[guidType]; } public static void RemoveGUID(ulong guid, GUIDType guidType) { uint lowGuid = BitConverter.ToUInt32(BitConverter.GetBytes(guid), 0); m_unusedLowGuids[guidType].Enqueue(lowGuid); } private static Dictionary> m_unusedLowGuids; private static Dictionary m_keyHolder; public static GUID Create(GUIDType guidType) { return new GUID(GetFirstAvailableLowGUID(guidType),(uint)guidType); } } public enum GUIDType : uint { Item = 0x40000070, //Container = 0x40000070, Unit = 0xF0001000, Player = 0x00000000, GameObject = 0xF0004000, DynamicObject = 0xF000A000, Corpse = 0xF0007000, PlayerCorpse = 0x80000001, Transport = 0x80000000 } public class GUID { private ulong m_rawGuid; public GUID(ulong rawGuid) { m_rawGuid = rawGuid; } public GUID(uint guidLow, uint guidHigh) { List guidBytes = new List(); guidBytes.AddRange(BitConverter.GetBytes(guidLow)); guidBytes.AddRange(BitConverter.GetBytes(guidHigh)); m_rawGuid = BitConverter.ToUInt64(guidBytes.ToArray(), 0); } public static implicit operator GUID(ulong value) { return new GUID(value); } public static implicit operator ulong(GUID value) { return value.m_rawGuid; } public byte[] GetPacked() { byte[] guidBytes = BitConverter.GetBytes(m_rawGuid); List packedGUID = new List(); packedGUID.Add(0); for (int i = 0; i < 8; i++) { if (guidBytes[i] != 0) { packedGUID[0] |= (byte)(1 << i); packedGUID.Add(guidBytes[i]); } } return packedGUID.ToArray(); } }