private void LoadBlkFile(FileReader reader, Guid?targetId = null) { if (targetId == null) { Logger.Info("Loading " + reader.FileName); } else { Logger.Info("Loading " + reader.FileName + " with target ID " + targetId.Value.ToString()); } try { var blkFile = new BlkFile(reader); bool targetFound = false; for (int i = 0; i < blkFile.Files.Count; i++) { //Console.WriteLine(blkFile.Files[i].ID); if (targetId.HasValue && targetId.Value != blkFile.Files[i].ID) { continue; } targetFound = true; // TODO: proper dummyPath var dummyPath = Path.Combine(Path.GetDirectoryName(reader.FullPath), string.Format("{0}_{1}", reader.FileName, blkFile.Files[i].ID.ToString())); var subReader = new FileReader(dummyPath, new MemoryStream(blkFile.Files[i].Data)); var asset = LoadAssetsFromMemory(subReader, dummyPath); if (asset == null) { //Logger.Error("what"); continue; } foreach (var sharedFile in asset.m_Externals) { var sharedFileName = sharedFile.fileName; var sharedFileNameWithID = string.Format("{0}_{1}", sharedFileName, sharedFile.cabId.ToString()); if (!sharedFileName.EndsWith(".blk")) { // this will directly load .blk files, so anything that isn't one is not supported Logger.Warning(String.Format("attempted to load non-blk shared file ({0})", sharedFileName)); continue; } if (!importFilesHash.Contains(sharedFileNameWithID)) { var sharedFilePath = Path.Combine(Path.GetDirectoryName(reader.FullPath), sharedFileName); if (!File.Exists(sharedFilePath)) { var findFiles = Directory.GetFiles(Path.GetDirectoryName(reader.FullPath), sharedFileName, SearchOption.AllDirectories); if (findFiles.Length > 0) { sharedFilePath = findFiles[0]; } } if (File.Exists(sharedFilePath)) { // TODO: proper integration with the loading bar LoadBlkFile(new FileReader(sharedFilePath), sharedFile.cabId); //importFiles.Add(sharedFilePath); importFilesHash.Add(sharedFileNameWithID); } } } } if (blkFile.Files.Count > 0 && !targetFound) { Logger.Warning("failed to find target mhy0"); } } catch (Exception e) { Logger.Error($"Error while reading blk file {reader.FileName}", e); } finally { reader.Dispose(); } }