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()
|
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")
|
@rpc("any_peer", "call_local", "reliable")
|
||||||
func sync_playerboard(player_id: int, new_playerboard: Array):
|
func sync_playerboard(player_id: int, new_playerboard: Array):
|
||||||
# Find the player and update their playerboard
|
var player = await _wait_for_playerboard(player_id)
|
||||||
var player = get_node_or_null(str(player_id))
|
if not player:
|
||||||
if player:
|
push_warning("[sync_playerboard] Dropped update: player %s not ready" % player_id)
|
||||||
player.playerboard = new_playerboard.duplicate()
|
return
|
||||||
|
|
||||||
|
player.playerboard = new_playerboard.duplicate()
|
||||||
|
|
||||||
# Update UI for local player
|
# Update UI for local player
|
||||||
if player_id == multiplayer.get_unique_id() and GameStateManager.local_player_character:
|
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.
|
"""Patch a single playerboard slot without touching other slots.
|
||||||
Used by _execute_grab on grab confirmation to avoid overwriting concurrent
|
Used by _execute_grab on grab confirmation to avoid overwriting concurrent
|
||||||
in-flight optimistic grab updates on high-latency clients."""
|
in-flight optimistic grab updates on high-latency clients."""
|
||||||
var player = get_node_or_null(str(player_id))
|
var player = await _wait_for_playerboard(player_id)
|
||||||
if player and slot_index >= 0 and slot_index < player.playerboard.size():
|
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
|
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
|
# Update UI for local player only
|
||||||
if player_id == multiplayer.get_unique_id() and GameStateManager.local_player_character:
|
if player_id == multiplayer.get_unique_id() and GameStateManager.local_player_character:
|
||||||
|
|||||||
Reference in New Issue
Block a user