fix: wait for playerboard before applying multiplayer sync

This commit is contained in:
god
2026-07-04 19:17:27 +08:00
parent 0786638a98
commit 7762a82d18
+24 -6
View File
@@ -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: