What is an efficient system for movement state operations?

So here’s an image of how my movement states interact.


Is there a more efficient system than using the tick event combined with branches? Or at the very least, is there a more efficient way to setup these branches? Because what I want is several kinds of states, some of which are not quite compatible. An example would be that I can’t sprint and crouch at the same time. If I press the crouch button, I stop sprinting. If I press the sprint button, I stop crouching. I already have it setup so that I’ll stop crouching when I press sprint (if I’m already crouching). But the systems are a little complex, and when you have hierarchical systems like in branches, you either have to setup something semi-complex, or just find the best layering for your current setup.

Currently, in this system, if I’m holding the walk key, and then I press sprint, it doesn’t transition me into sprinting. But if I’m holding the sprint key, and I press the walk key, then walking overrules sprinting (and if I let go of the walk key, I start sprinting without having to press it again). And if I’m sprinting, pressing the crouch key won’t overwrite my sprinting.

I used an Enum that indicates in which state I am.

Event Tick switches over “currentState” and calls a subroutine of this exact state.
You can easily poll input and change the State how you want it.
For example
State Walk → Is there ground under the Character → No → Go into State “Fall” → else → nothing (Stay in Walk)
State Fall → Is there ground under the Character → No → Add Fall Height Else → Go Into State Landing
State Landing → Nothing (Wait for Anim Notify,goes to State Idle)
State Idle-> Is Forward Axis != 0 → Go to State Walk

and so on.