diff --git a/scenes/main.gd b/scenes/main.gd index af4eca5..0f16cf4 100644 --- a/scenes/main.gd +++ b/scenes/main.gd @@ -1474,13 +1474,23 @@ func sync_player_goals(player_id: int, goals: Array): call_deferred("_deferred_set_player_goals", player_id, goals) func _deferred_set_player_goals(player_id: int, goals: Array): - # Reduce delay to 0.05s for snappier updates (just enough to ensure nodes are in tree) - if not get_node_or_null(str(player_id)): - await get_tree().create_timer(0.1).timeout - + # The player node waits 0.5s in its _ready() function before initializing managers. + # We MUST cleanly wait until it finishes creating them, instead of silently aborting. var player = get_node_or_null(str(player_id)) + + # Wait until player and its race_manager thoroughly exist + var wait_limit = 2.0 # Safety limit + var waited = 0.0 + while (not player or not player.race_manager) and waited < wait_limit: + await get_tree().create_timer(0.1).timeout + waited += 0.1 + player = get_node_or_null(str(player_id)) + if player and player.race_manager: player.goals = goals.duplicate() + # UI UPDATE FIX: explicitly refresh local UI upon receiving starting goals + if player_id == multiplayer.get_unique_id() and GameStateManager.local_player_character: + ui_manager.update_playerboard_ui() @rpc("any_peer", "call_local")