diff --git a/scenes/player.gd b/scenes/player.gd index 15a1230..5b661d6 100644 --- a/scenes/player.gd +++ b/scenes/player.gd @@ -12,6 +12,8 @@ var powerup_manager # Score tracking var score: int = 0 +signal position_changed + # Display name (synced across network) var _display_name: String = "" var display_name: String: @@ -1412,6 +1414,7 @@ func start_movement_along_path(path: Array, clear_visual: bool = true): func update_player_position(grid_position: Vector2i): position = grid_to_world(grid_position) + emit_signal("position_changed") func grid_to_world(grid_position: Vector2i) -> Vector3: var world_position = Vector3( @@ -1939,6 +1942,8 @@ func set_spawn_position(pos: Vector2i): # Reveal character now that it's in the correct position visible = true + + emit_signal("position_changed") @rpc("any_peer", "call_local", "reliable") diff --git a/scripts/managers/camera_context_manager.gd b/scripts/managers/camera_context_manager.gd index 4f8076d..2aab708 100644 --- a/scripts/managers/camera_context_manager.gd +++ b/scripts/managers/camera_context_manager.gd @@ -30,21 +30,31 @@ func initialize(p_camera: Camera3D, _p_shake_manager: Node): func set_player(p_player: Node3D): player = p_player unique_id = p_player.name.to_int() - # Try to get movement manager (might be initializing) - var movement_mgr = player.get("movement_manager") - if not movement_mgr and player.get("movement_manager") == null: - # Try direct access if script variable + # Try to get movement manager (might be initializing child) + var movement_mgr = player.get("movement_manager") + if not movement_mgr and "movement_manager" in player: movement_mgr = player.movement_manager - - if movement_mgr: + + var has_snap_signal = player.has_signal("position_changed") + + if movement_mgr and has_snap_signal: + # 1. Follow during movement if not movement_mgr.movement_finished.is_connected(_on_player_moved): movement_mgr.movement_finished.connect(_on_player_moved) + + # 2. Snap on spawn/teleport + if not player.position_changed.is_connected(_on_player_moved): + player.position_changed.connect(_on_player_moved) + + print("[CameraContextManager] Successfully connected to all player signals") else: - print("[CameraContextManager] Warning: movement_manager not found on player. Retrying in 0.5s...") + print("[CameraContextManager] Warning: movement_manager or signal missing. Retrying in 0.5s...") await get_tree().create_timer(0.5).timeout - if player == p_player: # Ensure player hasn't changed - set_player(p_player) # Retry + if player == p_player: + set_player(p_player) + return # Exit current (failed) initialization + _update_camera_target() func _on_player_moved():