Utility/Effects.cs
namespace Sandbox;

public class Effects : GameObjectSystem<Effects>
{
	public Effects( Scene scene ) : base( scene )
	{
	}

	public static void SpawnExplosion( Vector3 worldPosition )
	{
		var prefab = GameObject.GetPrefab( "/prefabs/effects/explosion.prefab" );
		prefab?.Clone( worldPosition );
	}

	public static void SpawnExplosionSmall( Vector3 worldPosition )
	{
		var prefab = GameObject.GetPrefab( "/prefabs/effects/explosion_sm.prefab" );
		prefab?.Clone( worldPosition );
	}

	public static void SpawnScorch( Vector3 worldPosition, Vector3 direction, GameObject source )
	{
		var tr = Game.ActiveScene.Trace.Ray( new Ray( worldPosition, -direction ), 64 )
			.IgnoreGameObjectHierarchy( source )
			.WithoutTags( "player" )
			.UseHitPosition( true )
			.Run();

		if ( !tr.Hit ) return;

		var prefab = GameObject.GetPrefab( "/prefabs/effects/scorchdecal.prefab" );
		var instance = prefab.Clone( tr.HitPosition + tr.Normal * 1, Rotation.LookAt( -tr.Normal, Vector3.Up ) );
		instance.SetParent( tr.GameObject, true );
	}
}