Code/Extensions/GameObjectExtensions.cs
namespace SmallFishUtils;

public static class GameObjectExtensions
{
	/// <summary>
	/// Setup the networking for a GameObject.
	/// </summary>
	public static void SetupNetworking(
		this GameObject obj,
		Connection owner = null,
		OwnerTransfer transfer = OwnerTransfer.Takeover,
		NetworkOrphaned orphaned = NetworkOrphaned.ClearOwner )
	{
		if ( !obj.IsValid() )
			return;

		obj.NetworkMode = NetworkMode.Object;

		if ( !obj.Network.Active )
			obj.NetworkSpawn( owner );
		else if ( Networking.IsActive && owner != null )
			obj.Network.AssignOwnership( owner );

		obj.Network.SetOwnerTransfer( transfer );
		obj.Network.SetOrphanedMode( orphaned );
	}

	/// <summary>
	/// Play a sound via the GameObject.
	/// </summary>
	public static SoundHandle PlaySound( this GameObject self, SoundEvent sndEvent, SoundSettings? settings = null )
	{
		if ( !self.IsValid() || sndEvent is null )
			return null;

		var handle = self.PlaySound( sndEvent );
		settings ??= new SoundSettings();
		settings.Value.SetHandleSettings( handle );

		var soundHandler = self.Components.GetOrCreate<SoundHandler>();
		soundHandler.AddSound( handle, settings.Value );

		return handle;
	}

	/// <summary>
	/// Play a sound via the GameObject.
	/// </summary>
	public static SoundHandle PlaySound( this GameObject self, string sndPath, SoundSettings? settings = null )
	{
		return ResourceLibrary.TryGet<SoundEvent>( sndPath, out var sndEvent ) ? self.PlaySound( sndEvent, settings ) : null;
	}

	/// <summary>
	/// Broadcast a sound via the GameObject.
	/// </summary>
	[Rpc.Broadcast]
	public static void BroadcastSound( this GameObject self, string soundPath, SoundSettings? settings = null )
	{
		self.PlaySound( soundPath, settings );
	}

	/// <summary>
	/// Broadcast a sound via the GameObject.
	/// </summary>
	[Rpc.Broadcast]
	public static void BroadcastSound( this GameObject self, SoundEvent soundEvent, SoundSettings? settings = null )
	{
		self.PlaySound( soundEvent, settings );
	}
}