hook_gen.gd 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. @tool
  2. class_name ModToolHookGen
  3. extends RefCounted
  4. static func transform_one(path: String, mod_tool_store: ModToolStore) -> Error:
  5. var source_code_processed := mod_tool_store.mod_hook_preprocessor.process_script(path, true)
  6. var backup_path := "%s/%s" % [mod_tool_store.path_script_backup_dir, path.trim_prefix("res://")]
  7. # Create a backup of the vanilla script files
  8. if not FileAccess.file_exists(backup_path):
  9. ModToolUtils.file_copy(path, backup_path)
  10. var file := FileAccess.open(path, FileAccess.WRITE)
  11. if not file:
  12. var error := file.get_error()
  13. return error
  14. # Write processed source_code to file
  15. file.store_string(source_code_processed)
  16. file.close()
  17. mod_tool_store.hooked_scripts[path] = true
  18. return OK
  19. static func restore(path: String, mod_tool_store: ModToolStore) -> Error:
  20. var backup_path := "%s/%s" % [mod_tool_store.path_script_backup_dir, path.trim_prefix("res://")]
  21. var backup_file := FileAccess.open(backup_path, FileAccess.READ)
  22. if not backup_file:
  23. mod_tool_store.hooked_scripts.erase(path)
  24. clear_mod_hook_preprocessor_hashmap(path, mod_tool_store)
  25. return FileAccess.get_open_error()
  26. var restored_source := backup_file.get_as_text()
  27. var file := FileAccess.open(path, FileAccess.WRITE)
  28. if not file:
  29. return FileAccess.get_open_error()
  30. # Write processed source_code to file
  31. file.store_string(restored_source)
  32. file.close()
  33. mod_tool_store.hooked_scripts.erase(path)
  34. clear_mod_hook_preprocessor_hashmap(path, mod_tool_store)
  35. return OK
  36. static func clear_mod_hook_preprocessor_hashmap(path: String, mod_tool_store: ModToolStore) -> void:
  37. var script: GDScript = load(path)
  38. for method in script.get_script_method_list():
  39. mod_tool_store.mod_hook_preprocessor.hashmap.erase(_ModLoaderHooks.get_hook_hash(path, method.name))