From 345ca3d6fe10d9fe9f1e4c9f93ce4aa52c9821c9 Mon Sep 17 00:00:00 2001 From: Luna Date: Sun, 20 May 2018 19:49:06 -0400 Subject: [PATCH] Fix joining late! --- scenes/lobby.tscn | 2 +- scripts/heroes/3.gd | 2 +- scripts/heroes/4.gd | 2 +- scripts/heroes/5.gd | 2 +- scripts/heroes/5_portal.gd | 2 +- scripts/lobby.gd | 16 +++++++++++++--- scripts/networking.gd | 22 +++++++++++++--------- scripts/player.gd | 3 ++- scripts/util.gd | 6 +++++- 9 files changed, 38 insertions(+), 19 deletions(-) diff --git a/scenes/lobby.tscn b/scenes/lobby.tscn index 8381d61..66f376c 100644 --- a/scenes/lobby.tscn +++ b/scenes/lobby.tscn @@ -297,7 +297,7 @@ toggle_mode = false enabled_focus_mode = 2 shortcut = null group = null -text = "Ready!" +text = "Start!" flat = false align = 1 diff --git a/scripts/heroes/3.gd b/scripts/heroes/3.gd index b5603af..7f5229e 100644 --- a/scripts/heroes/3.gd +++ b/scripts/heroes/3.gd @@ -90,7 +90,7 @@ func set_boosted(node, is_boosted): sync func merge(node_name): set_boosting(true) - var other = $"/root/Level/Players".get_node(node_name) + var other = util.get_player(node_name) set_boosted(other, true) merged = other diff --git a/scripts/heroes/4.gd b/scripts/heroes/4.gd index 179792a..b76049c 100644 --- a/scripts/heroes/4.gd +++ b/scripts/heroes/4.gd @@ -60,7 +60,7 @@ func _process(delta): sync func stun(net_id, position): # Stun the thing! - var player = get_node("/root/Level/Players/%s" % net_id) + var player = util.get_player(net_id) player.set_linear_velocity(Vector3()) # Show the beam! diff --git a/scripts/heroes/5.gd b/scripts/heroes/5.gd index 72fd2e8..7697230 100644 --- a/scripts/heroes/5.gd +++ b/scripts/heroes/5.gd @@ -66,7 +66,7 @@ func flick_input(): build_charge(flick_charge) sync func flick(player_id, towards): - var who = $"/root/Level/Players".get_node(player_id) + var who = util.get_player(player_id) if who.is_network_master(): var direction = towards - who.translation var impulse = direction.normalized() * flick_strength * who.get_mass() diff --git a/scripts/heroes/5_portal.gd b/scripts/heroes/5_portal.gd index da361b2..757f7d9 100644 --- a/scripts/heroes/5_portal.gd +++ b/scripts/heroes/5_portal.gd @@ -25,7 +25,7 @@ func _exit_tree(): other.queue_free() func init(maker): - + index = maker.placement.placed.size() # If index is odd, we're the second (1, 3...), if even, first (0, 4...) diff --git a/scripts/lobby.gd b/scripts/lobby.gd index fa2a277..31fff35 100644 --- a/scripts/lobby.gd +++ b/scripts/lobby.gd @@ -5,6 +5,7 @@ var port = null # Defined by command-line argument with default onready var hero_select = get_node("HeroSelect/Hero") onready var level_select = get_node("LevelSelect") onready var start_game_button = get_node("StartGame") +onready var ready_button = get_node("Ready") func _ready(): @@ -13,12 +14,12 @@ func _ready(): var spectating = util.args.get_value("-silent") get_node("Spectating").pressed = spectating get_node("Spectating").connect("toggled", self, "_set_info_callback", ["spectating"]) - get_node("Ready").connect("toggled", self, "_set_info_callback", ["ready"]) + ready_button.connect("toggled", self, "_set_info_callback", ["ready"]) start_game_button.connect("pressed", networking, "start_game") + # Shown, maybe, in _check_begun + start_game_button.hide() if get_tree().is_network_server(): start_game_button.show() - else: - start_game_button.hide() if get_tree().is_network_server(): # We put level in our players dict because it's automatically broadcast to other players @@ -40,6 +41,7 @@ func _ready(): _connected() func _connected(): + _send_name() if util.args.get_value("-hero") == "r": hero_select.random_hero() @@ -66,7 +68,15 @@ func _send_name(): var name = get_node("Username").text networking.set_info("username", name) +func _check_begun(): + var game_started = networking.players[1].begun + if game_started: + start_game_button.show() + # The "Ready" toggle doesn't really make sense on a started game + ready_button.hide() + func render_player_list(): + _check_begun() var list = "" var hero_names = hero_select.hero_names for p in networking.players: diff --git a/scripts/networking.gd b/scripts/networking.gd index 6971a16..9e97536 100644 --- a/scripts/networking.gd +++ b/scripts/networking.gd @@ -4,7 +4,6 @@ onready var matchmaking = preload("res://scripts/matchmaking.gd").new() remote var players = {} var players_done = [] -var begun = false var global_server_ip = "nv.cosinegaming.com" var matchmaker_tcp var right_team_next = false @@ -79,6 +78,7 @@ remote func register_player(new_peer): 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(): @@ -104,8 +104,9 @@ remote func register_player(new_peer): sync func unregister_player(peer): players.erase(peer) - if begun: - get_node("/root/Level/Players/%d" % peer).queue_free() + var p = util.get_player(peer) + if p: + p.queue_free() emit_signal("info_updated") sync func _set_info(key, value, peer=0): @@ -148,20 +149,23 @@ sync func _spawn_player(p): get_node("/root/Level/Players").call_deferred("add_child", player) sync func _pre_configure_game(level): - begun = true var self_peer_id = get_tree().get_network_unique_id() - get_node("/root/Lobby").hide() + if not players[self_peer_id].begun: + get_node("/root/Lobby").hide() - var world = load("res://scenes/levels/%d.tscn" % level).instance() - get_node("/root").add_child(world) + var world = load("res://scenes/levels/%d.tscn" % level).instance() + get_node("/root").add_child(world) # Load all players (including self) for p in players: if not players[p].spectating: - _spawn_player(p) + var existing_player = util.get_player(p) + if not players[self_peer_id].begun or not existing_player: + _spawn_player(p) + set_info("begun", true) rpc_id(1, "_done_preconfiguring", self_peer_id) sync func _done_preconfiguring(who): @@ -178,7 +182,7 @@ sync func _post_configure_game(): _begin_player_deferred(p) func _begin_player(peer): - get_node("/root/Level/Players/%d" % peer).begin() + util.get_player(peer).begin() remote func _begin_player_deferred(peer): call_deferred("_begin_player", peer) diff --git a/scripts/player.gd b/scripts/player.gd index 2adddfa..887a7cb 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -56,7 +56,6 @@ func _ready(): get_node("TPCamera/Camera/Ray").add_exception(self) get_node(tp_camera).set_enabled(true) get_node(tp_camera).cam_view_sensitivity = 0.05 - spawn() if "is_ai" in player_info and player_info.is_ai and not ai_instanced: add_child(preload("res://scenes/ai.tscn").instance()) ai_instanced = true @@ -193,6 +192,8 @@ func begin(): for mesh in colored_meshes: get_node(mesh).set_surface_material(0, mat) + spawn() + func toggle_mouse_capture(): if (Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED): Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) diff --git a/scripts/util.gd b/scripts/util.gd index 318a2fa..4a3b62a 100644 --- a/scripts/util.gd +++ b/scripts/util.gd @@ -10,7 +10,11 @@ func _ready(): args = _get_args() func get_master_player(): - var path = "/root/Level/Players/%d" % get_tree().get_network_unique_id() + return get_player(get_tree().get_network_unique_id()) + +func get_player(netid): + # We not %d? Because sometimes we need to do get_player(thing.get_name()) + var path = "/root/Level/Players/%s" % str(netid) if has_node(path): return get_node(path) else: