one state at a time
A finite state machine keeps a character in exactly one state and lists which events move it to which state. An event with no matching transition is ignored, like the attack pressed in mid air here. This replaces a pile of booleans like isJumping and isAttacking that can end up true at the same time.
Model the character with a finite state machine: one active state at a time, an explicit transition table keyed by state and event, events with no entry ignored, and enter, update and exit hooks on each state.