diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 1ab30d2634e..89c7c3eebe1 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -812,17 +812,22 @@ default behaviour is: adjustBruteLoss(2) visible_message("\The [src]'s [isSynthetic() ? "state" : "wounds"] worsen terribly from being dragged!") -/mob/living/Moved(var/oldloc, direct, forced, movetime) +/mob/living/Moved(var/atom/oldloc, direct, forced, movetime) . = ..() handle_footstep(loc) - var/atom/movable/pullee = pulling - if(pulling && pulling == pullee) // we were pulling a thing and didn't lose it during our move. - if(pulling.anchored) + if(pulling) // we were pulling a thing and didn't lose it during our move. + if(pulling.anchored || !isturf(pulling.loc)) stop_pulling() + return var/pull_dir = get_dir(src, pulling) if(get_dist(src, pulling) > 1 || (moving_diagonally != SECOND_DIAG_STEP && ((pull_dir - 1) & pull_dir))) // puller and pullee more than one tile away or in diagonal position + // If it is too far away or across z-levels from old location, stop pulling. + if(get_dist(pulling.loc, oldloc) > 1 || pulling.loc.z != oldloc?.z) + stop_pulling() + return + // living might take damage from drags if(isliving(pulling)) var/mob/living/M = pulling diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm index 331588183eb..07084265115 100644 --- a/code/modules/multiz/structures.dm +++ b/code/modules/multiz/structures.dm @@ -159,7 +159,7 @@ A.forceMove(target) if(isliving(A)) var/mob/living/L = A - if(L.pulling) + if(L.pulling && !L.pulling.anchored) L.pulling.forceMove(target) /obj/structure/stairs/proc/upperStep(var/turf/T)