Rewrite pack code

This commit is contained in:
Razmoth
2023-01-07 20:24:41 +04:00
parent 44cdb28520
commit 94d73398ca

View File

@@ -110,35 +110,30 @@ namespace AssetStudio
{ {
var mr0k = (Mr0k)game; var mr0k = (Mr0k)game;
var bundleSize = 0; long readSize = 0;
long bundleSize = 0;
reader.Position = 0; reader.Position = 0;
Header header = null;
var pack = new { IsMr0k = false, BlockSize = -1 };
while (reader.Remaining > 0) while (reader.Remaining > 0)
{ {
var pos = reader.Position; var pos = reader.Position;
var signature = reader.ReadStringToNull(4); var signature = reader.ReadStringToNull(4);
if (signature == PackSignature) if (signature == PackSignature)
{ {
pack = new { var isMr0k = reader.ReadBoolean();
IsMr0k = reader.ReadBoolean(), var blockSize = BinaryPrimitives.ReadInt32LittleEndian(reader.ReadBytes(4));
BlockSize = BinaryPrimitives.ReadInt32LittleEndian(reader.ReadBytes(4))
};
Span<byte> buffer = new byte[pack.BlockSize]; Span<byte> buffer = new byte[blockSize];
reader.Read(buffer); reader.Read(buffer);
if (pack.IsMr0k) if (isMr0k)
{ {
buffer = Mr0kUtils.Decrypt(buffer, mr0k); buffer = Mr0kUtils.Decrypt(buffer, mr0k);
} }
ms.Write(buffer); ms.Write(buffer);
bundleSize += buffer.Length; if (bundleSize == 0)
if (header == null)
{ {
using var blockReader = new EndianBinaryReader(new MemoryStream(buffer.ToArray())); using var blockReader = new EndianBinaryReader(new MemoryStream(buffer.ToArray()));
header = new Header() var header = new Header()
{ {
signature = blockReader.ReadStringToNull(), signature = blockReader.ReadStringToNull(),
version = blockReader.ReadUInt32(), version = blockReader.ReadUInt32(),
@@ -146,18 +141,20 @@ namespace AssetStudio
unityRevision = blockReader.ReadStringToNull(), unityRevision = blockReader.ReadStringToNull(),
size = blockReader.ReadInt64() size = blockReader.ReadInt64()
}; };
bundleSize = header.size;
} }
if (bundleSize % (PackSize - 0x80) == 0) readSize += buffer.Length;
if (readSize % (PackSize - 0x80) == 0)
{ {
reader.Position += PackSize - 9 - pack.BlockSize; reader.Position += PackSize - 9 - blockSize;
} }
if (bundleSize == header.size) if (readSize == bundleSize)
{ {
readSize = 0;
bundleSize = 0; bundleSize = 0;
header = null;
pack = new { IsMr0k = false, BlockSize = -1 };
} }
continue; continue;
@@ -167,7 +164,7 @@ namespace AssetStudio
signature = reader.ReadStringToNull(); signature = reader.ReadStringToNull();
if (signature == UnityFSSignature) if (signature == UnityFSSignature)
{ {
header = new Header() var header = new Header()
{ {
signature = reader.ReadStringToNull(), signature = reader.ReadStringToNull(),
version = reader.ReadUInt32(), version = reader.ReadUInt32(),
@@ -178,7 +175,6 @@ namespace AssetStudio
reader.Position = pos; reader.Position = pos;
reader.BaseStream.CopyTo(ms, header.size); reader.BaseStream.CopyTo(ms, header.size);
header = null;
continue; continue;
} }