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)