diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index 8049d4e..7ba1cae 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -139,9 +139,6 @@ namespace AssetStudio catch { //Logger.Error($"Unable to load assets file {fileName} from {Path.GetFileName(originalPath)}"); - } - finally - { resourceFileReaders.Add(fileName, reader); } } @@ -156,8 +153,16 @@ namespace AssetStudio var bundleFile = new BundleFile(reader, fullName); foreach (var file in bundleFile.fileList) { - var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName; - LoadAssetsFromMemory(dummyPath, new EndianBinaryReader(file.stream), parentPath ?? fullName, bundleFile.versionEngine); + var subReader = new EndianBinaryReader(file.stream); + if (SerializedFile.IsSerializedFile(subReader)) + { + var dummyPath = Path.GetDirectoryName(fullName) + Path.DirectorySeparatorChar + file.fileName; + LoadAssetsFromMemory(dummyPath, subReader, parentPath ?? fullName, bundleFile.versionEngine); + } + else + { + resourceFileReaders.Add(file.fileName, subReader); + } } } catch @@ -196,6 +201,9 @@ namespace AssetStudio case FileType.WebFile: LoadWebFile(dummyPath, fileReader); break; + case FileType.ResourceFile: + resourceFileReaders.Add(file.fileName, fileReader); + break; } } } diff --git a/AssetStudio/ImportHelper.cs b/AssetStudio/ImportHelper.cs index c3ea046..a935606 100644 --- a/AssetStudio/ImportHelper.cs +++ b/AssetStudio/ImportHelper.cs @@ -8,7 +8,8 @@ namespace AssetStudio { AssetsFile, BundleFile, - WebFile + WebFile, + ResourceFile } public static class ImportHelper @@ -96,7 +97,14 @@ namespace AssetStudio { return FileType.WebFile; } - return FileType.AssetsFile; + if (SerializedFile.IsSerializedFile(reader)) + { + return FileType.AssetsFile; + } + else + { + return FileType.ResourceFile; + } } } } diff --git a/AssetStudio/SerializedFile.cs b/AssetStudio/SerializedFile.cs index 493f30f..64ba57c 100644 --- a/AssetStudio/SerializedFile.cs +++ b/AssetStudio/SerializedFile.cs @@ -330,5 +330,30 @@ namespace AssetStudio return offset.ToString(); } } + + public static bool IsSerializedFile(EndianBinaryReader reader) + { + var fileSize = reader.BaseStream.Length; + if (fileSize < 16) + { + return false; + } + var m_MetadataSize = reader.ReadUInt32(); + var m_FileSize = reader.ReadUInt32(); + if (m_FileSize != fileSize) + { + reader.Position = 0; + return false; + } + var m_Version = reader.ReadUInt32(); + var m_DataOffset = reader.ReadUInt32(); + if (m_DataOffset > fileSize) + { + reader.Position = 0; + return false; + } + reader.Position = 0; + return true; + } } }