store.gd 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. @tool
  2. class_name ModToolStore
  3. extends Node
  4. # Global store for all Data the ModTool requires.
  5. const PATH_SAVE_FILE := "user://mod-tool-plugin-save.json"
  6. const PATH_TEMPLATES_DIR := "res://addons/mod_tool/templates/"
  7. var editor_plugin: EditorPlugin
  8. var editor_file_system: EditorFileSystem
  9. var editor_base_control: Control
  10. var name_mod_dir := "":
  11. set = set_name_mod_dir
  12. var path_mod_dir := ""
  13. var path_current_template_dir := "res://addons/mod_tool/templates/default/"
  14. var path_export_dir := "":
  15. set = set_path_export_dir
  16. var path_temp_dir := ""
  17. var path_manifest := ""
  18. var path_global_export_dir := ""
  19. var path_global_project_dir := ""
  20. var path_global_temp_dir := ""
  21. var path_addon_dir := "res://addons/mod_tool/"
  22. var path_global_addon_dir := ""
  23. var path_global_seven_zip := ""
  24. var path_global_seven_zip_base_dir := ""
  25. var path_global_final_zip := ""
  26. var excluded_file_extensions: PackedStringArray = [".csv.import"]
  27. var path_mod_files := []
  28. var path_script_backup_dir := "res://addons/mod_tool/.script_backup"
  29. var current_os := ""
  30. var is_seven_zip_installed := true
  31. var pending_reloads: Array[String] = []
  32. var is_hook_generation_done := false
  33. var hooked_scripts := {}
  34. # ModManifest instance
  35. var manifest_data : ModManifest
  36. var mod_hook_preprocessor := _ModLoaderModHookPreProcessor.new()
  37. func _ready() -> void:
  38. load_store()
  39. if not DirAccess.dir_exists_absolute(path_script_backup_dir):
  40. create_script_backup_dir()
  41. func _exit_tree() -> void:
  42. save_store()
  43. func set_name_mod_dir(new_name_mod_dir: String) -> void:
  44. name_mod_dir = new_name_mod_dir
  45. update_paths(new_name_mod_dir)
  46. func set_path_export_dir(new_path_export_dir: String) -> void:
  47. path_export_dir = new_path_export_dir
  48. path_global_export_dir = ProjectSettings.globalize_path(path_export_dir)
  49. path_global_final_zip = "%s/%s.zip" % [path_global_export_dir, name_mod_dir]
  50. func init(store: Dictionary) -> void:
  51. path_global_project_dir = ProjectSettings.globalize_path(_ModLoaderPath.get_local_folder_dir())
  52. path_global_addon_dir = path_global_project_dir + "addons/mod_tool/"
  53. if OS.has_feature("windows"):
  54. current_os = "windows"
  55. elif OS.has_feature("macos"):
  56. current_os = "osx"
  57. elif OS.has_feature("linux"):
  58. current_os = "x11"
  59. else:
  60. ModToolUtils.output_error("OS currently not supported. Please open an issue on GitHub")
  61. name_mod_dir = store.name_mod_dir
  62. path_mod_dir = "res://mods-unpacked/" + store.name_mod_dir
  63. path_current_template_dir = store.path_current_template_dir
  64. path_export_dir = store.path_export_dir
  65. path_global_export_dir = ProjectSettings.globalize_path(path_export_dir)
  66. path_temp_dir = "user://temp/" + store.name_mod_dir
  67. path_manifest = path_mod_dir + "/manifest.json"
  68. path_global_temp_dir = ProjectSettings.globalize_path(path_temp_dir)
  69. path_global_final_zip = "%s/%s.zip" % [path_global_export_dir, name_mod_dir]
  70. excluded_file_extensions = []
  71. is_hook_generation_done = store.is_hook_generation_done
  72. hooked_scripts = JSON.parse_string(store.hooked_scripts)
  73. mod_hook_preprocessor.hashmap = JSON.parse_string(store.mod_hook_preprocessor_hashmap)
  74. func update_paths(new_name_mod_dir: String) -> void:
  75. path_mod_dir = "res://mods-unpacked/" + new_name_mod_dir
  76. path_temp_dir = "user://temp/" + new_name_mod_dir
  77. path_global_temp_dir = ProjectSettings.globalize_path(path_temp_dir)
  78. path_manifest = path_mod_dir + "/manifest.json"
  79. path_global_final_zip = "%s/%s.zip" % [path_global_export_dir, name_mod_dir]
  80. func create_script_backup_dir() -> void:
  81. DirAccess.make_dir_recursive_absolute(path_script_backup_dir)
  82. FileAccess.open("%s/.gdignore" % path_script_backup_dir, FileAccess.WRITE)
  83. func save_store() -> void:
  84. var save_data := {
  85. "name_mod_dir": name_mod_dir,
  86. "path_mod_dir": path_mod_dir,
  87. "path_current_template_dir": path_current_template_dir,
  88. "path_export_dir": path_export_dir,
  89. "path_global_project_dir": path_global_project_dir,
  90. "path_temp_dir": path_temp_dir,
  91. "excluded_file_extensions": excluded_file_extensions,
  92. "is_hook_generation_done": is_hook_generation_done,
  93. "hooked_scripts": JSON.stringify(hooked_scripts),
  94. "mod_hook_preprocessor_hashmap": JSON.stringify(mod_hook_preprocessor.hashmap)
  95. }
  96. var file := FileAccess.open(PATH_SAVE_FILE, FileAccess.WRITE)
  97. if not file:
  98. ModToolUtils.output_error(str(FileAccess.get_open_error()))
  99. file.store_string(JSON.stringify(save_data))
  100. file.close()
  101. # NOTE: Check if mod_dir still exists when loading
  102. func load_store() -> void:
  103. if not FileAccess.file_exists(PATH_SAVE_FILE):
  104. return
  105. var file := FileAccess.open(PATH_SAVE_FILE, FileAccess.READ)
  106. if not file:
  107. ModToolUtils.output_error(str(FileAccess.get_open_error()))
  108. var content := file.get_as_text()
  109. var test_json_conv = JSON.new()
  110. test_json_conv.parse(content)
  111. init(test_json_conv.data)