AI/Animals/Animal.Persistence.cs
using HC3.Persistence;
using System.Text.Json.Nodes;

namespace HC3;

partial class Animal : IPrefabSourceComponent<Animal.SaveData>
{
	public string PrefabSource { get; private set; }

	public sealed record SaveData( Vector3 Position, float Rotation, JsonObject Metadata = null );

	public SaveData GetSaveData()
	{
		return new( WorldPosition, WorldRotation.Yaw(), GetPersistentMetadata() );
	}

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

		if ( GameObject.IsPrefabInstanceRoot )
		{
			PrefabSource = GameObject.PrefabInstanceSource;
		}
	}

	protected virtual JsonObject GetPersistentMetadata()
	{
		var obj = new JsonObject();
		// TODO: empty so we can define stuff
		return obj;
	}

	protected virtual void SetPersistentMetadata( JsonObject obj )
	{
		if ( obj == null )
			return;

		// TODO: define later
	}

	public void Spawn( SaveData saveData )
	{
		WorldPosition = saveData.Position;
		WorldRotation = Rotation.FromYaw( saveData.Rotation );

		Transform.ClearInterpolation();

		SetPersistentMetadata( saveData.Metadata );

		IsPlaced = true;

		GameObject.Root.NetworkSpawn();
	}
}

file sealed class AnimalSaveData : SpawnedPrefabSaveData<Animal, Animal.SaveData>
{
	public override string PropertyName => "Animals";
}