Level/WheelInteract.cs
using Sandbox;

public class WheelInteract : BaseInteract
{
	[Property] public float TurnSpeed { get; set; } = 50f;
	[Property] public float ReturnSpeed { get; set; } = 50f;
	[Property] public bool LockOnOpen { get; set; } = false;
	[Property] public float TurnDistance { get; set; } = 360f;
	[Property] public float MoveDistance { get; set; } = 100f;
	[Property] public GameObject Door { get; set; }
	public float currentDistance { get; set; } = 0f;
	public float outDistance { get; set; } = 0f;
	Vector3 doorstartPos { get; set; }

	bool fullyOpen = false;
	bool used = false;


	public override void OnUse( GameObject player )
	{
		used = true;

		if ( player.Components.Get<Opium.PlayerController>() is Opium.PlayerController controller )
		{
			controller.LockMovement = true;
			controller.LockCameraMovement = true;
		}
	}
	public override void OnUseStop( GameObject player )
	{
		used = false;

		if ( player.Components.Get<Opium.PlayerController>() is Opium.PlayerController controller )
		{
			controller.LockMovement = false;
			controller.LockCameraMovement = false;
		}
	}
	protected override void OnUpdate()
	{
		if(fullyOpen && LockOnOpen )
		{
			return;
		}

		if( outDistance == MoveDistance )
		{
			fullyOpen = true;
		}

		if ( used && currentDistance < TurnDistance )
		{
			Transform.Rotation *= Rotation.FromRoll( Time.Delta * TurnSpeed );
			currentDistance += Time.Delta * TurnSpeed;
			outDistance = currentDistance.Remap( 0f, TurnDistance, 0f, MoveDistance );
		}
		else if ( !used && currentDistance > 0f )
		{
			Transform.Rotation *= Rotation.FromRoll( Time.Delta * -ReturnSpeed );
			currentDistance -= Time.Delta * ReturnSpeed;
			outDistance = currentDistance.Remap( 0f, TurnDistance, 0f, MoveDistance );
		}

		if ( Door != null )
		{
			var doorcomp = Door.Components.Get<SlidingDoorComponent>();
			doorcomp.MoveTo( outDistance, MoveDistance );
		}
	}
}