| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- @tool
- extends Window
- signal mod_dir_created
- const DIR_NAME_DEFAULT_TEMPLATE = "default"
- const DIR_NAME_MINIMAL_TEMPLATE = "minimal"
- @onready var mod_tool_store: ModToolStore = get_node_or_null("/root/ModToolStore")
- @onready var mod_namespace: ModToolInterfaceInputString = $"%Namespace"
- @onready var mod_name: ModToolInterfaceInputString = $"%ModName"
- @onready var mod_id: ModToolInterfaceInputString = $"%ModId"
- @onready var mod_template: ModToolInterfaceInputOptions = $"%ModTemplate"
- func _ready() -> void:
- mod_namespace.show_error_if_not(false)
- mod_name.show_error_if_not(false)
- mod_id.show_error_if_not(false)
- func add_mod() -> void:
- # Validate mod-id
- if not mod_tool_store.manifest_data.is_mod_id_valid(mod_tool_store.name_mod_dir, mod_tool_store.name_mod_dir, "", true):
- ModToolUtils.output_error('Invalid name or namespace: "%s". You may only use letters, numbers, underscores and at least 3 characters for each.' % mod_tool_store.name_mod_dir)
- return
- # Check if mod dir exists
- if not _ModLoaderFile.dir_exists(mod_tool_store.path_mod_dir):
- # If not - create it
- var success := ModToolUtils.make_dir_recursive(mod_tool_store.path_mod_dir)
- if not success:
- return
- # Get Template files
- var template_paths := ModToolUtils.get_flat_view_dict(mod_tool_store.path_current_template_dir, "", [], false, true)
- # Copy current selected template dir files and folders to res://mods-unpacked
- for path in template_paths:
- var template_local_path := path.trim_prefix(mod_tool_store.path_current_template_dir) as String
- if _ModLoaderFile.file_exists(path):
- ModToolUtils.file_copy(path, mod_tool_store.path_mod_dir.path_join(template_local_path))
- else:
- ModToolUtils.make_dir_recursive(mod_tool_store.path_mod_dir.path_join(template_local_path))
- # Update FileSystem
- mod_tool_store.editor_file_system.scan()
- # Wait for the scan to finish
- await mod_tool_store.editor_file_system.filesystem_changed
- # Navigate to the new mod dir in the FileSystem pannel
- EditorInterface.get_file_system_dock().navigate_to_path(mod_tool_store.path_mod_dir.path_join("mod_main.gd"))
- # Output info
- ModToolUtils.output_info("Added base mod files to " + mod_tool_store.path_mod_dir)
- # Open mod_main.gd in the code editor
- var mod_main_script := load(mod_tool_store.path_mod_dir.path_join("mod_main.gd"))
- EditorInterface.edit_script(mod_main_script)
- EditorInterface.set_main_screen_editor("Script")
- # Split the new mod id
- var name_mod_dir_split: Array = mod_tool_store.name_mod_dir.split("-")
- # Update the namespace in the manifest
- mod_tool_store.manifest_data.mod_namespace = name_mod_dir_split[0]
- # Update the mod name in the manifest
- mod_tool_store.manifest_data.name = name_mod_dir_split[1]
- # Update manifest editor ui
- mod_tool_store.editor_plugin.tools_panel.manifest_editor.update_ui()
- # Open manifest editor
- mod_tool_store.editor_plugin.tools_panel.show_manifest_editor()
- # Save the manifest
- mod_tool_store.editor_plugin.tools_panel.manifest_editor.save_manifest()
- else:
- # If so - show error and ask if user wants to connect with the mod instead
- ModToolUtils.output_error("Mod directory at %s already exists." % mod_tool_store.path_mod_dir)
- # TODO: Ask user to connect with the mod instead
- return
- func clear_mod_id_input() -> void:
- mod_id.input_text = ""
- func get_template_options() -> Array[String]:
- var mod_template_options: Array[String] = []
- var template_dirs := _ModLoaderPath.get_dir_paths_in_dir(mod_tool_store.PATH_TEMPLATES_DIR)
- # Add the default templates
- mod_template_options.push_back(DIR_NAME_DEFAULT_TEMPLATE)
- mod_template_options.push_back(DIR_NAME_MINIMAL_TEMPLATE)
- for template_dir in template_dirs:
- var template_dir_name: String = template_dir.split("/")[-1]
- # Skip if its one of the default templates
- if (
- template_dir_name == DIR_NAME_DEFAULT_TEMPLATE or
- template_dir_name == DIR_NAME_MINIMAL_TEMPLATE
- ):
- continue
- # Add all the custom templates
- mod_template_options.push_back(template_dir_name)
- return mod_template_options
- func _on_Namespace_value_changed(new_value: String, input_node: ModToolInterfaceInputString) -> void:
- input_node.validate(mod_tool_store.manifest_data.is_name_or_namespace_valid(new_value, true))
- mod_id.input_text = "%s-%s" % [mod_namespace.get_input_value(), mod_name.get_input_value()]
- func _on_ModName_value_changed(new_value: String, input_node: ModToolInterfaceInputString) -> void:
- input_node.validate(mod_tool_store.manifest_data.is_name_or_namespace_valid(new_value, true))
- mod_id.input_text = "%s-%s" % [mod_namespace.get_input_value(), mod_name.get_input_value()]
- func _on_ModId_value_changed(new_value: String, input_node: ModToolInterfaceInputString) -> void:
- input_node.validate(mod_tool_store.manifest_data.is_mod_id_valid(new_value, new_value, "", true))
- mod_tool_store.name_mod_dir = new_value
- func _on_btn_create_mod_pressed() -> void:
- add_mod()
- emit_signal("mod_dir_created")
- func _on_CreateMod_about_to_show() -> void:
- # Reset Inputs
- mod_namespace.input_text = ""
- mod_name.input_text = ""
- # Reset Template
- mod_tool_store.path_current_template_dir = mod_tool_store.PATH_TEMPLATES_DIR + "default"
- # Get all Template options
- mod_template.input_options = get_template_options()
- func _on_ModTemplate_value_changed(new_value: String, input_node: ModToolInterfaceInputOptions) -> void:
- mod_tool_store.path_current_template_dir = mod_tool_store.PATH_TEMPLATES_DIR + new_value
- func _on_close_requested() -> void:
- hide()
|