Показать сообщение отдельно
Старый 01.05.2011, 10:00   #176
LordJZ
Супер-модератор
 
Аватар для LordJZ
 
Регистрация: 07.03.2010
Сообщений: 647
Сказал(а) спасибо: 100
Поблагодарили 252 раз(а) в 123 сообщениях
LordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранитаLordJZ Как самоцвет среди гранита
По умолчанию

Еще одно доказательство дороговизны близзардовской травы: вот как теперь читается и пишется опкод CMSG_PLAYER_LOGIN:
Код:
        private static int[] s_maskSeq = { 3, 4, 6, 2, 1, 7, 0, 5 };
        private static int[] s_byteSeq = { 6, 4, 0, 1, 5, 7, 3, 2 };
        private static int s_byteXor = 1;

        public override void Read(BinaryReader reader)
        {
            byte[] guid = new byte[8];
            BitArray src = new BitArray(new byte[] { reader.ReadByte() });
            BitArray dst = new BitArray(8);

            for (int i = 0; i < 8; ++i)
                dst[s_maskSeq[i]] = src[i];

            for (int i = 0; i < 8; ++i)
            {
                if (dst[s_byteSeq[i]])
                    guid[s_byteSeq[i]] = (byte)(reader.ReadByte() ^ s_byteXor);
            }

            Guid = new WowGuid(BitConverter.ToUInt64(guid, 0));
        }

        public override void Save(BinaryWriter writer)
        {
            byte mask = 0;
            byte[] guid = BitConverter.GetBytes(Guid.Raw);

            for (int i = 0; i < 8; ++i)
            {
                if (guid[s_maskSeq[i]] != 0)
                    mask |= (byte)(1 << i);
            }

            writer.Write((byte)mask);

            for (int i = 0; i < 8; ++i)
            {
                if (guid[s_byteSeq[i]] != 0)
                    writer.Write((byte)(guid[s_byteSeq[i]] ^ s_byteXor));
            }
        }
LordJZ вне форума   Ответить с цитированием