extends Node3D ## NS-18: **Client preview only** — glow when `CharacterBody3D` is within horizontal radius of the ## prototype terminal (X/Z, inclusive). Server `POST …/interact` remains authoritative. const ProtoIx = preload("res://scripts/prototype_interaction_constants.gd") const EMISSION_DIM := 0.12 const EMISSION_BRIGHT := 7.0 @export var marker_paths: Array[NodePath] = [^"MarkerA", ^"MarkerB"] var _player: CharacterBody3D var _mat: StandardMaterial3D func setup_player(player: CharacterBody3D) -> void: _player = player func _ready() -> void: _mat = StandardMaterial3D.new() _mat.albedo_color = Color(0.1, 0.32, 0.9) _mat.emission_enabled = true _mat.emission = Color(0.3, 0.6, 1.0) _mat.emission_energy_multiplier = EMISSION_DIM for p in marker_paths: var mi := get_node_or_null(p) as MeshInstance3D if mi: mi.material_override = _mat func _process(_delta: float) -> void: if _player == null or _mat == null: return var dx: float = _player.global_position.x - ProtoIx.anchor_x() var dz: float = _player.global_position.z - ProtoIx.anchor_z() var dist_sq: float = dx * dx + dz * dz var r: float = ProtoIx.interaction_radius() var in_range: bool = dist_sq <= r * r _mat.emission_energy_multiplier = EMISSION_BRIGHT if in_range else EMISSION_DIM