Автомат состояний. У тебя его зачаток написан в StateHandler(), хотя и немного корявый.
Нужно так же иметь ввижу, что с персонажем могут быть ассоциированы несколько параллельно работающих автоматов состояний. Например, один связан с движением, другой - с атаками, третий - с абилками и т.д..
Что касается рывка при спринте, просто сделай два состояния. При нажатии клавиши переходишь в состояние рывок, если по прошествию 2 секунд клавиша ещё не отпущена, то переводишь состояние в спринт. При отпускании в любом из двух состояний переходишь в ходьбу.