public static BlockTable Load(WildstarFile file, int directoryCountOffset = 544, int directoryStartOffset = 536) { List <BlockTableEntry> tableEntries = new List <BlockTableEntry>(); var startPos = Math.Min(directoryCountOffset, directoryStartOffset); var endPos = Math.Max(directoryCountOffset + 4, directoryStartOffset + 8); int directoryCount; long directoryStart; var countOffset = directoryCountOffset - startPos; var startOffset = directoryStartOffset - startPos; using (var blockTableDataStream = file.File.CreateViewStream(startPos, endPos - startPos + 1, MemoryMappedFileAccess.Read)) using (var binaryReader = new BinaryReader(blockTableDataStream)) { binaryReader.BaseStream.Seek(startOffset, SeekOrigin.Begin); directoryStart = binaryReader.ReadInt64(); binaryReader.BaseStream.Seek(countOffset, SeekOrigin.Begin); directoryCount = binaryReader.ReadInt32(); } using (var directoryEntryStream = file.File.CreateViewStream(directoryStart, directoryCount * BlockTableEntry.Size, MemoryMappedFileAccess.Read)) using (var binaryReader = new BinaryReader(directoryEntryStream)) for (var x = 0; x < directoryCount; x++) { tableEntries.Add(BlockTableEntry.FromReader(binaryReader)); } return(new BlockTable(tableEntries)); }
public ArchiveFileEntry(WildstarFile indexFile, WildstarAssets assets, IArchiveDirectoryEntry parent, int blockNumber, string name, BinaryReader reader) : base(indexFile, assets, parent, blockNumber, name) { Flags = reader.ReadInt32(); Reserved1 = reader.ReadInt64(); UncompressedSize = reader.ReadInt64(); CompressedSize = reader.ReadInt64(); Hash = BitConverter.ToString(reader.ReadBytes(20)).Replace("-", "").ToLower(); Reserved2 = reader.ReadInt32(); _lazyArchiveFile = new Lazy <WildstarFile>(() => Assets.LocateArchiveWithAsset(Hash)); }
public WildstarAssets(DirectoryInfo baseDirectoryInfo) { BaseDirectory = baseDirectoryInfo; PatchDirectory = new DirectoryInfo(Path.Combine(baseDirectoryInfo.FullName, "Patch")); var patchFileName = Path.Combine(PatchDirectory.FullName, "Patch.index"); var patchFile = new WildstarFile(new FileInfo(patchFileName)); var directory = new ArchiveDirectoryEntry(patchFile, this, null, (int)patchFile.AssetIndexEntry.RootBlock, null); var filesToLoad = directory.Children.OfType <ArchiveFileEntry>().ToList(); foreach (var fileName in filesToLoad) { var file = GetFile(fileName); if (file != null) { _fileList.Add(file); } } IndexCount = _fileList.Count; var coreDataFileName = Path.Combine(PatchDirectory.FullName, "CoreData.archive"); FileInfo coreDataFileInfo = new FileInfo(coreDataFileName); if (coreDataFileInfo.Exists) { var coreDataFile = new WildstarFile(new FileInfo(coreDataFileName)); _fileList.Add(coreDataFile); } foreach (var fileName in filesToLoad.Select(i => Path.ChangeExtension(i.Name, ".archive"))) { var file = GetFile(fileName); if (file != null) { _fileList.Add(file); } } RootDirectory = new MergedArchiveDirectoryEntry(this); }
public ArchiveDirectoryEntry(WildstarFile indexFile, WildstarAssets assets, IArchiveDirectoryEntry parent, int blockNumber, string name) : base(indexFile, assets, parent, blockNumber, name) { _children = new Lazy <List <IArchiveEntry> >(ReadChildren); }
public ResourceContainerTable(AssetArchiveResourceContainerDescriptor descriptor, WildstarFile archiveFile) { using (var directoryStream = archiveFile.File.CreateViewStream(archiveFile.BlockTable[descriptor.BlockEntry].DirectoryOffset, dirEntrySize * descriptor.EntryCount, MemoryMappedFileAccess.Read)) using (var reader = new BinaryReader(directoryStream)) for (var x = 0; x < descriptor.EntryCount; x++) { var next = ArchiveResourceEntry.Load(reader); var position = _entries.BinarySearch(next); if (position < 0) { position = ~position; } _entries.Insert(position, next); } }