SausageExplosionEffect.cs
using Sandbox;
namespace PaintballBaddies;

// Visual/audio-only adaptation of the engine explosion. All damage remains
// host-authoritative in the bolt/grenade; this prefab has no RadiusDamage.
public static class SausageExplosionEffect
{
    public static int Plays {get;private set;}
    public static void Spawn(Scene scene,Vector3 point,bool grenade)
    {
        if(!scene.IsValid() || scene!=Game.ActiveScene)return;
        var effect=GameObject.Clone("prefabs/effects/sausage_explosion.prefab",new Transform(point),startEnabled:false);
        if(!effect.IsValid())
        {
            Sound.Play("sounds/effects/explosion/explosion_small.sound",point);
            DroneDamageFlare.Spawn(scene,point,Color.Orange,true,MultiplayerSession.Find(scene)?.RoundId ?? 0,.5f);
            return;
        }
        effect.NetworkMode=NetworkMode.Never;
        effect.WorldScale=new Vector3(grenade ? 1.35f : 1);
        effect.Tags.Add("paintball_debris");effect.Enabled=true;Plays++;
        if(scene.Camera.IsValid())
        {
            float distance=(scene.Camera.WorldPosition-point).Length;
            float strength=(1-distance/(grenade ? 850 : 550)).Clamp(0,1);
            if(strength>0)scene.Camera.AddShake(strength*(grenade ? 1.8f : .65f),35,grenade ? .3f : .18f);
        }
    }
}