diff --git a/UnityPy/files/SerializedFile.py b/UnityPy/files/SerializedFile.py index 309dd106..9ce1342d 100644 --- a/UnityPy/files/SerializedFile.py +++ b/UnityPy/files/SerializedFile.py @@ -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 diff --git a/tests/test_dependencies.py b/tests/test_dependencies.py new file mode 100644 index 00000000..864862b8 --- /dev/null +++ b/tests/test_dependencies.py @@ -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