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();
}
}