diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 0b66569b05..104fa066b6 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -230,8 +230,6 @@ /atom/movable/proc/doMove(atom/destination) . = FALSE if(destination) - if(pulledby) - pulledby.stop_pulling() var/atom/oldloc = loc var/same_loc = oldloc == destination var/area/old_area = get_area(oldloc) @@ -262,6 +260,10 @@ continue AM.Crossed(src, oldloc) + // Break pulling if we are too far to pull now. + if(pulledby && (pulledby.z != src.z || get_dist(pulledby, src) > 1)) + pulledby.stop_pulling() + Moved(oldloc, NONE, TRUE) . = TRUE diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f1a5238f78..fe89afd4ce 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -767,7 +767,6 @@ default behaviour is: return /mob/living/Move(a, b, flag) - if (buckled && buckled.loc != a) //not updating position if(istype(buckled, /mob)) //If you're buckled to a mob, a la slime things, keep on rolling. return buckled.Move(a, b) @@ -853,9 +852,12 @@ default behaviour is: if(istype(location, /turf/simulated)) location.add_blood(M) - step(pulling, get_dir(pulling.loc, T)) - if(t) - M.start_pulling(t) + if(get_dist(pulling.loc, T) > 1 || pulling.loc.z != T.z) + M.stop_pulling() + else + step(pulling, get_dir(pulling.loc, T)) + if(t) + M.start_pulling(t) else if (pulling) if (istype(pulling, /obj/structure/window)) @@ -863,8 +865,11 @@ default behaviour is: if(W.is_fulltile()) for(var/obj/structure/window/win in get_step(pulling,get_dir(pulling.loc, T))) stop_pulling() - if (pulling) - step(pulling, get_dir(pulling.loc, T)) + + if(get_dist(pulling.loc, T) > 1 || pulling.loc.z != T.z) // This is needed or else pulled objects can't get pushed away. + stop_pulling() + else + step(pulling, get_dir(pulling.loc, T)) else stop_pulling() . = ..()