diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm
index 6d0da02bb2a..f04b690f27f 100644
--- a/code/game/atoms_movable.dm
+++ b/code/game/atoms_movable.dm
@@ -1089,6 +1089,25 @@
return TRUE
return FALSE
+/atom/movable/proc/teleport_radius(var/range)
+ var/list/best_options = list()
+ var/list/backup_options = list()
+ var/turf/picked
+ for(var/turf/T in orange(range, src))
+ if(T.x>world.maxx-6 || T.x<6 || T.y>world.maxy-6 || T.y<6) //Conditions we will NEVER accept: too close to edge
+ continue
+ if(istype(T,/turf/space) || T.density) //Only as a fallback: dense turf or space
+ backup_options += T
+ continue
+ best_options += T
+ if(best_options.len)
+ picked = pick(best_options)
+ else if(backup_options.len)
+ picked = pick(backup_options)
+ else
+ return
+ forceMove(picked)
+
// -- trackers
/atom/movable/proc/add_tracker(var/datum/tracker/T)
diff --git a/code/game/objects/items/weapons/storage/lockbox.dm b/code/game/objects/items/weapons/storage/lockbox.dm
index e6f5cd4dafe..2eff284056b 100644
--- a/code/game/objects/items/weapons/storage/lockbox.dm
+++ b/code/game/objects/items/weapons/storage/lockbox.dm
@@ -513,25 +513,9 @@
return ..()
/obj/item/weapon/storage/lockbox/advanced/proc/react()
- var/list/turfs = new/list()
- for(var/turf/T in orange(6, loc))
- if(istype(T,/turf/space))
- continue
- if(T.density)
- continue
- if(T.x>world.maxx-6 || T.x<6)
- continue
- if(T.y>world.maxy-6 || T.y<6)
- continue
- turfs += T
- if(!turfs.len)
- turfs += pick(/turf in orange(6))
- var/turf/picked = pick(turfs)
- if(!isturf(picked))
- return
+ teleport_radius(6)
visible_message("\The [src] displaces itself with its reactive teleport system!")
- playsound(src, 'sound/effects/teleport.ogg', 30, 1)
- forceMove(picked)
+ playsound(src, 'sound/effects/teleport.ogg', 50, 1)
/obj/item/weapon/storage/lockbox/advanced/energyshotgun/New()
..()
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 71dc23d04f9..87cec2a7d03 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -296,29 +296,9 @@
if(L.wear_suit != src) //Not worn
return 0 //Don't do anything
- var/list/turfs = new/list()
-
- for(var/turf/T in orange(6, loc))
- if(istype(T,/turf/space))
- continue
- if(T.density)
- continue
- if(T.x>world.maxx-6 || T.x<6)
- continue
- if(T.y>world.maxy-6 || T.y<6)
- continue
- turfs += T
- if(!turfs.len)
- turfs += pick(/turf in orange(6))
- var/turf/picked = pick(turfs)
- if(!isturf(picked))
- return
-
+ L.teleport_radius(6)
L.visible_message("The reactive teleport system flings [L] clear of \the [blocked]!", "The reactive teleport system flings you clear of \the [blocked].")
-
- playsound(L, 'sound/effects/teleport.ogg', 30, 1)
-
- L.forceMove(picked)
+ playsound(L, 'sound/effects/teleport.ogg', 50, 1)
return 1