Dump MonoBehaviours in a scene tree folder structure · UserUnknownFactor/UnityPy@23c51ab · GitHub
Skip to content

Commit 23c51ab

Browse files
Dump MonoBehaviours in a scene tree folder structure
Function to print scene tree
1 parent 37dfb6a commit 23c51ab

11 files changed

Lines changed: 245 additions & 81 deletions

File tree

‎UnityPy/classes/GameObject.py‎

Lines changed: 13 additions & 4 deletions

‎UnityPy/classes/Object.py‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ class Object(object):
1212

1313
def __init__(self, reader: ObjectReader):
1414
self.reader = reader
15-
self.assets_file = reader.assets_file
1615
self.type = reader.type
1716
self.path_id = reader.path_id
1817
self.version = reader.version

‎UnityPy/classes/Texture2D.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ def image(self, img):
3939
self.m_MipCount = 1
4040
# img.width * img.height * (cahnnel count = len(img.getbands()))
4141
self.m_TextureFormat = tex_format
42+
#print(tex_format.name)
4243

4344
@property
4445
def image_data(self):

‎UnityPy/environment.py‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ def load_file(
124124
str(file.__hash__()) if hasattr(file, "__hash__") else "",
125125
))
126126

127+
f = None
127128
if typ == FileType.AssetsFile:
128129
f = files.SerializedFile(reader, parent, name=stream_name)
129130
self.register_cab(stream_name, f)
@@ -154,14 +155,17 @@ def load_zip_file(self, value):
154155
self.load_assets(z.namelist(), lambda x: z.open(x, "r"))
155156
z.close()
156157

157-
def save(self, pack: str = "none", writer_generator: Callable = None):
158+
def save(self, pack: str = "none", writer_generator: Callable = None, out_path=None):
158159
"""Saves all changed assets.
159160
Mark assets as changed using `.mark_changed()`.
160161
pack = "none" (default) or "lz4"
161162
"""
162163
for f in self.files:
163-
if self.files[f].is_changed:
164-
fn = os.path.join(self.out_path, os.path.basename(f))
164+
opath = self.out_path
165+
if out_path:
166+
opath = out_path
167+
if hasattr(self.files[f], "is_changed") and self.files[f].is_changed:
168+
fn = os.path.join(opath, os.path.basename(f))
165169
with open(fn, "wb") as out:
166170
out.write(self.files[f].save(packer=pack, writer=writer_generator(fn) if writer_generator else None))
167171

‎UnityPy/files/File.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ def __repr__(self):
159159
return f"<{self.__class__.__name__}>"
160160

161161
def mark_changed(self):
162-
if isinstance(self.parent, File):
162+
if self.parent is not None and hasattr(self.parent, "is_changed"):
163163
self.parent.mark_changed()
164164
self.is_changed = True
165165

‎UnityPy/files/ObjectReader.py‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
from ..helpers.Tpk import get_typetree_nodes
77
from ..exceptions import TypeTreeError
88

9-
DEBUG = False
109

1110
class ObjectReader:
1211
byte_start: int
@@ -172,8 +171,8 @@ def read(self, return_typetree_on_error: bool=False):
172171
obj = self.read_typetree(wrap=True)
173172
self._last_read_pos = self.reader.Position
174173
end_pos = self.byte_start + self.byte_size
175-
if DEBUG and self._last_read_pos < end_pos and obj:
176-
raise Exception(f"self._last_read_pos < end_pos: {self._last_read_pos} < {end_pos} (diff = {end_pos-self._last_read_pos})")
174+
if False and self._last_read_pos < end_pos and obj and obj.type == ClassIDType.MonoBehaviour:
175+
raise Exception(f"self._last_read_pos < end_pos: {self._last_read_pos} < {end_pos} (diff = {end_pos-self._last_read_pos}) in {obj}")
177176
return obj
178177

179178
def get(self, key, default=None):

‎UnityPy/files/SerializedFile.py‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ def write(self, serialized_file, writer, is_ref_type):
166166
writer.write_string_to_null(self.m_NameSpace)
167167
writer.write_string_to_null(self.m_AssemblyName)
168168
else:
169-
writer.write_int_array(self.type_dependencies)
169+
writer.write_int_array(self.type_dependencies, True)
170170

171171

172172
class SerializedFile(File.File):
@@ -370,8 +370,8 @@ def read_type_tree(self):
370370

371371
def read_type_tree_blob(self):
372372
reader = self.reader
373-
number_of_nodes = self.reader.read_int()
374-
string_buffer_size = self.reader.read_int()
373+
number_of_nodes = self.reader.read_u_int()
374+
string_buffer_size = self.reader.read_u_int()
375375

376376
type = f"{reader.endian}hBBIIiii"
377377
keys = [
@@ -615,9 +615,9 @@ def save_type_tree5(self, nodes: list, writer: EndianBinaryWriter, str_data=b'')
615615
]
616616

617617
# number of nodes
618-
writer.write_int(len(nodes))
618+
writer.write_u_int(len(nodes))
619619
# string buffer size
620-
writer.write_int(string_buffer.Length)
620+
writer.write_u_int(string_buffer.Length)
621621

622622
# nodes
623623
for i, node in enumerate(nodes):
@@ -643,10 +643,10 @@ def save_type_tree5(self, nodes: list, writer: EndianBinaryWriter, str_data=b'')
643643

644644
# string buffer
645645
writer.write(string_buffer.bytes)
646-
647646
if self.header.version >= 21:
648-
writer.write_bytes(b"\x00" * 4)
649-
647+
#writer.align_stream() # TOFIX: maybe align stream?
648+
writer.write_bytes(b"\0" * 4)
649+
pass
650650

651651
def read_string(string_buffer_reader: EndianBinaryReader, value: int) -> str:
652652
is_offset = (value & 0x80000000) == 0

‎UnityPy/helpers/ImportHelper.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,5 +143,5 @@ def parse_file(
143143
elif typ == FileType.WebFile:
144144
f = files.WebFile(reader, parent, name=name, is_dependency=is_dependency)
145145
else:
146-
f = reader
146+
f = None
147147
return f

‎UnityPy/helpers/TypeTreeHelper.py‎

Lines changed: 2 additions & 1 deletion

0 commit comments

Comments
 (0)