From 7762a82d18346cd121b2dfa60b084518fd74404f Mon Sep 17 00:00:00 2001 From: god Date: Sat, 4 Jul 2026 19:17:27 +0800 Subject: [PATCH] fix: wait for playerboard before applying multiplayer sync --- scenes/main.gd | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/scenes/main.gd b/scenes/main.gd index 2d91e09..3738604 100644 --- a/scenes/main.gd +++ b/scenes/main.gd @@ -1686,12 +1686,23 @@ func _deferred_set_player_goals(player_id: int, goals: Array): ui_manager.update_playerboard_ui() +func _wait_for_playerboard(player_id: int) -> Node: + var player = get_node_or_null(str(player_id)) + var waited := 0.0 + while (not player or player.playerboard.size() < 25) and waited < 2.0: + await get_tree().create_timer(0.1).timeout + waited += 0.1 + player = get_node_or_null(str(player_id)) + return player if player and player.playerboard.size() >= 25 else null + @rpc("any_peer", "call_local", "reliable") func sync_playerboard(player_id: int, new_playerboard: Array): - # Find the player and update their playerboard - var player = get_node_or_null(str(player_id)) - if player: - player.playerboard = new_playerboard.duplicate() + var player = await _wait_for_playerboard(player_id) + if not player: + push_warning("[sync_playerboard] Dropped update: player %s not ready" % player_id) + return + + player.playerboard = new_playerboard.duplicate() # Update UI for local player if player_id == multiplayer.get_unique_id() and GameStateManager.local_player_character: @@ -1702,9 +1713,16 @@ func sync_playerboard_slot(player_id: int, slot_index: int, item_id: int): """Patch a single playerboard slot without touching other slots. Used by _execute_grab on grab confirmation to avoid overwriting concurrent in-flight optimistic grab updates on high-latency clients.""" - var player = get_node_or_null(str(player_id)) - if player and slot_index >= 0 and slot_index < player.playerboard.size(): + var player = await _wait_for_playerboard(player_id) + if not player: + push_warning("[sync_playerboard_slot] Dropped update: player %s not ready" % player_id) + return + + if slot_index >= 0 and slot_index < player.playerboard.size(): player.playerboard[slot_index] = item_id + else: + push_warning("[sync_playerboard_slot] Ignored invalid slot %s for player %s" % [slot_index, player_id]) + return # Update UI for local player only if player_id == multiplayer.get_unique_id() and GameStateManager.local_player_character: