Public feed #381371

guidgen

public text v1 · immutable
Raw Edit
·published 2007-03-04 20:24 UTC
rendered paste body
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<GUIDType, Queue<uint>> m_unusedLowGuids;
        private static Dictionary<GUIDType, uint> 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<byte> guidBytes = new List<byte>();
            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<byte> packedGUID = new List<byte>();
            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();
        }
    }