diff --git a/AssetTools.NET/Standard/AssetsBundleFileFormat/AssetBundleFile.cs b/AssetTools.NET/Standard/AssetsBundleFileFormat/AssetBundleFile.cs index 9f87ce0..f5de0b5 100644 --- a/AssetTools.NET/Standard/AssetsBundleFileFormat/AssetBundleFile.cs +++ b/AssetTools.NET/Standard/AssetsBundleFileFormat/AssetBundleFile.cs @@ -57,7 +57,7 @@ public void Read(AssetsFileReader reader) Header = new AssetBundleHeader(); Header.Read(reader); - if (Header.Version >= 7) + if (Header.NeedAlignAfterHeader) { reader.Align16(); } @@ -103,7 +103,7 @@ public void Write(AssetsFileWriter writer, long filePos = 0) Header.Write(writer); - if (Header.Version >= 7) + if (Header.NeedAlignAfterHeader) { writer.Align16(); } @@ -282,6 +282,8 @@ public void Unpack(AssetsFileWriter writer) ) } }; + + newBundleHeader.NeedAlignAfterHeader = Header.NeedAlignAfterHeader; long fileSize = newBundleHeader.GetFileDataOffset(); for (int i = 0; i < blockInfos.Length; i++) @@ -321,7 +323,7 @@ public void Unpack(AssetsFileWriter writer) } newBundleHeader.Write(writer); - if (newBundleHeader.Version >= 7) + if (newBundleHeader.NeedAlignAfterHeader) { writer.Align16(); } @@ -418,6 +420,8 @@ public void Pack(AssetsFileWriter writer, AssetBundleCompressionType compType, EngineVersion = Header.EngineVersion, FileStreamHeader = newFsHeader }; + + newHeader.NeedAlignAfterHeader = Header.NeedAlignAfterHeader; AssetBundleBlockAndDirInfo newBlockAndDirList = new AssetBundleBlockAndDirInfo() { @@ -430,7 +434,7 @@ public void Pack(AssetsFileWriter writer, AssetBundleCompressionType compType, long startPos = writer.Position; newHeader.Write(writer); - if (newHeader.Version >= 7) + if (newHeader.NeedAlignAfterHeader) writer.Align16(); int headerSize = (int)(writer.Position - startPos); @@ -604,7 +608,7 @@ public void Pack(AssetsFileWriter writer, AssetBundleCompressionType compType, writer.Position = 0; newHeader.Write(writer); - if (newHeader.Version >= 7) + if (newHeader.NeedAlignAfterHeader) writer.Align16(); } diff --git a/AssetTools.NET/Standard/AssetsBundleFileFormat/AssetBundleHeader.cs b/AssetTools.NET/Standard/AssetsBundleFileFormat/AssetBundleHeader.cs index 7aec5c8..3abd698 100644 --- a/AssetTools.NET/Standard/AssetsBundleFileFormat/AssetBundleHeader.cs +++ b/AssetTools.NET/Standard/AssetsBundleFileFormat/AssetBundleHeader.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; namespace AssetsTools.NET { @@ -27,6 +28,11 @@ public class AssetBundleHeader /// public AssetBundleFSHeader FileStreamHeader { get; set; } + /// + /// Weather align after header. Because for 2019.4.30f1 Signature is 0x06 but has align + /// + public bool NeedAlignAfterHeader { get; set; } + public void Read(AssetsFileReader reader) { reader.BigEndian = true; @@ -38,6 +44,25 @@ public void Read(AssetsFileReader reader) { FileStreamHeader = new AssetBundleFSHeader(); FileStreamHeader.Read(reader); + if (Version >= 7) + { + NeedAlignAfterHeader = true; + } + else if(EngineVersion.StartsWith("2019.4.")) + // should check if FileStreamHeader.Flags != AssetBundleFSHeaderFlags.HasDirectoryInfo + // but UABEANext now only save file with none compression and will read saved file again + // to avoid error won't check flag at now time + { + long p = reader.Position; + long len = 16 - p % 16; + byte[] bytes = reader.ReadBytes((int)len); + NeedAlignAfterHeader = bytes.All(x => x == 0); + reader.Position = p; + } + else + { + NeedAlignAfterHeader = false; + } } else { @@ -80,7 +105,7 @@ public long GetBundleInfoOffset() else { long ret = GenerationVersion.Length + EngineVersion.Length + 0x1a; - if (Version >= 7) + if (NeedAlignAfterHeader) { if ((flags & AssetBundleFSHeaderFlags.OldWebPluginCompatibility) != 0) return ((ret + 0x0a) + 15) & ~15; @@ -111,7 +136,7 @@ public long GetFileDataOffset() else ret += Signature.Length + 1; - if (Version >= 7) + if (NeedAlignAfterHeader) ret = (ret + 15) & ~15; if ((flags & AssetBundleFSHeaderFlags.BlockAndDirAtEnd) == 0) ret += compressedSize;