Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions UnityPy/files/SerializedFile.py
Original file line number Diff line number Diff line change
Expand Up @@ -407,14 +407,14 @@ def load_dependencies(self, possible_dependencies: Optional[list] = None):
where the target file is not listed as external.
"""
for file_id in self.externals:
self.environment.load_file(file_id.path, True)
self.environment.load_file(file_id.path, is_dependency=True)

if possible_dependencies is None:
return

for dependency in possible_dependencies:
try:
self.environment.load_file(dependency, True)
self.environment.load_file(dependency, is_dependency=True)
except FileNotFoundError:
pass

Expand Down
39 changes: 39 additions & 0 deletions tests/test_dependencies.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import os

import UnityPy
from UnityPy.files import SerializedFile
from UnityPy.files.SerializedFile import FileIdentifier

SAMPLES = os.path.join(os.path.dirname(os.path.abspath(__file__)), "samples")


def write_serialized_files(directory):
"""main.assets, which lists dep.assets as an external, and dep.assets, both copies of a sample file"""
env = UnityPy.load(os.path.join(SAMPLES, "banner_1"))
bundle = next(iter(env.files.values()))
serialized = next(f for f in bundle.files.values() if isinstance(f, SerializedFile))
with open(os.path.join(directory, "dep.assets"), "wb") as f:
f.write(serialized.save())

external = object.__new__(FileIdentifier)
external.path = "dep.assets"
external.temp_empty = ""
external.guid = bytes(16)
external.type = 0
serialized.externals.append(external)
with open(os.path.join(directory, "main.assets"), "wb") as f:
f.write(serialized.save())
return len(serialized.objects)


def test_dependencies_are_not_listed_as_objects(tmp_path):
object_count = write_serialized_files(str(tmp_path))
env = UnityPy.load(os.path.join(str(tmp_path), "main.assets"))
assert len(env.objects) == object_count
main = next(iter(env.files.values()))

main.load_dependencies()
dependency = env.get_cab("dep.assets")
assert isinstance(dependency, SerializedFile)
assert dependency.is_dependency
assert len(env.objects) == object_count
Loading