You don’t need a separate system to apply these abilities. I’d simply code them into the Weapon parent class.
Shoot faster: 60 / Rounds per minute = Time between shots
3 Projectiles: Standard Burst firing mode (semi auto, burst, auto)
Projectile Pierce: sounds like penetration, custom projectile
For ROF I’d simply have an int var for the rounds per minute the weapon can fire. Simple math (60/RoF) to Set Timer by Event.
Burst fire (regardless projectile count) is a simple looped firing mode. Similar to how you’d handle shotgun w/pellets. Enum or Enum array of firing modes.
Projectile penetration would utilize a custom projectile that on hit would determine if it could penetrate, then calc exit point of mesh and new trajectory. Spawn new projectile w/new trajectory and destroy the original. Not a lot of code actually. Then use an Enum to select which projectile class to spawn… Normal, Penetrate etc.