Pickups/BasePickup.cs
namespace Opium;

public partial class BasePickup : BaseInteract
{
	[Property] public ModelRenderer ModelRenderer { get; set; }
	[Property] public GameObject ObjectSpawnOnUse { get; set; }

	[Property] public float MoveToPlayerTime { get; set; } = 0.5f;

	[Property] public Action OnPickupAction { get; set; }

	public override bool ShowInteractionUI => true;

	public bool MovingToPlayer { get; set; }
	public TimeUntil TimeUntilMoved { get; set; }
	public GameObject Player { get; set; }

	public override bool CanUse( GameObject player )
	{
		return !MovingToPlayer;
	}

	public override void OnUse( GameObject player )
	{
		MovingToPlayer = true;
		TimeUntilMoved = MoveToPlayerTime;
		Player = player;
	}

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

		if ( MovingToPlayer )
		{
			var targetPos = Player.Transform.Position + Vector3.Up * 48f;

			Transform.Position = Transform.Position.LerpTo( targetPos, TimeUntilMoved.Fraction );

			if ( Transform.Position.Distance( targetPos ) < 12f )
			{
				MovingToPlayer = false;
				OnPickup( Player );
			}
		}
	}

	public virtual void OnPickup( GameObject player )
	{
		if ( ObjectSpawnOnUse is not null )
		{
			ObjectSpawnOnUse.Clone( new CloneConfig()
			{
				Transform = GameObject.Transform.World.WithScale( 1f ),
				StartEnabled = true,
			} );
		}

		OnPickupAction?.Invoke();

		GameObject?.Destroy();
	}
}