diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index a3c326abfa1..fe2a2e34cbc 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -295,3 +295,23 @@
if(buckled_mob == mover)
return 1
return ..()
+
+
+/atom/movable/proc/get_spacemove_backup()
+ var/atom/movable/dense_object_backup
+ for(var/A in orange(1, get_turf(src)))
+ if(isarea(A))
+ continue
+ else if(isturf(A))
+ var/turf/turf = A
+ if(!turf.density)
+ continue
+ return turf
+ else
+ var/atom/movable/AM = A
+ if(!AM.CanPass(src) || AM.density)
+ if(AM.anchored)
+ return AM
+ dense_object_backup = AM
+ break
+ . = dense_object_backup
\ No newline at end of file
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 2c892b128a9..a664b6227c5 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -406,9 +406,17 @@
events.fireEvent("onMove",get_turf(src))
/obj/mecha/Process_Spacemove(var/movement_dir = 0)
- if(occupant)
- return occupant.Process_Spacemove(movement_dir) //We'll just say you used the clamp to grab the wall
- return ..()
+ . = ..()
+ if(.)
+ return 1
+
+ var/atom/movable/backup = get_spacemove_backup()
+ if(backup)
+ if(istype(backup) && movement_dir && !!backup.anchored)
+ if(backup.newtonian_move(turn(movement_dir, 180)))
+ if(occupant)
+ occupant << "You push off of [backup] to propel yourself."
+ return 1
/obj/mecha/relaymove(mob/user,direction)
if(!direction)
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 388119192d9..3c57f7c9463 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -305,43 +305,40 @@
///For moving in space
///Return 1 for movement 0 for none
/mob/Process_Spacemove(movement_dir = 0)
-
if(..())
return 1
+ var/atom/movable/backup = get_spacemove_backup()
+ if(backup)
+ if(istype(backup) && movement_dir && !backup.anchored)
+ if(backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves
+ src << "You push off of [backup] to propel yourself."
+ return 1
+ return 0
+/mob/get_spacemove_backup()
var/atom/movable/dense_object_backup
- for(var/atom/A in orange(1, get_turf(src)))
+ for(var/A in orange(1, get_turf(src)))
if(isarea(A))
continue
-
else if(isturf(A))
var/turf/turf = A
if(istype(turf,/turf/space))
continue
-
if(!turf.density && !mob_negates_gravity())
continue
-
- return 1
-
+ return A
else
var/atom/movable/AM = A
if(AM == buckled) //Kind of unnecessary but let's just be sure
continue
if(!AM.CanPass(src) || AM.density)
if(AM.anchored)
- return 1
+ return AM
if(pulling == AM)
continue
dense_object_backup = AM
-
- if(movement_dir && dense_object_backup)
- if(dense_object_backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves
- src << "You push off of [dense_object_backup] to propel yourself."
-
-
- return 1
- return 0
+ break
+ . = dense_object_backup
/mob/proc/mob_has_gravity(turf/T)
return has_gravity(src, T)