GhostBallLogic.cs
using Sandbox;
using System;

public sealed class GhostBallLogic : Component, Component.ITriggerListener
{
	[Property] ModelRenderer ExplosionModel;
	[Property] TemporaryEffect temporaryEffect;
	[Property] GameObject ExplosionEffect;

	public SoundHandle attackSoundHandle;

	Random random;

	protected override void OnStart()
	{
		random = new Random();

		attackSoundHandle.Parent = GameObject; 
		attackSoundHandle.FollowParent = true;
	}
	public void OnTriggerEnter( GameObject other ) 
	{
		if ( !other.Tags.HasAny( "enemy", "ghost-ball", "nograss", "dead" ) )
		{
			Log.Info( $"Hit {other.Name}" );
			Explode();
		}
	}

	void Explode() 
	{
		SceneTraceResult sceneTrace = Scene.Trace.Sphere( 64, WorldPosition, WorldPosition + GetComponent<Rigidbody>().Velocity )
			.IgnoreGameObjectHierarchy(this.GameObject)
			.WithTag("carbody")
			.Run();

		// DebugOverlay.Trace(sceneTrace);
		// Explosion sound, Particle Effekt
		if ( sceneTrace.Hit ) 
		{
			sceneTrace.GameObject.GetComponentInParent<HealthSystem>().Damage( 500 );
			Log.Info( "Hit Player" );
			// sceneTrace.GameObject.GetComponent<Rigidbody>().ApplyImpulse((WorldPosition - sceneTrace.GameObject.WorldPosition).Normal * 1000);
			// sceneTrace.GameObject.GetComponent<Rigidbody>().AngularVelocity += random.VectorInSphere( 10 );
		}

		attackSoundHandle.Volume = 0;

		GetComponent<TemporaryEffect>().DestroyAfterSeconds = 0.1f;
		GameObject _newExplosion = ExplosionEffect.Clone(WorldTransform);
	}

}