From 58b2fdf39fdcb9dd7ddc8b07cb76eafbed63fae1 Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 26 May 2018 12:31:15 -0400 Subject: [PATCH] Fix peers not properly sharing other peer's info --- scripts/hero_select.gd | 2 +- scripts/lobby.gd | 22 ++++++++++++++-------- scripts/networking.gd | 26 ++++++++++++++------------ 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/scripts/hero_select.gd b/scripts/hero_select.gd index 38b2726..ebb7b3c 100644 --- a/scripts/hero_select.gd +++ b/scripts/hero_select.gd @@ -26,7 +26,7 @@ func _ready(): func set_hero(hero): select(hero) - networking.set_info("hero", hero) + networking.set_info_from_server("hero", hero) func random_hero(): var hero = randi() % hero_names.size() diff --git a/scripts/lobby.gd b/scripts/lobby.gd index d96f8d8..7aab4cb 100644 --- a/scripts/lobby.gd +++ b/scripts/lobby.gd @@ -9,14 +9,20 @@ onready var ready_button = get_node("Ready") func _ready(): + # Connect (to networking) get_node("Username").connect("text_changed", self, "_send_name") - - var spectating = util.args.get_value("-silent") - get_node("Spectating").pressed = spectating get_node("Spectating").connect("toggled", self, "_set_info_callback", ["spectating"]) ready_button.connect("toggled", self, "_set_info_callback", ["ready"]) start_game_button.connect("pressed", networking, "start_game") + # Connect (from networking) + networking.connect("info_updated", self, "render_player_list") + get_tree().connect("connected_to_server", self, "_connected") + + # Connect (static) get_node("Back").connect("pressed", self, "_exit_to_menu") + + var spectating = util.args.get_value("-silent") + get_node("Spectating").pressed = spectating # Shown, maybe, in _check_begun start_game_button.hide() if get_tree().is_network_server(): @@ -36,18 +42,18 @@ func _ready(): else: level_select.hide() - networking.connect("info_updated", self, "render_player_list") - get_tree().connect("connected_to_server", self, "_connected") if get_tree().is_network_server(): _connected() func _connected(): _send_name() + networking.set_info_from_server("ready", false) + networking.set_info_from_server("spectating", util.args.get_value("-silent")) + networking.set_info_from_server("begun", false) if util.args.get_value("-hero") == "r": hero_select.random_hero() else: - print(util.args.get_value("-hero")) hero_select.set_hero(int(util.args.get_value("-hero"))) if util.args.get_value("-start-game"): @@ -59,7 +65,7 @@ func _set_level(level): # Because of the annoying way callbacks work (automatic parameter, optional parameter) # We need a utility function for making these kinds of callbacks for set_info func _set_info_callback(value, key): - networking.set_info(key, value) + networking.set_info_from_server(key, value) sync func set_hero(peer, hero): networking.players[peer].hero = hero @@ -67,7 +73,7 @@ sync func set_hero(peer, hero): func _send_name(): var name = get_node("Username").text - networking.set_info("username", name) + networking.set_info_from_server("username", name) func _check_begun(): var game_started = networking.players[1].begun diff --git a/scripts/networking.gd b/scripts/networking.gd index 9e97536..08eda14 100644 --- a/scripts/networking.gd +++ b/scripts/networking.gd @@ -74,13 +74,6 @@ func send_all_info(new_peer): set_info(key, val, p) remote func register_player(new_peer): - var info = {} - info.is_right_team = right_team_next - info.ready = false - info.spectating = false - info.begun = false - right_team_next = not right_team_next - players[new_peer] = info if get_tree().is_network_server(): # I tell new player about all the existing people send_all_info(new_peer) @@ -115,16 +108,25 @@ sync func _set_info(key, value, peer=0): if peer == 0: # Was self. See https://github.com/godotengine/godot/issues/19026 peer = get_tree().get_network_unique_id() - if players.has(peer): - players[peer][key] = value - emit_signal("info_updated") + if not players.has(peer): + players[peer] = {} + players[peer][key] = value + emit_signal("info_updated") -func set_info(key, value, peer=0): +master func set_info(key, value, peer=0): rpc("_set_info", str(key), value, peer) +# When connectivity is not yet guaranteed, the only one we know is always +# connected to everyone is the server. So in initial handshakes, it's better to +# tell the server what to tell everyone to do +func set_info_from_server(key, value, peer=0): + if not peer: + peer = get_tree().get_network_unique_id() + rpc_id(1, "set_info", key, value, peer) + func _on_connect(): - emit_signal("info_updated") register_player(get_tree().get_network_unique_id()) + emit_signal("info_updated") func _check_info(): # Check for "everyone is ready"