41 lines
1.3 KiB
GDScript
41 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")
|
|
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
|