Carriable/CarriedEdible.cs
using Clover.Components;
using Clover.Data;
using Clover.Persistence;

namespace Clover.Carriable;

[Category( "Clover/Carriable" )]
public class CarriedEdible : BaseCarriable
{
	[Property] public ItemData EdibleData { get; set; }

	[Property] public SoundEvent EatSound { get; set; }
	[Property] public SoundEvent DrinkSound { get; set; }

	// public override bool DestroyOnUnequip => true;

	private GameObject _edibleModel;

	public override bool CanUse()
	{
		return true;
	}

	public override void OnSave( PersistentItem item )
	{
		base.OnSave( item );
		item.SetSaveData( "EdibleData", EdibleData?.GetIdentifier() );
	}

	public override void OnUnequip()
	{
		base.OnUnequip();
	}

	public override void OnLoad( PersistentItem item )
	{
		base.OnLoad( item );
		if ( item.TryGetSaveData( "EdibleData", out string edibleId ) )
		{
			EdibleData = Data.ItemData.Get( edibleId );
			UpdateModel();
		}
	}

	public override string GetUseName()
	{
		if ( EdibleData is IEdibleData iEdible )
		{
			return iEdible.Type switch
			{
				IEdibleData.EdibleType.Food => "Eat",
				IEdibleData.EdibleType.Drink => "Drink",
				IEdibleData.EdibleType.Unknown => "Use",
				_ => "Use"
			};
		}

		return "Use";
	}

	public void UpdateModel()
	{
		_edibleModel?.Destroy();

		if ( EdibleData is IEdibleData edibleData )
		{
			_edibleModel = edibleData.HoldScene.Clone();
		}
		else
		{
			_edibleModel = EdibleData.ModelScene.Clone();
			_edibleModel.LocalScale = Vector3.One * 0.3f;
		}

		_edibleModel.SetParent( GameObject );
		_edibleModel.LocalPosition = Vector3.Zero;
		_edibleModel.LocalRotation = Rotation.Identity;
	}

	public override void OnUseDown()
	{
		base.OnUseDown();

		if ( EdibleData is IEdibleData iEdible )
		{
			switch ( iEdible.Type )
			{
				case IEdibleData.EdibleType.Food:
					SoundEx.Play( EatSound, GameObject.WorldPosition );
					break;
				case IEdibleData.EdibleType.Drink:
					SoundEx.Play( DrinkSound, GameObject.WorldPosition );
					break;
				case IEdibleData.EdibleType.Unknown:
				default:
					Log.Error( "Unknown edible type" );
					SoundEx.Play( EatSound, GameObject.WorldPosition );
					break;
			}
		}
		else
		{
			SoundEx.Play( EatSound, GameObject.WorldPosition );
		}


		Player.Equips.RemoveEquippedItem( Equips.EquipSlot.Tool, true );
	}
}