neon-sprawl/client/scripts/interaction_radius_indicato...

42 lines
1.3 KiB
GDScript

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")
@export var marker_paths: Array[NodePath] = [^"MarkerA", ^"MarkerB"]
var _player: CharacterBody3D
var _mat: StandardMaterial3D
const _emission_dim := 0.12
const _emission_bright := 7.0
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