Code/InteractiveComputer/ComputerUseRaycaster.cs
using Sandbox;

namespace PaneOS.InteractiveComputer;

/// <summary>
/// Optional bridge for games that want a simple use-key trace into an in-world computer.
/// Attach to the player and set PlayerCamera. Custom controllers can call BeginInteraction directly instead.
/// </summary>
public sealed class ComputerUseRaycaster : Component
{
	[Property] public CameraComponent? PlayerCamera { get; set; }
	[Property] public float UseDistance { get; set; } = 96f;
	[Property] public string UseButton { get; set; } = "use";

	protected override void OnUpdate()
	{
		if ( PlayerCamera is null || !Input.Pressed( UseButton ) )
			return;

		var start = PlayerCamera.WorldPosition;
		var end = start + PlayerCamera.WorldRotation.Forward * UseDistance;
		var trace = Scene.Trace.Ray( start, end ).Run();
		var computer = trace.GameObject?.Components.Get<InteractiveComputerComponent>();

		computer?.ToggleInteraction( GameObject );
	}
}