Exemplo n.º 1
0
        public static async ValueTask <TES3Reader> Load(IStreamFactory factory)
        {
            await using var fs = await factory.GetStream();

            using var br = new BinaryReader(fs);
            var rdr = new TES3Reader
            {
                _streamFactory   = factory,
                _versionNumber   = br.ReadUInt32(),
                _hashTableOffset = br.ReadUInt32(),
                _fileCount       = br.ReadUInt32()
            };

            rdr._files = new TES3FileEntry[rdr._fileCount];
            for (int i = 0; i < rdr._fileCount; i++)
            {
                var file = new TES3FileEntry {
                    Index   = i,
                    Archive = rdr,
                    Size    = br.ReadUInt32(),
                    Offset  = br.ReadUInt32()
                };
                rdr._files[i] = file;
            }

            for (int i = 0; i < rdr._fileCount; i++)
            {
                rdr._files[i].NameOffset = br.ReadUInt32();
            }

            var origPos = br.BaseStream.Position;

            for (int i = 0; i < rdr._fileCount; i++)
            {
                br.BaseStream.Position = origPos + rdr._files[i].NameOffset;
                rdr._files[i].Path     = new RelativePath(br.ReadStringTerm(VersionType.TES3));
            }

            br.BaseStream.Position = rdr._hashTableOffset + 12;
            for (int i = 0; i < rdr._fileCount; i++)
            {
                rdr._files[i].Hash1 = br.ReadUInt32();
                rdr._files[i].Hash2 = br.ReadUInt32();
            }

            rdr._dataOffset = br.BaseStream.Position;
            return(rdr);
        }
Exemplo n.º 2
0
        public TES3Reader(AbsolutePath filename)
        {
            _filename        = filename;
            using var fs     = filename.OpenRead();
            using var br     = new BinaryReader(fs);
            _versionNumber   = br.ReadUInt32();
            _hashTableOffset = br.ReadUInt32();
            _fileCount       = br.ReadUInt32();

            _files = new TES3FileEntry[_fileCount];
            for (int i = 0; i < _fileCount; i++)
            {
                var file = new TES3FileEntry {
                    Index   = i,
                    Archive = this,
                    Size    = br.ReadUInt32(),
                    Offset  = br.ReadUInt32()
                };
                _files[i] = file;
            }

            for (int i = 0; i < _fileCount; i++)
            {
                _files[i].NameOffset = br.ReadUInt32();
            }

            var origPos = br.BaseStream.Position;

            for (int i = 0; i < _fileCount; i++)
            {
                br.BaseStream.Position = origPos + _files[i].NameOffset;
                _files[i].Path         = new RelativePath(br.ReadStringTerm(VersionType.TES3));
            }

            br.BaseStream.Position = _hashTableOffset + 12;
            for (int i = 0; i < _fileCount; i++)
            {
                _files[i].Hash1 = br.ReadUInt32();
                _files[i].Hash2 = br.ReadUInt32();
            }

            _dataOffset = br.BaseStream.Position;
        }