public class GUIDGenerator { private static Dictionary m_keyHolder; public static GUID Create(GUIDType guidType) { if (!m_keyHolder.ContainsKey(guidType)) { m_keyHolder.Add(guidType, 0); } return new GUID(++m_keyHolder[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 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(); } public static GUID GetNew() { return new GUID(0);// do GUIDGenerator magic } }