Once, I found a way to make all light invisible, then change the projectile to empty, and keep damage on, invisible damage. Is that what you wanted?
//projectile
AddDamageType("RocketDirect", '<bitmap:add-ons/ci/rocket> %1', '%2 <bitmap:add-ons/ci/rocket> %1',1,1);
AddDamageType("RocketRadius", '<bitmap:add-ons/ci/rocketRadius> %1', '%2 <bitmap:add-ons/ci/rocketRadius> %1',1,0);
datablock ProjectileData(GolfscorereseterProjectile)
{
projectileShapeName = "base/data/shapes/empty.dts";
directDamage = 0;
directDamageType = $DamageType::rocketDirect;
radiusDamageType = $DamageType::rocketRadius;
impactImpulse = 0;
verticalImpulse = 0;
explosion = GolfscorereseterExplosion;
particleEmitter = GolfscorereseterTrailEmitter;
muzzleVelocity = 70;
velInheritFactor = 1;
armingDelay = 0;
lifetime = 20000;
fadeDelay = 19500;
bounceElasticity = 0;
bounceFriction = 0;
isBallistic = true;
gravityMod = 0.20;
hasLight = false;
hasLight = false; is what makes the particles invisible...