diff --git a/Scenes/copy_multiplayer_settings.gd b/Scenes/copy_multiplayer_settings.gd index 4c00abe..79df733 100644 --- a/Scenes/copy_multiplayer_settings.gd +++ b/Scenes/copy_multiplayer_settings.gd @@ -1,24 +1,32 @@ class_name copyMultiplayerSettings extends TabContainer -@export var visible_icon: Texture2D -@export var hidden_icon: Texture2D +@export var visible_icon : Texture2D +@export var hidden_icon : Texture2D + +@export var connect_address : LineEdit +@export var connect_reveal : Button +@export var connect_port : SpinBox +@export var connect_join : Button +@export var connect_host : Button +@export var connect_disconnect : Button + +@export var settings_cache : LineEdit +@export var settings_file_dialog : FileDialog +@export var settings_nickname : LineEdit func is_tab_selected(tab_name: String) -> bool: return get_current_tab_control().name == tab_name func _on_cache_dir_dialog_pressed() -> void: - var widget: LineEdit = $"Settings/VBoxContainer/Cache/LineEdit" - - var dialog: FileDialog = $"Settings/VBoxContainer/Cache/FileDialog" - dialog.size = get_window().size / 2 - dialog.position = get_window().size / 4 - dialog.current_dir = widget.text - dialog.popup() + settings_file_dialog.size = get_window().size / 2 + settings_file_dialog.position = get_window().size / 4 + settings_file_dialog.current_dir = settings_cache.text + settings_file_dialog.popup() - widget.text = await dialog.dir_selected - widget.text_changed.emit(widget.text) + settings_cache.text = await settings_file_dialog.dir_selected + settings_cache.text_changed.emit(settings_cache.text) func _on_show_hide_address_toggled(toggled_on: bool) -> void: - $"Connect/VBoxContainer/Host/Address".secret = !toggled_on - $"Connect/VBoxContainer/Host/ShowHide".icon = visible_icon if toggled_on else hidden_icon + connect_address.secret = !toggled_on + connect_reveal.icon = visible_icon if toggled_on else hidden_icon diff --git a/Scenes/copy_multiplayer_settings.tscn b/Scenes/copy_multiplayer_settings.tscn index 5c53bf2..112d39b 100644 --- a/Scenes/copy_multiplayer_settings.tscn +++ b/Scenes/copy_multiplayer_settings.tscn @@ -4,7 +4,7 @@ [ext_resource type="Texture2D" uid="uid://qbho5oyu1kfa" path="res://Mods/copyMultiplayer/Resources/hidden.png" id="2_1u5pu"] [ext_resource type="Texture2D" uid="uid://dcmljlb2v6p16" path="res://Mods/copyMultiplayer/Resources/visible.png" id="2_ibe7i"] -[node name="copyMultiplayerSettings" type="TabContainer"] +[node name="copyMultiplayerSettings" type="TabContainer" node_paths=PackedStringArray("connect_address", "connect_reveal", "connect_port", "connect_join", "connect_host", "connect_disconnect", "settings_cache", "settings_file_dialog", "settings_nickname", "stats_ping", "stats_average", "stats_maximum")] anchors_preset = 15 anchor_right = 1.0 anchor_bottom = 1.0 @@ -12,13 +12,21 @@ grow_horizontal = 2 grow_vertical = 2 size_flags_horizontal = 3 size_flags_vertical = 3 -current_tab = 2 +current_tab = 0 script = ExtResource("1_7d55i") visible_icon = ExtResource("2_ibe7i") hidden_icon = ExtResource("2_1u5pu") +connect_address = NodePath("Connect/VBoxContainer/Join/Address") +connect_reveal = NodePath("Connect/VBoxContainer/Join/ShowHide") +connect_port = NodePath("Connect/VBoxContainer/Host/Port") +connect_join = NodePath("Connect/VBoxContainer/Join/Button") +connect_host = NodePath("Connect/VBoxContainer/Host/Button") +connect_disconnect = NodePath("Connect/VBoxContainer/Disconnect") +settings_cache = NodePath("Settings/VBoxContainer/Cache/LineEdit") +settings_file_dialog = NodePath("Settings/VBoxContainer/Cache/FileDialog") +settings_nickname = NodePath("Settings/VBoxContainer/Nickname/LineEdit") [node name="Connect" type="MarginContainer" parent="."] -visible = false layout_mode = 2 theme_override_constants/margin_left = 4 theme_override_constants/margin_top = 4 @@ -33,7 +41,7 @@ layout_mode = 2 layout_mode = 2 [node name="Label" type="Label" parent="Connect/VBoxContainer/Join"] -custom_minimum_size = Vector2(80, 0) +custom_minimum_size = Vector2(100, 0) layout_mode = 2 text = "Address:" horizontal_alignment = 2 @@ -63,7 +71,7 @@ text = "Join" layout_mode = 2 [node name="Label" type="Label" parent="Connect/VBoxContainer/Host"] -custom_minimum_size = Vector2(80, 0) +custom_minimum_size = Vector2(100, 0) layout_mode = 2 text = "Port:" horizontal_alignment = 2 @@ -109,7 +117,7 @@ layout_mode = 2 layout_mode = 2 [node name="Label" type="Label" parent="Settings/VBoxContainer/Cache"] -custom_minimum_size = Vector2(80, 0) +custom_minimum_size = Vector2(100, 0) layout_mode = 2 text = "Cache:" horizontal_alignment = 2 @@ -131,20 +139,21 @@ ok_button_text = "Select Current Folder" file_mode = 2 access = 2 -[node name="Name" type="HBoxContainer" parent="Settings/VBoxContainer"] +[node name="Nickname" type="HBoxContainer" parent="Settings/VBoxContainer"] layout_mode = 2 -[node name="Label" type="Label" parent="Settings/VBoxContainer/Name"] -custom_minimum_size = Vector2(80, 0) +[node name="Label" type="Label" parent="Settings/VBoxContainer/Nickname"] +custom_minimum_size = Vector2(100, 0) layout_mode = 2 -text = "Name:" +text = "Nickname:" horizontal_alignment = 2 -[node name="LineEdit" type="LineEdit" parent="Settings/VBoxContainer/Name"] +[node name="LineEdit" type="LineEdit" parent="Settings/VBoxContainer/Nickname"] layout_mode = 2 size_flags_horizontal = 3 [node name="Players" type="MarginContainer" parent="."] +visible = false layout_mode = 2 theme_override_constants/margin_left = 4 theme_override_constants/margin_top = 4 diff --git a/Scenes/player_settings.tscn b/Scenes/player_settings.tscn index 317725c..e7bed44 100644 --- a/Scenes/player_settings.tscn +++ b/Scenes/player_settings.tscn @@ -167,6 +167,7 @@ size_flags_horizontal = 3 min_value = 0.5 max_value = 2.0 step = 0.01 +value = 1.0 alignment = 2 custom_arrow_step = 0.05 diff --git a/Scenes/sync_controller.gd b/Scenes/sync_controller.gd index 4eba397..29d09ae 100644 --- a/Scenes/sync_controller.gd +++ b/Scenes/sync_controller.gd @@ -206,6 +206,7 @@ func update_collision_shape_position() -> void: var right_foot := _get_bone_position("RightFoot") var avg_foot := (left_foot + right_foot) / 2 shape.global_position = skeleton.global_position + (head + avg_foot) / 2 + # FIXME: This doesn't consider rotation or scale. func _get_bone_position(bone_name: String) -> Vector3: var idx := skeleton.find_bone(bone_name) diff --git a/copyMultiplayer.gd b/copyMultiplayer.gd index e473881..6508c96 100644 --- a/copyMultiplayer.gd +++ b/copyMultiplayer.gd @@ -47,16 +47,15 @@ func _ready() -> void: for phalange in [ "Proximal", "Intermediate", "Distal" ]: tracked_bones.append("%s%s%s" % [ side, finger, phalange ]) - setup_setting_widget("address" , "Connect/VBoxContainer/Join/Address" , true ) - setup_setting_widget("port" , "Connect/VBoxContainer/Host/Port" , true ) - - setup_setting_widget("cache" , "Settings/VBoxContainer/Cache/LineEdit", true ) - setup_setting_widget("nickname", "Settings/VBoxContainer/Name/LineEdit" , false) + setup_setting_widget("connect" , "address" , true ) + setup_setting_widget("connect" , "port" , true ) + setup_setting_widget("settings", "cache" , true ) + setup_setting_widget("settings", "nickname", false) setup_button_connections() # Filter whitespace characters from nickname before saving it to "nickname" field. - var nickname_widget: LineEdit = get_settings_window().get_node("Settings/VBoxContainer/Name/LineEdit") + var nickname_widget := get_settings_window().settings_nickname nickname_widget.text_changed.connect(func(new_text): modify_setting("nickname", new_text.strip_edges())) nickname_widget.text_submitted.connect(func(_new_text): nickname_widget.text = nickname) nickname_widget.focus_exited.connect(func(): nickname_widget.text = nickname) @@ -73,24 +72,28 @@ func _exit_tree() -> void: func _create_settings_window() -> Control: return load("res://Mods/copyMultiplayer/Scenes/copy_multiplayer_settings.tscn").instantiate() -func setup_setting_widget(setting_name: String, path: NodePath, setup_events: bool) -> void: - var settings = get_settings_window() - var widget: Control = settings.get_node(path) +# Override base method to provide type hint. +func get_settings_window() -> copyMultiplayerSettings: + return super.get_settings_window() + +func setup_setting_widget(category: String, setting: String, setup_events: bool) -> void: + var settings := get_settings_window() + var widget: Control = settings.get("%s_%s" % [ category, setting ]) - _settings_properties.append({ name = setting_name, args = { } }) - _settings_widgets_by_setting_name[setting_name] = widget + _settings_properties.append({ name = setting, args = { } }) + _settings_widgets_by_setting_name[setting] = widget if setup_events: if widget is LineEdit: widget.text_changed.connect( - func(text): modify_setting(setting_name, text)) + func(text): modify_setting(setting, text)) if widget is SpinBox: widget.value_changed.connect( - func(number): modify_setting(setting_name, roundi(number))) + func(number): modify_setting(setting, roundi(number))) func setup_button_connections() -> void: - var window = get_settings_window() - window.get_node("Connect/VBoxContainer/Join/Button").pressed.connect(on_join_pressed) - window.get_node("Connect/VBoxContainer/Host/Button").pressed.connect(on_host_pressed) - window.get_node("Connect/VBoxContainer/Disconnect" ).pressed.connect(on_disconnect_pressed) + var settings := get_settings_window() + settings.connect_join.pressed.connect(on_join_pressed) + settings.connect_host.pressed.connect(on_host_pressed) + settings.connect_disconnect.pressed.connect(on_disconnect_pressed) var player_settings_scene: PackedScene = load("res://Mods/copyMultiplayer/Scenes/player_settings.tscn") func new_player_settings() -> PlayerSettings: @@ -175,13 +178,13 @@ func on_server_disconnected() -> void: func update_enabled_state(is_online: bool) -> void: - var window = get_settings_window() - window.get_node("Settings/VBoxContainer/Name/LineEdit").editable = !is_online - window.get_node("Connect/VBoxContainer/Join/Address" ).editable = !is_online - window.get_node("Connect/VBoxContainer/Join/Button" ).disabled = is_online - window.get_node("Connect/VBoxContainer/Host/Port" ).editable = !is_online - window.get_node("Connect/VBoxContainer/Host/Button" ).disabled = is_online - window.get_node("Connect/VBoxContainer/Disconnect" ).disabled = !is_online + var settings := get_settings_window() + settings.settings_nickname .editable = !is_online + settings.connect_address .editable = !is_online + settings.connect_port .editable = !is_online + settings.connect_join .disabled = is_online + settings.connect_host .disabled = is_online + settings.connect_disconnect.disabled = !is_online func update_status() -> void: var num_players := 1 + multiplayer.get_peers().size()