From 5693bcdab015160182c44c204b6545e345e7c41c Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 26 May 2018 22:06:10 -0400 Subject: [PATCH] Organize public and private methods within networking --- scripts/lobby.gd | 6 +-- scripts/networking.gd | 132 +++++++++++++++++++++++++++----------------------- 2 files changed, 74 insertions(+), 64 deletions(-) diff --git a/scripts/lobby.gd b/scripts/lobby.gd index e634d6e..72abc8a 100644 --- a/scripts/lobby.gd +++ b/scripts/lobby.gd @@ -13,7 +13,7 @@ func _ready(): 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") + networking.connect("info_updated", self, "_render_player_list") get_tree().connect("connected_to_server", self, "_connected") # Connect (static) @@ -67,7 +67,7 @@ func _set_info_callback(value, key): sync func set_hero(peer, hero): networking.players[peer].hero = hero - render_player_list() + _render_player_list() func _send_name(): var name = get_node("Username").text @@ -82,7 +82,7 @@ func _check_begun(): # The "Ready" toggle doesn't really make sense on a started game ready_button.hide() -func render_player_list(): +func _render_player_list(): _check_begun() var list = "" var hero_names = hero_select.hero_names diff --git a/scripts/networking.gd b/scripts/networking.gd index bf04e2c..14d15f7 100644 --- a/scripts/networking.gd +++ b/scripts/networking.gd @@ -1,25 +1,20 @@ extends Node +# Public variables +# ================ + onready var matchmaking = preload("res://scripts/matchmaking.gd").new() remote var players = {} -var players_done = [] var global_server_ip = "nv.cosinegaming.com" var matchmaker_tcp -var right_team_next = false var level signal info_updated -func _ready(): - add_child(matchmaking) - - get_tree().connect("network_peer_disconnected", self, "unregister_player") - get_tree().connect("network_peer_connected", self, "register_player") - get_tree().connect("connected_to_server", self, "_on_connect") - - connect("info_updated", self, "_check_info") +# Public methods +# ============== func start_client(ip="", port=0): if not ip: @@ -38,14 +33,6 @@ remote func reconnect(ip, port): players = {} start_client(ip, port) -func _connect_to_matchmaker(game_port): - var matchmaker_peer = StreamPeerTCP.new() - matchmaker_peer.connect_to_host("127.0.0.1", matchmaking.SERVER_TO_SERVER_PORT) - var matchmaker_tcp = PacketPeerStream.new() - matchmaker_tcp.set_stream_peer(matchmaker_peer) - matchmaker_tcp.put_var(matchmaking.messages.ready_to_connect) - matchmaker_tcp.put_var(game_port) - func start_server(port=0): if not port: port = util.args.get_value("-port") @@ -55,18 +42,72 @@ func start_server(port=0): get_tree().set_network_peer(peer) # As soon as we're listening, let the matchmaker know _connect_to_matchmaker(port) - register_player(get_tree().get_network_unique_id()) + _register_player(get_tree().get_network_unique_id()) if util.args.get_value("-silent"): set_info("spectating", true) get_tree().change_scene("res://scenes/lobby.tscn") -master func _start_game(): - rpc("_pre_configure_game", level) +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 +# 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 start_game(): rpc_id(1, "_start_game") -func send_all_info(new_peer): +sync func reset_state(): + for p in players: + players[p].begun = false + # TODO: Do I in fact want to unready everyone automatically? + players[p].ready = false + get_node("/root/Level").queue_free() + + +# Private methods +# =============== + +func _ready(): + add_child(matchmaking) + + get_tree().connect("network_peer_disconnected", self, "_unregister_player") + get_tree().connect("network_peer_connected", self, "_register_player") + get_tree().connect("connected_to_server", self, "_on_connect") + + connect("info_updated", self, "_check_info") + +remote func _register_player(new_peer): + if get_tree().is_network_server(): + # I tell new player about all the existing people + _send_all_info(new_peer) + set_info("is_right_team", _right_team_next(), new_peer) + +sync func _unregister_player(peer): + players.erase(peer) + var p = util.get_player(peer) + if p: + p.queue_free() + emit_signal("info_updated") + +func _connect_to_matchmaker(game_port): + var matchmaker_peer = StreamPeerTCP.new() + matchmaker_peer.connect_to_host("127.0.0.1", matchmaking.SERVER_TO_SERVER_PORT) + var matchmaker_tcp = PacketPeerStream.new() + matchmaker_tcp.set_stream_peer(matchmaker_peer) + matchmaker_tcp.put_var(matchmaking.messages.ready_to_connect) + matchmaker_tcp.put_var(game_port) + +master func _start_game(): + rpc("_pre_configure_game", level) + +func _send_all_info(new_peer): for p in players: if p != new_peer: for key in players[p]: @@ -83,40 +124,14 @@ func _right_team_next(): right_team_count += 1 return (right_team_count <= players.size() / 2) -remote func register_player(new_peer): - if get_tree().is_network_server(): - # I tell new player about all the existing people - send_all_info(new_peer) - set_info("is_right_team", _right_team_next(), new_peer) - -sync func unregister_player(peer): - players.erase(peer) - var p = util.get_player(peer) - if p: - p.queue_free() - emit_signal("info_updated") - 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 -# 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(): - register_player(get_tree().get_network_unique_id()) + _register_player(get_tree().get_network_unique_id()) emit_signal("info_updated") func _check_info(): @@ -124,11 +139,17 @@ func _check_info(): # Only have 1 person check this, might as well be server if get_tree().is_network_server(): var ready = true + var all_done = true for p in players: if not players[p].has("spectating") or not players[p].spectating: if not players[p].has("ready") or not players[p].ready: ready = false - if ready: + if not players[p].has("begun") or not players[p].begun: + all_done = false + if all_done: + rpc("_post_configure_game") + elif ready: + # If we're all done, then we don't need to even check a start_game start_game() sync func _spawn_player(p): @@ -173,20 +194,9 @@ sync func _pre_configure_game(level): # So we only change it once, only start_game twice, and avoida segfault if not self_begun: 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") - rpc("_post_configure_game") sync func _post_configure_game(): # Begin all players (including self) # TODO: What do? Maybe, unpause game? pass -sync func reset_state(): - players_done = [] - get_node("/root/Level").queue_free() -