bugfix, desync, and add UI function

This commit is contained in:
2026-01-14 00:20:20 +08:00
parent 6948a4aed1
commit bee9c30f0e
14 changed files with 362 additions and 112 deletions
+50 -18
View File
@@ -59,9 +59,14 @@ func _init_managers():
screen_shake_manager.initialize($Camera3D)
# Touch controls for mobile
touch_controls = load("res://scripts/managers/touch_controls.gd").new()
touch_controls.name = "TouchControls"
add_child(touch_controls)
# Touch controls for mobile
touch_controls = get_node_or_null("TouchControls")
if not touch_controls:
print("TouchControls node not found in scene, creating instance...")
touch_controls = load("res://scripts/managers/touch_controls.gd").new()
touch_controls.name = "TouchControls"
add_child(touch_controls)
touch_controls.initialize(self)
# Connect signals for UI updates
@@ -180,8 +185,16 @@ func broadcast_message(player_name: String, message: String):
func _setup_global_match_timer_ui():
"""Create the global match timer display at the top of the screen."""
# Check if timer check is enabled in lobby settings
if not LobbyManager.enable_cycle_timer:
var existing = get_node_or_null("GlobalMatchTimer")
if existing:
existing.visible = false
return
var existing = get_node_or_null("GlobalMatchTimer")
if existing:
existing.visible = true
return
# Create timer panel
@@ -345,21 +358,40 @@ func _setup_client_game():
var my_id = multiplayer.get_unique_id()
print("Client setup - my peer ID: ", my_id)
# Create local player immediately
if not has_node(str(my_id)):
var player_character = PlayerManager.add_player_character(my_id)
add_child(player_character)
player_character.add_to_group("Players", true)
GameStateManager.add_player(my_id)
GameStateManager.local_player_character = player_character
ui_manager.set_local_player(player_character)
if touch_controls:
touch_controls.set_player(player_character)
ui_manager.update_button_states()
print("Created local player for client: ", my_id)
# Pre-spawn ALL players known from LobbyManager (including Host ID 1)
# This ensures nodes exist to receive RPCs (like 'set_spawn_position') that might arrive before full sync
var lobby_players = LobbyManager.get_players()
for player_data in lobby_players:
var p_id = player_data.get("id", 0)
if p_id != 0:
add_player_character(p_id)
print("Client: Pre-spawned player ", p_id)
# Wait for host to be ready, then request full sync
await get_tree().create_timer(2.0).timeout
# Pre-spawn potential bots (IDs 2 to MaxPlayers) to prevent RPC "Node not found" errors
# Bots use small integer IDs (2, 3, 4...) while clients use large unique IDs
if GameStateManager.enable_bots:
for i in range(2, GameStateManager.max_players + 1):
# Only spawn if not already existing (e.g. if a human somehow got this ID, though unlikely)
if not has_node(str(i)):
add_player_character(i)
get_node(str(i)).is_bot = true # Assume bot initially
get_node(str(i)).add_to_group("Bots", true)
print("Client: Pre-spawned potential bot ", i)
# Ensure local player setup (UI, controls) is verified
var player_character = get_node_or_null(str(my_id))
if player_character:
# If we just spawned it above, we need to set these locally too
if GameStateManager.local_player_character != player_character:
GameStateManager.local_player_character = player_character
ui_manager.set_local_player(player_character)
if touch_controls:
touch_controls.set_player(player_character)
ui_manager.update_button_states()
print("Client: Configured local player ", my_id)
# Wait shorter time for host to be ready, then request full sync to correct positions/state
await get_tree().create_timer(1.0).timeout
rpc_id(1, "request_full_player_sync", my_id)
func _auto_start_from_lobby():
@@ -483,7 +515,7 @@ func add_player_character(peer_id: int):
func _on_peer_connected(new_peer_id: int):
if multiplayer.is_server():
await get_tree().create_timer(1.5).timeout
await get_tree().create_timer(0.1).timeout
add_player_character(new_peer_id)
rpc("add_newly_connected_player_character", new_peer_id)