Interactable/SceneTransferDoor.cs
using Sandbox;

namespace CryptidHunt;

public partial class SceneTransferDoor : Interactable
{
	[Property]
	public ModelRenderer Model { get; set; }
	[Property]
	public SpawnPoint SpawnPoint { get; set; }

	public override string InteractDescription => Locked ? "LOCKED" : "Open";
	public override bool Locked => !GameManager.Instance.ReadInitialNote;
	public bool Open { get; set; } = false;
	float _degrees = 0f;

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

		if ( !Open ) return;

		WorldRotation *= Rotation.FromYaw( -_degrees * Time.Delta );
		_degrees = Math.Max( _degrees - Time.Delta * 25f, 0f );
	}

	public override void Interact( Player player )
	{
		if ( !player.IsValid() ) return;

		if ( Open ) return;

		if ( Locked )
			Sound.Play( "chest_locked", WorldPosition );
		else
		{
			Sound.Play( "door_open", WorldPosition );
			Open = true;
			_degrees = 25f;
			NextScene();
		}

		player.AddCameraShake( 0.3f, 8f );
	}

	public async void NextScene()
	{
		GameUI.BlackScreen();
		Player.Instance.LockInputs = true;
		await Task.DelaySeconds( 2.5f );
		_degrees = 0;
		Player.Instance.LockInputs = false;
		Player.Instance.WorldPosition = SpawnPoint.WorldPosition;
		Player.Instance.Controller.EyeAngles = SpawnPoint.WorldRotation;

		await Task.DelaySeconds( 3f );
		Sound.Play( "piano_intro" );
		await Task.DelaySeconds( 1f );

		Player.Instance.SetFlashLight( true, true );

		await Task.DelaySeconds( 1f );
	}
}