Park/Rides/FlatRides/DropperRide.cs
using HC3;

public sealed class DropperRide : BasicRide
{
	[Property] public GameObject RideSeats { get; set; }
	[Property] GameObject TopPos { get; set; }
	[Property] GameObject BottomPos { get; set; }
	private float riseSpeed = 0.15f;
	private float dropSpeed = 0.8f;
	private bool isRising = true;
	private bool waitingToDrop = false;
	private TimeUntil waitTimer = 0f;
	private float waitDuration = 1.5f;
	protected override void DrawGizmos()
	{
		base.DrawGizmos();
		Gizmo.Draw.IgnoreDepth = true;
		Gizmo.Draw.LineThickness = 4;
		Gizmo.Draw.Color = Color.Red;
		Gizmo.Draw.Line( TopPos.WorldPosition, BottomPos.WorldPosition );
	}

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

		if ( !RideStarted || RideSeats == null ) return;

		if ( isRising )
		{
			RideSeats.WorldPosition = Vector3.Lerp( RideSeats.WorldPosition, TopPos.WorldPosition, Time.Delta * riseSpeed );
			if ( RideSeats.WorldPosition.Distance( TopPos.WorldPosition ) < 10f )
			{
				isRising = false;
				waitingToDrop = true;
				waitTimer = waitDuration;
			}
		}
		else if ( waitingToDrop )
		{
			if ( waitTimer <= 0f )
			{
				waitingToDrop = false;
			}
		}
		else
		{
			RideSeats.WorldPosition = Vector3.Lerp( RideSeats.WorldPosition, BottomPos.WorldPosition, Time.Delta * dropSpeed );
			if ( RideSeats.WorldPosition.Distance( BottomPos.WorldPosition ) < 1f )
			{
				EndRide();
			}
		}
	}

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

		isRising = true;
		waitingToDrop = false;
		waitTimer = 0f;
		RideSeats.WorldPosition = BottomPos.WorldPosition;
	}

	protected override void OnRideEnded()
	{
		base.OnRideEnded();
		RideSeats.WorldPosition = BottomPos.WorldPosition;
	}
}