feat : Refactored Game Over UI from programmatic to scene-based architecture and resolved critical multiplayer/spawn bugs

This commit is contained in:
2026-04-01 06:06:09 +08:00
parent a88839b396
commit f2739841c6
5 changed files with 816 additions and 195 deletions
+9 -3
View File
@@ -844,20 +844,26 @@ func _on_server_disconnected() -> void:
# Rematch Logic
# =============================================================================
func _get_connected_human_count() -> int:
"""Returns the number of connected real human players (peers + host, excluding bots)."""
if multiplayer.has_multiplayer_peer():
return multiplayer.get_peers().size() + 1 # peers + self (host)
return max(1, players_in_room.size()) # Fallback to lobby list
func reset_rematch_votes() -> void:
rematch_votes.clear()
var required = max(1, ceili(players_in_room.size() / 2.0))
var required = max(1, ceili(_get_connected_human_count() / 2.0))
emit_signal("rematch_votes_updated", 0, required)
@rpc("any_peer", "call_local", "reliable")
func request_rematch(player_id: int) -> void:
"""Client requests a rematch. Votes needed depend on connected real players."""
"""Client requests a rematch. Votes needed depend on connected real players (excluding bots)."""
if not multiplayer.is_server():
return
if player_id not in rematch_votes:
rematch_votes.append(player_id)
var required = max(1, ceili(players_in_room.size() / 2.0))
var required = max(1, ceili(_get_connected_human_count() / 2.0))
print("[LobbyManager] Rematch vote from %d. Total: %d/%d" % [player_id, rematch_votes.size(), required])
# Sync vote count to all clients