diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 6c1cfeb7714..037b9fb7d87 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -16,20 +16,8 @@ emp_act
if(check_reflect(def_zone)) // Checks if you've passed a reflection% check
visible_message("The [P.name] gets reflected by [src]!", \
"The [P.name] gets reflected by [src]!")
- // Find a turf near or on the original location to bounce to
- if(P.starting)
- var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2)
- var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2)
- var/turf/curloc = get_turf(src)
-
- // redirect the projectile
- P.firer = src
- P.original = locate(new_x, new_y, P.z)
- P.starting = curloc
- P.current = curloc
- P.yo = new_y - curloc.y
- P.xo = new_x - curloc.x
- P.Angle = null
+
+ P.reflect_back(src)
return -1 // complete projectile permutation
diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm
index 7c92d8748bd..f88670fc0c1 100644
--- a/code/modules/mob/living/carbon/human/species/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/golem.dm
@@ -474,19 +474,9 @@
if(P.is_reflectable)
H.visible_message("The [P.name] gets reflected by [H]'s glass skin!", \
"The [P.name] gets reflected by [H]'s glass skin!")
- if(P.starting)
- var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2)
- var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2)
- var/turf/curloc = get_turf(H)
+
+ P.reflect_back(H)
- // redirect the projectile
- P.firer = src
- P.original = locate(new_x, new_y, P.z)
- P.starting = curloc
- P.current = curloc
- P.yo = new_y - curloc.y
- P.xo = new_x - curloc.x
- P.Angle = null
return FALSE
return TRUE
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index 0c003b9e3b8..b41f7f3837a 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -132,19 +132,7 @@
visible_message("The [P.name] gets reflected by [src]'s shell!", \
"The [P.name] gets reflected by [src]'s shell!")
- // Find a turf near or on the original location to bounce to
- if(P.starting)
- var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
- var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
- var/turf/curloc = get_turf(src)
-
- // redirect the projectile
- P.original = locate(new_x, new_y, P.z)
- P.starting = curloc
- P.current = curloc
- P.firer = src
- P.yo = new_y - curloc.y
- P.xo = new_x - curloc.x
+ P.reflect_back(src, list(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3))
return -1 // complete projectile permutation
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index dc798e10830..a02c301ec01 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -302,6 +302,21 @@
Range()
sleep(1)
+obj/item/projectile/proc/reflect_back(atom/source, list/position_modifiers = list(0, 0, 0, 0, 0, -1, 1, -2, 2))
+ if(starting)
+ var/new_x = starting.x + pick(position_modifiers)
+ var/new_y = starting.y + pick(position_modifiers)
+ var/turf/curloc = get_turf(source)
+
+ // redirect the projectile
+ firer = source
+ original = locate(new_x, new_y, z)
+ starting = curloc
+ current = curloc
+ yo = new_y - curloc.y
+ xo = new_x - curloc.x
+ Angle = null // Will be calculated in fire()
+
obj/item/projectile/Crossed(atom/movable/AM, oldloc) //A mob moving on a tile with a projectile is hit by it.
..()
if(isliving(AM) && AM.density && !checkpass(PASSMOB))