diff --git a/flatscreen-project/project.godot b/flatscreen-project/project.godot index 69c22811..1b3cee73 100644 --- a/flatscreen-project/project.godot +++ b/flatscreen-project/project.godot @@ -11,6 +11,6 @@ config_version=5 [application] config/name="you_done_it" -run/main_scene="uid://bbvpj46frv0ho" +run/main_scene="uid://dosb4sb7pvss4" config/features=PackedStringArray("4.5", "Forward Plus") config/icon="res://icon.svg" diff --git a/flatscreen-project/scenes/flatscreen_root.tscn b/flatscreen-project/scenes/flatscreen_root.tscn index 1f37582c..e91f50bd 100644 --- a/flatscreen-project/scenes/flatscreen_root.tscn +++ b/flatscreen-project/scenes/flatscreen_root.tscn @@ -1,3 +1,12 @@ -[gd_scene format=3 uid="uid://dosb4sb7pvss4"] +[gd_scene load_steps=2 format=3 uid="uid://dosb4sb7pvss4"] -[node name="ServerNode" type="ServerNode"] +[sub_resource type="QuadMesh" id="QuadMesh_usqe2"] + +[node name="FlatscreenRoot" type="Node2D"] + +[node name="Camera2D" type="Camera2D" parent="."] + +[node name="MeshInstance2D" type="MeshInstance2D" parent="."] +position = Vector2(142, -50) +scale = Vector2(762.00006, 514) +mesh = SubResource("QuadMesh_usqe2") diff --git a/flatscreen-project/scenes/start_server_ui.tscn b/flatscreen-project/scenes/start_server_ui.tscn new file mode 100644 index 00000000..f12db7eb --- /dev/null +++ b/flatscreen-project/scenes/start_server_ui.tscn @@ -0,0 +1,68 @@ +[gd_scene load_steps=2 format=3 uid="uid://owa17yo7q6wo"] + +[sub_resource type="GDScript" id="GDScript_usqe2"] +resource_name = "StartServerUI" +script/source = "extends CenterContainer + +@onready var label := $VBoxContainer/ConnectingText +@onready var open_server_btn := $VBoxContainer/OpenServerButton +@onready var close_server_btn := $VBoxContainer/CloseServerButton + +func _ready(): + ServerNode.get_singleton().connection_established.connect(self._on_server_node_connection_established) + +func _on_open_button_pressed() -> void: + if not ServerNode.get_singleton().is_open(): + if ServerNode.get_singleton().open(): + label.visible = true + close_server_btn.visible = true + open_server_btn.visible = false + +func _on_close_button_pressed() -> void: + if ServerNode.get_singleton().is_open(): + ServerNode.get_singleton().close() + label.visible = false + close_server_btn.visible = false + open_server_btn.visible = true + +func _on_server_node_connection_established() -> void: + self.visible = false +" + +[node name="StartServerUI" type="CenterContainer"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 +script = SubResource("GDScript_usqe2") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 2 + +[node name="OpenServerButton" type="Button" parent="VBoxContainer"] +layout_mode = 2 +text = "Host Game Server" + +[node name="CloseServerButton" type="Button" parent="VBoxContainer"] +visible = false +layout_mode = 2 +text = "Cancel Connection" + +[node name="ConnectingText" type="Label" parent="VBoxContainer"] +visible = false +layout_mode = 2 +text = "Waiting for client..." +horizontal_alignment = 1 + +[node name="PermissionsText" type="Label" parent="VBoxContainer"] +layout_mode = 2 +text = "Requires permissions to open port 6667. +If you have a firewall on your system you +may need to open configure it" +horizontal_alignment = 1 + +[connection signal="pressed" from="VBoxContainer/OpenServerButton" to="." method="_on_open_button_pressed"] +[connection signal="pressed" from="VBoxContainer/CloseServerButton" to="." method="_on_close_button_pressed"] diff --git a/modules/you_done_it/server_node.cpp b/modules/you_done_it/server_node.cpp index 1db8473f..dde038ef 100644 --- a/modules/you_done_it/server_node.cpp +++ b/modules/you_done_it/server_node.cpp @@ -11,6 +11,11 @@ void ServerNode::_bind_methods() { ADD_SIGNAL(MethodInfo(sig_clue_revealed, PropertyInfo(Variant::INT, "id"))); ADD_SIGNAL(MethodInfo(sig_connection_established)); ADD_SIGNAL(MethodInfo(sig_connection_lost)); + + ClassDB::bind_method(D_METHOD("open"), &self_type::open); + ClassDB::bind_method(D_METHOD("close"), &self_type::close); + ClassDB::bind_method(D_METHOD("is_open"), &self_type::is_open); + ClassDB::bind_static_method(self_type::get_class_static(), "get_singleton", &self_type::get_singleton); } void ServerNode::enter_tree() { @@ -19,22 +24,24 @@ void ServerNode::enter_tree() { abort(); } else { singleton_instance = this; - ydi::server::open(); } } void ServerNode::process(double delta) { + bool new_is_connected{ ydi::server::has_client() }; + if (this->is_connected != new_is_connected) { + this->is_connected = new_is_connected; + emit_signal(this->is_connected ? sig_connection_established : sig_connection_lost); + } + if (!ydi::server::has_client()) { + return; + } Vector new_clues{}; if (ydi::server::receive::new_clues(new_clues)) { for (NetworkData::ClueID clue : new_clues) { emit_signal(sig_clue_revealed, clue); } } - bool new_is_connected{ ydi::server::has_client() }; - if (this->is_connected != new_is_connected) { - this->is_connected = new_is_connected; - emit_signal(this->is_connected ? sig_connection_established : sig_connection_lost); - } } void ServerNode::exit_tree() { @@ -67,3 +74,15 @@ void ServerNode::_notification(int what) { ServerNode *ServerNode::get_singleton() { return singleton_instance; } + +bool ServerNode::open() { + return ydi::server::open(); +} + +void ServerNode::close() { + ydi::server::close(); +} + +bool ServerNode::is_open() const { + return ydi::server::is_running(); +} diff --git a/modules/you_done_it/server_node.h b/modules/you_done_it/server_node.h index 8f1b31e9..c522354a 100644 --- a/modules/you_done_it/server_node.h +++ b/modules/you_done_it/server_node.h @@ -15,6 +15,9 @@ protected: public: static ServerNode *get_singleton(); + bool open(); + void close(); + bool is_open() const; public: static String const sig_clue_revealed; diff --git a/modules/you_done_it/ydi_server.cpp b/modules/you_done_it/ydi_server.cpp index 160b2602..cc768388 100644 --- a/modules/you_done_it/ydi_server.cpp +++ b/modules/you_done_it/ydi_server.cpp @@ -99,10 +99,10 @@ void receive_thread_entry() { } } -void open() { +bool open() { if (service) { print_error("Server: Detected attempt to open duplicate Server, exiting without action."); - return; + return false; } print_line("Server: Starting"); service.emplace(); @@ -111,7 +111,7 @@ void open() { } catch (...) { service.reset(); print_line("Server: Failed to create context"); - return; + return false; } print_line("Server: Created zmq context"); try { @@ -121,7 +121,7 @@ void open() { service->context.reset(); service.reset(); print_line("Server: Failed to create socket"); - return; + return false; } print_line("Server: Created socket"); try { @@ -133,12 +133,13 @@ void open() { service->context.reset(); service.reset(); print_line("Server: Failed to bind socket"); - return; + return false; } print_line("Server: Bound socket"); receive_thread.emplace(receive_thread_entry); assert(receive_thread->joinable()); print_line("Server: Startup complete!"); + return true; } void close() { @@ -170,16 +171,22 @@ void close() { } bool has_client() { - if (service) { - std::scoped_lock lock{ service->mtx }; - return service->client.has_value(); - } else { + if (!service) { return false; } + std::scoped_lock lock{ service->mtx }; + return service->client.has_value(); +} + +bool is_running() { + return service.has_value(); } namespace receive { bool new_clues(Vector &out) { + if (!service) { + return false; + } std::scoped_lock lock{ service->mtx }; bool const has_new{ !service->new_clues.is_empty() }; if (has_new) { diff --git a/modules/you_done_it/ydi_server.h b/modules/you_done_it/ydi_server.h index 56940f14..a8683324 100644 --- a/modules/you_done_it/ydi_server.h +++ b/modules/you_done_it/ydi_server.h @@ -5,9 +5,10 @@ #include namespace ydi::server { -void open(); +bool open(); void close(); bool has_client(); +bool is_running(); namespace receive { bool new_clues(Vector &out); diff --git a/vr-project/scenes/game_scene.tscn b/vr-project/scenes/game_scene.tscn index dbfca7ef..c8a681c3 100644 --- a/vr-project/scenes/game_scene.tscn +++ b/vr-project/scenes/game_scene.tscn @@ -52,16 +52,6 @@ fog_height_density = -0.4746 [node name="Root" type="Node3D"] [node name="VROrigin" parent="." instance=ExtResource("2_onqr8")] -_import_path = NodePath("") -unique_name_in_owner = false -process_mode = 0 -process_priority = 0 -process_physics_priority = 0 -process_thread_group = 0 -physics_interpolation_mode = 0 -auto_translate_mode = 0 -editor_description = "" -script = null [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_bw6k5") @@ -82,17 +72,7 @@ shadow_blur = 2.834 transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.27989578, 0, 1.4924412) [node name="ClueMarker" type="ClueMarker" parent="."] -_import_path = NodePath("") -unique_name_in_owner = false -process_mode = 0 -process_priority = 0 -process_physics_priority = 0 -process_thread_group = 0 -physics_interpolation_mode = 0 -auto_translate_mode = 0 -editor_description = "" clue_id = 0 -script = null [node name="Stapler" parent="." instance=ExtResource("3_ycayy")] transform = Transform3D(-1.8868132, 0, -1.8585076, 0, 2.6484175, 0, 1.8585076, 0, -1.8868132, -1.2748423, 0.9004388, 2.876501)