Better way to achieve semi-automatic fire for third person shooter?

In my opinion, not really. it’s mostly because it’s a bit noodle-like, so I usually prefer bools and branches to control the conditional execution flow. Also in this case it’s an exception for one type of weapons and located outside of the said weapon main logic, so it probably doesn’t look as neat as it could be.