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();
}
}