From 528976f56318624663a0805f01df7117cb162496 Mon Sep 17 00:00:00 2001 From: Harry Huang Date: Wed, 30 Sep 2026 12:24:57 +0800 Subject: [PATCH 1/2] feat(SerializedFile): support SF v23 --- UnityPy/files/SerializedFile.py | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/UnityPy/files/SerializedFile.py b/UnityPy/files/SerializedFile.py index d8853378..b4b43062 100644 --- a/UnityPy/files/SerializedFile.py +++ b/UnityPy/files/SerializedFile.py @@ -109,6 +109,9 @@ class SerializedType: m_AssemblyName: Optional[str] = None # 21+ type_dependencies: Optional[Tuple[int, ...]] = None + # 23+ + type_tree_content_hash: Optional[bytes] = None # Hash128, XXH3 + type_tree_serialized_size: Optional[int] = None def __init__( self, @@ -136,8 +139,13 @@ def __init__( self.old_type_hash = reader.read_bytes(16) if serialized_file._enable_type_tree: + if version >= 23: + self.type_tree_content_hash = reader.read_bytes(16) + self.type_tree_serialized_size = reader.read_int() + if version >= 12 or version == 10: - self.node = TypeTreeNode.parse_blob(reader, version) + if version < 23 or self.type_tree_serialized_size: + self.node = TypeTreeNode.parse_blob(reader, version) else: self.node = TypeTreeNode.parse(reader, version) @@ -179,8 +187,19 @@ def write( if serialized_file._enable_type_tree: assert self.node is not None + if version >= 23: + assert self.type_tree_content_hash is not None + writer.write_bytes(self.type_tree_content_hash) # Hash128 + if version >= 12 or version == 10: - self.node.dump_blob(writer, version) + if version >= 23: + blob_writer = EndianBinaryWriter(endian=writer.endian) + self.node.dump_blob(blob_writer, version) + blob_data = blob_writer.bytes + writer.write_int(len(blob_data)) + writer.write(blob_data) + else: + self.node.dump_blob(writer, version) else: serialized_file.dump(writer, version) From 2522d88f774fb959d85c8e216db4c812f52bb661 Mon Sep 17 00:00:00 2001 From: Harry Huang Date: Wed, 30 Sep 2026 12:33:58 +0800 Subject: [PATCH 2/2] feat(TypeTreeNode): support SF v23 --- UnityPy/helpers/TypeTreeNode.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/UnityPy/helpers/TypeTreeNode.py b/UnityPy/helpers/TypeTreeNode.py index a0a09571..bacdc937 100644 --- a/UnityPy/helpers/TypeTreeNode.py +++ b/UnityPy/helpers/TypeTreeNode.py @@ -108,6 +108,12 @@ def parse(cls, reader: EndianBinaryReader, version: int) -> TypeTreeNode: @classmethod def parse_blob(cls, reader: EndianBinaryReader, version: int) -> TypeTreeNode: + if version >= 23: + if reader.read_bytes(4) != b"mhtt": + raise ValueError("Invalid type tree blob magic") + format_version = reader.read_int() + if format_version != version: + raise ValueError("Inconsistent type tree format version detected") node_count = reader.read_int() stringbuffer_size = reader.read_int() @@ -270,6 +276,9 @@ def write_node(node: TypeTreeNode): node_count = len([write_node(node) for node in self.traverse()]) # write blob + if version >= 23: + writer.write(b"mhtt") + writer.write_int(version) writer.write_int(node_count) writer.write_int(string_writer.Position) writer.write(node_writer.bytes)