Browse Source

Fix spawning infinite players on start

Infinite loop in start_game caused by set_info setting the wrong peer's
info. Making the RPC more explicit about who we're setting resolves
this.
master
Luna 7 years ago
parent
commit
8462031d55
1 changed files with 16 additions and 16 deletions
  1. +16
    -16
      scripts/networking.gd

+ 16
- 16
scripts/networking.gd View File

@ -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()


Loading…
Cancel
Save