Utilities/ParticleManager.cs
using Sandbox;

namespace Braxnet;

public sealed class ParticleManager : Component
{
	[ActionGraphNode( "particlemanager.instance" ), Title( "Particle Manager Instance" ), Icon( "cloud" ),
	 Category( "Clover" )]
	public static ParticleManager Instance => Game.ActiveScene.GetAllComponents<ParticleManager>().FirstOrDefault();

	[Property] public GameObject Poof { get; set; }
	[Property] public GameObject Confetti { get; set; }

	[Rpc.Broadcast]
	public void BroadcastPoofAt( Vector3 position, float scale = 1 )
	{
		var poof = Instance.Poof.Clone();
		poof.WorldPosition = position;

		poof.GetComponent<ParticleSphereEmitter>().Radius = 20 * scale;
		poof.GetComponent<ParticleSpriteRenderer>().Scale = scale;
	}

	[Rpc.Broadcast]
	public void BroadcastConfettiAt( Vector3 position )
	{
		var confetti = Instance.Confetti.Clone();
		confetti.WorldPosition = position;
		confetti.WorldRotation = Rotation.FromPitch( -90 );
		// return confetti;
	}

	public static void PoofAt( Vector3 position, float scale = 1 )
	{
		Instance.BroadcastPoofAt( position, scale );
	}

	public static void ConfettiAt( Vector3 position )
	{
		Instance.BroadcastConfettiAt( position );
	}
}