Leaving works, some more stuff around waiting for peering to finish

setting up?
This commit is contained in:
Daniel Flanagan 2021-12-09 21:53:43 -06:00
parent 5e7735a815
commit 41e7769249
Signed by: lytedev
GPG key ID: 5B2020A0F9921EF4
5 changed files with 72 additions and 13 deletions

View file

@ -176,7 +176,7 @@ size_flags_vertical = 3
clear_button_enabled = true clear_button_enabled = true
placeholder_text = "Compose a chat message here, press Enter to send" placeholder_text = "Compose a chat message here, press Enter to send"
[node name="Button" type="Button" parent="v/body/v/h"] [node name="send" type="Button" parent="v/body/v/h"]
margin_left = 678.0 margin_left = 678.0
margin_right = 786.0 margin_right = 786.0
margin_bottom = 31.0 margin_bottom = 31.0
@ -188,4 +188,4 @@ text = "Send Message"
[connection signal="pressed" from="v/head/start" to="." method="_on_start_pressed"] [connection signal="pressed" from="v/head/start" to="." method="_on_start_pressed"]
[connection signal="toggled" from="v/head/ready_up" to="." method="_on_ready_up_toggled"] [connection signal="toggled" from="v/head/ready_up" to="." method="_on_ready_up_toggled"]
[connection signal="text_entered" from="v/body/v/h/chat" to="." method="_on_TextEdit_text_entered"] [connection signal="text_entered" from="v/body/v/h/chat" to="." method="_on_TextEdit_text_entered"]
[connection signal="pressed" from="v/body/v/h/Button" to="." method="_on_Button_pressed"] [connection signal="pressed" from="v/body/v/h/send" to="." method="_on_Button_pressed"]

View file

@ -156,7 +156,7 @@ func _process_message(data: Dictionary):
emit_signal("peer_data", [data] if data.has("id") else data["data"]) emit_signal("peer_data", [data] if data.has("id") else data["data"])
"peer_left": "peer_left":
print("Peer Left: %s" % data) print("Peer Left: %s" % data)
emit_signal("peer_left", data) emit_signal("peer_left", data["data"])
"candidate": "candidate":
print("Candidate received - Data: %s" % JSON.print(data)) print("Candidate received - Data: %s" % JSON.print(data))

View file

@ -4,6 +4,11 @@ extends Node
This module sets up WebRTC peer connections. This module sets up WebRTC peer connections.
""" """
signal peer_connected(id)
signal peer_disconnected(id)
signal connection_succeeded()
signal signaller_disconnected()
onready var webrtc = WebRTCMultiplayer.new() onready var webrtc = WebRTCMultiplayer.new()
var signaller_client = null var signaller_client = null
@ -15,17 +20,39 @@ func _init(_ice_servers, _signaller_client):
print("Initializing WebRTCNegotiator with ICE servers: %s" % ice_servers) print("Initializing WebRTCNegotiator with ICE servers: %s" % ice_servers)
func _ready(): func _ready():
signaller_client.connect("disconnected", self, "_signaller_disconnected")
signaller_client.connect("offer_received", self, "_offer_received") signaller_client.connect("offer_received", self, "_offer_received")
signaller_client.connect("answer_received", self, "_answer_received") signaller_client.connect("answer_received", self, "_answer_received")
signaller_client.connect("candidate_received", self, "_candidate_received") signaller_client.connect("candidate_received", self, "_candidate_received")
# signaller_client.connect("websocket_disconnected", self, "disconnected")
signaller_client.connect("peer_init", self, "_peer_id_set") signaller_client.connect("peer_init", self, "_peer_id_set")
signaller_client.connect("peer_data", self, "_peer_data") signaller_client.connect("peer_data", self, "_peer_data")
# webrtc.connect("peer_disconnected", self, "peer_disconnected")
webrtc.connect("connection_succeeded", self, "_connection_succeeded")
webrtc.connect("peer_connected", self, "_peer_connected")
webrtc.connect("peer_disconnected", self, "_peer_disconnected")
# connect("lobby_sealed", self, "lobby_sealed") # connect("lobby_sealed", self, "lobby_sealed")
add_child(self.signaller_client) add_child(self.signaller_client)
func _peer_connected(peer_id):
print("FULLY CONNECTED PEER: %s" % peer_id)
emit_signal("peer_connected", peer_id)
func _peer_disconnected(peer_id):
print("FULLY CONNECTED PEER DISCONNECTING: %s" % peer_id)
emit_signal("peer_disconnected")
func _connection_succeeded():
print("FULLY CONNECTED")
emit_signal("connection_succeeded")
func _signaller_disconnected():
print("SIGNALLER DISCONNECTED")
emit_signal("signaller_disconnected")
func close(): func close():
webrtc.close() webrtc.close()
signaller_client.close() signaller_client.close()

View file

@ -6,6 +6,7 @@ onready var ready_tex: Texture = load("res://assets/img/check.png")
onready var not_ready_tex: Texture = load("res://assets/img/cross.png") onready var not_ready_tex: Texture = load("res://assets/img/cross.png")
export(String) var id = "Some UUID" export(String) var id = "Some UUID"
export(String) var peerId = "Some UUID"
export(String) var display_name = "Lobby" setget set_display_name export(String) var display_name = "Lobby" setget set_display_name
export(bool) var ready = false setget set_ready export(bool) var ready = false setget set_ready
@ -17,7 +18,7 @@ func _update():
$TextureRect.texture = ready_tex if ready else not_ready_tex $TextureRect.texture = ready_tex if ready else not_ready_tex
$TextureRect.hint_tooltip = "Ready" if ready else "Not Ready" $TextureRect.hint_tooltip = "Ready" if ready else "Not Ready"
const keys = ["id", "display_name", "ready"] const keys = ["id", "display_name", "ready", "peerId"]
func set_with_dict(dict): func set_with_dict(dict):
if dict.has("name"): self.display_name = dict["name"] if dict.has("name"): self.display_name = dict["name"]
for k in keys: for k in keys:

View file

@ -5,6 +5,7 @@ onready var lobby_name = $v/head/lobby_info
onready var peers_list_label = $v/body/peers/label onready var peers_list_label = $v/body/peers/label
onready var chat = $v/body/v/messages onready var chat = $v/body/v/messages
onready var chat_edit = $v/body/v/h/chat onready var chat_edit = $v/body/v/h/chat
onready var send_button = $v/body/v/h/send
onready var auto_scroll_chk = $v/body/v/chat_head/auto_scroll onready var auto_scroll_chk = $v/body/v/chat_head/auto_scroll
onready var max_players = $v/head/max_players onready var max_players = $v/head/max_players
onready var ready_up = $v/head/ready_up onready var ready_up = $v/head/ready_up
@ -13,6 +14,7 @@ onready var start = $v/head/start
onready var peer = preload("res://objects/peer.tscn") onready var peer = preload("res://objects/peer.tscn")
onready var peers = {} onready var peers = {}
onready var peers_id_mappings = {}
onready var is_host = false onready var is_host = false
func _ready(): func _ready():
@ -22,6 +24,7 @@ func _ready():
Global.signaller_client.connect("lobby_data", self, "_lobby_data") Global.signaller_client.connect("lobby_data", self, "_lobby_data")
Global.signaller_client.connect("disconnected", self, "_signaller_disconnected") Global.signaller_client.connect("disconnected", self, "_signaller_disconnected")
Global.negotiator.connect("connection_succeeded", self, "_connection_succeeded")
# lobby_name.text = "%s" % Global.signaller_client.lobby_name # lobby_name.text = "%s" % Global.signaller_client.lobby_name
@ -30,14 +33,24 @@ func _ready():
# hide/show controls depending on whether or not we're the host # hide/show controls depending on whether or not we're the host
is_host = Global.signaller_client.is_host() is_host = Global.signaller_client.is_host()
if is_host: ready_up.queue_free() if is_host:
ready_up.queue_free()
else: else:
lobby_name.editable = false lobby_name.editable = false
max_players.editable = false max_players.editable = false
start.queue_free() start.queue_free()
lock.queue_free() lock.queue_free()
# until we fully connect
ready_up.disabled = true
chat_edit.disabled = true
send_button.disabled = true
print("Setting up lobby... %s %s" % [Global.signaller_client.peer_id, is_host]) print("Setting up lobby... %s %s" % [Global.signaller_client.peer_id, is_host])
func _connection_succeeded():
ready_up.disabled = false
send_button.disabled = false
func _lobby_update(l): func _lobby_update(l):
for u in l: for u in l:
if !is_host: if !is_host:
@ -56,9 +69,11 @@ func _peer_data(peers):
func _add_peer(id, peer_data): func _add_peer(id, peer_data):
call_deferred("update_player_count") call_deferred("update_player_count")
var new_peer = peer.instance() var new_peer = peer.instance()
if peer_data.peerId == 1: peer_data.ready = true
new_peer.set_with_dict(peer_data) new_peer.set_with_dict(peer_data)
peers_grid.add_child(new_peer) peers_grid.add_child(new_peer)
peers[id] = new_peer peers[id] = new_peer
peers_id_mappings[int(peer_data.peerId)] = id
add_chat("> %s joined the lobby" % new_peer.display_name) add_chat("> %s joined the lobby" % new_peer.display_name)
func _update_peer(id, peer_data): func _update_peer(id, peer_data):
@ -67,15 +82,24 @@ func _update_peer(id, peer_data):
add_chat("! %s is %s" % [peers[id].display_name, update_text]) add_chat("! %s is %s" % [peers[id].display_name, update_text])
peers[id].set_with_dict(peer_data) peers[id].set_with_dict(peer_data)
func _peer_left(ids: Array): func _peer_left(leavers):
call_deferred("update_player_count") call_deferred("update_player_count")
for data in ids: for data in leavers:
var id = data["id"] var id = data.id
if peers.has(id): if peers.has(id):
var peer_id = peers[id].peerId
call_deferred("add_chat", "< %s left the lobby" % peers[id].display_name) call_deferred("add_chat", "< %s left the lobby" % peers[id].display_name)
peers[id].queue_free() peers[id].queue_free()
peers.erase(id) peers.erase(id)
peers_id_mappings.erase(peer_id)
func peer_by_peer_id(peer_id):
if peers_id_mappings.has(peer_id):
var p = peers_id_mappings[peer_id]
if peers.has(p):
return peers[p]
return null
remotesync func add_chat(message): remotesync func add_chat(message):
if auto_scroll_chk.pressed: call_deferred("scroll_chat_to_bottom") if auto_scroll_chk.pressed: call_deferred("scroll_chat_to_bottom")
else: else:
@ -104,7 +128,6 @@ func update_can_start():
if !peer.ready: if !peer.ready:
can_start = false can_start = false
break break
print(can_start)
if can_start: add_chat("! All players ready - game may now be started") if can_start: add_chat("! All players ready - game may now be started")
start.disabled = !can_start start.disabled = !can_start
@ -114,11 +137,19 @@ func _on_start_pressed():
remotesync func start_game(): remotesync func start_game():
Global.goto_game() Global.goto_game()
remotesync func set_ready(ready):
var from = get_tree().get_rpc_sender_id()
print(from)
peer_by_peer_id(from).ready = ready
func _on_TextEdit_text_entered(_new_text):
if !send_button.disabled:
send_chat_message()
func _lobby_left(_id): Global.lobby_browser() func _lobby_left(_id): Global.lobby_browser()
func _on_leave_button_pressed(): Global.lobby_browser() func _on_leave_button_pressed(): Global.lobby_browser()
func _on_TextEdit_text_entered(_new_text): send_chat_message()
func update_player_count(): peers_list_label.text = "Players: %d" % peers.size() func update_player_count(): peers_list_label.text = "Players: %d" % peers.size()
func _on_Button_pressed(): send_chat_message() func _on_Button_pressed(): send_chat_message()
func _on_ready_up_toggled(button_pressed: bool): Global.signaller_client.set_ready(button_pressed) func _on_ready_up_toggled(button_pressed: bool): rpc("set_ready", button_pressed)
func _on_lobby_info_text_changed(new_text: String): Global.signaller_client.set_lobby_name(new_text) func _on_lobby_info_text_changed(new_text: String): Global.signaller_client.set_lobby_name(new_text)
func _signaller_disconnected(): Global.main_menu() func _signaller_disconnected(): Global.main_menu()