added the game

This commit is contained in:
JHDev2006
2025-09-13 16:30:32 +01:00
parent 5ef689109b
commit 3773bdaf64
3616 changed files with 263702 additions and 0 deletions

View File

@@ -0,0 +1,278 @@
@tool
extends PanelContainer
var input_fields := []
@onready var mod_tool_store: ModToolStore = get_node_or_null("/root/ModToolStore")
@onready var manifest_input_vbox := $"%InputVBox"
@onready var input_incompatibilities: ModToolInterfaceInputString = $"%Incompatibilities"
@onready var input_dependencies: ModToolInterfaceInputString = $"%Dependencies"
@onready var input_optional_dependencies: ModToolInterfaceInputString = $"%OptionalDependencies"
@onready var input_load_before: ModToolInterfaceInputString = $"%LoadBefore"
func _ready() -> void:
$VBox/Panel.add_theme_stylebox_override("panel", ThemeDB.get_default_theme().get_stylebox("bg", "ItemList"))
# Setup input fields
for node in manifest_input_vbox.get_children():
if node is ModToolInterfaceInputString:
input_fields.append(node)
func load_manifest() -> void:
var manifest_dict_json := _ModLoaderFile.get_json_as_dict(mod_tool_store.path_manifest)
mod_tool_store.manifest_data = ModManifest.new(manifest_dict_json, mod_tool_store.path_mod_dir)
ModToolUtils.output_info("Loaded manifest from " + mod_tool_store.path_manifest)
func save_manifest() -> void:
var invalid_inputs := get_invalid()
if invalid_inputs.size() == 0:
var _is_success := ModToolUtils.save_to_manifest_json(mod_tool_store.manifest_data, mod_tool_store.path_manifest)
else:
ModToolUtils.output_error('Invalid Manifest - Manifest not saved! Please check your inputs in the following fields -> ' + ", ".join(invalid_inputs))
func update_ui() -> void:
# For each input field
for input in input_fields:
# Check if the key used in the ModToolInterfaceInputString instance is in the data_dict.
if mod_tool_store.manifest_data.get(input.key):
var value = mod_tool_store.manifest_data.get(input.key)
# If the value is an Array create a comma separated list
if value is PackedStringArray:
input.input_text = ", ".join(value)
# Else convert the value to a string
else:
input.input_text = str(value)
# If the key is not in the data clear the input
else:
input.input_text = ""
# Returns an array of invalid fields
func get_invalid() -> Array:
var invalid_fields := []
for input in input_fields:
if not input.is_valid:
invalid_fields.append(input.label_text)
return invalid_fields
func _update_manifest_value(input: ModToolInterfaceInputString, new_value) -> void:
if mod_tool_store.manifest_data:
mod_tool_store.manifest_data.set(input.key, new_value)
func _on_SaveManifest_pressed() -> void:
save_manifest()
# Validated StringInputs
# =============================================================================
func _on_ModName_value_changed(new_text: String, input_node: ModToolInterfaceInputString) -> void:
_update_manifest_value(input_node, new_text)
input_node.validate(mod_tool_store.manifest_data.is_name_or_namespace_valid(new_text, true))
func _on_Namespace_value_changed(new_text: String, input_node: ModToolInterfaceInputString) -> void:
_update_manifest_value(input_node, new_text)
input_node.validate(mod_tool_store.manifest_data.is_name_or_namespace_valid(new_text, true))
func _on_Version_value_changed(new_text: String, input_node: ModToolInterfaceInputString) -> void:
_update_manifest_value(input_node, new_text)
input_node.validate(mod_tool_store.manifest_data.is_semver_valid("", new_text, "version", true))
# When dealing with Inputs that depend on other Inputs, the `input_node` is not utilized.
# This is because the `value_changed` signal is connected to this method for all relevant inputs.
# As a result, the input_node would retrieve multiple different nodes, which should not be updated but rather revalidated.
# In such cases, the input node is directly referenced to prevent overwriting the values in other input fields.
func _on_Dependencies_value_changed(new_text: String, input_node: ModToolInterfaceInputString, validate_only: bool) -> void:
var dependencies: PackedStringArray
if validate_only:
dependencies = mod_tool_store.manifest_data.dependencies
else:
dependencies = input_dependencies.get_input_as_array_from_comma_separated_string()
_update_manifest_value(input_dependencies, dependencies)
var is_id_array_valid := mod_tool_store.manifest_data.is_mod_id_array_valid(mod_tool_store.name_mod_dir, dependencies, "dependencies", true)
var is_distinct_mod_id_incompatibilities := mod_tool_store.manifest_data.validate_distinct_mod_ids_in_arrays(
mod_tool_store.name_mod_dir,
dependencies,
mod_tool_store.manifest_data.incompatibilities,
["dependencies", "incompatibilities"],
"",
true
)
var is_distinct_mod_id_optional_dependencies := mod_tool_store.manifest_data.validate_distinct_mod_ids_in_arrays(
mod_tool_store.name_mod_dir,
dependencies,
mod_tool_store.manifest_data.optional_dependencies,
["dependencies", "optional_dependencies"],
"",
true
)
input_dependencies.validate(
is_id_array_valid and
is_distinct_mod_id_incompatibilities and
is_distinct_mod_id_optional_dependencies
)
# When dealing with Inputs that depend on other Inputs, the `input_node` is not utilized.
# This is because the `value_changed` signal is connected to this method for all relevant inputs.
# As a result, the input_node would retrieve multiple different nodes, which should not be updated but rather revalidated.
# In such cases, the input node is directly referenced to prevent overwriting the values in other input fields.
func _on_OptionalDependencies_value_changed(new_text: String, input_node: ModToolInterfaceInputString, validate_only: bool) -> void:
var optional_dependencies: PackedStringArray
if validate_only:
optional_dependencies = mod_tool_store.manifest_data.optional_dependencies
else:
optional_dependencies = input_optional_dependencies.get_input_as_array_from_comma_separated_string()
_update_manifest_value(input_optional_dependencies, optional_dependencies)
var is_id_array_valid := mod_tool_store.manifest_data.is_mod_id_array_valid(mod_tool_store.name_mod_dir, optional_dependencies, "optional_dependencies", true)
var is_distinct_mod_id_incompatibilities := mod_tool_store.manifest_data.validate_distinct_mod_ids_in_arrays(
mod_tool_store.name_mod_dir,
optional_dependencies,
mod_tool_store.manifest_data.incompatibilities,
["optional_dependencies", "incompatibilities"],
"",
true
)
var is_distinct_mod_id_dependencies := mod_tool_store.manifest_data.validate_distinct_mod_ids_in_arrays(
mod_tool_store.name_mod_dir,
optional_dependencies,
mod_tool_store.manifest_data.dependencies,
["optional_dependencies", "dependencies"],
"",
true
)
input_optional_dependencies.validate(
is_id_array_valid and
is_distinct_mod_id_incompatibilities and
is_distinct_mod_id_dependencies
)
func _on_CompatibleModLoaderVersions_value_changed(new_text: String, input_node: ModToolInterfaceInputString) -> void:
var compatible_modloader_versions := input_node.get_input_as_array_from_comma_separated_string()
_update_manifest_value(input_node, compatible_modloader_versions)
input_node.validate(mod_tool_store.manifest_data.is_semver_version_array_valid(mod_tool_store.name_mod_dir, compatible_modloader_versions, "Compatible ModLoader Versions", true))
# When dealing with Inputs that depend on other Inputs, the `input_node` is not utilized.
# This is because the `value_changed` signal is connected to this method for all relevant inputs.
# As a result, the input_node would retrieve multiple different nodes, which should not be updated but rather revalidated.
# In such cases, the input node is directly referenced to prevent overwriting the values in other input fields.
func _on_Incompatibilities_value_changed(new_text: String, input_node: ModToolInterfaceInputString, validate_only: bool) -> void:
var incompatibilities: PackedStringArray
if validate_only:
incompatibilities = mod_tool_store.manifest_data.incompatibilities
else:
incompatibilities = input_incompatibilities.get_input_as_array_from_comma_separated_string()
_update_manifest_value(input_incompatibilities, incompatibilities)
var is_mod_id_array_valid := mod_tool_store.manifest_data.is_mod_id_array_valid(mod_tool_store.name_mod_dir, incompatibilities, "incompatibilities", true)
var is_distinct_mod_id_dependencies := mod_tool_store.manifest_data.validate_distinct_mod_ids_in_arrays(
mod_tool_store.name_mod_dir,
mod_tool_store.manifest_data.dependencies,
incompatibilities,
["dependencies", "incompatibilities"],
"",
true
)
var is_distinct_mod_id_optional_dependencies := mod_tool_store.manifest_data.validate_distinct_mod_ids_in_arrays(
mod_tool_store.name_mod_dir,
mod_tool_store.manifest_data.optional_dependencies,
incompatibilities,
["optional_dependencies", "incompatibilities"],
"",
true
)
input_incompatibilities.validate(
is_mod_id_array_valid and
is_distinct_mod_id_dependencies and
is_distinct_mod_id_optional_dependencies
)
# When dealing with Inputs that depend on other Inputs, the `input_node` is not utilized.
# This is because the `value_changed` signal is connected to this method for all relevant inputs.
# As a result, the input_node would retrieve multiple different nodes, which should not be updated but rather revalidated.
# In such cases, the input node is directly referenced to prevent overwriting the values in other input fields.
func _on_LoadBefore_value_changed(new_text: String, input_node: ModToolInterfaceInputString, validate_only: bool) -> void:
var load_before: PackedStringArray
if validate_only:
load_before = mod_tool_store.manifest_data.load_before
else:
load_before = input_load_before.get_input_as_array_from_comma_separated_string()
_update_manifest_value(input_load_before, load_before)
var is_mod_id_array_valid := mod_tool_store.manifest_data.is_mod_id_array_valid(mod_tool_store.name_mod_dir, load_before, "load_before", true)
var is_distinct_mod_id_dependencies := mod_tool_store.manifest_data.validate_distinct_mod_ids_in_arrays(
mod_tool_store.name_mod_dir,
load_before,
mod_tool_store.manifest_data.dependencies,
["load_before", "dependencies"],
"\"load_before\" should be handled as optional dependency adding it to \"dependencies\" will cancel out the desired effect.",
true
)
var is_distinct_mod_id_optional_dependencies := mod_tool_store.manifest_data.validate_distinct_mod_ids_in_arrays(
mod_tool_store.name_mod_dir,
load_before,
mod_tool_store.manifest_data.optional_dependencies,
["load_before", "optional_dependencies"],
"\"load_before\" can be viewed as optional dependency, please remove the duplicate mod-id.",
true
)
input_load_before.validate(
is_mod_id_array_valid and
is_distinct_mod_id_dependencies and
is_distinct_mod_id_optional_dependencies
)
# Non Validated StringInputs
# =============================================================================
func _on_WebsiteUrl_value_changed(new_text: String, input_node: ModToolInterfaceInputString) -> void:
_update_manifest_value(input_node, new_text)
func _on_Description_value_changed(new_text: String, input_node: ModToolInterfaceInputString) -> void:
_update_manifest_value(input_node, new_text)
func _on_Authors_value_changed(new_text: String, input_node: ModToolInterfaceInputString) -> void:
var authors := input_node.get_input_as_array_from_comma_separated_string()
_update_manifest_value(input_node, authors)
func _on_CompatibleGameVersions_value_changed(new_text: String, input_node: ModToolInterfaceInputString) -> void:
var compatible_game_versions := input_node.get_input_as_array_from_comma_separated_string()
_update_manifest_value(input_node, compatible_game_versions)
func _on_Tags_value_changed(new_text: String, input_node: ModToolInterfaceInputString) -> void:
var tags := input_node.get_input_as_array_from_comma_separated_string()
_update_manifest_value(input_node, tags)

View File

@@ -0,0 +1 @@
uid://c4jhb2cmcvg3k

View File

@@ -0,0 +1,289 @@
[gd_scene load_steps=5 format=3 uid="uid://hpefgw6k5qpq"]
[ext_resource type="PackedScene" path="res://addons/mod_tool/interface/global/input_string_multiline.tscn" id="1"]
[ext_resource type="PackedScene" path="res://addons/mod_tool/interface/global/input_string.tscn" id="2"]
[ext_resource type="Script" path="res://addons/mod_tool/interface/manifest_editor/manifest_editor.gd" id="4"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_pun0q"]
content_margin_left = 4.0
content_margin_top = 4.0
content_margin_right = 4.0
content_margin_bottom = 4.0
bg_color = Color(1, 0.365, 0.365, 1)
draw_center = false
border_width_left = 2
border_width_top = 2
border_width_right = 2
border_width_bottom = 2
corner_detail = 1
[node name="ModManifest" type="PanelContainer"]
unique_name_in_owner = true
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
script = ExtResource("4")
[node name="VBox" type="VBoxContainer" parent="."]
layout_mode = 2
[node name="HBox2" type="HBoxContainer" parent="VBox"]
layout_mode = 2
[node name="Label" type="Label" parent="VBox/HBox2"]
layout_mode = 2
size_flags_horizontal = 3
text = "Metadata required for your mod"
[node name="ErrorLabel" type="Label" parent="VBox/HBox2"]
unique_name_in_owner = true
layout_mode = 2
text = "Manifest is valid"
[node name="ShouldValidate" type="CheckButton" parent="VBox/HBox2"]
unique_name_in_owner = true
layout_mode = 2
flat = true
[node name="VSeparator" type="VSeparator" parent="VBox/HBox2"]
layout_mode = 2
[node name="SaveManifest" type="Button" parent="VBox/HBox2"]
layout_mode = 2
text = "Save to manifest.json"
[node name="Panel" type="PanelContainer" parent="VBox"]
layout_mode = 2
size_flags_vertical = 3
theme_override_styles/panel = SubResource("StyleBoxFlat_pun0q")
[node name="ScrollContainer" type="ScrollContainer" parent="VBox/Panel"]
layout_mode = 2
size_flags_vertical = 3
follow_focus = true
[node name="InputVBox" type="VBoxContainer" parent="VBox/Panel/ScrollContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
[node name="Category" type="LineEdit" parent="VBox/Panel/ScrollContainer/InputVBox"]
layout_mode = 2
mouse_filter = 2
mouse_default_cursor_shape = 0
text = "Manifest"
editable = false
context_menu_enabled = false
virtual_keyboard_enabled = false
shortcut_keys_enabled = false
middle_mouse_paste_enabled = false
[node name="ModName" parent="VBox/Panel/ScrollContainer/InputVBox" instance=ExtResource("2")]
unique_name_in_owner = true
layout_mode = 2
tooltip_text = "Name of the Mod.
Only letters, numbers and underscores allowed."
mouse_default_cursor_shape = 16
is_required = true
key = "name"
label_text = "Mod Name"
hint_text = "Name of the Mod.
Only letters, numbers and underscores allowed."
[node name="Namespace" parent="VBox/Panel/ScrollContainer/InputVBox" instance=ExtResource("2")]
unique_name_in_owner = true
layout_mode = 2
tooltip_text = "Namespace of the Mod.
Often just the main author or team name.
Only letters, numbers and underscores allowed."
mouse_default_cursor_shape = 16
is_required = true
key = "mod_namespace"
label_text = "Namespace"
hint_text = "Namespace of the Mod.
Often just the main author or team name.
Only letters, numbers and underscores allowed."
[node name="Version" parent="VBox/Panel/ScrollContainer/InputVBox" instance=ExtResource("2")]
unique_name_in_owner = true
layout_mode = 2
tooltip_text = "Semantic version string.
Only integers and periods allowed.
Format: {major}.{minor}.{patch}
For reference, see https://semver.org"
mouse_default_cursor_shape = 16
input_text = "0.0.1"
is_required = true
key = "version_number"
label_text = "Version"
hint_text = "Semantic version string.
Only integers and periods allowed.
Format: {major}.{minor}.{patch}
For reference, see https://semver.org"
[node name="WebsiteUrl" parent="VBox/Panel/ScrollContainer/InputVBox" instance=ExtResource("2")]
unique_name_in_owner = true
layout_mode = 2
tooltip_text = "URL for your website or repository."
mouse_default_cursor_shape = 16
input_placeholder = "https://example.com"
key = "website_url"
label_text = "Mod website URL"
hint_text = "URL for your website or repository."
[node name="Dependencies" parent="VBox/Panel/ScrollContainer/InputVBox" instance=ExtResource("2")]
unique_name_in_owner = true
layout_mode = 2
tooltip_text = "Comma-separated list of mod IDs.
Only letters, numbers and underscores allowed.
A single dash in the middle is required.
Format: {namespace}-{name}
Dependencies can't be in Incompatibilities or Optional Dependencies.
"
mouse_default_cursor_shape = 16
input_placeholder = "Namespace-ModName, Author-Name"
key = "dependencies"
label_text = "Dependencies"
hint_text = "Comma-separated list of mod IDs.
Only letters, numbers and underscores allowed.
A single dash in the middle is required.
Format: {namespace}-{name}
Dependencies can't be in Incompatibilities or Optional Dependencies.
"
[node name="Description" parent="VBox/Panel/ScrollContainer/InputVBox" instance=ExtResource("1")]
unique_name_in_owner = true
layout_mode = 2
key = "description"
label_text = "Description"
[node name="Category2" type="LineEdit" parent="VBox/Panel/ScrollContainer/InputVBox"]
layout_mode = 2
mouse_filter = 2
mouse_default_cursor_shape = 0
text = "Manifest Extra"
editable = false
context_menu_enabled = false
virtual_keyboard_enabled = false
shortcut_keys_enabled = false
middle_mouse_paste_enabled = false
[node name="Authors" parent="VBox/Panel/ScrollContainer/InputVBox" instance=ExtResource("2")]
unique_name_in_owner = true
layout_mode = 2
tooltip_text = "Comma-separated list of Authors"
mouse_default_cursor_shape = 16
input_placeholder = "Author1, Autor2"
key = "authors"
label_text = "Authors"
hint_text = "Comma-separated list of Authors"
[node name="Incompatibilities" parent="VBox/Panel/ScrollContainer/InputVBox" instance=ExtResource("2")]
unique_name_in_owner = true
layout_mode = 2
tooltip_text = "Comma-separated list of mod IDs.
Only letters, numbers and underscores allowed.
A single dash in the middle is required.
Format: {namespace}-{name}
Incompatible Mods can't be in dependencies or optional dependencies."
mouse_default_cursor_shape = 16
input_placeholder = "Namespace-ModName, Author-Name"
key = "incompatibilities"
label_text = "Incompatible Mods"
hint_text = "Comma-separated list of mod IDs.
Only letters, numbers and underscores allowed.
A single dash in the middle is required.
Format: {namespace}-{name}
Incompatible Mods can't be in dependencies or optional dependencies."
[node name="OptionalDependencies" parent="VBox/Panel/ScrollContainer/InputVBox" instance=ExtResource("2")]
unique_name_in_owner = true
layout_mode = 2
tooltip_text = "Comma-separated list of mod IDs.
Only letters, numbers and underscores allowed.
A single dash in the middle is required.
Format: {namespace}-{name}
Optional Dependencies can't be in Incompatibilities or Dependencies."
mouse_default_cursor_shape = 16
input_placeholder = "Namespace-ModName, Author-Name"
key = "optional_dependencies"
label_text = "Optional Dependencies"
hint_text = "Comma-separated list of mod IDs.
Only letters, numbers and underscores allowed.
A single dash in the middle is required.
Format: {namespace}-{name}
Optional Dependencies can't be in Incompatibilities or Dependencies."
[node name="LoadBefore" parent="VBox/Panel/ScrollContainer/InputVBox" instance=ExtResource("2")]
unique_name_in_owner = true
layout_mode = 2
tooltip_text = "Comma-separated list of mod IDs.
Only letters, numbers and underscores allowed.
A single dash in the middle is required.
Format: {namespace}-{name}
Should be handled as optional dependency adding it to \"dependencies\" will cancel out the desired effect.
Can be viewed as optional dependency, please remove duplicate mod-id from \"optional_dependencies\"."
mouse_default_cursor_shape = 16
input_placeholder = "Namespace-ModName, Author-Name"
key = "load_before"
label_text = "Load Before"
hint_text = "Comma-separated list of mod IDs.
Only letters, numbers and underscores allowed.
A single dash in the middle is required.
Format: {namespace}-{name}
Should be handled as optional dependency adding it to \"dependencies\" will cancel out the desired effect.
Can be viewed as optional dependency, please remove duplicate mod-id from \"optional_dependencies\"."
[node name="CompatibleGameVersions" parent="VBox/Panel/ScrollContainer/InputVBox" instance=ExtResource("2")]
unique_name_in_owner = true
layout_mode = 2
tooltip_text = "Comma-separated list of valid game versions."
mouse_default_cursor_shape = 16
input_placeholder = "1.0.0, 1.2.0"
key = "compatible_game_version"
label_text = "Compatible Game Versions"
hint_text = "Comma-separated list of valid game versions."
[node name="CompatibleModLoaderVersions" parent="VBox/Panel/ScrollContainer/InputVBox" instance=ExtResource("2")]
unique_name_in_owner = true
layout_mode = 2
tooltip_text = "Comma-separated list of ModLoader versions."
mouse_default_cursor_shape = 16
input_placeholder = "5.0.0, 4.1.0"
is_required = true
key = "compatible_mod_loader_version"
label_text = "Compatible Mod Loader Versions"
hint_text = "Comma-separated list of ModLoader versions."
[node name="Tags" parent="VBox/Panel/ScrollContainer/InputVBox" instance=ExtResource("2")]
unique_name_in_owner = true
layout_mode = 2
tooltip_text = "Comma-separated list of tags that describe your mod.."
mouse_default_cursor_shape = 16
input_placeholder = "Tag1, Tag2"
key = "tags"
label_text = "Tags"
hint_text = "Comma-separated list of tags that describe your mod.."
[connection signal="pressed" from="VBox/HBox2/SaveManifest" to="." method="_on_SaveManifest_pressed"]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/ModName" to="." method="_on_ModName_value_changed"]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/Namespace" to="." method="_on_Namespace_value_changed"]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/Version" to="." method="_on_Version_value_changed"]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/WebsiteUrl" to="." method="_on_WebsiteUrl_value_changed"]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/Dependencies" to="." method="_on_OptionalDependencies_value_changed" flags=3 binds= [true]]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/Dependencies" to="." method="_on_Incompatibilities_value_changed" flags=3 binds= [true]]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/Dependencies" to="." method="_on_Dependencies_value_changed" binds= [false]]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/Description" to="." method="_on_Description_value_changed"]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/Authors" to="." method="_on_Authors_value_changed"]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/Incompatibilities" to="." method="_on_OptionalDependencies_value_changed" flags=3 binds= [true]]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/Incompatibilities" to="." method="_on_Incompatibilities_value_changed" binds= [false]]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/Incompatibilities" to="." method="_on_Dependencies_value_changed" flags=3 binds= [true]]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/OptionalDependencies" to="." method="_on_OptionalDependencies_value_changed" binds= [false]]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/OptionalDependencies" to="." method="_on_Incompatibilities_value_changed" flags=3 binds= [true]]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/OptionalDependencies" to="." method="_on_Dependencies_value_changed" flags=3 binds= [true]]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/LoadBefore" to="." method="_on_OptionalDependencies_value_changed" flags=3 binds= [true]]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/LoadBefore" to="." method="_on_LoadBefore_value_changed" binds= [false]]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/LoadBefore" to="." method="_on_Dependencies_value_changed" flags=3 binds= [true]]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/CompatibleGameVersions" to="." method="_on_CompatibleGameVersions_value_changed"]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/CompatibleModLoaderVersions" to="." method="_on_CompatibleModLoaderVersions_value_changed"]
[connection signal="value_changed" from="VBox/Panel/ScrollContainer/InputVBox/Tags" to="." method="_on_Tags_value_changed"]