This commit is contained in:
Razmoth
2023-08-21 21:45:57 +04:00
parent 6da2387c8c
commit 0bd3fa6db2
48 changed files with 967 additions and 510 deletions

View File

@@ -60,23 +60,28 @@ namespace AssetStudio
reader.Position = header.m_FileSize - header.m_MetadataSize;
m_FileEndianess = reader.ReadByte();
}
if (header.m_Version >= SerializedFileFormatVersion.LargeFilesSupport)
{
header.m_MetadataSize = reader.ReadUInt32();
header.m_FileSize = reader.ReadInt64();
header.m_DataOffset = reader.ReadInt64();
reader.ReadInt64(); // unknown
}
Logger.Verbose($"File {fileName} Info: {header}");
// ReadMetadata
if (m_FileEndianess == 0)
{
reader.Endian = EndianType.LittleEndian;
Logger.Verbose($"Endianness {reader.Endian}");
}
if (header.m_Version >= SerializedFileFormatVersion.Unknown_7)
{
unityVersion = reader.ReadStringToNull();
Logger.Verbose($"Unity version {unityVersion}");
SetVersion(unityVersion);
}
if (header.m_Version >= SerializedFileFormatVersion.Unknown_8)
@@ -84,12 +89,15 @@ namespace AssetStudio
m_TargetPlatform = (BuildTarget)reader.ReadInt32();
if (!Enum.IsDefined(typeof(BuildTarget), m_TargetPlatform))
{
Logger.Verbose($"Parsed target format {m_TargetPlatform} doesn't match any of supported formats, defaulting to {BuildTarget.UnknownPlatform}");
m_TargetPlatform = BuildTarget.UnknownPlatform;
}
else if (game.Type.IsMhyGroup())
{
Logger.Verbose($"Selected game {game.Name} is a mhy game, forcing target format {BuildTarget.StandaloneWindows64}");
m_TargetPlatform = BuildTarget.StandaloneWindows64;
}
Logger.Verbose($"Target format {m_TargetPlatform}");
}
if (header.m_Version >= SerializedFileFormatVersion.HasTypeTreeHashes)
{
@@ -99,6 +107,7 @@ namespace AssetStudio
// Read Types
int typeCount = reader.ReadInt32();
m_Types = new List<SerializedType>(typeCount);
Logger.Verbose($"Found {typeCount} serialized types");
for (int i = 0; i < typeCount; i++)
{
m_Types.Add(ReadSerializedType(false));
@@ -114,6 +123,7 @@ namespace AssetStudio
m_Objects = new List<ObjectInfo>(objectCount);
Objects = new List<Object>(objectCount);
ObjectsDic = new Dictionary<long, Object>(objectCount);
Logger.Verbose($"Found {objectCount} objects");
for (int i = 0; i < objectCount; i++)
{
var objectInfo = new ObjectInfo();
@@ -164,12 +174,14 @@ namespace AssetStudio
{
objectInfo.stripped = reader.ReadByte();
}
Logger.Verbose($"Object Info: {objectInfo}");
m_Objects.Add(objectInfo);
}
if (header.m_Version >= SerializedFileFormatVersion.HasScriptTypeIndex)
{
int scriptCount = reader.ReadInt32();
Logger.Verbose($"Found {scriptCount} scripts");
m_ScriptTypes = new List<LocalSerializedObjectIdentifier>(scriptCount);
for (int i = 0; i < scriptCount; i++)
{
@@ -184,12 +196,14 @@ namespace AssetStudio
reader.AlignStream();
m_ScriptType.localIdentifierInFile = reader.ReadInt64();
}
Logger.Verbose($"Script Info: {m_ScriptType}");
m_ScriptTypes.Add(m_ScriptType);
}
}
int externalsCount = reader.ReadInt32();
m_Externals = new List<FileIdentifier>(externalsCount);
Logger.Verbose($"Found {externalsCount} externals");
for (int i = 0; i < externalsCount; i++)
{
var m_External = new FileIdentifier();
@@ -204,6 +218,7 @@ namespace AssetStudio
}
m_External.pathName = reader.ReadStringToNull();
m_External.fileName = Path.GetFileName(m_External.pathName);
Logger.Verbose($"External Info: {m_External}");
m_Externals.Add(m_External);
}
@@ -211,6 +226,7 @@ namespace AssetStudio
{
int refTypesCount = reader.ReadInt32();
m_RefTypes = new List<SerializedType>(refTypesCount);
Logger.Verbose($"Found {refTypesCount} reference types");
for (int i = 0; i < refTypesCount; i++)
{
m_RefTypes.Add(ReadSerializedType(true));
@@ -239,12 +255,14 @@ namespace AssetStudio
private SerializedType ReadSerializedType(bool isRefType)
{
Logger.Verbose($"Attempting to parse serialized" + (isRefType ? " reference" : " ") + "type");
var type = new SerializedType();
type.classID = reader.ReadInt32();
if (game.Type.IsGIGroup() && BitConverter.ToBoolean(header.m_Reserved))
{
Logger.Verbose($"Encoded class ID {type.classID}, decoding...");
type.classID = DecodeClassID(type.classID);
}
@@ -273,6 +291,7 @@ namespace AssetStudio
if (m_EnableTypeTree)
{
Logger.Verbose($"File has type tree enabled !!");
type.m_Type = new TypeTree();
type.m_Type.m_Nodes = new List<TypeTreeNode>();
if (header.m_Version >= SerializedFileFormatVersion.Unknown_12 || header.m_Version == SerializedFileFormatVersion.Unknown_10)
@@ -298,11 +317,13 @@ namespace AssetStudio
}
}
Logger.Verbose($"Serialized type info: {type}");
return type;
}
private void ReadTypeTree(TypeTree m_Type, int level = 0)
{
Logger.Verbose($"Attempting to parse type tree...");
var typeTreeNode = new TypeTreeNode();
m_Type.m_Nodes.Add(typeTreeNode);
typeTreeNode.m_Level = level;
@@ -329,12 +350,16 @@ namespace AssetStudio
{
ReadTypeTree(m_Type, level + 1);
}
Logger.Verbose($"Type Tree Info: {m_Type}");
}
private void TypeTreeBlobRead(TypeTree m_Type)
{
Logger.Verbose($"Attempting to parse blob type tree...");
int numberOfNodes = reader.ReadInt32();
int stringBufferSize = reader.ReadInt32();
Logger.Verbose($"Found {numberOfNodes} nodes and {stringBufferSize} strings");
for (int i = 0; i < numberOfNodes; i++)
{
var typeTreeNode = new TypeTreeNode();
@@ -364,6 +389,8 @@ namespace AssetStudio
}
}
Logger.Verbose($"Type Tree Info: {m_Type}");
string ReadString(EndianBinaryReader stringBufferReader, uint value)
{
var isOffset = (value & 0x80000000) == 0;
@@ -383,6 +410,7 @@ namespace AssetStudio
public void AddObject(Object obj)
{
Logger.Verbose($"Caching object with {obj.m_PathID} in file {fileName}...");
Objects.Add(obj);
ObjectsDic.Add(obj.m_PathID, obj);
}