InteractiveComputer/ComputerInteractionPlayerLock.cs
using Sandbox;

namespace PaneOS.InteractiveComputer;

/// <summary>
/// Optional player-side helper that disables assigned movement/look components
/// while that player is interacting with a PaneOS computer.
/// </summary>
public sealed class ComputerInteractionPlayerLock : Component
{
	[Property] public Component? MovementComponent { get; set; }
	[Property] public Component? RotationComponent { get; set; }

	private bool? originalMovementEnabled;
	private bool? originalRotationEnabled;
	private bool wasLocked;

	protected override void OnUpdate()
	{
		var shouldLock = InteractiveComputerComponent.GetActiveComputerForPlayer( GameObject ) is not null;
		if ( shouldLock == wasLocked )
			return;

		ApplyLockState( shouldLock );
		wasLocked = shouldLock;
	}

	protected override void OnDisabled()
	{
		base.OnDisabled();

		if ( wasLocked )
		{
			ApplyLockState( false );
			wasLocked = false;
		}
	}

	private void ApplyLockState( bool shouldLock )
	{
		if ( MovementComponent is not null )
		{
			if ( shouldLock )
			{
				originalMovementEnabled ??= MovementComponent.Enabled;
				MovementComponent.Enabled = false;
			}
			else if ( originalMovementEnabled.HasValue )
			{
				MovementComponent.Enabled = originalMovementEnabled.Value;
				originalMovementEnabled = null;
			}
		}

		if ( RotationComponent is not null )
		{
			if ( shouldLock )
			{
				originalRotationEnabled ??= RotationComponent.Enabled;
				RotationComponent.Enabled = false;
			}
			else if ( originalRotationEnabled.HasValue )
			{
				RotationComponent.Enabled = originalRotationEnabled.Value;
				originalRotationEnabled = null;
			}
		}
	}
}