public static void Write(this BinaryWriter writer, MdbPacket packet)
        {
            writer.WriteAscii(packet.Signature, 4);
            writer.Write(packet.Size);
            long mark1 = writer.BaseStream.Position;

            switch (packet.Signature)
            {
            case "RIGD":
                writer.WriteMdbPacket((MdbPacket_RIGD)packet);
                break;

            case "SKIN":
                writer.WriteMdbPacket((MdbPacket_SKIN)packet);
                break;

            case "COL2":
            case "COL3":
                writer.WriteMdbPacket((MdbPacket_COLN)packet);
                break;

            case "COLS":
                writer.WriteMdbPacket((MdbPacket_COLS)packet);
                break;

            case "WALK":
                writer.WriteMdbPacket((MdbPacket_WALK)packet);
                break;

            case "HOOK":
                writer.WriteMdbPacket((MdbPacket_HOOK)packet);
                break;

            case "TRRN":
                writer.WriteMdbPacket((MdbPacket_TRRN)packet);
                break;

            case "HELM":
                writer.WriteMdbPacket((MdbPacket_HELM)packet);
                break;

            case "HAIR":
                writer.WriteMdbPacket((MdbPacket_HAIR)packet);
                break;

            default:
                CTDebug.Error("Unrecognized object format: {0}", packet.Signature);
                break;
            }
            long mark2 = writer.BaseStream.Position;

            if (mark2 - mark1 != packet.Size)
            {
                CTDebug.Error("Incorrectly sized packet!");
            }
        }
        public static MdbPacket ReadMdbPacket(this BinaryReader reader)
        {
            string    Signature     = reader.ReadAscii(4);
            UInt32    Size          = reader.ReadUInt32();
            MdbPacket ret           = null;
            long      debugCheckPos = reader.BaseStream.Position;

            switch (Signature)
            {
            case "RIGD":
                ret = reader.ReadMdbPacket_RIGD(Size);
                break;

            case "SKIN":
                ret = reader.ReadMdbPacket_SKIN(Size);
                break;

            case "COL2":
            case "COL3":
                ret = reader.ReadMdbPacket_COLN(Size);
                break;

            case "COLS":
                ret = reader.ReadMdbPacket_COLS(Size);
                break;

            case "WALK":
                ret = reader.ReadMdbPacket_WALK(Size);
                break;

            case "HOOK":
                ret = reader.ReadMdbPacket_HOOK(Size);
                break;

            case "TRRN":
                ret = reader.ReadMdbPacket_TRRN(Size);
                break;

            case "HELM":
                ret = reader.ReadMdbPacket_HELM(Size);
                break;

            case "HAIR":
                ret = reader.ReadMdbPacket_HAIR(Size);
                break;

            default:
                CTDebug.Error("Unrecognized object format: {0}", Signature);
                break;
            }

            long diff = reader.BaseStream.Position - debugCheckPos;

            if (diff != Size)
            {
                CTDebug.Warn("Invalid size of MDB Packet.");
            }
            ret.Size      = Size;
            ret.Signature = Signature;

            return(ret);
        }