extends Node3D ## NS-14: client-only click-to-move. Provisional until authoritative movement sync (server / MoveCommand). @onready var _camera: Camera3D = $World/Camera3D @onready var _nav_agent: NavigationAgent3D = $Player/NavigationAgent3D func _unhandled_input(event: InputEvent) -> void: if event is InputEventMouseButton: var mb := event as InputEventMouseButton if mb.button_index == MOUSE_BUTTON_LEFT and mb.pressed: _try_set_move_target(mb.position) func _try_set_move_target(screen_pos: Vector2) -> void: var origin: Vector3 = _camera.project_ray_origin(screen_pos) var ray_dir: Vector3 = _camera.project_ray_normal(screen_pos) var to: Vector3 = origin + ray_dir * 2000.0 var query := PhysicsRayQueryParameters3D.create(origin, to) query.collision_mask = 1 var space: PhysicsDirectSpaceState3D = get_world_3d().direct_space_state var hit: Dictionary = space.intersect_ray(query) if hit.is_empty(): return var collider: Variant = hit.get("collider") if collider is Node and (collider as Node).is_in_group("walkable"): _nav_agent.target_position = hit.position