public static void HandleClientCharDelete(Packet packet)
        {
            var playerGuid = new byte[8];

            playerGuid[2] = packet.ReadBit();
            playerGuid[1] = packet.ReadBit();
            playerGuid[5] = packet.ReadBit();
            playerGuid[7] = packet.ReadBit();
            playerGuid[6] = packet.ReadBit();

            var unknown = packet.ReadBit();

            playerGuid[3] = packet.ReadBit();
            playerGuid[0] = packet.ReadBit();
            playerGuid[4] = packet.ReadBit();

            packet.ReadXORByte(playerGuid, 1);
            packet.ReadXORByte(playerGuid, 3);
            packet.ReadXORByte(playerGuid, 4);
            packet.ReadXORByte(playerGuid, 0);
            packet.ReadXORByte(playerGuid, 7);
            packet.ReadXORByte(playerGuid, 2);
            packet.ReadXORByte(playerGuid, 5);
            packet.ReadXORByte(playerGuid, 6);

            var guid = new WowGuid64(BitConverter.ToUInt64(playerGuid, 0));

            packet.WriteGuid("GUID", playerGuid);
        }
示例#2
0
        public void TestConstructor()
        {
            var guid = new WowGuid64(1);

            Assert.IsNotNull(guid);
            Assert.AreEqual(1, guid.Low);
            Assert.AreEqual(0, guid.High);
        }
示例#3
0
        public void TestGetHashCode()
        {
            var guid1  = new WowGuid64(0xF130005C0500105F);
            var guid15 = new WowGuid64(0xF130005C0500105F);
            var guid2  = new WowGuid64(0x600000002B2D7C9);

            Assert.AreEqual(guid1.GetHashCode(), guid15.GetHashCode());
            Assert.AreNotEqual(guid1.GetHashCode(), guid2.GetHashCode());
        }
示例#4
0
        public void TestGetHighType()
        {
            var guid1 = new WowGuid64(0xF130005C0500105F);
            var guid2 = new WowGuid64(0x600000002B2D7C9);
            var guid3 = new WowGuid64(0);

            Assert.AreEqual(HighGuidType.Creature, guid1.GetHighType());
            Assert.AreEqual(HighGuidType.Player, guid2.GetHighType());
            Assert.AreEqual(HighGuidType.Null, guid3.GetHighType());
        }
示例#5
0
        public void TestGetLow()
        {
            var guid1 = new WowGuid64(0xF130005C0500105F);
            var guid2 = new WowGuid64(0x600000002B2D7C9);
            var guid3 = new WowGuid64(0);

            Assert.AreEqual(0x105F, guid1.GetLow());
            Assert.AreEqual(0x2B2D7C9, guid2.GetLow());
            Assert.AreEqual(0, guid3.GetLow());
        }
示例#6
0
        public void TestHasEntry()
        {
            var guid1 = new WowGuid64(0xF130005C0500105F);
            var guid2 = new WowGuid64(0x600000002B2D7C9);
            var guid3 = new WowGuid64(0);

            Assert.IsTrue(guid1.HasEntry());
            Assert.IsFalse(guid2.HasEntry());
            Assert.IsFalse(guid3.HasEntry());
        }
示例#7
0
        public void TestGetObjectType()
        {
            var guid1 = new WowGuid64(0xF130005C0500105F);
            var guid2 = new WowGuid64(0x600000002B2D7C9);
            var guid3 = new WowGuid64(0);

            Assert.AreEqual(ObjectType.Unit, guid1.GetObjectType());
            Assert.AreEqual(ObjectType.Player, guid2.GetObjectType());
            Assert.AreEqual(ObjectType.Object, guid3.GetObjectType());
        }
示例#8
0
        public void TestGetEntry()
        {
            ClientVersion.SetVersion(ClientVersionBuild.V3_3_5a_12340);

            var guid1 = new WowGuid64(0xF130005C0500105F);
            var guid2 = new WowGuid64(0x600000002B2D7C9);
            var guid3 = new WowGuid64(0);

            Assert.AreEqual(0x5C05, guid1.GetEntry());
            Assert.AreEqual(0, guid2.GetEntry());
            Assert.AreEqual(0, guid3.GetEntry());
        }
示例#9
0
        public void TestEquals()
        {
            var guid1  = new WowGuid64(0xF130005C0500105F);
            var guid2  = new WowGuid64(0x600000002B2D7C9);
            var guid25 = new WowGuid64(0x600000002B2D7C9);
            var guid3  = new WowGuid64(0);

            Assert.IsFalse(guid1.Equals(guid2));
            Assert.IsTrue(guid2.Equals(guid25));
            Assert.IsTrue(guid2.Equals((object)guid25));
            Assert.IsFalse(guid2.Equals(new object()));
            Assert.IsTrue(guid3.Equals(guid3));
        }
示例#10
0
 public static UniversalGuid ToUniversal(this WowGuid64 guid)
 {
     return(new UniversalGuid()
     {
         Entry = guid.GetEntry(),
         Type = (UniversalHighGuid)(int)guid.HighGuid.GetHighGuidType(),
         Guid64 = new UniversalGuid64()
         {
             Low = guid.Low,
             High = guid.High
         }
     });
 }
示例#11
0
        public void TestOperators()
        {
            var guid1 = new WowGuid64(0xF130005C0500105F);
            var guid2 = new WowGuid64(0x600000002B2D7C9);
            var guid3 = new WowGuid64(0);

            Assert.IsFalse(guid1 == guid2);
            Assert.IsTrue(guid1 != guid2);

#pragma warning disable 1718
            Assert.IsTrue(guid3 == guid3);
#pragma warning restore 1718
        }
示例#12
0
        public static void HandlePetNameQuery(Packet packet)
        {
            var number = new byte[8];
            var guid   = new byte[8];

            guid[6]   = packet.ReadBit();
            number[4] = packet.ReadBit();
            number[6] = packet.ReadBit();
            number[5] = packet.ReadBit();
            guid[4]   = packet.ReadBit();
            number[7] = packet.ReadBit();
            guid[5]   = packet.ReadBit();
            guid[3]   = packet.ReadBit();
            guid[2]   = packet.ReadBit();
            guid[7]   = packet.ReadBit();
            number[1] = packet.ReadBit();
            number[0] = packet.ReadBit();
            number[2] = packet.ReadBit();
            number[3] = packet.ReadBit();
            guid[1]   = packet.ReadBit();
            guid[0]   = packet.ReadBit();

            packet.ReadXORByte(guid, 7);
            packet.ReadXORByte(number, 2);
            packet.ReadXORByte(guid, 4);
            packet.ReadXORByte(guid, 6);
            packet.ReadXORByte(guid, 5);
            packet.ReadXORByte(number, 5);
            packet.ReadXORByte(guid, 3);
            packet.ReadXORByte(number, 0);
            packet.ReadXORByte(number, 6);
            packet.ReadXORByte(guid, 1);
            packet.ReadXORByte(number, 4);
            packet.ReadXORByte(guid, 0);
            packet.ReadXORByte(number, 7);
            packet.ReadXORByte(number, 1);
            packet.ReadXORByte(guid, 2);
            packet.ReadXORByte(number, 3);

            packet.WriteGuid("Guid2", number);
            packet.WriteGuid("Guid3", guid);

            var GUID   = new WowGuid64(BitConverter.ToUInt64(guid, 0));
            var Number = BitConverter.ToUInt64(number, 0);

            packet.WriteGuid("Guid", guid);
            packet.AddValue("Pet Number", Number);

            // Store temporary name (will be replaced in SMSG_PET_NAME_QUERY_RESPONSE)
            StoreGetters.AddName(GUID, Number.ToString(CultureInfo.InvariantCulture));
        }
示例#13
0
        public void TestOperators()
        {
            var guid1 = new WowGuid64(0xF130005C0500105F);
            var guid2 = new WowGuid64(0x600000002B2D7C9);
            var guid3 = new WowGuid64(0);

            Assert.IsFalse(guid1 == guid2);
            Assert.IsTrue(guid1 != guid2);

#pragma warning disable 1718
            // ReSharper disable once EqualExpressionComparison
            Assert.IsTrue(guid3 == guid3);
#pragma warning restore 1718
        }
示例#14
0
        public static void HandleSpellClick(Packet packet)
        {
            var guidBytes = new byte[8];

            packet.StartBitStream(guidBytes, 7, 4, 0, 3, 6, 5);
            packet.ReadBit("unk");
            packet.StartBitStream(guidBytes, 1, 2);
            packet.ParseBitStream(guidBytes, 6, 1, 5, 4, 7, 2, 3, 0);

            packet.WriteGuid("Guid", guidBytes);

            var guid = new WowGuid64(BitConverter.ToUInt64(guidBytes, 0));

            if (guid.GetObjectType() == ObjectType.Unit)
            {
                Storage.NpcSpellClicks.Add(guid, packet.TimeSpan);
            }
        }
示例#15
0
        public static void HandleClientCharDelete(Packet packet)
        {
            var playerGuid = new byte[8];

            playerGuid[1] = packet.ReadBit();
            playerGuid[4] = packet.ReadBit();
            playerGuid[7] = packet.ReadBit();
            playerGuid[5] = packet.ReadBit();
            playerGuid[3] = packet.ReadBit();
            playerGuid[2] = packet.ReadBit();
            playerGuid[0] = packet.ReadBit();
            playerGuid[6] = packet.ReadBit();

            packet.ParseBitStream(playerGuid, 2, 0, 4, 1, 5, 3, 7, 6);

            var guid = new WowGuid64(BitConverter.ToUInt64(playerGuid, 0));

            packet.WriteGuid("GUID", playerGuid);
        }
示例#16
0
        public static void HandleAuraUpdate(Packet packet)
        {
            var guid      = new byte[8];
            var powerGUID = new byte[8];

            packet.ReadBit(); // fake bit?

            packet.StartBitStream(guid, 6, 1, 0);

            var bits4 = (int)packet.ReadBits(24);

            packet.StartBitStream(guid, 2, 4);

            var hasPowerData = packet.ReadBit();

            var powerCount = 0u;

            if (hasPowerData)
            {
                packet.StartBitStream(powerGUID, 7, 0, 6);
                powerCount = packet.ReadBits(21);
                packet.StartBitStream(powerGUID, 3, 1, 2, 4, 5);
            }

            packet.StartBitStream(guid, 7, 3, 5);

            var hasAura        = new bool[bits4];
            var hasCasterGUID  = new bool[bits4];
            var hasDuration    = new bool[bits4];
            var hasMaxDuration = new bool[bits4];
            var effectCount    = new uint[bits4];
            var casterGUID     = new byte[bits4][];
            var bitsEC         = new uint[bits4];

            for (var i = 0; i < bits4; ++i)
            {
                hasAura[i] = packet.ReadBit();

                if (hasAura[i])
                {
                    hasMaxDuration[i] = packet.ReadBit();
                    effectCount[i]    = packet.ReadBits(22);
                    hasCasterGUID[i]  = packet.ReadBit();
                    if (hasCasterGUID[i])
                    {
                        casterGUID[i] = new byte[8];
                        packet.StartBitStream(casterGUID[i], 3, 0, 2, 6, 5, 7, 4, 1);
                    }

                    hasDuration[i] = packet.ReadBit();
                    bitsEC[i]      = packet.ReadBits(22);
                }
            }

            var auras = new List <Aura>();

            for (var i = 0; i < bits4; ++i)
            {
                if (hasAura[i])
                {
                    var aura = new Aura();

                    aura.Duration = hasDuration[i] ? packet.ReadInt32("Duration", i) : 0;

                    if (hasCasterGUID[i])
                    {
                        packet.ParseBitStream(casterGUID[i], 0, 7, 5, 6, 1, 3, 2, 4);
                        packet.WriteGuid("Caster GUID", casterGUID[i], i);
                        aura.CasterGuid = new WowGuid64(BitConverter.ToUInt64(casterGUID[i], 0));
                    }
                    else
                    {
                        aura.CasterGuid = WowGuid64.Empty;
                    }

                    aura.AuraFlags = packet.ReadByteE <AuraFlagMoP>("Flags", i);

                    for (var j = 0; j < effectCount[i]; ++j)
                    {
                        packet.ReadSingle("Effect Value", i, j);
                    }

                    aura.SpellId = packet.ReadUInt32("Spell Id", i);

                    aura.MaxDuration = hasMaxDuration[i] ? packet.ReadInt32("Max Duration", i) : 0;

                    for (var j = 0; j < bitsEC[i]; ++j)
                    {
                        packet.ReadSingle("FloatEA");
                    }

                    aura.Charges = packet.ReadByte("Charges", i);
                    packet.ReadInt32("Effect Mask", i);
                    aura.Level = packet.ReadUInt16("Caster Level", i);
                    auras.Add(aura);
                    packet.AddSniffData(StoreNameType.Spell, (int)aura.SpellId, "AURA_UPDATE");
                }

                packet.ReadByte("Slot", i);
            }

            if (hasPowerData)
            {
                packet.ReadXORByte(powerGUID, 7);
                packet.ReadXORByte(powerGUID, 4);
                packet.ReadXORByte(powerGUID, 5);
                packet.ReadXORByte(powerGUID, 1);
                packet.ReadXORByte(powerGUID, 6);
                for (var i = 0; i < powerCount; ++i)
                {
                    packet.ReadInt32("Value", i);
                    packet.ReadInt32E <PowerType>("Power type", i); // Actually powertype for class
                }

                packet.ReadInt32("Attack power");
                packet.ReadInt32("Spell power");
                packet.ReadXORByte(powerGUID, 3);
                packet.ReadInt32("Current health");
                packet.ReadXORByte(powerGUID, 0);
                packet.ReadXORByte(powerGUID, 2);
                packet.WriteGuid("Power GUID", powerGUID);
            }

            packet.ParseBitStream(guid, 0, 4, 3, 7, 5, 6, 2, 1);

            packet.WriteGuid("Guid", guid);

            var GUID = new WowGuid64(BitConverter.ToUInt64(guid, 0));

            if (Storage.Objects.ContainsKey(GUID))
            {
                var unit = Storage.Objects[GUID].Item1 as Unit;
                if (unit != null)
                {
                    // If this is the first packet that sends auras
                    // (hopefully at spawn time) add it to the "Auras" field,
                    // if not create another row of auras in AddedAuras
                    // (similar to ChangedUpdateFields)

                    if (unit.Auras == null)
                    {
                        unit.Auras = auras;
                    }
                    else
                    {
                        unit.AddedAuras.Add(auras);
                    }
                }
            }
        }
示例#17
0
        public static void HandleNpcGossip(Packet packet)
        {
            var guidBytes = new byte[8];

            guidBytes[7] = packet.ReadBit();
            guidBytes[6] = packet.ReadBit();
            guidBytes[1] = packet.ReadBit();

            uint questgossips = packet.ReadBits(19);

            guidBytes[0] = packet.ReadBit();
            guidBytes[4] = packet.ReadBit();
            guidBytes[5] = packet.ReadBit();
            guidBytes[2] = packet.ReadBit();
            guidBytes[3] = packet.ReadBit();

            uint amountOfOptions = packet.ReadBits(20);

            var boxTextLen    = new uint[amountOfOptions];
            var optionTextLen = new uint[amountOfOptions];

            for (int i = 0; i < amountOfOptions; ++i)
            {
                boxTextLen[i]    = packet.ReadBits(12);
                optionTextLen[i] = packet.ReadBits(12);
            }

            var titleLen = new uint[questgossips];

            for (int i = 0; i < questgossips; ++i)
            {
                packet.ReadBit("Change Icon", i);
                titleLen[i] = packet.ReadBits(9);
            }

            for (var i = 0; i < questgossips; ++i)
            {
                packet.ReadUInt32E <QuestFlagsEx>("Flags 2", i);
                packet.ReadUInt32 <QuestId>("Quest ID", i);
                packet.ReadInt32("Level", i);
                packet.ReadUInt32("Icon", i);
                packet.ReadUInt32E <QuestFlags>("Flags", i);
                packet.ReadWoWString("Title", titleLen[i], i);
            }

            packet.ReadXORByte(guidBytes, 6);

            var gossipOptions     = new List <GossipMenuOption>((int)amountOfOptions);
            var gossipOptionBoxes = new List <GossipMenuOptionBox>((int)amountOfOptions);

            for (int i = 0; i < amountOfOptions; ++i)
            {
                GossipMenuOption    gossipMenuOption    = new GossipMenuOption();
                GossipMenuOptionBox gossipMenuOptionBox = new GossipMenuOptionBox();

                gossipMenuOptionBox.BoxMoney = packet.ReadUInt32("Required money", i);
                gossipMenuOption.OptionText  = packet.ReadWoWString("Text", optionTextLen[i], i);
                gossipMenuOption.OptionIndex = gossipMenuOptionBox.OptionIndex = packet.ReadUInt32("Index", i);
                gossipMenuOption.OptionIcon  = packet.ReadByteE <GossipOptionIcon>("Icon", i);
                gossipMenuOptionBox.BoxText  = packet.ReadWoWString("Box Text", boxTextLen[i], i);
                gossipMenuOptionBox.BoxCoded = packet.ReadBool("Box", i);

                gossipOptions.Add(gossipMenuOption);
                if (!gossipMenuOptionBox.IsEmpty)
                {
                    gossipOptionBoxes.Add(gossipMenuOptionBox);
                }
            }

            packet.ReadXORByte(guidBytes, 2);

            uint textId = packet.ReadUInt32("Text Id");

            packet.ReadXORByte(guidBytes, 1);
            packet.ReadXORByte(guidBytes, 5);

            uint menuId = packet.ReadUInt32("Menu Id");

            packet.ReadUInt32("Friendship Faction");

            packet.ReadXORByte(guidBytes, 4);
            packet.ReadXORByte(guidBytes, 7);
            packet.ReadXORByte(guidBytes, 3);
            packet.ReadXORByte(guidBytes, 0);

            packet.WriteGuid("Guid", guidBytes);

            GossipMenu gossip = new GossipMenu
            {
                Entry  = menuId,
                TextID = textId
            };

            WowGuid64 guid = new WowGuid64(BitConverter.ToUInt64(guidBytes, 0));

            gossip.ObjectType  = guid.GetObjectType();
            gossip.ObjectEntry = guid.GetEntry();

            if (guid.GetObjectType() == ObjectType.Unit)
            {
                if (Storage.Objects.ContainsKey(guid))
                {
                    ((Unit)Storage.Objects[guid].Item1).GossipId = menuId;
                }
            }

            gossipOptions.ForEach(g =>
            {
                g.MenuId = menuId;
                Storage.GossipMenuOptions.Add(g, packet.TimeSpan);
            });
            gossipOptionBoxes.ForEach(gb =>
            {
                gb.MenuId = menuId;
                Storage.GossipMenuOptionBoxes.Add(gb, packet.TimeSpan);
            });

            Storage.Gossips.Add(gossip, packet.TimeSpan);
            var lastGossipOption = CoreParsers.NpcHandler.LastGossipOption;

            if (lastGossipOption.HasSelection)
            {
                Storage.GossipMenuOptionActions.Add(new GossipMenuOptionAction {
                    MenuId = lastGossipOption.MenuId, OptionIndex = lastGossipOption.OptionIndex, ActionMenuId = gossip.Entry
                }, packet.TimeSpan);
            }

            packet.AddSniffData(StoreNameType.Gossip, (int)menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture));
        }
示例#18
0
        public static void HandleCharEnum(Packet packet)
        {
            packet.ReadBit("Unk bit");

            var unkCounter = packet.ReadBits("Unk Counter", 21);
            var count      = packet.ReadBits("Char count", 16);

            var charGuids   = new byte[count][];
            var guildGuids  = new byte[count][];
            var firstLogins = new bool[count];
            var nameLenghts = new uint[count];

            for (int c = 0; c < count; ++c)
            {
                charGuids[c]  = new byte[8];
                guildGuids[c] = new byte[8];

                guildGuids[c][4] = packet.ReadBit();
                charGuids[c][0]  = packet.ReadBit();
                charGuids[c][3]  = packet.ReadBit();
                charGuids[c][6]  = packet.ReadBit();
                guildGuids[c][1] = packet.ReadBit();
                charGuids[c][1]  = packet.ReadBit();
                guildGuids[c][2] = packet.ReadBit();
                guildGuids[c][3] = packet.ReadBit();
                firstLogins[c]   = packet.ReadBit();
                charGuids[c][2]  = packet.ReadBit();
                guildGuids[c][0] = packet.ReadBit();
                guildGuids[c][7] = packet.ReadBit();
                nameLenghts[c]   = packet.ReadBits(6);
                packet.ReadBit("Unkt Bit");
                guildGuids[c][6] = packet.ReadBit();
                charGuids[c][4]  = packet.ReadBit();
                guildGuids[c][5] = packet.ReadBit();
                charGuids[c][5]  = packet.ReadBit();
                charGuids[c][7]  = packet.ReadBit();
            }

            packet.ResetBitReader();

            for (int c = 0; c < count; ++c)
            {
                var pos = new Vector3();

                packet.ReadByte("Face", c);

                packet.ReadXORByte(guildGuids[c], 7);

                var race = packet.ReadByteE <Race>("Race", c);

                packet.ReadXORByte(charGuids[c], 5);
                packet.ReadXORByte(guildGuids[c], 2);
                packet.ReadXORByte(charGuids[c], 6);

                packet.ReadInt32E <CharacterFlag>("CharacterFlag", c);
                var zone = packet.ReadUInt32 <ZoneId>("Zone Id", c);

                packet.ReadXORByte(guildGuids[c], 3);

                packet.ReadInt32("Pet Level", c);      // v4+112
                packet.ReadInt32("Pet Display ID", c); //v4+108
                packet.ReadUInt32("Unk 1", c);
                packet.ReadUInt32("Unk 2", c);

                packet.ReadXORByte(charGuids[c], 3);
                packet.ReadXORByte(charGuids[c], 0);

                packet.ReadByte("Facial Hair", c);
                packet.ReadByteE <Gender>("Gender", c);

                packet.ReadXORByte(guildGuids[c], 0);

                packet.ReadByte("HairStyle", c);
                var level = packet.ReadByte("Level", c);

                for (int j = 0; j < 23; ++j)
                {
                    packet.ReadInt32("Item DisplayID", c, j);
                    packet.ReadInt32("Item EnchantID", c, j);
                    packet.ReadByteE <InventoryType>("Item InventoryType", c, j);
                }

                pos.Z = packet.ReadSingle();

                packet.ReadXORByte(guildGuids[c], 1);

                pos.Y = packet.ReadSingle();
                packet.ReadByte("Skin", c);
                packet.ReadByte("List Order", c); //v4+57

                packet.ReadXORByte(guildGuids[c], 5);
                packet.ReadXORByte(charGuids[c], 1);

                packet.ReadUInt32("Unk 3", c);
                pos.X = packet.ReadSingle();
                var name  = packet.ReadWoWString("Name", (int)nameLenghts[c], c);
                var mapId = packet.ReadInt32("Map", c);
                packet.ReadInt32("Pet Family", c); // v4+116
                packet.ReadByte("Hair Color", c);
                var klass = packet.ReadByteE <Class>("Class", c);

                packet.ReadXORByte(guildGuids[c], 4);
                packet.ReadXORByte(charGuids[c], 2);

                packet.ReadUInt32E <CustomizationFlag>("CustomizationFlag", c);

                packet.ReadXORByte(charGuids[c], 7);
                packet.ReadXORByte(guildGuids[c], 6);
                packet.ReadXORByte(charGuids[c], 4);

                var playerGuid = new WowGuid64(BitConverter.ToUInt64(charGuids[c], 0));

                packet.AddValue("Position", pos, c);
                packet.WriteGuid("Character GUID", charGuids[c], c);
                packet.WriteGuid("Guild GUID", guildGuids[c], c);

                if (firstLogins[c])
                {
                    PlayerCreateInfo startPos = new PlayerCreateInfo {
                        Race = race, Class = klass, Map = (uint)mapId, Zone = zone, Position = pos, Orientation = 0
                    };
                    Storage.StartPositions.Add(startPos, packet.TimeSpan);
                }

                var playerInfo = new Player {
                    Race = race, Class = klass, Name = name, FirstLogin = firstLogins[c], Level = level
                };
                if (Storage.Objects.ContainsKey(playerGuid))
                {
                    Storage.Objects[playerGuid] = new Tuple <WoWObject, TimeSpan?>(playerInfo, packet.TimeSpan);
                }
                else
                {
                    Storage.Objects.Add(playerGuid, playerInfo, packet.TimeSpan);
                }
                StoreGetters.AddName(playerGuid, name);
            }

            for (var i = 0; i < unkCounter; ++i)
            {
                packet.ReadUInt32("Unk int", i);
                packet.ReadByte("Unk byte", i);
            }
        }
示例#19
0
        public static void HandleVendorInventoryList(Packet packet)
        {
            var npcVendor = new NpcVendor();

            var guid = new byte[8];

            var itemCount = (int)packet.ReadBits(18);

            guid[0] = packet.ReadBit();

            var hasExtendedCost = new bool[itemCount];
            var hasCondition    = new bool[itemCount];

            for (int i = 0; i < itemCount; ++i)
            {
                packet.ReadBit("Unk bit", i);
                hasExtendedCost[i] = !packet.ReadBit();
                hasCondition[i]    = !packet.ReadBit();
            }

            guid[3] = packet.ReadBit();
            guid[7] = packet.ReadBit();
            guid[6] = packet.ReadBit();
            guid[5] = packet.ReadBit();
            guid[2] = packet.ReadBit();
            guid[1] = packet.ReadBit();
            guid[4] = packet.ReadBit();

            packet.ReadXORByte(guid, 7);
            packet.ReadXORByte(guid, 6);

            npcVendor.VendorItems = new List <VendorItem>(itemCount);
            for (int i = 0; i < itemCount; ++i)
            {
                var vendorItem = new VendorItem();

                vendorItem.Type = packet.ReadUInt32("Type", i); // 1 - item, 2 - currency
                var buyCount = packet.ReadUInt32("Buy Count", i);
                var maxCount = packet.ReadInt32("Max Count", i);
                packet.ReadInt32("Display ID", i);
                vendorItem.Slot = packet.ReadUInt32("Item Position", i);
                packet.ReadInt32("Max Durability", i);
                packet.ReadInt32("Price", i);

                if (hasExtendedCost[i])
                {
                    vendorItem.ExtendedCostId = packet.ReadUInt32("Extended Cost", i);
                }

                packet.ReadInt32("Item Upgrade ID", i);
                vendorItem.ItemId = (uint)packet.ReadEntry <Int32>(StoreNameType.Item, "Item ID", i);

                if (hasCondition[i])
                {
                    packet.ReadInt32("Condition ID", i);
                }

                npcVendor.VendorItems.Add(vendorItem);
            }

            packet.ReadByte("Byte28");

            packet.ReadXORByte(guid, 2);
            packet.ReadXORByte(guid, 3);
            packet.ReadXORByte(guid, 5);
            packet.ReadXORByte(guid, 1);
            packet.ReadXORByte(guid, 0);
            packet.ReadXORByte(guid, 4);

            packet.WriteGuid("Guid", guid);

            var vendorGUID = new WowGuid64(BitConverter.ToUInt64(guid, 0));

            Storage.NpcVendors.Add(vendorGUID.GetEntry(), npcVendor, packet.TimeSpan);
        }
示例#20
0
        public static void HandleNpcGossip(Packet packet)
        {
            var gossip = new Gossip();

            var guidBytes = new byte[8];

            guidBytes[7] = packet.ReadBit();
            guidBytes[6] = packet.ReadBit();
            guidBytes[1] = packet.ReadBit();

            var questgossips = packet.ReadBits(19);

            guidBytes[0] = packet.ReadBit();
            guidBytes[4] = packet.ReadBit();
            guidBytes[5] = packet.ReadBit();
            guidBytes[2] = packet.ReadBit();
            guidBytes[3] = packet.ReadBit();

            var amountOfOptions = packet.ReadBits(20);

            var boxTextLen    = new uint[amountOfOptions];
            var optionTextLen = new uint[amountOfOptions];

            for (var i = 0; i < amountOfOptions; ++i)
            {
                boxTextLen[i]    = packet.ReadBits(12);
                optionTextLen[i] = packet.ReadBits(12);
            }

            var titleLen = new uint[questgossips];

            for (var i = 0; i < questgossips; ++i)
            {
                packet.ReadBit("Change Icon", i);
                titleLen[i] = packet.ReadBits(9);
            }

            for (var i = 0; i < questgossips; ++i)
            {
                packet.ReadUInt32E <QuestFlags2>("Flags 2", i);
                packet.ReadUInt32 <QuestId>("Quest ID", i);
                packet.ReadInt32("Level", i);
                packet.ReadUInt32("Icon", i);
                packet.ReadUInt32E <QuestFlags>("Flags", i);
                packet.ReadWoWString("Title", titleLen[i], i);
            }

            packet.ReadXORByte(guidBytes, 6);

            gossip.GossipOptions = new List <GossipOption>((int)amountOfOptions);
            for (var i = 0; i < amountOfOptions; ++i)
            {
                var gossipOption = new GossipOption
                {
                    RequiredMoney = packet.ReadUInt32("Required money", i),
                    OptionText    = packet.ReadWoWString("Text", optionTextLen[i], i),
                    Index         = packet.ReadUInt32("Index", i),
                    OptionIcon    = packet.ReadByteE <GossipOptionIcon>("Icon", i),
                    BoxText       = packet.ReadWoWString("Box Text", boxTextLen[i], i),
                    Box           = packet.ReadBool("Box", i)
                };

                gossip.GossipOptions.Add(gossipOption);
            }

            packet.ReadXORByte(guidBytes, 2);

            var textId = packet.ReadUInt32("Text Id");

            packet.ReadXORByte(guidBytes, 1);
            packet.ReadXORByte(guidBytes, 5);

            var menuId = packet.ReadUInt32("Menu Id");

            packet.ReadUInt32("Friendship Faction");

            packet.ReadXORByte(guidBytes, 4);
            packet.ReadXORByte(guidBytes, 7);
            packet.ReadXORByte(guidBytes, 3);
            packet.ReadXORByte(guidBytes, 0);

            packet.WriteGuid("Guid", guidBytes);

            var guid = new WowGuid64(BitConverter.ToUInt64(guidBytes, 0));

            gossip.ObjectType  = guid.GetObjectType();
            gossip.ObjectEntry = guid.GetEntry();

            if (guid.GetObjectType() == ObjectType.Unit)
            {
                if (Storage.Objects.ContainsKey(guid))
                {
                    ((Unit)Storage.Objects[guid].Item1).GossipId = menuId;
                }
            }

            if (Storage.Gossips.ContainsKey(Tuple.Create(menuId, textId)))
            {
                var oldGossipOptions = Storage.Gossips[Tuple.Create(menuId, textId)];
                if (oldGossipOptions != null)
                {
                    foreach (var gossipOptions in gossip.GossipOptions)
                    {
                        oldGossipOptions.Item1.GossipOptions.Add(gossipOptions);
                    }
                }
            }
            else
            {
                Storage.Gossips.Add(Tuple.Create(menuId, textId), gossip, packet.TimeSpan);
            }

            packet.AddSniffData(StoreNameType.Gossip, (int)menuId, guid.GetEntry().ToString(CultureInfo.InvariantCulture));
        }
示例#21
0
        public static void HandleServerTrainerList(Packet packet)
        {
            var npcTrainer = new NpcTrainer();

            var guid = new byte[8];

            guid[4] = packet.ReadBit();
            guid[5] = packet.ReadBit();
            var count    = (int)packet.ReadBits(19);
            var titleLen = packet.ReadBits(11);

            guid[6] = packet.ReadBit();
            guid[2] = packet.ReadBit();
            guid[7] = packet.ReadBit();
            guid[1] = packet.ReadBit();
            guid[3] = packet.ReadBit();
            guid[0] = packet.ReadBit();

            packet.ReadXORByte(guid, 4);

            npcTrainer.TrainerSpells = new List <TrainerSpell>(count);
            for (var i = 0; i < count; ++i)
            {
                var trainerSpell = new TrainerSpell();
                trainerSpell.RequiredLevel = packet.ReadByte("Required Level", i);
                trainerSpell.Cost          = packet.ReadUInt32("Cost", i);
                trainerSpell.Spell         = (uint)packet.ReadEntry <Int32>(StoreNameType.Spell, "Spell ID", i);
                for (var j = 0; j < 3; ++j)
                {
                    packet.ReadInt32("Int818", i, j);
                }
                trainerSpell.RequiredSkill      = packet.ReadUInt32("Required Skill", i);
                trainerSpell.RequiredSkillLevel = packet.ReadUInt32("Required Skill Level", i);
                packet.ReadEnum <TrainerSpellState>("State", TypeCode.Byte, i);

                npcTrainer.TrainerSpells.Add(trainerSpell);
            }

            npcTrainer.Title = packet.ReadWoWString("Title", titleLen);
            packet.ReadXORByte(guid, 6);
            packet.ReadXORByte(guid, 7);
            packet.ReadXORByte(guid, 1);
            packet.ReadXORByte(guid, 3);
            packet.ReadInt32("Unk Int32"); // Same unk exists in CMSG_TRAINER_BUY_SPELL
            packet.ReadXORByte(guid, 5);
            packet.ReadXORByte(guid, 0);
            packet.ReadXORByte(guid, 2);
            npcTrainer.Type = packet.ReadEnum <TrainerType>("Type", TypeCode.Int32);

            packet.WriteGuid("Guid", guid);
            var GUID = new WowGuid64(BitConverter.ToUInt64(guid, 0));

            if (Storage.NpcTrainers.ContainsKey(GUID.GetEntry()))
            {
                var oldTrainer = Storage.NpcTrainers[GUID.GetEntry()];
                if (oldTrainer != null)
                {
                    foreach (var trainerSpell in npcTrainer.TrainerSpells)
                    {
                        oldTrainer.Item1.TrainerSpells.Add(trainerSpell);
                    }
                }
            }
            else
            {
                Storage.NpcTrainers.Add(GUID.GetEntry(), npcTrainer, packet.TimeSpan);
            }
        }
示例#22
0
        public static void ReadSpellCastData(Packet packet, params object[] idx)
        {
            bool    isSpellGo  = packet.Opcode == Opcodes.GetOpcode(Opcode.SMSG_SPELL_GO, Direction.ServerToClient);
            WowGuid targetGUID = new WowGuid64();

            var casterGUID = packet.ReadPackedGuid("CasterGUID", idx);

            packet.ReadPackedGuid("CasterUnit", idx);
            packet.ReadByte("CastID", idx);
            var      spellId = packet.ReadInt32 <SpellId>("SpellID", idx);
            CastFlag flags   = packet.ReadInt32E <CastFlag>("CastFlags", idx);

            packet.ReadUInt32("CastFlagsEx", idx);
            packet.ReadUInt32("CastTime", idx);

            if (isSpellGo)
            {
                var hitTargetsCount = packet.ReadByte("HitTargetsCount", idx);
                for (var i = 0; i < hitTargetsCount; ++i)
                {
                    packet.ReadGuid("HitTarget", idx, i);
                }

                var missCount = packet.ReadByte("MissStatusCount", idx);
                for (var i = 0; i < missCount; ++i)
                {
                    ReadSpellMissStatus(packet, idx, "MissStatus", i);
                }
            }

            TargetFlag targetFlags = TargetFlag.Self;

            ReadSpellTargetData(packet, ref targetFlags, targetGUID, idx, "Target");

            if (flags.HasAnyFlag(CastFlag.PredictedPower))
            {
                packet.ReadUInt32("RemainingPower");
            }

            if (flags.HasAnyFlag(CastFlag.RuneInfo))
            {
                ReadRuneData(packet, idx, "RemainingRunes");
            }

            if (isSpellGo)
            {
                if (flags.HasAnyFlag(CastFlag.AdjustMissile))
                {
                    ReadMissileTrajectoryResult(packet, idx, "MissileTrajectory");
                }
            }

            if (flags.HasAnyFlag(CastFlag.Projectile))
            {
                ReadSpellAmmo(packet, idx, "Ammo");
            }

            if (isSpellGo)
            {
                if (flags.HasAnyFlag(CastFlag.VisualChain))
                {
                    ReadProjectileVisual(packet, idx, "ProjectileVisual");
                }

                if (targetFlags.HasAnyFlag(TargetFlag.DestinationLocation))
                {
                    packet.ReadByte("DestLocSpellCastIndex", idx);
                }

                if (targetFlags.HasAnyFlag(TargetFlag.ExtraTargets))
                {
                    var targetPointsCount = packet.ReadInt32("TargetPointsCount", idx);
                    for (var i = 0; i < targetPointsCount; ++i)
                    {
                        ReadTargetLocation(packet, idx, "TargetPoints", i);
                    }
                }
            }
            else
            {
                if (flags.HasAnyFlag(CastFlag.Immunity))
                {
                    ReadCreatureImmunities(packet, idx, "Immunities");
                }

                if (flags.HasAnyFlag(CastFlag.HealPrediction))
                {
                    ReadSpellHealPrediction(packet, idx, "Predict");
                }
            }

            if (flags.HasAnyFlag(CastFlag.Unknown21) && !isSpellGo)
            {
                NpcSpellClick spellClick = new NpcSpellClick
                {
                    SpellID    = (uint)spellId,
                    CasterGUID = casterGUID,
                    TargetGUID = targetGUID
                };

                Storage.SpellClicks.Add(spellClick, packet.TimeSpan);
            }

            if (isSpellGo)
            {
                packet.AddSniffData(StoreNameType.Spell, spellId, "SPELL_GO");
            }
        }
示例#23
0
        public static void HandleAuraUpdate(Packet packet)
        {
            var guid = new byte[8];

            guid[3] = packet.ReadBit();
            guid[6] = packet.ReadBit();
            guid[0] = packet.ReadBit();
            guid[7] = packet.ReadBit();
            guid[5] = packet.ReadBit();
            guid[4] = packet.ReadBit();

            var bits0 = packet.ReadBits(24);

            var bit10 = packet.ReadBit();

            var hasAura        = new bool[bits0];
            var hasCasterGUID  = new bool[bits0];
            var hasMaxDuration = new bool[bits0];
            var hasDuration    = new bool[bits0];
            var bits48         = new uint[bits0];
            var casterGUID     = new byte[bits0][];
            var effectCount    = new uint[bits0];

            for (var i = 0; i < bits0; ++i)
            {
                hasAura[i] = packet.ReadBit();

                if (hasAura[i])
                {
                    effectCount[i] = packet.ReadBits(22);
                    bits48[i]      = packet.ReadBits(22);

                    hasCasterGUID[i] = packet.ReadBit();
                    if (hasCasterGUID[i])
                    {
                        casterGUID[i] = new byte[8];
                        packet.StartBitStream(casterGUID[i], 7, 4, 2, 5, 6, 1, 3, 0);
                    }

                    hasMaxDuration[i] = packet.ReadBit();
                    hasDuration[i]    = packet.ReadBit();
                }
            }

            guid[1] = packet.ReadBit();
            guid[2] = packet.ReadBit();

            var auras = new List <Aura>();

            for (var i = 0; i < bits0; ++i)
            {
                if (hasAura[i])
                {
                    var aura = new Aura();
                    if (hasCasterGUID[i])
                    {
                        packet.ParseBitStream(casterGUID[i], 0, 3, 7, 1, 2, 5, 4, 6);
                        packet.WriteGuid("Caster GUID", casterGUID[i], i);
                        aura.CasterGuid = new WowGuid64(BitConverter.ToUInt64(casterGUID[i], 0));
                    }

                    aura.Duration = hasDuration[i] ? packet.ReadInt32("Duration", i) : 0;

                    for (var j = 0; j < bits48[i]; ++j)
                    {
                        packet.ReadSingle("Float3", i, j);
                    }

                    for (var j = 0; j < effectCount[i]; ++j)
                    {
                        packet.ReadSingle("Effect Value", i, j);
                    }

                    aura.Level = packet.ReadUInt16("Caster Level", i);

                    aura.MaxDuration = hasMaxDuration[i] ? packet.ReadInt32("Max Duration", i) : 0;

                    aura.Charges   = packet.ReadByte("Charges", i);
                    aura.SpellId   = packet.ReadUInt32("Spell Id", i);
                    aura.AuraFlags = packet.ReadByteE <AuraFlagMoP>("Flags", i);
                    packet.ReadInt32("Effect Mask", i);

                    auras.Add(aura);
                    packet.AddSniffData(StoreNameType.Spell, (int)aura.SpellId, "AURA_UPDATE");
                }

                packet.ReadByte("Slot", i);
            }

            packet.ParseBitStream(guid, 5, 1, 2, 6, 0, 7, 4, 3);

            packet.WriteGuid("Guid", guid);

            var GUID = new WowGuid64(BitConverter.ToUInt64(guid, 0));

            if (Storage.Objects.ContainsKey(GUID))
            {
                var unit = Storage.Objects[GUID].Item1 as Unit;
                if (unit != null)
                {
                    // If this is the first packet that sends auras
                    // (hopefully at spawn time) add it to the "Auras" field,
                    // if not create another row of auras in AddedAuras
                    // (similar to ChangedUpdateFields)

                    if (unit.Auras == null)
                    {
                        unit.Auras = auras;
                    }
                    else
                    {
                        unit.AddedAuras.Add(auras);
                    }
                }
            }
        }
示例#24
0
        public static void HandleVendorInventoryList(Packet packet)
        {
            var npcVendor = new NpcVendor();

            var guid = new byte[8];

            guid[5] = packet.ReadBit();
            guid[7] = packet.ReadBit();
            guid[1] = packet.ReadBit();
            guid[3] = packet.ReadBit();
            guid[6] = packet.ReadBit();

            var itemCount = packet.ReadBits(18);

            var unkBit          = new uint[itemCount];
            var hasExtendedCost = new bool[itemCount];
            var hasCondition    = new bool[itemCount];

            for (var i = 0; i < itemCount; ++i)
            {
                unkBit[i]          = packet.ReadBit();
                hasExtendedCost[i] = !packet.ReadBit(); // +44
                hasCondition[i]    = !packet.ReadBit(); // +36
            }

            guid[4] = packet.ReadBit();
            guid[0] = packet.ReadBit();
            guid[2] = packet.ReadBit();

            packet.ReadByte("Byte10");

            npcVendor.VendorItems = new List <VendorItem>((int)itemCount);
            for (var i = 0; i < itemCount; ++i)
            {
                var vendorItem = new VendorItem();

                packet.AddValue("unkBit", unkBit[i], i);

                packet.ReadInt32("Max Durability", i);                                                // +16
                packet.ReadInt32("Price", i);                                                         // +20
                vendorItem.Type = packet.ReadUInt32("Type", i);                                       // +4
                var maxCount = packet.ReadInt32("Max Count", i);                                      // +24
                packet.ReadInt32("Display ID", i);                                                    // +12
                var buyCount = packet.ReadUInt32("Buy Count", i);                                     // +28

                vendorItem.ItemId = (uint)packet.ReadEntry <Int32>(StoreNameType.Item, "Item ID", i); // +8

                if (hasExtendedCost[i])
                {
                    vendorItem.ExtendedCostId = packet.ReadUInt32("Extended Cost", i); // +36
                }
                packet.ReadInt32("Item Upgrade ID", i);                                // +32

                if (hasCondition[i])
                {
                    packet.ReadInt32("Condition ID", i);                 // +40
                }
                vendorItem.Slot = packet.ReadUInt32("Item Position", i); // +0

                npcVendor.VendorItems.Add(vendorItem);
            }

            packet.ParseBitStream(guid, 3, 7, 0, 6, 2, 1, 4, 5);

            packet.WriteGuid("Guid", guid);

            var vendorGUID = new WowGuid64(BitConverter.ToUInt64(guid, 0));

            Storage.NpcVendors.Add(vendorGUID.GetEntry(), npcVendor, packet.TimeSpan);
        }
示例#25
0
        public static void HandleCharEnum(Packet packet)
        {
            var count = packet.ReadBits("Char count", 16);

            var charGuids   = new byte[count][];
            var guildGuids  = new byte[count][];
            var firstLogins = new bool[count];
            var nameLenghts = new uint[count];

            for (int c = 0; c < count; ++c)
            {
                charGuids[c]  = new byte[8];
                guildGuids[c] = new byte[8];


                guildGuids[c][3] = packet.ReadBit();
                firstLogins[c]   = packet.ReadBit();
                charGuids[c][6]  = packet.ReadBit();
                guildGuids[c][1] = packet.ReadBit();
                charGuids[c][1]  = packet.ReadBit();
                charGuids[c][5]  = packet.ReadBit();
                guildGuids[c][6] = packet.ReadBit();
                charGuids[c][7]  = packet.ReadBit();
                charGuids[c][0]  = packet.ReadBit();
                guildGuids[c][5] = packet.ReadBit();
                charGuids[c][2]  = packet.ReadBit();
                nameLenghts[c]   = packet.ReadBits(6);
                charGuids[c][4]  = packet.ReadBit();
                guildGuids[c][4] = packet.ReadBit();
                guildGuids[c][2] = packet.ReadBit();
                charGuids[c][3]  = packet.ReadBit();
                guildGuids[c][0] = packet.ReadBit();
                guildGuids[c][7] = packet.ReadBit();
            }

            packet.ReadBit("Unk bit");
            var count2 = packet.ReadBits("RIDBIT21", 21);

            packet.ResetBitReader();

            for (int c = 0; c < count; ++c)
            {
                packet.ReadByte("Skin", c); //v4+61
                packet.ReadXORByte(charGuids[c], 2);
                packet.ReadXORByte(charGuids[c], 7);
                packet.ReadInt32("Pet Display ID", c);                           //v4+108
                var name = packet.ReadWoWString("Name", (int)nameLenghts[c], c); // v4 + 8

                for (int j = 0; j < 23; ++j)
                {
                    packet.ReadInt32("Item DisplayID", c, j);
                    packet.ReadInt32("Item EnchantID", c, j);
                    packet.ReadByteE <InventoryType>("Item InventoryType", c, j);
                }

                packet.ReadXORByte(charGuids[c], 4);
                packet.ReadXORByte(charGuids[c], 6);

                var level = packet.ReadByte("Level", c);        // v4+66
                var y     = packet.ReadSingle("Position Y", c); // v4+80
                var x     = packet.ReadSingle("Position X", c); //v4+76
                packet.ReadByte("Face", c);                     // v4+62
                packet.ReadXORByte(guildGuids[c], 0);
                packet.ReadByte("List Order", c);               //v4+57
                var zone = packet.ReadUInt32 <ZoneId>("Zone Id", c);
                packet.ReadXORByte(guildGuids[c], 7);
                packet.ReadInt32E <CharacterFlag>("CharacterFlag", c);
                var mapId = packet.ReadInt32 <MapId>("Map Id", c); //v4+72
                var race  = packet.ReadByteE <Race>("Race", c);    //v4+58
                var z     = packet.ReadSingle("Position Z", c);    //v4+84
                packet.ReadXORByte(guildGuids[c], 1);
                packet.ReadByteE <Gender>("Gender", c);            //v4+60
                packet.ReadXORByte(charGuids[c], 3);
                packet.ReadByte("Hair Color", c);                  // v4+64
                packet.ReadXORByte(guildGuids[c], 5);
                var clss = packet.ReadByteE <Class>("Class", c);   // v4+59
                packet.ReadXORByte(guildGuids[c], 2);
                packet.ReadXORByte(charGuids[c], 1);
                packet.ReadUInt32E <CustomizationFlag>("CustomizationFlag", c); //v4+100
                packet.ReadByte("Facial Hair", c);                              // v4+65
                packet.ReadXORByte(guildGuids[c], 6);
                packet.ReadXORByte(charGuids[c], 0);
                packet.ReadByte("Hair Style", c);  // v4+63
                packet.ReadXORByte(charGuids[c], 5);
                packet.ReadInt32("Pet Family", c); // v4+116
                packet.ReadXORByte(guildGuids[c], 2);
                packet.ReadInt32("Pet Level", c);  // v4+112
                packet.ReadXORByte(guildGuids[c], 4);

                for (var i = 0; i < count2; ++i)
                {
                    packet.ReadByte("unk2", i);
                    packet.ReadUInt32("unk1", i);
                }

                var playerGuid = new WowGuid64(BitConverter.ToUInt64(charGuids[c], 0));

                packet.WriteGuid("Character GUID", charGuids[c], c);
                packet.WriteGuid("Guild GUID", guildGuids[c], c);

                if (firstLogins[c])
                {
                    var startPos = new StartPosition {
                        Map = (uint)mapId, Position = new Vector3(x, y, z), Zone = zone
                    };

                    Storage.StartPositions.Add(new Tuple <Race, Class>(race, clss), startPos, packet.TimeSpan);
                }

                var playerInfo = new Player {
                    Race = race, Class = clss, Name = name, FirstLogin = firstLogins[c], Level = level
                };
                if (Storage.Objects.ContainsKey(playerGuid))
                {
                    Storage.Objects[playerGuid] = new Tuple <WoWObject, TimeSpan?>(playerInfo, packet.TimeSpan);
                }
                else
                {
                    Storage.Objects.Add(playerGuid, playerInfo, packet.TimeSpan);
                }

                StoreGetters.AddName(playerGuid, name);
            }
        }
示例#26
0
        public static void HandleAuraUpdate(Packet packet)
        {
            var guid  = new byte[8];
            var guid2 = new byte[8];

            guid[1] = packet.ReadBit();
            var hasPowerData = packet.ReadBit();

            uint bits3C = 0;

            if (hasPowerData)
            {
                packet.StartBitStream(guid2, 1, 5, 6);
                bits3C = packet.ReadBits(21);
                packet.StartBitStream(guid2, 2, 3, 7, 0, 4);
            }

            var bits4 = packet.ReadBits(24);

            guid[6] = packet.ReadBit();

            var hasAura        = new bool[bits4];
            var hasCasterGUID  = new bool[bits4];
            var hasDuration    = new bool[bits4];
            var hasMaxDuration = new bool[bits4];
            var effectCount    = new uint[bits4];
            var casterGUID     = new byte[bits4][];

            for (var i = 0; i < bits4; ++i)
            {
                hasAura[i] = packet.ReadBit();
                if (hasAura[i])
                {
                    hasMaxDuration[i] = packet.ReadBit();
                    effectCount[i]    = packet.ReadBits(22);
                    hasCasterGUID[i]  = packet.ReadBit();
                    if (hasCasterGUID[i])
                    {
                        casterGUID[i] = new byte[8];
                        packet.StartBitStream(casterGUID[i], 5, 7, 4, 1, 6, 0, 3, 2);
                    }
                    hasDuration[i] = packet.ReadBit();
                }
            }
            packet.StartBitStream(guid, 2, 3, 7, 4);
            packet.ReadBit("Is AURA_UPDATE_ALL");
            packet.StartBitStream(guid, 0, 5);
            packet.ResetBitReader();

            var auras = new List <Aura>();

            for (var i = 0; i < bits4; ++i)
            {
                if (hasAura[i])
                {
                    var aura = new Aura();
                    if (hasCasterGUID[i])
                    {
                        packet.ParseBitStream(casterGUID[i], 2, 7, 6, 1, 4, 0, 5, 3);
                        packet.WriteGuid("Caster GUID", casterGUID[i], i);
                        aura.CasterGuid = new WowGuid64(BitConverter.ToUInt64(casterGUID[i], 0));
                    }
                    else
                    {
                        aura.CasterGuid = new WowGuid64();
                    }

                    aura.Charges = packet.ReadByte("Charges", i);

                    if (hasDuration[i])
                    {
                        aura.Duration = packet.ReadInt32("Duration", i);
                    }
                    else
                    {
                        aura.Duration = 0;
                    }

                    aura.SpellId   = packet.ReadUInt32("Spell Id", i);
                    aura.AuraFlags = packet.ReadEnum <AuraFlagMoP>("Flags", TypeCode.Byte, i);

                    for (var j = 0; j < effectCount[i]; ++j)
                    {
                        packet.ReadSingle("Effect Value", i, j);
                    }
                    packet.ReadInt32("Effect Mask", i);

                    if (hasMaxDuration[i])
                    {
                        aura.MaxDuration = packet.ReadInt32("Max Duration", i);
                    }
                    else
                    {
                        aura.MaxDuration = 0;
                    }

                    aura.Level = packet.ReadUInt16("Caster Level", i);
                    auras.Add(aura);
                    packet.AddSniffData(StoreNameType.Spell, (int)aura.SpellId, "AURA_UPDATE");
                }
                packet.ReadByte("Slot", i);
            }

            if (hasPowerData)
            {
                packet.ReadXORBytes(guid2, 7, 0);
                for (var i = 0; i < bits3C; ++i)
                {
                    packet.ReadEnum <PowerType>("Power Type", TypeCode.UInt32, i);
                    packet.ReadInt32("Power Value", i);
                }
                packet.ReadXORBytes(guid2, 2, 5);
                packet.ReadInt32("Attack power");
                packet.ReadInt32("Spell power");
                packet.ReadXORBytes(guid2, 6, 4, 3, 1);
                packet.ReadInt32("Current Health");
                packet.WriteGuid("PowerUnitGUID", guid2);
            }
            packet.ParseBitStream(guid, 0, 5, 7, 2, 1, 4, 3, 6);
            packet.WriteGuid("Guid", guid);

            var GUID = new WowGuid64(BitConverter.ToUInt64(guid, 0));

            if (Storage.Objects.ContainsKey(GUID))
            {
                var unit = Storage.Objects[GUID].Item1 as Unit;
                if (unit != null)
                {
                    // If this is the first packet that sends auras
                    // (hopefully at spawn time) add it to the "Auras" field,
                    // if not create another row of auras in AddedAuras
                    // (similar to ChangedUpdateFields)

                    if (unit.Auras == null)
                    {
                        unit.Auras = auras;
                    }
                    else
                    {
                        unit.AddedAuras.Add(auras);
                    }
                }
            }
        }