Using True PVE v2.2.3, `spawn rocket_mlrs` and `spawn rocket_basic` don't do damage to NPCs or buildings in PVE areas, and also don't do damage to scientists even in exclude zones. Rockets launched from a launcher work in both of these cases.
Here is my TruePVE configuration: https://pastebin.com/598jP38f
Note in particular that I have `"defaultAllowDamage":true,` and all rules end in `cannot hurt Players`, so I would expect NPCs to always take damage.
If I'm reading the trace correctly, it seems TruePVE fails to determine the initiator and decides to just block by default:
======================
== STARTING TRACE ==
== 22:48:03.98488 ==
======================
From: MLRSRocket, rocket_mlrs
To: ScientistNPC, scientistnpc_roamtethered
Checking exclusions between [empty] and [empty]
Shared locations: none
No shared locations, or no matching exclusion mapping - no exclusions
No exclusion found - looking up RuleSet...
Using RuleSet "default"
Initiator empty for player damage; block and return (Damage Type: Explosion, Damage Amount: 500)
======================
== STARTING TRACE ==
== 22:48:04.78471 ==
======================
From: TimedExplosive, rocket_basic
To: ScientistNPC, scientistnpc_roamtethered
Checking exclusions between [empty] and [empty]
Shared locations: none
No shared locations, or no matching exclusion mapping - no exclusions
No exclusion found - looking up RuleSet...
Using RuleSet "default"
Initiator empty for player damage; block and return (Damage Type: Explosion, Damage Amount: 315.2245)
======================
== STARTING TRACE ==
== 22:48:05.92394 ==
======================
From: TimedExplosive, rocket_hv
To: ScientistNPC, scientistnpc_roamtethered
Checking exclusions between [empty] and [empty]
Shared locations: none
No shared locations, or no matching exclusion mapping - no exclusions
No exclusion found - looking up RuleSet...
Using RuleSet "default"
Initiator empty for player damage; block and return (Damage Type: AntiVehicle, Damage Amount: 427.3882)