fix: wait for playerboard before applying multiplayer sync
This commit is contained in:
+24
-6
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user