diff --git a/scripts/networking.gd b/scripts/networking.gd index 955098d..a53fba3 100644 --- a/scripts/networking.gd +++ b/scripts/networking.gd @@ -96,18 +96,15 @@ sync func unregister_player(peer): p.queue_free() emit_signal("info_updated") -sync func _set_info(key, value, peer=0): - if not peer: - peer = get_tree().get_rpc_sender_id() - if peer == 0: - # Was self. See https://github.com/godotengine/godot/issues/19026 - peer = get_tree().get_network_unique_id() +sync func _set_info(key, value, peer): if not players.has(peer): players[peer] = {} players[peer][key] = value emit_signal("info_updated") master func set_info(key, value, peer=0): + if not peer: + peer = get_tree().get_network_unique_id() rpc("_set_info", str(key), value, peer) # When connectivity is not yet guaranteed, the only one we know is always @@ -142,13 +139,14 @@ sync func _spawn_player(p): player.set_name(str(p)) player.set_network_master(p) player.player_info = players[p] - get_node("/root/Level/Players").call_deferred("add_child", player) + get_node("/root/Level/Players").add_child(player) sync func _pre_configure_game(level): var self_peer_id = get_tree().get_network_unique_id() + var self_begun = players[self_peer_id].begun - if not players[self_peer_id].begun: + if not self_begun: get_node("/root/Lobby").hide() var world = load("res://scenes/levels/%d.tscn" % level).instance() @@ -158,31 +156,33 @@ sync func _pre_configure_game(level): for p in players: if not players[p].spectating: var existing_player = util.get_player(p) - if not players[self_peer_id].begun or not existing_player: + if not self_begun or not existing_player: _spawn_player(p) - set_info("begun", true) + # Why do we check first? Weird error. It's because set_info triggers a + # start_game if everyone is ready + # This causes a stack overflow if we call it from here repeatedly + # So we only change it once, only start_game twice, and avoida segfault + if not self_begun: + print("setting my begun to true") + set_info("begun", true) rpc_id(1, "_done_preconfiguring", self_peer_id) sync func _done_preconfiguring(who): players_done.append(who) if players_done.size() == players.size(): print("done") - # We call deferred in case singleplayer has placing the player in queue still - call_deferred("rpc", "_post_configure_game") + rpc("_post_configure_game") sync func _post_configure_game(): # Begin all players (including self) for p in players: if not players[p].spectating: - _begin_player_deferred(p) + _begin_player(p) func _begin_player(peer): util.get_player(peer).begin() -remote func _begin_player_deferred(peer): - call_deferred("_begin_player", peer) - sync func reset_state(): players_done = [] get_node("/root/Level").queue_free()