From 40705ac661520693b048ea4058b5a5db14c2e2b3 Mon Sep 17 00:00:00 2001 From: Hamcha Date: Tue, 14 Jul 2020 01:59:45 +0200 Subject: [PATCH] Add master server dialog --- Scenes/Game.gd | 1 - Scenes/Global/Multiplayer.gd | 21 +++++- Scenes/Menu.gd | 47 +++++++++--- Scenes/Menu.tscn | 137 ++++++++++++++++++++++++++++++----- 4 files changed, 175 insertions(+), 31 deletions(-) diff --git a/Scenes/Game.gd b/Scenes/Game.gd index ff7f1b4..c3debec 100644 --- a/Scenes/Game.gd +++ b/Scenes/Game.gd @@ -31,7 +31,6 @@ master func send_map() -> void: }) puppet func receive_data(data: Dictionary) -> void: - print(data.systems) world.map.deserialize(data["map"]) systems.deserialize(data["systems"]) print("Received map data from master") diff --git a/Scenes/Global/Multiplayer.gd b/Scenes/Global/Multiplayer.gd index 9c3850b..14408df 100644 --- a/Scenes/Global/Multiplayer.gd +++ b/Scenes/Global/Multiplayer.gd @@ -171,6 +171,17 @@ func _ms_request(endpoint: String, data): if error != OK: push_error("An error occurred in the HTTP request.") +func ms_get_entries(): + var http_request = HTTPRequest.new() + add_child(http_request) + http_request.connect("request_completed", self, "_ms_response", ["list_games"]) + var error = http_request.request( + "https://" + MASTER_SERVER_ADDR + "/" + MS_GAME_CODE, + ["Content-Type: application/json"], + true, HTTPClient.METHOD_GET) + if error != OK: + push_error("An error occurred in the HTTP request.") + func get_game_data(): return { "name": server_name, @@ -192,7 +203,15 @@ func update_ms_entry(): "key": ms_key, "data": get_game_data() }) - yield(get_tree().create_timer(20), "timeout") + +var time_left = 30 +func _process(delta): + if not ms_active: + return + time_left -= delta + if time_left < 0: + update_ms_entry() + time_left = 30 func _ms_response(_result: int, response_code: int, _headers: PoolStringArray, body: PoolByteArray, action: String): print_debug("MS said " + str(response_code)) diff --git a/Scenes/Menu.gd b/Scenes/Menu.gd index 5fac0c6..2ef88b3 100644 --- a/Scenes/Menu.gd +++ b/Scenes/Menu.gd @@ -8,12 +8,18 @@ export var delay = 1.0 onready var viewport = $Viewport onready var background = $Background +onready var netgame = $"/root/Multiplayer" +onready var server_list = $Popup/MarginContainer/VBoxContainer/ItemList -func _ready(): +var servers = [] + +func _ready() -> void: set_scale(scale) $"/root/Music/BGM".play() + netgame.connect("ms_updated", self, "_ms_update") + request_servers() -func _process(delta): +func _process(delta: float) -> void: # Give the system time to adjust if delay > 0: delay -= delta @@ -25,25 +31,44 @@ func _process(delta): print("GPU is taking it easy (", delta, "s < ", upThreshold, "s), adjusting shader scale") set_scale(scale-1) -func set_scale(val): +func request_servers(): + netgame.ms_get_entries() + +func _ms_update(action, result): + if action == "list_games": + # Reset server list + server_list.clear() + servers = result + for server in servers: + server_list.add_item(server.data.name + " (" + server.address + ") - " + str(server.data.players) + "/" + str(server.data.max_players) + " players") + +func set_scale(val) -> void: scale = val if viewport: viewport.size = rect_size / scale background.update() -func _on_resized(): +func _on_resized() -> void: if viewport: viewport.size = rect_size / scale background.update() -func _host_pressed(): +func _host_pressed() -> void: $"/root/Music/BGM".stop() $"/root/Multiplayer".host() -func _join_pressed(): - $"/root/Music/BGM".stop() - var addr = $CenterContainer/PanelContainer/HBoxContainer/ServerAddr - $"/root/Multiplayer".join(addr.text) +func _join_pressed() -> void: + $Popup.popup_centered_ratio() -func _server_addr_changed(new_text: String): - $CenterContainer/PanelContainer/HBoxContainer/JoinButton.disabled = new_text.length() < 1 +func join_server(addr: String) -> void: + $"/root/Music/BGM".stop() + $"/root/Multiplayer".join(addr) + +func _server_addr_changed(new_text: String) -> void: + $Popup/MarginContainer/VBoxContainer/HBoxContainer/Button.disabled = new_text.length() < 1 + +func _manual_join_pressed(): + join_server($Popup/MarginContainer/VBoxContainer/HBoxContainer/LineEdit.text) + +func _server_item_clicked(index): + join_server(servers[index].address) diff --git a/Scenes/Menu.tscn b/Scenes/Menu.tscn index 68e0851..ad65ccc 100644 --- a/Scenes/Menu.tscn +++ b/Scenes/Menu.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=10 format=2] +[gd_scene load_steps=13 format=2] [ext_resource path="res://Scenes/Menu.gd" type="Script" id=1] [ext_resource path="res://Graphics/UI/Background.shader" type="Shader" id=2] [ext_resource path="res://Graphics/UI/logo-temp-pixel.png" type="Texture" id=3] [ext_resource path="res://Graphics/UI/ui_theme.tres" type="Theme" id=4] +[ext_resource path="res://Graphics/UI/iosevka-aile-regular.ttf" type="DynamicFontData" id=5] [sub_resource type="ViewportTexture" id=1] viewport_path = NodePath("Viewport") @@ -51,6 +52,18 @@ corner_radius_top_right = 4 corner_radius_bottom_right = 4 corner_radius_bottom_left = 4 +[sub_resource type="DynamicFont" id=6] +size = 20 +extra_spacing_top = 5 +extra_spacing_bottom = 5 +font_data = ExtResource( 5 ) + +[sub_resource type="DynamicFont" id=7] +size = 20 +extra_spacing_top = 10 +extra_spacing_bottom = 10 +font_data = ExtResource( 5 ) + [node name="Control" type="Control"] anchor_right = 1.0 anchor_bottom = 1.0 @@ -125,9 +138,9 @@ __meta__ = { [node name="PanelContainer" type="PanelContainer" parent="CenterContainer"] margin_left = 390.0 -margin_top = 43.0 +margin_top = 35.0 margin_right = 690.0 -margin_bottom = 207.0 +margin_bottom = 215.0 rect_min_size = Vector2( 300, 0 ) custom_styles/panel = SubResource( 5 ) @@ -135,41 +148,129 @@ custom_styles/panel = SubResource( 5 ) margin_left = 16.0 margin_top = 20.0 margin_right = 284.0 -margin_bottom = 144.0 +margin_bottom = 160.0 custom_constants/separation = 10 [node name="HostButton" type="Button" parent="CenterContainer/PanelContainer/HBoxContainer"] margin_right = 268.0 -margin_bottom = 24.0 +margin_bottom = 42.0 theme = ExtResource( 4 ) +custom_fonts/font = SubResource( 6 ) text = "Start a new game" [node name="Label" type="Label" parent="CenterContainer/PanelContainer/HBoxContainer"] -margin_top = 34.0 +margin_top = 52.0 margin_right = 268.0 -margin_bottom = 52.0 +margin_bottom = 88.0 theme = ExtResource( 4 ) +custom_fonts/font = SubResource( 6 ) text = "or" align = 1 __meta__ = { "_edit_use_anchors_": false } -[node name="ServerAddr" type="LineEdit" parent="CenterContainer/PanelContainer/HBoxContainer"] -margin_top = 62.0 -margin_right = 268.0 -margin_bottom = 90.0 -theme = ExtResource( 4 ) -placeholder_text = "Server address or URL" - [node name="JoinButton" type="Button" parent="CenterContainer/PanelContainer/HBoxContainer"] -margin_top = 100.0 +margin_top = 98.0 margin_right = 268.0 -margin_bottom = 124.0 +margin_bottom = 140.0 theme = ExtResource( 4 ) -disabled = true +custom_fonts/font = SubResource( 6 ) text = "Join an existing game" + +[node name="Popup" type="PopupDialog" parent="."] +visible = true +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 100.0 +margin_top = 100.0 +margin_right = -100.0 +margin_bottom = -100.0 +custom_styles/panel = SubResource( 5 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="MarginContainer" type="MarginContainer" parent="Popup"] +anchor_right = 1.0 +anchor_bottom = 1.0 +margin_left = 20.0 +margin_top = 20.0 +margin_right = -20.0 +margin_bottom = -20.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="VBoxContainer" type="VBoxContainer" parent="Popup/MarginContainer"] +margin_right = 1040.0 +margin_bottom = 560.0 +custom_constants/separation = 5 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="Popup/MarginContainer/VBoxContainer"] +margin_right = 1040.0 +margin_bottom = 36.0 +custom_fonts/font = SubResource( 6 ) +text = "Server Browser" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="ItemList" type="ItemList" parent="Popup/MarginContainer/VBoxContainer"] +margin_top = 41.0 +margin_right = 1040.0 +margin_bottom = 468.0 +size_flags_vertical = 3 +custom_fonts/font = SubResource( 7 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label2" type="Label" parent="Popup/MarginContainer/VBoxContainer"] +margin_top = 473.0 +margin_right = 1040.0 +margin_bottom = 509.0 +custom_fonts/font = SubResource( 6 ) +text = "Join by IP/address" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="HBoxContainer" type="HBoxContainer" parent="Popup/MarginContainer/VBoxContainer"] +margin_top = 514.0 +margin_right = 1040.0 +margin_bottom = 560.0 +size_flags_horizontal = 3 +custom_constants/separation = 10 + +[node name="LineEdit" type="LineEdit" parent="Popup/MarginContainer/VBoxContainer/HBoxContainer"] +margin_right = 300.0 +margin_bottom = 46.0 +rect_min_size = Vector2( 300, 0 ) +custom_fonts/font = SubResource( 6 ) +placeholder_text = "server.address" +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Button" type="Button" parent="Popup/MarginContainer/VBoxContainer/HBoxContainer"] +margin_left = 310.0 +margin_right = 410.0 +margin_bottom = 46.0 +rect_min_size = Vector2( 100, 0 ) +theme = ExtResource( 4 ) +custom_fonts/font = SubResource( 6 ) +disabled = true +text = "Join" +__meta__ = { +"_edit_use_anchors_": false +} [connection signal="resized" from="." to="." method="_on_resized"] [connection signal="pressed" from="CenterContainer/PanelContainer/HBoxContainer/HostButton" to="." method="_host_pressed"] -[connection signal="text_changed" from="CenterContainer/PanelContainer/HBoxContainer/ServerAddr" to="." method="_server_addr_changed"] [connection signal="pressed" from="CenterContainer/PanelContainer/HBoxContainer/JoinButton" to="." method="_join_pressed"] +[connection signal="item_activated" from="Popup/MarginContainer/VBoxContainer/ItemList" to="." method="_server_item_clicked"] +[connection signal="text_changed" from="Popup/MarginContainer/VBoxContainer/HBoxContainer/LineEdit" to="." method="_server_addr_changed"] +[connection signal="pressed" from="Popup/MarginContainer/VBoxContainer/HBoxContainer/Button" to="." method="_manual_join_pressed"]