summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-06-27 00:02:13 +0200
committermetamuffin <metamuffin@disroot.org>2024-06-27 00:02:13 +0200
commit140090a76e723fec6f3aea07cd7b7f463884be89 (patch)
tree7e4b476b52b65b9289ffff079a76c1171c7dd68a
parent8784d1a619f4224a4fe659750c91561fcc733100 (diff)
downloadhurrycurry-140090a76e723fec6f3aea07cd7b7f463884be89.tar
hurrycurry-140090a76e723fec6f3aea07cd7b7f463884be89.tar.bz2
hurrycurry-140090a76e723fec6f3aea07cd7b7f463884be89.tar.zst
main menu server start option
-rw-r--r--client/menu/main_menu.gd16
-rw-r--r--client/menu/main_menu.tscn8
-rw-r--r--client/project.godot1
-rw-r--r--client/server.gd84
4 files changed, 108 insertions, 1 deletions
diff --git a/client/menu/main_menu.gd b/client/menu/main_menu.gd
index 28629e0d..168eda7e 100644
--- a/client/menu/main_menu.gd
+++ b/client/menu/main_menu.gd
@@ -20,6 +20,7 @@ extends Control
@onready var quit_button = $side/margin/options/quit
@onready var connect_uri = $side/margin/options/connect/uri
+@onready var server_button = $side/margin/options/server
func _ready():
if OS.has_feature("web"):
@@ -58,3 +59,18 @@ func _on_change_character_pressed():
func _on_settings_pressed():
menu_manager.goto("settings")
+
+func _on_server_pressed():
+ match Server.state:
+ Server.State.RUNNING: Server.stop()
+ Server.State.STOPPED: Server.start()
+
+func _process(_delta):
+ server_button.disabled = Server.state != Server.State.RUNNING and Server.state != Server.State.STOPPED
+ server_button.modulate = Color.AQUAMARINE if Server.state == Server.State.RUNNING else Color.WHITE
+ match Server.state:
+ Server.State.RUNNING: server_button.text = tr("Stop Server")
+ Server.State.TESTING: server_button.text = tr("Server (Testing)")
+ Server.State.STARTING: server_button.text = tr("Server is starting...")
+ Server.State.STOPPED: server_button.text = tr("Start Server")
+ Server.State.UNAVAILABLE: server_button.text = tr("Server (Unavailable)"); server_button.tooltip_text = tr("Server binary was not found. Please install the server seperately.")
diff --git a/client/menu/main_menu.tscn b/client/menu/main_menu.tscn
index 361be363..32a55276 100644
--- a/client/menu/main_menu.tscn
+++ b/client/menu/main_menu.tscn
@@ -2,7 +2,7 @@
[ext_resource type="Theme" uid="uid://b0qmvo504e457" path="res://menu/theme/theme.tres" id="1_nlcpo"]
[ext_resource type="Script" path="res://menu/main_menu.gd" id="2_qot2j"]
-[ext_resource type="Material" uid="uid://beea1pc5nt67r" path="res://menu/theme/dark_blur_material.tres" id="3_k58q5"]
+[ext_resource type="Material" path="res://menu/theme/dark_blur_material.tres" id="3_k58q5"]
[ext_resource type="FontFile" uid="uid://bo4vh5xkpvrh1" path="res://menu/theme/font-sansita-swashed.woff2" id="4_mfs30"]
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ukani"]
@@ -81,6 +81,11 @@ layout_mode = 2
text = "Settings"
alignment = 0
+[node name="server" type="Button" parent="side/margin/options"]
+layout_mode = 2
+text = "Server"
+alignment = 0
+
[node name="credits" type="Button" parent="side/margin/options"]
layout_mode = 2
text = "Credits"
@@ -95,5 +100,6 @@ alignment = 0
[connection signal="pressed" from="side/margin/options/connect/connect" to="." method="_on_connect_pressed"]
[connection signal="pressed" from="side/margin/options/change_character" to="." method="_on_change_character_pressed"]
[connection signal="pressed" from="side/margin/options/settings" to="." method="_on_settings_pressed"]
+[connection signal="pressed" from="side/margin/options/server" to="." method="_on_server_pressed"]
[connection signal="pressed" from="side/margin/options/credits" to="." method="_on_credits_pressed"]
[connection signal="pressed" from="side/margin/options/quit" to="." method="_on_quit_pressed"]
diff --git a/client/project.godot b/client/project.godot
index 23b423fe..5bbc3f15 100644
--- a/client/project.godot
+++ b/client/project.godot
@@ -20,6 +20,7 @@ config/icon="res://icon.png"
[autoload]
Global="*res://global.gd"
+Server="*res://server.gd"
[input]
diff --git a/client/server.gd b/client/server.gd
new file mode 100644
index 00000000..c935b645
--- /dev/null
+++ b/client/server.gd
@@ -0,0 +1,84 @@
+class_name GameServer
+extends Node
+
+var thread = null
+var pid = null
+
+var state = State.TESTING
+enum State {
+ TESTING,
+ UNAVAILABLE,
+ STOPPED,
+ STARTING,
+ RUNNING,
+}
+
+var sem = Semaphore.new()
+var thread_result = null;
+
+func _ready():
+ state = State.TESTING
+ thread = Thread.new()
+ thread.start(_test_server)
+
+
+func start():
+ if state != State.STOPPED:
+ push_error("server cant be started")
+ return
+ state = State.STARTING
+ thread = Thread.new()
+ thread.start(_server_exec)
+
+func stop():
+ if state != State.RUNNING:
+ push_error("server cant be stopped")
+ return
+ OS.kill(pid)
+
+func _test_server():
+ var output = []
+ thread_result = OS.execute("undercooked-server", ["version"], output, true, false)
+ sem.post()
+
+func _server_exec():
+ thread_result = OS.create_process("undercooked-server", [], false)
+ if thread_result >= 0:
+ var ok = false
+ while not ok:
+ var conn = StreamPeerTCP.new()
+ if conn.connect_to_host("127.0.0.1", 27032) == OK:
+ while conn.poll() == OK:
+ if conn.get_status() == StreamPeerTCP.STATUS_ERROR: break
+ elif conn.get_status() == StreamPeerTCP.STATUS_CONNECTED: ok = true; break
+ OS.delay_msec(10)
+ OS.delay_msec(500 if not ok else 50)
+ sem.post()
+
+func _process(_delta):
+ match state:
+ State.TESTING:
+ if sem.try_wait():
+ print("Server: Test result=", thread_result)
+ if thread_result == 0: state = State.STOPPED
+ else: state = State.UNAVAILABLE
+ thread.wait_to_finish()
+ thread = null
+ State.STARTING:
+ if sem.try_wait():
+ if thread_result >= 0:
+ state = State.RUNNING
+ pid = thread_result
+ print("Server: Started pid=", thread_result)
+ else: state = State.STOPPED
+ thread.wait_to_finish()
+ thread = null
+ State.RUNNING:
+ if not OS.is_process_running(pid):
+ print("Server: Stopped")
+ state = State.STOPPED
+ pid = null
+
+func _exit_tree():
+ if thread != null: thread.wait_to_finish()
+ if pid != null: OS.kill(pid)