diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index ef71a9c7000..c3d1a8e7a32 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -288,7 +288,7 @@
return 0
if(affecting)
- if(!isturf(assailant.loc) || ( !isturf(affecting.loc) || assailant.loc != affecting.loc && get_dist(assailant, affecting) > 1) )
+ if(!isturf(assailant.loc) || ( !isturf(affecting.loc) || assailant.loc != affecting.loc && get_dist(assailant, affecting) > 1) || assailant.z != affecting.z )
qdel(src)
return 0
diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm
index 5a0f53fa558..0e300b195da 100644
--- a/code/modules/multiz/structures.dm
+++ b/code/modules/multiz/structures.dm
@@ -54,9 +54,17 @@
var/obj/structure/ladder/target_ladder = getTargetLadder(M)
if(!target_ladder)
return
+
+ var/obj/item/weapon/grab/G = M.l_hand
+ if (!istype(G))
+ G = M.r_hand
+
if(!M.Move(get_turf(src)))
to_chat(M, "You fail to reach \the [src].")
return
+
+ if (istype(G))
+ G.affecting.forceMove(get_turf(src))
var/direction = target_ladder == target_up ? "up" : "down"
@@ -66,7 +74,7 @@
target_ladder.audible_message("You hear something coming [direction] \the [src]")
- if(do_after(M, climb_time))
+ if(do_after(M, istype(G) ? (climb_time*2) : climb_time))
climbLadder(M, target_ladder)
/obj/structure/ladder/attack_ghost(var/mob/M)
@@ -126,6 +134,11 @@
if(!A.CanPass(M, M.loc, 1.5, 0))
to_chat(M, "\The [A] is blocking \the [src].")
return FALSE
+ var/obj/item/weapon/grab/G = M.l_hand
+ if (!istype(G))
+ G = M.r_hand
+ if (istype(G))
+ G.affecting.forceMove(T)
return M.Move(T)
/obj/structure/ladder/CanPass(obj/mover, turf/source, height, airflow)