From b3108770370336390fbabfa0b4881c9c6759559c Mon Sep 17 00:00:00 2001 From: Aaron Franke Date: Wed, 19 Feb 2020 17:48:36 -0500 Subject: [PATCH] Update other networking demos, with style fixes --- networking/webrtc_minimal/chat.gd | 22 +++--- networking/webrtc_minimal/main.tscn | 4 +- networking/webrtc_minimal/minimal.gd | 18 ++--- networking/webrtc_minimal/minimal.tscn | 2 +- .../client/multiplayer_client.gd | 38 +++++++---- .../client/ws_webrtc_client.gd | 35 +++++++--- networking/webrtc_signaling/demo/client_ui.gd | 19 +++++- .../webrtc_signaling/demo/client_ui.tscn | 36 +++++----- networking/webrtc_signaling/demo/main.gd | 6 +- networking/webrtc_signaling/demo/main.tscn | 36 +++++----- .../server/ws_webrtc_server.gd | 67 ++++++++++++------- networking/websocket_chat/client/client.gd | 15 ++++- networking/websocket_chat/client/client.tscn | 52 ++------------ networking/websocket_chat/client/client_ui.gd | 19 +++--- networking/websocket_chat/combo/combo.tscn | 9 --- networking/websocket_chat/server/server.gd | 12 +++- networking/websocket_chat/server/server_ui.gd | 21 +++--- networking/websocket_chat/utils.gd | 2 + networking/websocket_minimal/Main.tscn | 9 --- networking/websocket_minimal/client.gd | 9 ++- networking/websocket_minimal/server.gd | 10 ++- .../websocket_multiplayer/default_env.tres | 6 -- .../websocket_multiplayer/scene/game.tscn | 18 ----- .../websocket_multiplayer/scene/main.tscn | 46 +------------ .../websocket_multiplayer/script/game.gd | 14 ++++ .../websocket_multiplayer/script/main.gd | 16 +++++ 26 files changed, 275 insertions(+), 266 deletions(-) diff --git a/networking/webrtc_minimal/chat.gd b/networking/webrtc_minimal/chat.gd index 39678c3c..8e6da42a 100644 --- a/networking/webrtc_minimal/chat.gd +++ b/networking/webrtc_minimal/chat.gd @@ -1,35 +1,39 @@ -# An example p2p chat client extends Node +# An example p2p chat client. var peer = WebRTCPeerConnection.new() -# Create negotiated data channel +# Create negotiated data channel. var channel = peer.create_data_channel("chat", {"negotiated": true, "id": 1}) func _ready(): - # Connect all functions + # Connect all functions. peer.connect("ice_candidate_created", self, "_on_ice_candidate") peer.connect("session_description_created", self, "_on_session") - # Register to the local signaling server (see below for the implementation) + # Register to the local signaling server (see below for the implementation). Signaling.register(get_path()) + func _on_ice_candidate(mid, index, sdp): - # Send the ICE candidate to the other peer via signaling server + # Send the ICE candidate to the other peer via signaling server. Signaling.send_candidate(get_path(), mid, index, sdp) + func _on_session(type, sdp): - # Send the session to other peer via signaling server + # Send the session to other peer via signaling server. Signaling.send_session(get_path(), type, sdp) - # Set generated description as local + # Set generated description as local. peer.set_local_description(type, sdp) + func _process(delta): - # Always poll the connection frequently + # Always poll the connection frequently. peer.poll() if channel.get_ready_state() == WebRTCDataChannel.STATE_OPEN: while channel.get_available_packet_count() > 0: print(get_path(), " received: ", channel.get_packet().get_string_from_utf8()) + func send_message(message): - channel.put_packet(message.to_utf8()) \ No newline at end of file + channel.put_packet(message.to_utf8()) diff --git a/networking/webrtc_minimal/main.tscn b/networking/webrtc_minimal/main.tscn index 12e8c344..38dd5130 100644 --- a/networking/webrtc_minimal/main.tscn +++ b/networking/webrtc_minimal/main.tscn @@ -10,10 +10,10 @@ func _on_LinkButton_pressed(): OS.shell_open(\"https://github.com/godotengine/webrtc-native/releases\") " -[node name="main" type="Node"] +[node name="Main" type="Node"] script = ExtResource( 2 ) -[node name="minimal" parent="." instance=ExtResource( 1 )] +[node name="Minimal" parent="." instance=ExtResource( 1 )] [node name="CenterContainer" type="CenterContainer" parent="."] anchor_right = 1.0 diff --git a/networking/webrtc_minimal/minimal.gd b/networking/webrtc_minimal/minimal.gd index 06b37a25..95bd036a 100644 --- a/networking/webrtc_minimal/minimal.gd +++ b/networking/webrtc_minimal/minimal.gd @@ -1,35 +1,37 @@ -# Main scene extends Node +# Main scene. -# Create the two peers +# Create the two peers. var p1 = WebRTCPeerConnection.new() var p2 = WebRTCPeerConnection.new() var ch1 = p1.create_data_channel("chat", {"id": 1, "negotiated": true}) var ch2 = p2.create_data_channel("chat", {"id": 1, "negotiated": true}) func _ready(): - # Connect P1 session created to itself to set local description + print(p1.create_data_channel("chat", {"id": 1, "negotiated": true})) + # Connect P1 session created to itself to set local description. p1.connect("session_description_created", p1, "set_local_description") - # Connect P1 session and ICE created to p2 set remote description and candidates + # Connect P1 session and ICE created to p2 set remote description and candidates. p1.connect("session_description_created", p2, "set_remote_description") p1.connect("ice_candidate_created", p2, "add_ice_candidate") - # Same for P2 + # Same for P2. p2.connect("session_description_created", p2, "set_local_description") p2.connect("session_description_created", p1, "set_remote_description") p2.connect("ice_candidate_created", p1, "add_ice_candidate") - # Let P1 create the offer + # Let P1 create the offer. p1.create_offer() - # Wait a second and send message from P1 + # Wait a second and send message from P1. yield(get_tree().create_timer(1), "timeout") ch1.put_packet("Hi from P1".to_utf8()) - # Wait a second and send message from P2 + # Wait a second and send message from P2. yield(get_tree().create_timer(1), "timeout") ch2.put_packet("Hi from P2".to_utf8()) + func _process(delta): p1.poll() p2.poll() diff --git a/networking/webrtc_minimal/minimal.tscn b/networking/webrtc_minimal/minimal.tscn index 9e512bc6..2eb0dd7b 100644 --- a/networking/webrtc_minimal/minimal.tscn +++ b/networking/webrtc_minimal/minimal.tscn @@ -2,5 +2,5 @@ [ext_resource path="res://minimal.gd" type="Script" id=1] -[node name="minimal" type="Node"] +[node name="Minimal" type="Node"] script = ExtResource( 1 ) diff --git a/networking/webrtc_signaling/client/multiplayer_client.gd b/networking/webrtc_signaling/client/multiplayer_client.gd index 4902fb69..154c1be2 100644 --- a/networking/webrtc_signaling/client/multiplayer_client.gd +++ b/networking/webrtc_signaling/client/multiplayer_client.gd @@ -1,6 +1,6 @@ extends "ws_webrtc_client.gd" -var rtc_mp : WebRTCMultiplayer = WebRTCMultiplayer.new() +var rtc_mp: WebRTCMultiplayer = WebRTCMultiplayer.new() var sealed = false func _init(): @@ -16,17 +16,20 @@ func _init(): connect("peer_connected", self, "peer_connected") connect("peer_disconnected", self, "peer_disconnected") + func start(url, lobby = ""): stop() sealed = false self.lobby = lobby connect_to_url(url) + func stop(): rtc_mp.close() close() -func _create_peer(id : int): + +func _create_peer(id): var peer : WebRTCPeerConnection = WebRTCPeerConnection.new() peer.initialize({ "iceServers": [ { "urls": ["stun:stun.l.google.com:19302"] } ] @@ -38,10 +41,12 @@ func _create_peer(id : int): peer.create_offer() return peer -func _new_ice_candidate(mid_name : String, index_name : int, sdp_name : String, id : int): + +func _new_ice_candidate(mid_name, index_name, sdp_name, id): send_candidate(id, mid_name, index_name, sdp_name) -func _offer_created(type : String, data : String, id : int): + +func _offer_created(type, data, id): if not rtc_mp.has_peer(id): return print("created", type) @@ -49,38 +54,47 @@ func _offer_created(type : String, data : String, id : int): if type == "offer": send_offer(id, data) else: send_answer(id, data) -func connected(id : int): + +func connected(id): print("Connected %d" % id) rtc_mp.initialize(id, true) -func lobby_joined(lobby : String): + +func lobby_joined(lobby): self.lobby = lobby + func lobby_sealed(): sealed = true + func disconnected(): print("Disconnected: %d: %s" % [code, reason]) if not sealed: stop() # Unexpected disconnect -func peer_connected(id : int): + +func peer_connected(id): print("Peer connected %d" % id) _create_peer(id) -func peer_disconnected(id : int): + +func peer_disconnected(id): if rtc_mp.has_peer(id): rtc_mp.remove_peer(id) -func offer_received(id : int, offer : String): + +func offer_received(id, offer): print("Got offer: %d" % id) if rtc_mp.has_peer(id): rtc_mp.get_peer(id).connection.set_remote_description("offer", offer) -func answer_received(id : int, answer : String): + +func answer_received(id, answer): print("Got answer: %d" % id) if rtc_mp.has_peer(id): rtc_mp.get_peer(id).connection.set_remote_description("answer", answer) -func candidate_received(id : int, mid : String, index : int, sdp : String): + +func candidate_received(id, mid, index, sdp): if rtc_mp.has_peer(id): - rtc_mp.get_peer(id).connection.add_ice_candidate(mid, index, sdp) \ No newline at end of file + rtc_mp.get_peer(id).connection.add_ice_candidate(mid, index, sdp) diff --git a/networking/webrtc_signaling/client/ws_webrtc_client.gd b/networking/webrtc_signaling/client/ws_webrtc_client.gd index 8470c0f6..5e88a7a6 100644 --- a/networking/webrtc_signaling/client/ws_webrtc_client.gd +++ b/networking/webrtc_signaling/client/ws_webrtc_client.gd @@ -1,9 +1,9 @@ extends Node export var autojoin = true -export var lobby = "" # Will create a new lobby if empty +export var lobby = "" # Will create a new lobby if empty. -var client : WebSocketClient = WebSocketClient.new() +var client: WebSocketClient = WebSocketClient.new() var code = 1000 var reason = "Unknown" @@ -24,27 +24,33 @@ func _init(): client.connect("connection_error", self, "_closed") client.connect("server_close_request", self, "_close_request") -func connect_to_url(url : String): + +func connect_to_url(url): close() code = 1000 reason = "Unknown" client.connect_to_url(url) + func close(): client.disconnect_from_host() -func _closed(was_clean : bool = false): + +func _closed(was_clean = false): emit_signal("disconnected") -func _close_request(code : int, reason : String): + +func _close_request(code, reason): self.code = code self.reason = reason + func _connected(protocol = ""): client.get_peer(1).set_write_mode(WebSocketPeer.WRITE_MODE_TEXT) if autojoin: join_lobby(lobby) + func _parse_msg(): var pkt_str : String = client.get_peer(1).get_packet().get_string_from_utf8() @@ -92,25 +98,32 @@ func _parse_msg(): return emit_signal("candidate_received", src_id, candidate[0], int(candidate[1]), candidate[2]) -func join_lobby(lobby : String): + +func join_lobby(lobby): return client.get_peer(1).put_packet(("J: %s\n" % lobby).to_utf8()) + func seal_lobby(): return client.get_peer(1).put_packet("S: \n".to_utf8()) -func send_candidate(id : int, mid : String, index : int, sdp : String) -> int: + +func send_candidate(id, mid, index, sdp) -> int: return _send_msg("C", id, "\n%s\n%d\n%s" % [mid, index, sdp]) -func send_offer(id : int, offer : String) -> int: + +func send_offer(id, offer) -> int: return _send_msg("O", id, offer) -func send_answer(id : int, answer : String) -> int: + +func send_answer(id, answer) -> int: return _send_msg("A", id, answer) -func _send_msg(type : String, id : int, data : String) -> int: + +func _send_msg(type, id, data) -> int: return client.get_peer(1).put_packet(("%s: %d\n%s" % [type, id, data]).to_utf8()) + func _process(delta): var status : int = client.get_connection_status() if status == WebSocketClient.CONNECTION_CONNECTING or status == WebSocketClient.CONNECTION_CONNECTED: - client.poll() \ No newline at end of file + client.poll() diff --git a/networking/webrtc_signaling/demo/client_ui.gd b/networking/webrtc_signaling/demo/client_ui.gd index 36e0cf13..a61dc110 100644 --- a/networking/webrtc_signaling/demo/client_ui.gd +++ b/networking/webrtc_signaling/demo/client_ui.gd @@ -12,53 +12,68 @@ func _ready(): client.rtc_mp.connect("server_disconnected", self, "_mp_server_disconnect") client.rtc_mp.connect("connection_succeeded", self, "_mp_connected") + func _process(delta): client.rtc_mp.poll() while client.rtc_mp.get_available_packet_count() > 0: _log(client.rtc_mp.get_packet().get_string_from_utf8()) + func _connected(id): _log("Signaling server connected with ID: %d" % id) + func _disconnected(): _log("Signaling server disconnected: %d - %s" % [client.code, client.reason]) + func _lobby_joined(lobby): _log("Joined lobby %s" % lobby) + func _lobby_sealed(): _log("Lobby has been sealed") + func _mp_connected(): _log("Multiplayer is connected (I am %d)" % client.rtc_mp.get_unique_id()) + func _mp_server_disconnect(): _log("Multiplayer is disconnected (I am %d)" % client.rtc_mp.get_unique_id()) + func _mp_peer_connected(id : int): _log("Multiplayer peer %d connected" % id) + func _mp_peer_disconnected(id : int): _log("Multiplayer peer %d disconnected" % id) + func _log(msg): print(msg) - $vbox/TextEdit.text += str(msg) + "\n" + $VBoxContainer/TextEdit.text += str(msg) + "\n" + func ping(): _log(client.rtc_mp.put_packet("ping".to_utf8())) + func _on_Peers_pressed(): var d = client.rtc_mp.get_peers() _log(d) for k in d: _log(client.rtc_mp.get_peer(k)) + func start(): - client.start($vbox/connect/host.text, $vbox/connect/RoomSecret.text) + client.start($VBoxContainer/Connect/Host.text, $VBoxContainer/Connect/RoomSecret.text) + func _on_Seal_pressed(): client.seal_lobby() + func stop(): client.stop() diff --git a/networking/webrtc_signaling/demo/client_ui.tscn b/networking/webrtc_signaling/demo/client_ui.tscn index 83371a18..4ece95db 100644 --- a/networking/webrtc_signaling/demo/client_ui.tscn +++ b/networking/webrtc_signaling/demo/client_ui.tscn @@ -16,7 +16,7 @@ __meta__ = { [node name="Client" type="Node" parent="."] script = ExtResource( 2 ) -[node name="vbox" type="VBoxContainer" parent="."] +[node name="VBoxContainer" type="VBoxContainer" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 custom_constants/separation = 8 @@ -24,24 +24,24 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="connect" type="HBoxContainer" parent="vbox"] +[node name="Connect" type="HBoxContainer" parent="VBoxContainer"] margin_right = 1024.0 margin_bottom = 24.0 -[node name="Label" type="Label" parent="vbox/connect"] +[node name="Label" type="Label" parent="VBoxContainer/Connect"] margin_top = 5.0 margin_right = 73.0 margin_bottom = 19.0 text = "Connect to:" -[node name="host" type="LineEdit" parent="vbox/connect"] +[node name="Host" type="LineEdit" parent="VBoxContainer/Connect"] margin_left = 77.0 margin_right = 921.0 margin_bottom = 24.0 size_flags_horizontal = 3 text = "ws://localhost:9080" -[node name="Room" type="Label" parent="vbox/connect"] +[node name="Room" type="Label" parent="VBoxContainer/Connect"] margin_left = 925.0 margin_right = 962.0 margin_bottom = 24.0 @@ -49,13 +49,13 @@ size_flags_vertical = 5 text = "Room" valign = 1 -[node name="RoomSecret" type="LineEdit" parent="vbox/connect"] +[node name="RoomSecret" type="LineEdit" parent="VBoxContainer/Connect"] margin_left = 966.0 margin_right = 1024.0 margin_bottom = 24.0 placeholder_text = "secret" -[node name="HBoxContainer" type="HBoxContainer" parent="vbox"] +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] margin_top = 32.0 margin_right = 1024.0 margin_bottom = 52.0 @@ -64,43 +64,43 @@ __meta__ = { "_edit_use_anchors_": false } -[node name="Start" type="Button" parent="vbox/HBoxContainer"] +[node name="Start" type="Button" parent="VBoxContainer/HBoxContainer"] margin_right = 41.0 margin_bottom = 20.0 text = "Start" -[node name="Stop" type="Button" parent="vbox/HBoxContainer"] +[node name="Stop" type="Button" parent="VBoxContainer/HBoxContainer"] margin_left = 51.0 margin_right = 91.0 margin_bottom = 20.0 text = "Stop" -[node name="Seal" type="Button" parent="vbox/HBoxContainer"] +[node name="Seal" type="Button" parent="VBoxContainer/HBoxContainer"] margin_left = 101.0 margin_right = 139.0 margin_bottom = 20.0 text = "Seal" -[node name="Ping" type="Button" parent="vbox/HBoxContainer"] +[node name="Ping" type="Button" parent="VBoxContainer/HBoxContainer"] margin_left = 149.0 margin_right = 188.0 margin_bottom = 20.0 text = "Ping" -[node name="Peers" type="Button" parent="vbox/HBoxContainer"] +[node name="Peers" type="Button" parent="VBoxContainer/HBoxContainer"] margin_left = 198.0 margin_right = 280.0 margin_bottom = 20.0 text = "Print peers" -[node name="TextEdit" type="TextEdit" parent="vbox"] +[node name="TextEdit" type="TextEdit" parent="VBoxContainer"] margin_top = 60.0 margin_right = 1024.0 margin_bottom = 600.0 size_flags_vertical = 3 readonly = true -[connection signal="pressed" from="vbox/HBoxContainer/Start" to="." method="start"] -[connection signal="pressed" from="vbox/HBoxContainer/Stop" to="." method="stop"] -[connection signal="pressed" from="vbox/HBoxContainer/Seal" to="." method="_on_Seal_pressed"] -[connection signal="pressed" from="vbox/HBoxContainer/Ping" to="." method="ping"] -[connection signal="pressed" from="vbox/HBoxContainer/Peers" to="." method="_on_Peers_pressed"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Start" to="." method="start"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Stop" to="." method="stop"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Seal" to="." method="_on_Seal_pressed"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Ping" to="." method="ping"] +[connection signal="pressed" from="VBoxContainer/HBoxContainer/Peers" to="." method="_on_Peers_pressed"] diff --git a/networking/webrtc_signaling/demo/main.gd b/networking/webrtc_signaling/demo/main.gd index 619eafac..b35c4637 100644 --- a/networking/webrtc_signaling/demo/main.gd +++ b/networking/webrtc_signaling/demo/main.gd @@ -2,13 +2,15 @@ extends Control func _ready(): if OS.get_name() == "HTML5": - $vbox/Signaling.hide() + $VBoxContainer/Signaling.hide() + func _on_listen_toggled(button_pressed): if button_pressed: - $Server.listen(int($vbox/Signaling/port.value)) + $Server.listen(int($VBoxContainer/Signaling/Port.value)) else: $Server.stop() + func _on_LinkButton_pressed(): OS.shell_open("https://github.com/godotengine/webrtc-native/releases") diff --git a/networking/webrtc_signaling/demo/main.tscn b/networking/webrtc_signaling/demo/main.tscn index 47176216..947f299b 100644 --- a/networking/webrtc_signaling/demo/main.tscn +++ b/networking/webrtc_signaling/demo/main.tscn @@ -16,7 +16,7 @@ __meta__ = { "_edit_use_anchors_": true } -[node name="vbox" type="VBoxContainer" parent="."] +[node name="VBoxContainer" type="VBoxContainer" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 custom_constants/separation = 50 @@ -24,17 +24,17 @@ __meta__ = { "_edit_use_anchors_": true } -[node name="Signaling" type="HBoxContainer" parent="vbox"] -margin_right = 996.0 +[node name="Signaling" type="HBoxContainer" parent="VBoxContainer"] +margin_right = 995.0 margin_bottom = 24.0 -[node name="Label" type="Label" parent="vbox/Signaling"] +[node name="Label" type="Label" parent="VBoxContainer/Signaling"] margin_top = 5.0 margin_right = 104.0 margin_bottom = 19.0 text = "Signaling server:" -[node name="port" type="SpinBox" parent="vbox/Signaling"] +[node name="Port" type="SpinBox" parent="VBoxContainer/Signaling"] margin_left = 108.0 margin_right = 182.0 margin_bottom = 24.0 @@ -42,52 +42,52 @@ min_value = 1025.0 max_value = 65535.0 value = 9080.0 -[node name="listen" type="Button" parent="vbox/Signaling"] +[node name="ListenButton" type="Button" parent="VBoxContainer/Signaling"] margin_left = 186.0 margin_right = 237.0 margin_bottom = 24.0 toggle_mode = true text = "Listen" -[node name="CenterContainer" type="CenterContainer" parent="vbox/Signaling"] +[node name="CenterContainer" type="CenterContainer" parent="VBoxContainer/Signaling"] margin_left = 241.0 -margin_right = 996.0 +margin_right = 995.0 margin_bottom = 24.0 size_flags_horizontal = 3 size_flags_vertical = 3 -[node name="LinkButton" type="LinkButton" parent="vbox/Signaling/CenterContainer"] +[node name="LinkButton" type="LinkButton" parent="VBoxContainer/Signaling/CenterContainer"] margin_left = 104.0 margin_top = 5.0 margin_right = 650.0 margin_bottom = 19.0 text = "Make sure to download the GDNative WebRTC Plugin and place it in the project folder" -[node name="Clients" type="GridContainer" parent="vbox"] +[node name="Clients" type="GridContainer" parent="VBoxContainer"] margin_top = 74.0 -margin_right = 996.0 -margin_bottom = 580.0 +margin_right = 995.0 +margin_bottom = 579.0 size_flags_horizontal = 3 size_flags_vertical = 3 custom_constants/vseparation = 15 custom_constants/hseparation = 15 columns = 2 -[node name="ClientUI" parent="vbox/Clients" instance=ExtResource( 2 )] +[node name="ClientUI" parent="VBoxContainer/Clients" instance=ExtResource( 2 )] margin_right = 490.0 margin_bottom = 245.0 -[node name="ClientUI2" parent="vbox/Clients" instance=ExtResource( 2 )] +[node name="ClientUI2" parent="VBoxContainer/Clients" instance=ExtResource( 2 )] margin_left = 505.0 margin_right = 995.0 margin_bottom = 245.0 -[node name="ClientUI3" parent="vbox/Clients" instance=ExtResource( 2 )] +[node name="ClientUI3" parent="VBoxContainer/Clients" instance=ExtResource( 2 )] margin_top = 260.0 margin_right = 490.0 margin_bottom = 505.0 -[node name="ClientUI4" parent="vbox/Clients" instance=ExtResource( 2 )] +[node name="ClientUI4" parent="VBoxContainer/Clients" instance=ExtResource( 2 )] margin_left = 505.0 margin_top = 260.0 margin_right = 995.0 @@ -95,5 +95,5 @@ margin_bottom = 505.0 [node name="Server" type="Node" parent="."] script = ExtResource( 3 ) -[connection signal="toggled" from="vbox/Signaling/listen" to="." method="_on_listen_toggled"] -[connection signal="pressed" from="vbox/Signaling/CenterContainer/LinkButton" to="." method="_on_LinkButton_pressed"] +[connection signal="toggled" from="VBoxContainer/Signaling/ListenButton" to="." method="_on_listen_toggled"] +[connection signal="pressed" from="VBoxContainer/Signaling/CenterContainer/LinkButton" to="." method="_on_LinkButton_pressed"] diff --git a/networking/webrtc_signaling/server/ws_webrtc_server.gd b/networking/webrtc_signaling/server/ws_webrtc_server.gd index ed6586db..5c1833c6 100644 --- a/networking/webrtc_signaling/server/ws_webrtc_server.gd +++ b/networking/webrtc_signaling/server/ws_webrtc_server.gd @@ -6,6 +6,11 @@ const ALFNUM = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" var _alfnum = ALFNUM.to_ascii() +var rand: RandomNumberGenerator = RandomNumberGenerator.new() +var lobbies: Dictionary = {} +var server: WebSocketServer = WebSocketServer.new() +var peers: Dictionary = {} + class Peer extends Reference: var id = -1 var lobby = "" @@ -14,6 +19,8 @@ class Peer extends Reference: func _init(peer_id): id = peer_id + + class Lobby extends Reference: var peers : Array = [] var host : int = -1 @@ -23,7 +30,7 @@ class Lobby extends Reference: func _init(host_id : int): host = host_id - func join(peer_id : int, server : WebSocketServer) -> bool: + func join(peer_id, server) -> bool: if sealed: return false if not server.has_peer(peer_id): return false var new_peer : WebSocketPeer = server.get_peer(peer_id) @@ -36,27 +43,29 @@ class Lobby extends Reference: peers.push_back(peer_id) return true - func leave(peer_id : int, server : WebSocketServer) -> bool: + + func leave(peer_id, server) -> bool: if not peers.has(peer_id): return false peers.erase(peer_id) var close = false if peer_id == host: - # The room host disconnected, will disconnect all peers + # The room host disconnected, will disconnect all peers. close = true if sealed: return close - # Notify other peers + # Notify other peers. for p in peers: if not server.has_peer(p): return close if close: - # Disconnect peers + # Disconnect peers. server.disconnect_peer(p) else: - # Notify disconnection + # Notify disconnection. server.get_peer(p).put_packet(("D: %d\n" % peer_id).to_utf8()) return close - func seal(peer_id : int, server : WebSocketServer) -> bool: - # Only host can seal the room + + func seal(peer_id, server) -> bool: + # Only host can seal the room. if host != peer_id: return false sealed = true for p in peers: @@ -64,51 +73,54 @@ class Lobby extends Reference: time = OS.get_ticks_msec() return true -var rand : RandomNumberGenerator = RandomNumberGenerator.new() -var lobbies : Dictionary = {} -var server : WebSocketServer = WebSocketServer.new() -var peers : Dictionary = {} + func _init(): server.connect("data_received", self, "_on_data") server.connect("client_connected", self, "_peer_connected") server.connect("client_disconnected", self, "_peer_disconnected") + func _process(delta): poll() -func listen(port : int): + +func listen(port): stop() rand.seed = OS.get_unix_time() server.listen(port) + func stop(): server.stop() peers.clear() + func poll(): if not server.is_listening(): return server.poll() - # Peers timeout + # Peers timeout. for p in peers.values(): if p.lobby == "" and OS.get_ticks_msec() - p.time > TIMEOUT: server.disconnect_peer(p.id) - # Lobby seal + # Lobby seal. for k in lobbies: if not lobbies[k].sealed: continue if lobbies[k].time + SEAL_TIME < OS.get_ticks_msec(): - # Close lobby + # Close lobby. for p in lobbies[k].peers: server.disconnect_peer(p) -func _peer_connected(id : int, protocol = ""): + +func _peer_connected(id, protocol = ""): peers[id] = Peer.new(id) -func _peer_disconnected(id : int, was_clean : bool = false): + +func _peer_disconnected(id, was_clean = false): var lobby = peers[id].lobby print("Peer %d disconnected from lobby: '%s'" % [id, lobby]) if lobby and lobbies.has(lobby): @@ -119,9 +131,10 @@ func _peer_disconnected(id : int, was_clean : bool = false): lobbies.erase(lobby) peers.erase(id) -func _join_lobby(peer, lobby : String) -> bool: + +func _join_lobby(peer, lobby) -> bool: if lobby == "": - for i in range(0, 32): + for _i in range(0, 32): lobby += char(_alfnum[rand.randi_range(0, ALFNUM.length()-1)]) lobbies[lobby] = Lobby.new(peer.id) elif not lobbies.has(lobby): @@ -133,19 +146,21 @@ func _join_lobby(peer, lobby : String) -> bool: print("Peer %d joined lobby: '%s'" % [peer.id, lobby]) return true -func _on_data(id : int): + +func _on_data(id): if not _parse_msg(id): print("Parse message failed from peer %d" % id) server.disconnect_peer(id) -func _parse_msg(id : int) -> bool: - var pkt_str : String = server.get_peer(id).get_packet().get_string_from_utf8() - var req : PoolStringArray = pkt_str.split('\n', true, 1) +func _parse_msg(id) -> bool: + var pkt_str: String = server.get_peer(id).get_packet().get_string_from_utf8() + + var req = pkt_str.split('\n', true, 1) if req.size() != 2: # Invalid request size return false - var type : String = req[0] + var type = req[0] if type.length() < 3: # Invalid type size return false @@ -192,4 +207,4 @@ func _parse_msg(id : int) -> bool: elif type.begins_with("C: "): # Client is making an answer server.get_peer(dest_id).put_packet(("C: %d\n%s" % [id, req[1]]).to_utf8()) - return true \ No newline at end of file + return true diff --git a/networking/websocket_chat/client/client.gd b/networking/websocket_chat/client/client.gd index 16b44dec..d63d8b06 100644 --- a/networking/websocket_chat/client/client.gd +++ b/networking/websocket_chat/client/client.gd @@ -19,30 +19,37 @@ func _init(): _client.connect("connection_succeeded", self, "_client_connected", ["multiplayer_protocol"]) _client.connect("connection_failed", self, "_client_disconnected") + func _client_close_request(code, reason): Utils._log(_log_dest, "Close code: %d, reason: %s" % [code, reason]) + func _peer_connected(id): Utils._log(_log_dest, "%s: Client just connected" % id) last_connected_client = id + func _exit_tree(): _client.disconnect_from_host(1001, "Bye bye!") -func _process(delta): + +func _process(_delta): if _client.get_connection_status() == WebSocketClient.CONNECTION_DISCONNECTED: return _client.poll() + func _client_connected(protocol): Utils._log(_log_dest, "Client just connected with protocol: %s" % protocol) _client.get_peer(1).set_write_mode(_write_mode) + func _client_disconnected(clean=true): Utils._log(_log_dest, "Client just disconnected. Was clean: %s" % clean) -func _client_received(p_id = 1): + +func _client_received(_p_id = 1): if _use_multiplayer: var peer_id = _client.get_packet_peer() var packet = _client.get_packet() @@ -52,15 +59,18 @@ func _client_received(p_id = 1): var is_string = _client.get_peer(1).was_string_packet() Utils._log(_log_dest, "Received data. BINARY: %s: %s" % [not is_string, Utils.decode_data(packet, is_string)]) + func connect_to_url(host, protocols, multiplayer): _use_multiplayer = multiplayer if _use_multiplayer: _write_mode = WebSocketPeer.WRITE_MODE_BINARY return _client.connect_to_url(host, protocols, multiplayer) + func disconnect_from_host(): _client.disconnect_from_host(1000, "Bye bye!") + func send_data(data, dest): _client.get_peer(1).set_write_mode(_write_mode) if _use_multiplayer: @@ -69,5 +79,6 @@ func send_data(data, dest): else: _client.get_peer(1).put_packet(Utils.encode_data(data, _write_mode)) + func set_write_mode(mode): _write_mode = mode diff --git a/networking/websocket_chat/client/client.tscn b/networking/websocket_chat/client/client.tscn index f20edaad..6d6ce814 100644 --- a/networking/websocket_chat/client/client.tscn +++ b/networking/websocket_chat/client/client.tscn @@ -14,23 +14,14 @@ __meta__ = { [node name="Panel" type="Panel" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 -__meta__ = { - -} [node name="VBoxContainer" type="VBoxContainer" parent="Panel"] anchor_right = 1.0 anchor_bottom = 1.0 -__meta__ = { - -} [node name="Connect" type="HBoxContainer" parent="Panel/VBoxContainer"] margin_right = 1024.0 margin_bottom = 24.0 -__meta__ = { - -} [node name="Host" type="LineEdit" parent="Panel/VBoxContainer/Connect"] margin_right = 956.0 @@ -38,9 +29,6 @@ margin_bottom = 24.0 size_flags_horizontal = 3 text = "ws://localhost:8000/test/" placeholder_text = "ws://my.server/path/" -__meta__ = { - -} [node name="Connect" type="Button" parent="Panel/VBoxContainer/Connect"] margin_left = 960.0 @@ -48,83 +36,53 @@ margin_right = 1024.0 margin_bottom = 24.0 toggle_mode = true text = "Connect" -__meta__ = { - -} [node name="Settings" type="HBoxContainer" parent="Panel/VBoxContainer"] margin_top = 28.0 margin_right = 1024.0 margin_bottom = 52.0 -__meta__ = { - -} [node name="Mode" type="OptionButton" parent="Panel/VBoxContainer/Settings"] -margin_right = 41.0 +margin_right = 29.0 margin_bottom = 24.0 -__meta__ = { - -} [node name="Multiplayer" type="CheckBox" parent="Panel/VBoxContainer/Settings"] -margin_left = 45.0 -margin_right = 171.0 +margin_left = 33.0 +margin_right = 159.0 margin_bottom = 24.0 pressed = true text = "Multiplayer API" -__meta__ = { - -} [node name="Destination" type="OptionButton" parent="Panel/VBoxContainer/Settings"] -margin_left = 175.0 -margin_right = 216.0 +margin_left = 163.0 +margin_right = 192.0 margin_bottom = 24.0 -__meta__ = { - -} [node name="Send" type="HBoxContainer" parent="Panel/VBoxContainer"] margin_top = 56.0 margin_right = 1024.0 margin_bottom = 80.0 -__meta__ = { - -} [node name="LineEdit" type="LineEdit" parent="Panel/VBoxContainer/Send"] margin_right = 977.0 margin_bottom = 24.0 size_flags_horizontal = 3 placeholder_text = "Enter some text to send..." -__meta__ = { - -} [node name="Send" type="Button" parent="Panel/VBoxContainer/Send"] margin_left = 981.0 margin_right = 1024.0 margin_bottom = 24.0 text = "Send" -__meta__ = { - -} [node name="RichTextLabel" type="RichTextLabel" parent="Panel/VBoxContainer"] margin_top = 84.0 margin_right = 1024.0 margin_bottom = 600.0 size_flags_vertical = 3 -__meta__ = { - -} [node name="Client" type="Node" parent="."] script = ExtResource( 2 ) -__meta__ = { - -} [connection signal="toggled" from="Panel/VBoxContainer/Connect/Connect" to="." method="_on_Connect_toggled"] [connection signal="item_selected" from="Panel/VBoxContainer/Settings/Mode" to="." method="_on_Mode_item_selected"] [connection signal="pressed" from="Panel/VBoxContainer/Send/Send" to="." method="_on_Send_pressed"] diff --git a/networking/websocket_chat/client/client_ui.gd b/networking/websocket_chat/client/client_ui.gd index 071562c4..f57439a1 100644 --- a/networking/websocket_chat/client/client_ui.gd +++ b/networking/websocket_chat/client/client_ui.gd @@ -1,12 +1,12 @@ extends Control -onready var _client = get_node("Client") -onready var _log_dest = get_node("Panel/VBoxContainer/RichTextLabel") -onready var _line_edit = get_node("Panel/VBoxContainer/Send/LineEdit") -onready var _host = get_node("Panel/VBoxContainer/Connect/Host") -onready var _multiplayer = get_node("Panel/VBoxContainer/Settings/Multiplayer") -onready var _write_mode = get_node("Panel/VBoxContainer/Settings/Mode") -onready var _destination = get_node("Panel/VBoxContainer/Settings/Destination") +onready var _client = $Client +onready var _log_dest = $Panel/VBoxContainer/RichTextLabel +onready var _line_edit = $Panel/VBoxContainer/Send/LineEdit +onready var _host = $Panel/VBoxContainer/Connect/Host +onready var _multiplayer = $Panel/VBoxContainer/Settings/Multiplayer +onready var _write_mode = $Panel/VBoxContainer/Settings/Mode +onready var _destination = $Panel/VBoxContainer/Settings/Destination func _ready(): _write_mode.clear() @@ -23,9 +23,11 @@ func _ready(): _destination.set_item_metadata(2, -1) _destination.select(0) -func _on_Mode_item_selected( ID ): + +func _on_Mode_item_selected(_id): _client.set_write_mode(_write_mode.get_selected_metadata()) + func _on_Send_pressed(): if _line_edit.text == "": return @@ -40,6 +42,7 @@ func _on_Send_pressed(): _client.send_data(_line_edit.text, dest) _line_edit.text = "" + func _on_Connect_toggled( pressed ): if pressed: var multiplayer = _multiplayer.pressed diff --git a/networking/websocket_chat/combo/combo.tscn b/networking/websocket_chat/combo/combo.tscn index 8940a854..120e8daa 100644 --- a/networking/websocket_chat/combo/combo.tscn +++ b/networking/websocket_chat/combo/combo.tscn @@ -7,17 +7,11 @@ anchor_right = 1.0 anchor_bottom = 1.0 mouse_filter = 1 -__meta__ = { - -} [node name="Box" type="HBoxContainer" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 custom_constants/separation = 20 -__meta__ = { - -} [node name="ServerControl" parent="Box" instance=ExtResource( 1 )] anchor_right = 0.0 @@ -31,9 +25,6 @@ margin_left = 522.0 margin_right = 1024.0 margin_bottom = 600.0 size_flags_horizontal = 3 -__meta__ = { - -} [node name="Client" parent="Box/VBoxContainer" instance=ExtResource( 2 )] anchor_right = 0.0 diff --git a/networking/websocket_chat/server/server.gd b/networking/websocket_chat/server/server.gd index 790df3e5..999b8027 100644 --- a/networking/websocket_chat/server/server.gd +++ b/networking/websocket_chat/server/server.gd @@ -18,29 +18,35 @@ func _init(): _server.connect("peer_connected", self, "_client_connected", ["multiplayer_protocol"]) _server.connect("peer_disconnected", self, "_client_disconnected") + func _exit_tree(): _clients.clear() _server.stop() -func _process(delta): + +func _process(_delta): if _server.is_listening(): _server.poll() + func _client_close_request(id, code, reason): print(reason == "Bye bye!") Utils._log(_log_dest, "Client %s close code: %d, reason: %s" % [id, code, reason]) + func _client_connected(id, protocol): _clients[id] = _server.get_peer(id) _clients[id].set_write_mode(_write_mode) last_connected_client = id Utils._log(_log_dest, "%s: Client connected with protocol %s" % [id, protocol]) + func _client_disconnected(id, clean = true): Utils._log(_log_dest, "Client %s disconnected. Was clean: %s" % [id, clean]) if _clients.has(id): _clients.erase(id) + func _client_receive(id): if _use_multiplayer: var peer_id = _server.get_packet_peer() @@ -51,6 +57,7 @@ func _client_receive(id): var is_string = _server.get_peer(id).was_string_packet() Utils._log(_log_dest, "Data from %s BINARY: %s: %s" % [id, not is_string, Utils.decode_data(packet, is_string)]) + func send_data(data, dest): if _use_multiplayer: _server.set_target_peer(dest) @@ -59,15 +66,18 @@ func send_data(data, dest): for id in _clients: _server.get_peer(id).put_packet(Utils.encode_data(data, _write_mode)) + func listen(port, supported_protocols, multiplayer): _use_multiplayer = multiplayer if _use_multiplayer: set_write_mode(WebSocketPeer.WRITE_MODE_BINARY) return _server.listen(port, supported_protocols, multiplayer) + func stop(): _server.stop() + func set_write_mode(mode): _write_mode = mode for c in _clients: diff --git a/networking/websocket_chat/server/server_ui.gd b/networking/websocket_chat/server/server_ui.gd index dfad08fb..8d3146f8 100644 --- a/networking/websocket_chat/server/server_ui.gd +++ b/networking/websocket_chat/server/server_ui.gd @@ -1,12 +1,12 @@ extends Control -onready var _server = get_node("Server") -onready var _port = get_node("Panel/VBoxContainer/HBoxContainer/Port") -onready var _line_edit = get_node("Panel/VBoxContainer/HBoxContainer3/LineEdit") -onready var _write_mode = get_node("Panel/VBoxContainer/HBoxContainer2/WriteMode") -onready var _log_dest = get_node("Panel/VBoxContainer/RichTextLabel") -onready var _multiplayer = get_node("Panel/VBoxContainer/HBoxContainer2/MPAPI") -onready var _destination = get_node("Panel/VBoxContainer/HBoxContainer2/Destination") +onready var _server = $Server +onready var _port = $Panel/VBoxContainer/HBoxContainer/Port +onready var _line_edit = $Panel/VBoxContainer/HBoxContainer3/LineEdit +onready var _write_mode = $Panel/VBoxContainer/HBoxContainer2/WriteMode +onready var _log_dest = $Panel/VBoxContainer/RichTextLabel +onready var _multiplayer = $Panel/VBoxContainer/HBoxContainer2/MPAPI +onready var _destination = $Panel/VBoxContainer/HBoxContainer2/Destination func _ready(): _write_mode.clear() @@ -24,7 +24,8 @@ func _ready(): _destination.set_item_metadata(2, -1) _destination.select(0) -func _on_Listen_toggled( pressed ): + +func _on_Listen_toggled(pressed): if pressed: var use_multiplayer = _multiplayer.pressed _multiplayer.disabled = true @@ -49,6 +50,7 @@ func _on_Listen_toggled( pressed ): _destination.disabled = false Utils._log(_log_dest, "Server stopped") + func _on_Send_pressed(): if _line_edit.text == "": return @@ -63,5 +65,6 @@ func _on_Send_pressed(): _server.send_data(_line_edit.text, dest) _line_edit.text = "" -func _on_WriteMode_item_selected( ID ): + +func _on_WriteMode_item_selected(_id): _server.set_write_mode(_write_mode.get_selected_metadata()) diff --git a/networking/websocket_chat/utils.gd b/networking/websocket_chat/utils.gd index 0c1ffcfb..311f6c68 100644 --- a/networking/websocket_chat/utils.gd +++ b/networking/websocket_chat/utils.gd @@ -3,9 +3,11 @@ extends Node func encode_data(data, mode): return data.to_utf8() if mode == WebSocketPeer.WRITE_MODE_TEXT else var2bytes(data) + func decode_data(data, is_string): return data.get_string_from_utf8() if is_string else bytes2var(data) + func _log(node, msg): print(msg) node.add_text(str(msg) + "\n") diff --git a/networking/websocket_minimal/Main.tscn b/networking/websocket_minimal/Main.tscn index 02c63789..ab7297aa 100644 --- a/networking/websocket_minimal/Main.tscn +++ b/networking/websocket_minimal/Main.tscn @@ -4,18 +4,9 @@ [ext_resource path="res://client.gd" type="Script" id=2] [node name="Main" type="Node"] -__meta__ = { - -} [node name="Server" type="Node" parent="."] script = ExtResource( 1 ) -__meta__ = { - -} [node name="Client" type="Node" parent="."] script = ExtResource( 2 ) -__meta__ = { - -} diff --git a/networking/websocket_minimal/client.gd b/networking/websocket_minimal/client.gd index 6f52679f..e74e5c81 100644 --- a/networking/websocket_minimal/client.gd +++ b/networking/websocket_minimal/client.gd @@ -1,9 +1,9 @@ extends Node -# The URL we will connect to +# The URL we will connect to. export var websocket_url = "ws://localhost:9080" -# Our WebSocketClient instance +# Our WebSocketClient instance. var _client = WebSocketClient.new() func _ready(): @@ -22,12 +22,14 @@ func _ready(): print("Unable to connect") set_process(false) + func _closed(was_clean = false): # was_clean will tell you if the disconnection was correctly notified # by the remote peer before closing the socket. print("Closed, clean: ", was_clean) set_process(false) + func _connected(proto = ""): # This is called on connection, "proto" will be the selected WebSocket # sub-protocol (which is optional) @@ -36,16 +38,19 @@ func _connected(proto = ""): # and not put_packet directly when not using the MultiplayerAPI. _client.get_peer(1).put_packet("Test packet".to_utf8()) + func _on_data(): # Print the received packet, you MUST always use get_peer(1).get_packet # to receive data from server, and not get_packet directly when not # using the MultiplayerAPI. print("Got data from server: ", _client.get_peer(1).get_packet().get_string_from_utf8()) + func _process(delta): # Call this in _process or _physics_process. Data transfer, and signals # emission will only happen when calling this function. _client.poll() + func _exit_tree(): _client.disconnect_from_host() diff --git a/networking/websocket_minimal/server.gd b/networking/websocket_minimal/server.gd index 07b7449d..b74b0408 100644 --- a/networking/websocket_minimal/server.gd +++ b/networking/websocket_minimal/server.gd @@ -1,8 +1,8 @@ extends Node -# The port we will listen to +# The port we will listen to. const PORT = 9080 -# Our WebSocketServer instance +# Our WebSocketServer instance. var _server = WebSocketServer.new() func _ready(): @@ -22,22 +22,26 @@ func _ready(): print("Unable to start server") set_process(false) + func _connected(id, proto): # This is called when a new peer connects, "id" will be the assigned peer id, # "proto" will be the selected WebSocket sub-protocol (which is optional) print("Client %d connected with protocol: %s" % [id, proto]) + func _close_request(id, code, reason): # This is called when a client notifies that it wishes to close the connection, # providing a reason string and close code. print("Client %d disconnecting with code: %d, reason: %s" % [id, code, reason]) + func _disconnected(id, was_clean = false): # This is called when a client disconnects, "id" will be the one of the # disconnecting client, "was_clean" will tell you if the disconnection # was correctly notified by the remote peer before closing the socket. print("Client %d disconnected, clean: %s" % [id, str(was_clean)]) + func _on_data(id): # Print the received packet, you MUST always use get_peer(id).get_packet to receive data, # and not get_packet directly when not using the MultiplayerAPI. @@ -45,10 +49,12 @@ func _on_data(id): print("Got data from client %d: %s ... echoing" % [id, pkt.get_string_from_utf8()]) _server.get_peer(id).put_packet(pkt) + func _process(delta): # Call this in _process or _physics_process. # Data transfer, and signals emission will only happen when calling this function. _server.poll() + func _exit_tree(): _server.stop() diff --git a/networking/websocket_multiplayer/default_env.tres b/networking/websocket_multiplayer/default_env.tres index b9063186..dfe62abb 100644 --- a/networking/websocket_multiplayer/default_env.tres +++ b/networking/websocket_multiplayer/default_env.tres @@ -8,13 +8,7 @@ ground_bottom_color = Color( 0.101961, 0.145098, 0.188235, 1 ) ground_horizon_color = Color( 0.482353, 0.788235, 0.952941, 1 ) ground_curve = 0.01 sun_energy = 16.0 -__meta__ = { - -} [resource] background_mode = 2 background_sky = SubResource( 1 ) -__meta__ = { - -} diff --git a/networking/websocket_multiplayer/scene/game.tscn b/networking/websocket_multiplayer/scene/game.tscn index 7fddf3cc..bc89a88e 100644 --- a/networking/websocket_multiplayer/scene/game.tscn +++ b/networking/websocket_multiplayer/scene/game.tscn @@ -16,34 +16,22 @@ __meta__ = { [node name="HBoxContainer" type="HBoxContainer" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 -__meta__ = { - -} [node name="RichTextLabel" type="RichTextLabel" parent="HBoxContainer"] margin_right = 510.0 margin_bottom = 600.0 size_flags_horizontal = 3 -__meta__ = { - -} [node name="VBoxContainer" type="VBoxContainer" parent="HBoxContainer"] margin_left = 514.0 margin_right = 1024.0 margin_bottom = 600.0 size_flags_horizontal = 3 -__meta__ = { - -} [node name="Label" type="Label" parent="HBoxContainer/VBoxContainer"] margin_right = 510.0 margin_bottom = 14.0 text = "Players:" -__meta__ = { - -} [node name="ItemList" type="ItemList" parent="HBoxContainer/VBoxContainer"] margin_top = 18.0 @@ -52,9 +40,6 @@ margin_bottom = 576.0 size_flags_horizontal = 3 size_flags_vertical = 3 same_column_width = true -__meta__ = { - -} [node name="Action" type="Button" parent="HBoxContainer/VBoxContainer"] margin_top = 580.0 @@ -62,7 +47,4 @@ margin_right = 510.0 margin_bottom = 600.0 disabled = true text = "Do Action!" -__meta__ = { - -} [connection signal="pressed" from="HBoxContainer/VBoxContainer/Action" to="." method="_on_Action_pressed"] diff --git a/networking/websocket_multiplayer/scene/main.tscn b/networking/websocket_multiplayer/scene/main.tscn index c307df58..e4d08340 100644 --- a/networking/websocket_multiplayer/scene/main.tscn +++ b/networking/websocket_multiplayer/scene/main.tscn @@ -3,20 +3,17 @@ [ext_resource path="res://script/main.gd" type="Script" id=1] [ext_resource path="res://scene/game.tscn" type="PackedScene" id=2] -[node name="Control" type="Control"] +[node name="Main" type="Control"] anchor_right = 1.0 anchor_bottom = 1.0 script = ExtResource( 1 ) __meta__ = { - +"_edit_use_anchors_": false } [node name="Panel" type="Panel" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 -__meta__ = { - -} [node name="VBoxContainer" type="VBoxContainer" parent="Panel"] anchor_right = 1.0 @@ -25,16 +22,10 @@ margin_left = 20.0 margin_top = 20.0 margin_right = -20.0 margin_bottom = -20.0 -__meta__ = { - -} [node name="HBoxContainer" type="HBoxContainer" parent="Panel/VBoxContainer"] margin_right = 984.0 margin_bottom = 24.0 -__meta__ = { - -} [node name="Label" type="Label" parent="Panel/VBoxContainer/HBoxContainer"] margin_top = 5.0 @@ -42,9 +33,6 @@ margin_right = 326.0 margin_bottom = 19.0 size_flags_horizontal = 3 text = "Name" -__meta__ = { - -} [node name="NameEdit" type="LineEdit" parent="Panel/VBoxContainer/HBoxContainer"] margin_left = 330.0 @@ -53,51 +41,33 @@ margin_bottom = 24.0 size_flags_horizontal = 3 size_flags_stretch_ratio = 2.0 text = "A Godot User" -__meta__ = { - -} [node name="HBoxContainer2" type="HBoxContainer" parent="Panel/VBoxContainer"] margin_top = 28.0 margin_right = 984.0 margin_bottom = 52.0 -__meta__ = { - -} [node name="HBoxContainer" type="HBoxContainer" parent="Panel/VBoxContainer/HBoxContainer2"] margin_right = 326.0 margin_bottom = 24.0 size_flags_horizontal = 3 -__meta__ = { - -} [node name="Host" type="Button" parent="Panel/VBoxContainer/HBoxContainer2/HBoxContainer"] margin_right = 42.0 margin_bottom = 24.0 text = "Host" -__meta__ = { - -} [node name="Control" type="Control" parent="Panel/VBoxContainer/HBoxContainer2/HBoxContainer"] margin_left = 46.0 margin_right = 241.0 margin_bottom = 24.0 size_flags_horizontal = 3 -__meta__ = { - -} [node name="Connect" type="Button" parent="Panel/VBoxContainer/HBoxContainer2/HBoxContainer"] margin_left = 245.0 margin_right = 326.0 margin_bottom = 24.0 text = "Connect to" -__meta__ = { - -} [node name="Disconnect" type="Button" parent="Panel/VBoxContainer/HBoxContainer2/HBoxContainer"] visible = false @@ -105,9 +75,6 @@ margin_left = 68.0 margin_right = 152.0 margin_bottom = 24.0 text = "Disconnect" -__meta__ = { - -} [node name="Hostname" type="LineEdit" parent="Panel/VBoxContainer/HBoxContainer2"] margin_left = 330.0 @@ -117,18 +84,12 @@ size_flags_horizontal = 3 size_flags_stretch_ratio = 2.0 text = "localhost" placeholder_text = "localhost" -__meta__ = { - -} [node name="Control" type="Control" parent="Panel/VBoxContainer"] margin_top = 56.0 margin_right = 984.0 margin_bottom = 76.0 rect_min_size = Vector2( 0, 20 ) -__meta__ = { - -} [node name="Game" parent="Panel/VBoxContainer" instance=ExtResource( 2 )] anchor_right = 0.0 @@ -147,9 +108,6 @@ margin_top = -100.0 margin_right = 200.0 margin_bottom = 100.0 dialog_text = "Connection closed" -__meta__ = { - -} [connection signal="pressed" from="Panel/VBoxContainer/HBoxContainer2/HBoxContainer/Host" to="." method="_on_Host_pressed"] [connection signal="pressed" from="Panel/VBoxContainer/HBoxContainer2/HBoxContainer/Connect" to="." method="_on_Connect_pressed"] [connection signal="pressed" from="Panel/VBoxContainer/HBoxContainer2/HBoxContainer/Disconnect" to="." method="_on_Disconnect_pressed"] diff --git a/networking/websocket_multiplayer/script/game.gd b/networking/websocket_multiplayer/script/game.gd index 512efc03..4ca68139 100644 --- a/networking/websocket_multiplayer/script/game.gd +++ b/networking/websocket_multiplayer/script/game.gd @@ -12,11 +12,13 @@ master func set_player_name(name): var sender = get_tree().get_rpc_sender_id() rpc("update_player_name", sender, name) + sync func update_player_name(player, name): var pos = _players.find(player) if pos != -1: _list.set_item_text(pos, name) + master func request_action(action): var sender = get_tree().get_rpc_sender_id() if _players[_turn] != get_tree().get_rpc_sender_id(): @@ -25,11 +27,13 @@ master func request_action(action): do_action(action) next_turn() + sync func do_action(action): var name = _list.get_item_text(_turn) var val = randi() % 100 rpc("_log", "%s: %ss %d" % [name, action, val]) + sync func set_turn(turn): _turn = turn if turn >= _players.size(): @@ -41,6 +45,7 @@ sync func set_turn(turn): _list.set_item_icon(i, null) _action.disabled = _players[turn] != get_tree().get_network_unique_id() + sync func del_player(id): var pos = _players.find(id) if pos == -1: @@ -52,6 +57,7 @@ sync func del_player(id): if get_tree().is_network_server(): rpc("set_turn", _turn) + sync func add_player(id, name=""): _players.append(id) if name == "": @@ -59,27 +65,32 @@ sync func add_player(id, name=""): else: _list.add_item(name, null, false) + func get_player_name(pos): if pos < _list.get_item_count(): return _list.get_item_text(pos) else: return "Error!" + func next_turn(): _turn += 1 if _turn >= _players.size(): _turn = 0 rpc("set_turn", _turn) + func start(): set_turn(0) + func stop(): _players.clear() _list.clear() _turn = 0 _action.disabled = true + func on_peer_add(id): if not get_tree().is_network_server(): return @@ -88,14 +99,17 @@ func on_peer_add(id): rpc("add_player", id) rpc_id(id, "set_turn", _turn) + func on_peer_del(id): if not get_tree().is_network_server(): return rpc("del_player", id) + sync func _log(what): $HBoxContainer/RichTextLabel.add_text(what + "\n") + func _on_Action_pressed(): if get_tree().is_network_server(): do_action("roll") diff --git a/networking/websocket_multiplayer/script/main.gd b/networking/websocket_multiplayer/script/main.gd index 1dcb0423..2a141aa0 100644 --- a/networking/websocket_multiplayer/script/main.gd +++ b/networking/websocket_multiplayer/script/main.gd @@ -11,10 +11,18 @@ onready var _host_edit = $Panel/VBoxContainer/HBoxContainer2/Hostname onready var _game = $Panel/VBoxContainer/Game func _ready(): + #warning-ignore-all:return_value_discarded get_tree().connect("network_peer_disconnected", self, "_peer_disconnected") get_tree().connect("network_peer_connected", self, "_peer_connected") $AcceptDialog.get_label().align = Label.ALIGN_CENTER $AcceptDialog.get_label().valign = Label.VALIGN_CENTER + # Set the player name according to the system username. Fallback to the path. + if OS.has_environment("USERNAME"): + _name_edit.text = OS.get_environment("USERNAME") + else: + var desktop_path = OS.get_system_dir(0).replace("\\", "/").split("/") + _name_edit.text = desktop_path[desktop_path.size() - 2] + func start_game(): _host_btn.disabled = true @@ -24,6 +32,7 @@ func start_game(): _disconnect_btn.show() _game.start() + func stop_game(): _host_btn.disabled = false _name_edit.editable = true @@ -32,6 +41,7 @@ func stop_game(): _connect_btn.show() _game.stop() + func _close_network(): if get_tree().is_connected("server_disconnected", self, "_close_network"): get_tree().disconnect("server_disconnected", self, "_close_network") @@ -44,15 +54,19 @@ func _close_network(): $AcceptDialog.get_close_button().grab_focus() get_tree().set_network_peer(null) + func _connected(): _game.rpc("set_player_name", _name_edit.text) + func _peer_connected(id): _game.on_peer_add(id) + func _peer_disconnected(id): _game.on_peer_del(id) + func _on_Host_pressed(): var host = WebSocketServer.new() host.listen(DEF_PORT, PoolStringArray(["ludus"]), true) @@ -61,9 +75,11 @@ func _on_Host_pressed(): _game.add_player(1, _name_edit.text) start_game() + func _on_Disconnect_pressed(): _close_network() + func _on_Connect_pressed(): var host = WebSocketClient.new() host.connect_to_url("ws://" + _host_edit.text + ":" + str(DEF_PORT), PoolStringArray([PROTO_NAME]), true)