コード例 #1
0
        static void svc_serverinfo(BitBuffer bb, TreeNode node)
        {
            short version = (short)bb.ReadBits(16);

            node.Nodes.Add("Version: " + version);
            node.Nodes.Add("Server count: " + (int)bb.ReadBits(32));
            node.Nodes.Add("SourceTV: " + bb.ReadBool());
            node.Nodes.Add("Dedicated: " + bb.ReadBool());
            node.Nodes.Add("Server client CRC: 0x" + bb.ReadBits(32).ToString("X8"));
            node.Nodes.Add("Max classes: " + bb.ReadBits(16));
            if (version < 18)
            {
                node.Nodes.Add("Server map CRC: 0x" + bb.ReadBits(32).ToString("X8"));
            }
            else
            {
                bb.Seek(128); // TODO: display out map md5 hash
            }
            node.Nodes.Add("Current player count: " + bb.ReadBits(8));
            node.Nodes.Add("Max player count: " + bb.ReadBits(8));
            node.Nodes.Add("Interval per tick: " + bb.ReadFloat());
            node.Nodes.Add("Platform: " + (char)bb.ReadBits(8));
            node.Nodes.Add("Game directory: " + bb.ReadString());
            node.Nodes.Add("Map name: " + bb.ReadString());
            node.Nodes.Add("Skybox name: " + bb.ReadString());
            node.Nodes.Add("Hostname: " + bb.ReadString());
            node.Nodes.Add("Has replay: " + bb.ReadBool()); // ???: protocol version
        }
コード例 #2
0
ファイル: DataTables.cs プロジェクト: arispoloway/netdecode
        static void ParseTables(BitBuffer bb, TreeNode node)
        {
            while (bb.ReadBool())
            {
                bool needsdecoder = bb.ReadBool();
                var dtnode = node.Nodes.Add(bb.ReadString());
                if (needsdecoder) dtnode.Text += "*";

                var numprops = bb.ReadBits(10);
                dtnode.Text += " (" + numprops + " props)";

                for (int i = 0; i < numprops; i++)
                {
                    var type = (SendPropType)bb.ReadBits(5);
                    var propnode = dtnode.Nodes.Add("DPT_" + type + " " + bb.ReadString());
                    var flags = (SendPropFlags)bb.ReadBits(16);

                    if (type == SendPropType.DataTable || (flags & SendPropFlags.EXCLUDE) != 0)
                        propnode.Text += " : " + bb.ReadString();
                    else
                    {
                        if (type == SendPropType.Array)
                            propnode.Text += "[" + bb.ReadBits(10) + "]";
                        else
                        {
                            bb.Seek(64);
                            propnode.Text += " (" + bb.ReadBits(7) + " bits)";
                        }
                    }
                }
            }
        }
コード例 #3
0
 static void svc_bspdecal(BitBuffer bb, TreeNode node)
 {
     node.Nodes.Add("Position: " + bb.ReadVecCoord());
     node.Nodes.Add("Decal texture index: " + bb.ReadBits(9));
     if (bb.ReadBool())
     {
         node.Nodes.Add("Entity index: " + bb.ReadBits(11));
         node.Nodes.Add("Model index: " + bb.ReadBits(12));
     }
     node.Nodes.Add("Low priority: " + bb.ReadBool());
 }
コード例 #4
0
ファイル: DemoFile.cs プロジェクト: stgn/netdecode
 /*
 static string ParseButtons(uint buttons)
 {
     string res = "(none)";
     // TODO: IMPLEMENT
     return res;
 }
 */
 public static void ParseIntoTreeNode(byte[] data, TreeNode node)
 {
     var bb = new BitBuffer(data);
     if (bb.ReadBool()) node.Nodes.Add("Command number: " + bb.ReadBits(32));
     if (bb.ReadBool()) node.Nodes.Add("Tick count: " + bb.ReadBits(32));
     if (bb.ReadBool()) node.Nodes.Add("Viewangle pitch: " + bb.ReadFloat());
     if (bb.ReadBool()) node.Nodes.Add("Viewangle yaw: " + bb.ReadFloat());
     if (bb.ReadBool()) node.Nodes.Add("Viewangle roll: " + bb.ReadFloat());
     if (bb.ReadBool()) node.Nodes.Add("Foward move: " + bb.ReadFloat());
     if (bb.ReadBool()) node.Nodes.Add("Side move: " + bb.ReadFloat());
     if (bb.ReadBool()) node.Nodes.Add("Up move: " + bb.ReadFloat().ToString());
     if (bb.ReadBool()) node.Nodes.Add("Buttons: 0x" + bb.ReadBits(32).ToString("X8"));
     if (bb.ReadBool()) node.Nodes.Add("Impulse: " + bb.ReadBits(8));
     // TODO: weaponselect/weaponsubtype, mousedx/dy
 }
コード例 #5
0
ファイル: DemoFile.cs プロジェクト: kote2ster/VolvoWrench
/*
 *      static string ParseButtons(uint buttons)
 *      {
 *          string res = "(none)";
 *          // TODO: IMPLEMENT
 *          return res;
 *      }
 */

        public static void ParseIntoTreeNode(byte[] data, TreeNode node)
        {
            var bb = new BitBuffer(data);

            if (bb.ReadBool())
            {
                node.Nodes.Add("Command number: " + bb.ReadBits(32));
            }
            if (bb.ReadBool())
            {
                node.Nodes.Add("Tick count: " + bb.ReadBits(32));
            }
            if (bb.ReadBool())
            {
                node.Nodes.Add("Viewangle pitch: " + bb.ReadFloat());
            }
            if (bb.ReadBool())
            {
                node.Nodes.Add("Viewangle yaw: " + bb.ReadFloat());
            }
            if (bb.ReadBool())
            {
                node.Nodes.Add("Viewangle roll: " + bb.ReadFloat());
            }
            if (bb.ReadBool())
            {
                node.Nodes.Add("Foward move: " + bb.ReadFloat());
            }
            if (bb.ReadBool())
            {
                node.Nodes.Add("Side move: " + bb.ReadFloat());
            }
            if (bb.ReadBool())
            {
                node.Nodes.Add("Up move: " + bb.ReadFloat().ToString());
            }
            if (bb.ReadBool())
            {
                node.Nodes.Add("Buttons: 0x" + bb.ReadBits(32).ToString("X8"));
            }
            if (bb.ReadBool())
            {
                node.Nodes.Add("Impulse: " + bb.ReadBits(8));
            }
            // TODO: weaponselect/weaponsubtype, mousedx/dy
        }
コード例 #6
0
        static void svc_sendtable(BitBuffer bb, TreeNode node)
        {
            node.Nodes.Add("Needs decoder: " + bb.ReadBool());
            var n = bb.ReadBits(16);

            node.Nodes.Add("Length in bits: " + n);
            bb.Seek(n);
        }
コード例 #7
0
        static void svc_updatestringtable(BitBuffer bb, TreeNode node)
        {
            node.Nodes.Add("Table ID: " + bb.ReadBits(5));
            node.Nodes.Add("Changed entries: " + (bb.ReadBool() ? bb.ReadBits(16) : 1));
            var b = bb.ReadBits(20);

            node.Nodes.Add("Length in bits: " + b);
            bb.Seek(b);
        }
コード例 #8
0
        static void svc_packetentities(BitBuffer bb, TreeNode node)
        {
            node.Nodes.Add("Max entries: " + bb.ReadBits(11));
            bool d = bb.ReadBool();

            node.Nodes.Add("Is delta: " + d);
            if (d)
            {
                node.Nodes.Add("Delta from: " + bb.ReadBits(32));
            }
            node.Nodes.Add("Baseline: " + bb.ReadBool());
            node.Nodes.Add("Updated entries: " + bb.ReadBits(11));
            var b = bb.ReadBits(20);

            node.Nodes.Add("Length in bits: " + b);
            node.Nodes.Add("Update baseline: " + bb.ReadBool());
            bb.Seek(b);
        }
コード例 #9
0
ファイル: TF2UserMessages.cs プロジェクト: tritao/netdecode
        void HandleSayText(BitBuffer bb, TreeNode node, uint lengthBits)
        {
            var client = bb.ReadBits(8);
            var msg = bb.ReadString();
            var unk1 = bb.ReadBits(7);
            var unk2 = bb.ReadBool();

            AddItem("SayText", msg);
            node.Nodes.Add("Text: " + msg);
        }
コード例 #10
0
        static void svc_sounds(BitBuffer bb, TreeNode node)
        {
            var r = bb.ReadBool();

            node.Nodes.Add("Reliable: " + r);
            node.Nodes.Add("Number of sounds: " + (r ? 1 : bb.ReadBits(8)));
            uint b = r ? bb.ReadBits(8) : bb.ReadBits(16);

            node.Nodes.Add("Length in bits: " + b);
            bb.Seek(b);
        }
コード例 #11
0
ファイル: DataTables.cs プロジェクト: kote2ster/VolvoWrench
        static void ParseTables(BitBuffer bb, TreeNode node)
        {
            while (bb.ReadBool())
            {
                bool needsdecoder = bb.ReadBool();
                var  dtnode       = node.Nodes.Add(bb.ReadString());
                if (needsdecoder)
                {
                    dtnode.Text += "*";
                }

                var numprops = bb.ReadBits(10);
                dtnode.Text += " (" + numprops + " props)";

                for (int i = 0; i < numprops; i++)
                {
                    var type     = (SendPropType)bb.ReadBits(5);
                    var propnode = dtnode.Nodes.Add("DPT_" + type + " " + bb.ReadString());
                    var flags    = (SendPropFlags)bb.ReadBits(16);

                    if (type == SendPropType.DataTable || (flags & SendPropFlags.EXCLUDE) != 0)
                    {
                        propnode.Text += " : " + bb.ReadString();
                    }
                    else
                    {
                        if (type == SendPropType.Array)
                        {
                            propnode.Text += "[" + bb.ReadBits(10) + "]";
                        }
                        else
                        {
                            bb.Seek(64);
                            propnode.Text += " (" + bb.ReadBits(7) + " bits)";
                        }
                    }
                }
            }
        }
コード例 #12
0
        static void svc_createstringtable(BitBuffer bb, TreeNode node)
        {
            node.Nodes.Add("Table name: " + bb.ReadString());
            var m = bb.ReadBits(16);

            node.Nodes.Add("Max entries: " + m);
            node.Nodes.Add("Number of entries: " + bb.ReadBits((uint)Math.Log(m, 2) + 1));
            var n = bb.ReadBits(20);

            node.Nodes.Add("Length in bits: " + n);
            var f = bb.ReadBool();

            node.Nodes.Add("Userdata fixed size: " + f);
            if (f)
            {
                node.Nodes.Add("Userdata size: " + bb.ReadBits(12));
                node.Nodes.Add("Userdata bits: " + bb.ReadBits(4));
            }

            // ???: this is not in Source 2007 netmessages.h/cpp it seems. protocol version?
            node.Nodes.Add("Compressed: " + bb.ReadBool());
            bb.Seek(n);
        }
コード例 #13
0
        static void svc_classinfo(BitBuffer bb, TreeNode node)
        {
            var n = bb.ReadBits(16);

            node.Nodes.Add("Number of server classes: " + n);
            var cc = bb.ReadBool();

            node.Nodes.Add("Create classes on client: " + cc);
            if (!cc)
            {
                while (n-- > 0)
                {
                    node.Nodes.Add("Class ID: " + bb.ReadBits((uint)Math.Log(n, 2) + 1));
                    node.Nodes.Add("Class name: " + bb.ReadString());
                    node.Nodes.Add("Datatable name: " + bb.ReadString());
                }
            }
        }
コード例 #14
0
ファイル: Packet.cs プロジェクト: arispoloway/netdecode
 static void svc_sounds(BitBuffer bb, TreeNode node)
 {
     var r = bb.ReadBool();
     node.Nodes.Add("Reliable: " + r);
     node.Nodes.Add("Number of sounds: " + (r ? 1 : bb.ReadBits(8)));
     uint b = r ? bb.ReadBits(8) : bb.ReadBits(16);
     node.Nodes.Add("Length in bits: " + b);
     bb.Seek(b);
 }
コード例 #15
0
ファイル: Packet.cs プロジェクト: arispoloway/netdecode
 static void svc_updatestringtable(BitBuffer bb, TreeNode node)
 {
     node.Nodes.Add("Table ID: " + bb.ReadBits(5));
     node.Nodes.Add("Changed entries: " + (bb.ReadBool() ? bb.ReadBits(16) : 1));
     var b = bb.ReadBits(20);
     node.Nodes.Add("Length in bits: " + b);
     bb.Seek(b);
 }
コード例 #16
0
ファイル: Packet.cs プロジェクト: arispoloway/netdecode
        static void svc_createstringtable(BitBuffer bb, TreeNode node)
        {
            node.Nodes.Add("Table name: " + bb.ReadString());
            var m = bb.ReadBits(16);
            node.Nodes.Add("Max entries: " + m);
            node.Nodes.Add("Number of entries: " + bb.ReadBits((uint)Math.Log(m, 2) + 1));
            var n = bb.ReadBits(20);
            node.Nodes.Add("Length in bits: " + n);
            var f = bb.ReadBool();
            node.Nodes.Add("Userdata fixed size: " + f);
            if (f)
            {
                node.Nodes.Add("Userdata size: " + bb.ReadBits(12));
                node.Nodes.Add("Userdata bits: " + bb.ReadBits(4));
            }

            // ???: this is not in Source 2007 netmessages.h/cpp it seems. protocol version?
            node.Nodes.Add("Compressed: " + bb.ReadBool());
            bb.Seek(n);
        }
コード例 #17
0
ファイル: Packet.cs プロジェクト: arispoloway/netdecode
 static void svc_setpause(BitBuffer bb, TreeNode node)
 {
     node.Nodes.Add(bb.ReadBool().ToString());
 }
コード例 #18
0
ファイル: Packet.cs プロジェクト: arispoloway/netdecode
 static void svc_classinfo(BitBuffer bb, TreeNode node)
 {
     var n = bb.ReadBits(16);
     node.Nodes.Add("Number of server classes: " + n);
     var cc = bb.ReadBool();
     node.Nodes.Add("Create classes on client: " + cc);
     if (!cc)
         while (n-- > 0)
         {
             node.Nodes.Add("Class ID: " + bb.ReadBits((uint)Math.Log(n, 2) + 1));
             node.Nodes.Add("Class name: " + bb.ReadString());
             node.Nodes.Add("Datatable name: " + bb.ReadString());
         }
 }
コード例 #19
0
ファイル: Packet.cs プロジェクト: arispoloway/netdecode
 static void svc_sendtable(BitBuffer bb, TreeNode node)
 {
     node.Nodes.Add("Needs decoder: " + bb.ReadBool());
     var n = bb.ReadBits(16);
     node.Nodes.Add("Length in bits: " + n);
     bb.Seek(n);
 }
コード例 #20
0
ファイル: Packet.cs プロジェクト: arispoloway/netdecode
 static void svc_serverinfo(BitBuffer bb, TreeNode node)
 {
     short version = (short)bb.ReadBits(16);
     node.Nodes.Add("Version: " + version);
     node.Nodes.Add("Server count: " + (int)bb.ReadBits(32));
     node.Nodes.Add("SourceTV: " + bb.ReadBool());
     node.Nodes.Add("Dedicated: " + bb.ReadBool());
     node.Nodes.Add("Server client CRC: 0x" + bb.ReadBits(32).ToString("X8"));
     node.Nodes.Add("Max classes: " + bb.ReadBits(16));
     if (version < 18)
         node.Nodes.Add("Server map CRC: 0x" + bb.ReadBits(32).ToString("X8"));
     else
         bb.Seek(128); // TODO: display out map md5 hash
     node.Nodes.Add("Current player count: " + bb.ReadBits(8));
     node.Nodes.Add("Max player count: " + bb.ReadBits(8));
     node.Nodes.Add("Interval per tick: " + bb.ReadFloat());
     node.Nodes.Add("Platform: " + (char)bb.ReadBits(8));
     node.Nodes.Add("Game directory: " + bb.ReadString());
     node.Nodes.Add("Map name: " + bb.ReadString());
     node.Nodes.Add("Skybox name: " + bb.ReadString());
     node.Nodes.Add("Hostname: " + bb.ReadString());
     node.Nodes.Add("Has replay: " + bb.ReadBool()); // ???: protocol version
 }
コード例 #21
0
ファイル: Packet.cs プロジェクト: tritao/netdecode
        static void svc_createstringtable(BitBuffer bb, TreeNode node)
        {
            var tableName = bb.ReadString();
            node.Nodes.Add("Table name: " + tableName);

            var maxEntries = bb.ReadBits(16);
            node.Nodes.Add("Max entries: " + maxEntries);

            var numEntryBits = (uint)Math.Log(maxEntries, 2);
            var numEntries = bb.ReadBits(numEntryBits + 1);
            node.Nodes.Add("Number of entries: " + numEntries);

            var lengthBits = bb.ReadBits(20);
            node.Nodes.Add("Length in bits: " + lengthBits);

            var hasUserData = bb.ReadBool();
            node.Nodes.Add("Userdata fixed size: " + hasUserData);

            if (hasUserData)
            {
                node.Nodes.Add("Userdata size: " + bb.ReadBits(12));
                node.Nodes.Add("Userdata bits: " + bb.ReadBits(4));
            }

            bool isCompressed = bb.ReadBool();
            node.Nodes.Add("Compressed: " + isCompressed);

            var endBit = bb._pos + lengthBits;

            if (isCompressed)
            {
                var table = new List<string>();
                for (uint e = 0; e < numEntries; ++e)
                {
                    uint originalLength = bb.ReadBits(32);
                    uint compressedLength = bb.ReadBits(32);

                    // struct lzss_header_t
                    // {
                    //     unsigned int id;
                    //     unsigned int actualSize; // always little endian
                    // };

                    var id = bb.ReadBits(32);
                    Debug.Assert(id == (('S' << 24) | ('S' << 16) | ('Z' << 8) | ('L')));

                    var actualSize = bb.ReadBits(32);

                    var compressedData = new List<byte>();
                    for (uint i = 0; i < compressedLength; ++i)
                    {
                        compressedData.Add((byte)bb.ReadBits(8));
                    }

                    //File.WriteAllBytes(e + "_c.dmp", compressedData.ToArray());

                    var decompressedData = LZSS.Decompress(compressedData.ToArray(), actualSize);
                    Debug.Assert(decompressedData.Length == actualSize);

                    //File.WriteAllBytes(e + "_u.dmp", decompressedData);

                    var dbb = new BitBuffer(decompressedData);

                    //var hasIndex = dbb.ReadBool();
                    //if (!hasIndex)
                    //{
                    //    var entryIndex = dbb.ReadBits(numEntryBits);
                    //}

                    //var substringCheck = bb.ReadBool();

                    //if (substringCheck)
                    //{

                    //}
                    //else
                    //{
                    //    var str = bb.ReadString();
                    //    table.Add(str);
                    //}

                    //var text = bb.ReadString();
                    bb.Seek(120);
                }
            }

            bb.Seek(lengthBits);
        }
コード例 #22
0
ファイル: TF2UserMessages.cs プロジェクト: tritao/netdecode
        void teamplay_round_start(BitBuffer bb, TreeNode node, uint lengthBits)
        {
            var fullRestart = bb.ReadBool();
            node.Nodes.Add("Full Restart: " + fullRestart);

            //Console.WriteLine("[teamplay_round_start] full restart {0}", fullRestart);
        }
コード例 #23
0
 static void svc_setpause(BitBuffer bb, TreeNode node)
 {
     node.Nodes.Add(bb.ReadBool().ToString());
 }
コード例 #24
0
ファイル: TF2UserMessages.cs プロジェクト: tritao/netdecode
        void player_death(BitBuffer bb, TreeNode node, uint lengthBits)
        {
            long endBit = bb._pos + lengthBits;

            var userid = bb.ReadBits(16);
            var victim_entindex = bb.ReadBits(32);
            var inflictor_entindex = bb.ReadBits(32);
            var attacker = bb.ReadBits(16);
            var weapon = bb.ReadString();
            var weaponid = bb.ReadBits(16);
            var damagebits = bb.ReadBits(32);
            var customkill = bb.ReadBits(16);
            var assister = (short)bb.ReadBits(16);
            var weapon_logclassname = bb.ReadString();
            var stun_flags = bb.ReadBits(16);
            var death_flags = bb.ReadBits(16);
            var silent_kill = bb.ReadBool();
            var playerpenetratecount = bb.ReadBits(16);
            string assister_fallback;
            if (assister == -1)
                assister_fallback = bb.ReadString();
            else
            {
                var unk = bb.ReadBits(8);
            }

            if (bb._pos != endBit) Debugger.Break();

            //Console.WriteLine("[player_death]");
        }
コード例 #25
0
ファイル: Packet.cs プロジェクト: arispoloway/netdecode
 static void svc_packetentities(BitBuffer bb, TreeNode node)
 {
     node.Nodes.Add("Max entries: " + bb.ReadBits(11));
     bool d = bb.ReadBool();
     node.Nodes.Add("Is delta: " + d);
     if (d)
         node.Nodes.Add("Delta from: " + bb.ReadBits(32));
     node.Nodes.Add("Baseline: " + bb.ReadBool());
     node.Nodes.Add("Updated entries: " + bb.ReadBits(11));
     var b = bb.ReadBits(20);
     node.Nodes.Add("Length in bits: " + b);
     node.Nodes.Add("Update baseline: " + bb.ReadBool());
     bb.Seek(b);
 }
コード例 #26
0
ファイル: Packet.cs プロジェクト: arispoloway/netdecode
 static void svc_fixangle(BitBuffer bb, TreeNode node)
 {
     node.Nodes.Add("Relative: " + bb.ReadBool());
     // TODO: handle properly
     bb.Seek(48);
 }
コード例 #27
0
 static void svc_fixangle(BitBuffer bb, TreeNode node)
 {
     node.Nodes.Add("Relative: " + bb.ReadBool());
     // TODO: handle properly
     bb.Seek(48);
 }
コード例 #28
0
ファイル: Packet.cs プロジェクト: arispoloway/netdecode
 static void svc_bspdecal(BitBuffer bb, TreeNode node)
 {
     node.Nodes.Add("Position: " + bb.ReadVecCoord());
     node.Nodes.Add("Decal texture index: " + bb.ReadBits(9));
     if (bb.ReadBool())
     {
         node.Nodes.Add("Entity index: " + bb.ReadBits(11));
         node.Nodes.Add("Model index: " + bb.ReadBits(12));
     }
     node.Nodes.Add("Low priority: " + bb.ReadBool());
 }
コード例 #29
0
 static void net_file(BitBuffer bb, TreeNode node)
 {
     node.Nodes.Add("Transfer ID: " + bb.ReadBits(32));
     node.Nodes.Add("Filename: " + bb.ReadString());
     node.Nodes.Add("Requested: " + bb.ReadBool());
 }
コード例 #30
0
ファイル: Packet.cs プロジェクト: arispoloway/netdecode
 static void net_file(BitBuffer bb, TreeNode node)
 {
     node.Nodes.Add("Transfer ID: " + bb.ReadBits(32));
     node.Nodes.Add("Filename: " + bb.ReadString());
     node.Nodes.Add("Requested: " + bb.ReadBool());
 }
コード例 #31
0
ファイル: DemoFile.cs プロジェクト: arispoloway/netdecode
 /*
 static string ParseButtons(uint buttons)
 {
     string res = "(none)";
     // TODO: IMPLEMENT
     return res;
 }
 */
 public static void ParseIntoTreeNode(byte[] data, TreeNode node)
 {
     var bb = new BitBuffer(data);
     if (bb.ReadBool()) node.Nodes.Add("Command number: " + bb.ReadBits(32));
     if (bb.ReadBool()) node.Nodes.Add("Tick count: " + bb.ReadBits(32));
     if (bb.ReadBool()) node.Nodes.Add("Viewangle pitch: " + bb.ReadFloat());
     if (bb.ReadBool()) node.Nodes.Add("Viewangle yaw: " + bb.ReadFloat());
     if (bb.ReadBool()) node.Nodes.Add("Viewangle roll: " + bb.ReadFloat());
     if (bb.ReadBool()) node.Nodes.Add("Foward move: " + bb.ReadFloat());
     if (bb.ReadBool()) node.Nodes.Add("Side move: " + bb.ReadFloat());
     if (bb.ReadBool()) node.Nodes.Add("Up move: " + bb.ReadFloat().ToString());
     if (bb.ReadBool()) node.Nodes.Add("Buttons: 0x" + bb.ReadBits(32).ToString("X8"));
     if (bb.ReadBool()) node.Nodes.Add("Impulse: " + bb.ReadBits(8));
     if (bb.ReadBool()) {
         node.Nodes.Add("Weaponselect: " + bb.ReadBits(11).ToString("X8"));
         if(bb.ReadBool()) node.Nodes.Add("Weaponsubtype: " + bb.ReadBits(11).ToString("X8"));
     }
     node.Nodes.Add("BITS LEFT: " + bb.BitsLeft());
     if (bb.ReadBool()) node.Nodes.Add("dx: " + bb.ReadBits(16)); //These are supposed to be shorts - not sure how to read 16 bit short
     if (bb.ReadBool()) node.Nodes.Add("dy: " + bb.ReadBits(16));
     // TODO: weaponselect/weaponsubtype, mousedx/dy
 }