diff --git a/common/src/sys/animation.rs b/common/src/sys/animation.rs
index 2ccc5cff18..95bb562f90 100644
--- a/common/src/sys/animation.rs
+++ b/common/src/sys/animation.rs
@@ -49,7 +49,6 @@ impl<'a> System<'a> for Sys {
             .join()
         {
             animation_info.time += dt.0 as f64;
-            let moving = vel.0.magnitude() > 3.0;
 
             fn impossible_animation(message: &str) -> Animation {
                 warn!("{}", message);
@@ -58,7 +57,7 @@ impl<'a> System<'a> for Sys {
 
             let animation = match (
                 on_ground.is_some(),
-                moving,
+                vel.0.magnitude() > 3.0, // Moving
                 attacking.is_some(),
                 gliding.is_some(),
                 rolling.is_some(),
diff --git a/common/src/sys/controller.rs b/common/src/sys/controller.rs
index 9df950c144..cf518f7cb1 100644
--- a/common/src/sys/controller.rs
+++ b/common/src/sys/controller.rs
@@ -65,40 +65,58 @@ impl<'a> System<'a> for Sys {
                 continue;
             }
 
+            // Move dir
+            if rollings.get(entity).is_none() {
+                move_dirs.insert(
+                    entity,
+                    MoveDir(if controller.move_dir.magnitude() > 1.0 {
+                        controller.move_dir.normalized()
+                    } else {
+                        controller.move_dir
+                    }),
+                );
+            }
+
             // Glide
-            if controller.glide && on_ground.is_none() && attackings.get(entity).is_none() {
+            if controller.glide
+                && glidings.get(entity).is_none()
+                && on_ground.is_none()
+                && attackings.get(entity).is_none()
+                && rollings.get(entity).is_none()
+            {
                 glidings.insert(entity, Gliding);
             } else {
                 glidings.remove(entity);
             }
 
-            // Move dir
-            move_dirs.insert(
-                entity,
-                MoveDir(if controller.move_dir.magnitude() > 1.0 {
-                    controller.move_dir.normalized()
-                } else {
-                    controller.move_dir
-                }),
-            );
-
             // Attack
             if controller.attack
                 && attackings.get(entity).is_none()
                 && glidings.get(entity).is_none()
+                && rollings.get(entity).is_none()
             {
                 attackings.insert(entity, Attacking::start());
             }
 
             // Jump
-            if on_ground.is_some() && controller.jump && vel.0.z <= 0.0 {
+            if controller.jump
+                && jumpings.get(entity).is_none()
+                && on_ground.is_some()
+                && vel.0.z <= 0.0
+            {
                 jumpings.insert(entity, Jumping);
             } else {
                 jumpings.remove(entity);
             }
 
             // Roll
-            if controller.roll && rollings.get(entity).is_none() && on_ground.is_some() {
+            if controller.roll
+                && rollings.get(entity).is_none()
+                && attackings.get(entity).is_none()
+                && glidings.get(entity).is_none()
+                && on_ground.is_some()
+                && vel.0.magnitude() > 5.0
+            {
                 rollings.insert(entity, Rolling::start());
             }
         }