public static void HandleActionButtons(Packet packet)
        {
            const int buttonCount = 132;

            for (int i = 0; i < buttonCount; ++i)
            {
                PlayerCreateInfoAction action = new PlayerCreateInfoAction
                {
                    Button = (uint)i
                };

                action.Action = packet.ReadUInt32();
                uint type = packet.ReadUInt32();

                packet.AddValue("Action " + i, action.Action);
                packet.AddValue("Type " + i, type);

                if (type != 0)
                    continue;

                if (CoreParsers.SessionHandler.LoginGuid != null)
                {
                    WoWObject character;
                    if (Storage.Objects.TryGetValue(CoreParsers.SessionHandler.LoginGuid, out character))
                    {
                        Player player = character as Player;
                        if (player != null && player.FirstLogin)
                        {
                            action.Race = player.Race;
                            action.Class = player.Class;
                            Storage.StartActions.Add(action, packet.TimeSpan);
                        }
                    }
                }
            }

            packet.ReadByte("Packet Type");
        }
        public static void HandleActionButtons(Packet packet)
        {
            const int buttonCount = 132;

            var buttons = new byte[buttonCount][];

            for (int i = 0; i < buttonCount; i++)
            {
                buttons[i] = new byte[8];
                buttons[i][7] = packet.ReadBit();
            }

            for (int i = 0; i < buttonCount; i++)
                buttons[i][2] = packet.ReadBit();
            for (int i = 0; i < buttonCount; i++)
                buttons[i][1] = packet.ReadBit();
            for (int i = 0; i < buttonCount; i++)
                buttons[i][6] = packet.ReadBit();
            for (int i = 0; i < buttonCount; i++)
                buttons[i][3] = packet.ReadBit();
            for (int i = 0; i < buttonCount; i++)
                buttons[i][4] = packet.ReadBit();
            for (int i = 0; i < buttonCount; i++)
                buttons[i][5] = packet.ReadBit();
            for (int i = 0; i < buttonCount; i++)
                buttons[i][0] = packet.ReadBit();

            for (int i = 0; i < buttonCount; i++)
                packet.ReadXORByte(buttons[i], 3);
            for (int i = 0; i < buttonCount; i++)
                packet.ReadXORByte(buttons[i], 1);
            for (int i = 0; i < buttonCount; i++)
                packet.ReadXORByte(buttons[i], 4);
            for (int i = 0; i < buttonCount; i++)
                packet.ReadXORByte(buttons[i], 5);
            for (int i = 0; i < buttonCount; i++)
                packet.ReadXORByte(buttons[i], 6);
            for (int i = 0; i < buttonCount; i++)
                packet.ReadXORByte(buttons[i], 2);
            for (int i = 0; i < buttonCount; i++)
                packet.ReadXORByte(buttons[i], 7);
            for (int i = 0; i < buttonCount; i++)
                packet.ReadXORByte(buttons[i], 0);

            packet.ReadByte("Packet Type");

            for (int i = 0; i < buttonCount; i++)
            {
                int actionId = BitConverter.ToInt32(buttons[i], 0);

                if (actionId == 0)
                    continue;

                PlayerCreateInfoAction action = new PlayerCreateInfoAction
                {
                    Button = (uint)i,
                    Action = (uint)actionId,
                    Type = 0 // removed in MoP
                };

                packet.AddValue("Action " + i, action.Action);

                WoWObject character;
                if (Storage.Objects.TryGetValue(CoreParsers.SessionHandler.LoginGuid, out character))
                {
                    Player player = character as Player;
                    if (player != null && player.FirstLogin)
                    {
                        action.Race = player.Race;
                        action.Class = player.Class;
                        Storage.StartActions.Add(action, packet.TimeSpan);
                    }
                }
            }
        }
        public static void HandleInitialButtons(Packet packet)
        {
            if (ClientVersion.AddedInVersion(ClientVersionBuild.V3_1_0_9767) && ClientVersion.RemovedInVersion(ClientVersionBuild.V4_3_4_15595))
            {
                // State = 0: Looks to be sent when initial action buttons get sent, however on Trinity we use 1 since 0 had some difficulties
                // State = 1: Used in any SMSG_UPDATE_ACTION_BUTTONS packet with button data on Trinity. Only used after spec swaps on retail.
                // State = 2: Clears the action bars client sided. This is sent during spec swap before unlearning and before sending the new buttons
                if (packet.ReadByte("Packet Type") == 2)
                    return;
            }

            int buttonCount = ClientVersion.AddedInVersion(ClientVersionBuild.V3_2_0_10192) ? 144 : 132;

            for (int i = 0; i < buttonCount; i++)
            {
                PlayerCreateInfoAction action = new PlayerCreateInfoAction { Button = (uint)i };

                int packed = packet.ReadInt32();

                if (packed == 0)
                    continue;

                action.Action = (uint)(packed & 0x00FFFFFF);
                packet.AddValue("Action", action.Action, i);

                action.Type = (ActionButtonType)((packed & 0xFF000000) >> 24);
                packet.AddValue("Type", action.Type, i);

                WoWObject character;
                if (Storage.Objects.TryGetValue(SessionHandler.LoginGuid, out character))
                {
                    Player player = character as Player;
                    if (player != null && player.FirstLogin)
                    {
                        action.Race = player.Race;
                        action.Class = player.Class;
                        Storage.StartActions.Add(action, packet.TimeSpan);
                    }
                }
            }

            if (ClientVersion.AddedInVersion(ClientVersionBuild.V4_3_4_15595))
                packet.ReadByte("Packet Type");
        }