Skip to content

Commit b9d5739

Browse files
authored
1.9.19 update SerializedType & SerializedFile writers (K0lb3#147)
* update SerializedType writing/saving * add test_save * bump version to 1.9.19 * add file type check for test_save * format test
1 parent a9571fa commit b9d5739

File tree

3 files changed

+33
-9
lines changed

3 files changed

+33
-9
lines changed

UnityPy/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "1.9.18"
1+
__version__ = "1.9.19"
22

33
from .environment import Environment
44

UnityPy/files/SerializedFile.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,11 @@ def __init__(self, reader, serialized_file, is_ref_type: bool):
134134
if is_ref_type:
135135
self.m_ClassName = reader.read_string_to_null()
136136
self.m_NameSpace = reader.read_string_to_null()
137-
self.m_AsmName = reader.read_string_to_null()
137+
self.m_AssemblyName = reader.read_string_to_null()
138138
else:
139139
self.type_dependencies = reader.read_int_array()
140140

141-
def write(self, serialized_file, writer):
141+
def write(self, serialized_file, writer, is_ref_type):
142142
version = serialized_file.header.version
143143
writer.write_int(self.class_id)
144144

@@ -149,8 +149,10 @@ def write(self, serialized_file, writer):
149149
writer.write_short(self.script_type_index)
150150

151151
if version >= 13:
152-
if (version < 16 and self.class_id < 0) or (
153-
version >= 16 and self.class_id == 114
152+
if (
153+
(is_ref_type and self.script_type_index >= 0)
154+
or (version < 16 and self.class_id < 0)
155+
or (version >= 16 and self.class_id == 114)
154156
):
155157
writer.write_bytes(self.script_id) # Hash128
156158
writer.write_bytes(self.old_type_hash) # Hash128
@@ -161,6 +163,14 @@ def write(self, serialized_file, writer):
161163
else:
162164
serialized_file.save_type_tree(self.nodes, writer)
163165

166+
if version >= 21:
167+
if is_ref_type:
168+
writer.write_string_to_null(self.m_ClassName)
169+
writer.write_string_to_null(self.m_NameSpace)
170+
writer.write_string_to_null(self.m_AssemblyName)
171+
else:
172+
writer.write_int_array(self.type_dependencies)
173+
164174

165175
class SerializedFile(File.File):
166176
reader: EndianBinaryReader
@@ -243,8 +253,6 @@ def __init__(self, reader: EndianBinaryReader, parent=None, name=None):
243253
# ReadTypes
244254
type_count = reader.read_int()
245255
self.types = [SerializedType(reader, self, False) for _ in range(type_count)]
246-
if config.SERIALIZED_FILE_PARSE_TYPETREE is False:
247-
self._enable_type_tree = False
248256

249257
self.big_id_enabled = 0
250258
if 7 <= header.version < 14:
@@ -277,6 +285,9 @@ def __init__(self, reader: EndianBinaryReader, parent=None, name=None):
277285
SerializedType(reader, self, True) for _ in range(ref_type_count)
278286
]
279287

288+
if config.SERIALIZED_FILE_PARSE_TYPETREE is False:
289+
self._enable_type_tree = False
290+
280291
if header.version >= 5:
281292
self.userInformation = reader.read_string_to_null()
282293

@@ -439,7 +450,7 @@ def save(self, packer: str = None) -> bytes:
439450
# ReadTypes
440451
meta_writer.write_int(len(self.types))
441452
for typ in self.types:
442-
typ.write(self, meta_writer)
453+
typ.write(self, meta_writer, False)
443454

444455
if 7 <= header.version < 14:
445456
meta_writer.write_int(self.big_id_enabled)
@@ -464,7 +475,7 @@ def save(self, packer: str = None) -> bytes:
464475
if header.version >= 20:
465476
meta_writer.write_int(len(self.ref_types))
466477
for ref_type in self.ref_types:
467-
ref_type.write(self, meta_writer)
478+
ref_type.write(self, meta_writer, True)
468479

469480
if header.version >= 5:
470481
meta_writer.write_string_to_null(self.userInformation)

tests/test_main.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,19 @@ def test_read_typetree():
7979
obj.read_typetree()
8080

8181

82+
def test_save():
83+
env = UnityPy.load(SAMPLES)
84+
# TODO - check against original
85+
# this only makes sure
86+
# that the save function still produces a readable file
87+
for name, file in env.files.items():
88+
if isinstance(file, UnityPy.streams.EndianBinaryReader):
89+
continue
90+
save1 = file.save()
91+
save2 = UnityPy.load(save1).file.save()
92+
assert save1 == save2
93+
94+
8295
if __name__ == "__main__":
8396
for x in list(locals()):
8497
if str(x)[:4] == "test":

0 commit comments

Comments
 (0)