mirror of
https://github.com/4sval/FModel.git
synced 2026-06-21 15:30:05 -05:00
updated FByteBulkData so close #147
This commit is contained in:
parent
b736325b6a
commit
09be7a9ea6
|
|
@ -4,43 +4,45 @@ namespace FModel.PakReader.Parsers.Objects
|
|||
{
|
||||
public readonly struct FByteBulkData : IUStruct
|
||||
{
|
||||
public readonly FByteBulkDataHeader Header;
|
||||
public readonly byte[] Data;
|
||||
|
||||
internal FByteBulkData(BinaryReader reader, Stream ubulk, long ubulkOffset)
|
||||
{
|
||||
var BulkDataFlags = reader.ReadInt32();
|
||||
Header = new FByteBulkDataHeader(reader, ubulkOffset);
|
||||
var bulkDataFlags = Header.BulkDataFlags;
|
||||
|
||||
var ElementCount = reader.ReadInt32();
|
||||
_ = reader.ReadInt32(); //BulkDataSizeOnDisk
|
||||
var BulkDataOffsetInFile = reader.ReadInt64();
|
||||
if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_NoOffsetFixUp) == 0) // UE4.26 flag
|
||||
Data = new byte[Header.ElementCount];
|
||||
if (Header.ElementCount == 0)
|
||||
{
|
||||
BulkDataOffsetInFile += ubulkOffset;
|
||||
}
|
||||
|
||||
Data = null;
|
||||
if ((BulkDataFlags & 0x20) != 0 || ElementCount == 0)
|
||||
return;
|
||||
if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_OptionalPayload) != 0) //.uptnl
|
||||
}
|
||||
else if ((bulkDataFlags & (uint)EBulkDataFlags.BULKDATA_Unused) != 0)
|
||||
{
|
||||
return;
|
||||
|
||||
if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_PayloadAtEndOfFile) != 0 &&
|
||||
BulkDataOffsetInFile + ElementCount <= reader.BaseStream.Length) //.uasset
|
||||
{
|
||||
long rememberMe = reader.BaseStream.Position;
|
||||
reader.BaseStream.Seek(BulkDataOffsetInFile, SeekOrigin.Begin);
|
||||
Data = reader.ReadBytes(ElementCount);
|
||||
reader.BaseStream.Seek(rememberMe, SeekOrigin.Begin);
|
||||
}
|
||||
else if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_ForceInlinePayload) != 0) //.uexp
|
||||
else if ((bulkDataFlags & (uint)EBulkDataFlags.BULKDATA_OptionalPayload) != 0) //.uptnl
|
||||
{
|
||||
Data = reader.ReadBytes(ElementCount);
|
||||
return;
|
||||
}
|
||||
else if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_PayloadInSeperateFile) != 0 && ubulk != null) //.ubulk
|
||||
else if ((bulkDataFlags & (uint)EBulkDataFlags.BULKDATA_ForceInlinePayload) != 0) //.uexp
|
||||
{
|
||||
ubulk.Position = BulkDataOffsetInFile;
|
||||
Data = new byte[ElementCount];
|
||||
ubulk.Read(Data, 0, (int)ElementCount);
|
||||
reader.Read(Data, 0, Header.ElementCount);
|
||||
}
|
||||
else if((bulkDataFlags & (uint)EBulkDataFlags.BULKDATA_PayloadInSeperateFile) != 0) //.ubulk
|
||||
{
|
||||
ubulk.Position = Header.OffsetInFile;
|
||||
ubulk.Read(Data, 0, Header.ElementCount);
|
||||
}
|
||||
else if((bulkDataFlags & (uint)EBulkDataFlags.BULKDATA_PayloadAtEndOfFile) != 0) //.uexp
|
||||
{
|
||||
var savePos = reader.BaseStream.Position;
|
||||
if (Header.OffsetInFile + Header.ElementCount <= reader.BaseStream.Length)
|
||||
{
|
||||
reader.BaseStream.Position = Header.OffsetInFile;
|
||||
reader.Read(Data, 0, Header.ElementCount);
|
||||
}
|
||||
reader.BaseStream.Position = savePos;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
38
FModel/PakReader/Parsers/Objects/FByteBulkDataHeader.cs
Normal file
38
FModel/PakReader/Parsers/Objects/FByteBulkDataHeader.cs
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
using System.IO;
|
||||
|
||||
namespace FModel.PakReader.Parsers.Objects
|
||||
{
|
||||
public readonly struct FByteBulkDataHeader : IUStruct
|
||||
{
|
||||
public readonly int BulkDataFlags;
|
||||
public readonly int ElementCount;
|
||||
public readonly long SizeOnDisk;
|
||||
public readonly long OffsetInFile;
|
||||
|
||||
internal FByteBulkDataHeader(BinaryReader reader, long ubulkOffset)
|
||||
{
|
||||
BulkDataFlags = reader.ReadInt32();
|
||||
if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_Size64Bit) != 0)
|
||||
{
|
||||
ElementCount = (int)reader.ReadInt64();
|
||||
SizeOnDisk = reader.ReadInt64();
|
||||
}
|
||||
else
|
||||
{
|
||||
ElementCount = reader.ReadInt32();
|
||||
SizeOnDisk = reader.ReadInt32();
|
||||
}
|
||||
|
||||
OffsetInFile = reader.ReadInt64();
|
||||
if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_NoOffsetFixUp) == 0) // UE4.26 flag
|
||||
{
|
||||
OffsetInFile += ubulkOffset;
|
||||
}
|
||||
|
||||
if ((BulkDataFlags & (uint)EBulkDataFlags.BULKDATA_BadDataVersion) != 0)
|
||||
{
|
||||
reader.ReadBytes(2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -38,14 +38,7 @@ namespace FModel.Windows.SoundPlayer
|
|||
{
|
||||
get
|
||||
{
|
||||
try
|
||||
{
|
||||
return CanSeek ? (long)(_vorbisReader.TotalTime.TotalSeconds * _waveFormat.SampleRate * _waveFormat.Channels) : 0;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return CanSeek ? (long)(_vorbisReader.TotalTime.TotalSeconds * _waveFormat.SampleRate * _waveFormat.Channels) : 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user