I find that ECS itself is often not the right thing, but the reason for it over OOP is very valid. Subdividing classes into more modular components is important.
I'm stuck in a loop of "this is definitely the project I'm going to be able to focus on for a long time and maybe even finish at some point" and "ooh, this would be a cool idea for a new project!"
Something I just thought of about character generation in RPGs: Presenting players with skills without demonstrating what those skills do is pretty bad design.
I feel like your best bet would be interfaces rather than classes. You can mix those, but the key here is ensuring that your components have a definition for things even if that definition is defined as "do nothing".
@Jimmy What you'd probably then want is an "on hit" object that is called whenever the weapon deals damage. Most might have an empty class for that but the ones that set things on fire have an object that applies the "on fire" status to what was hit.
There's something to be said for knowing EXACTLY what your language will and won't do. So you know that if you're shooting yourself in the foot, you know exactly how and why.