diff --git a/_maps/map_files/debug/multiz.dmm b/_maps/map_files/debug/multiz.dmm
index eb8d233d0e8..63e7a22d273 100644
--- a/_maps/map_files/debug/multiz.dmm
+++ b/_maps/map_files/debug/multiz.dmm
@@ -1090,7 +1090,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
"eQ" = (
-/obj/structure/fluff/railing{
+/obj/structure/railing{
icon_state = "railing";
dir = 4
},
@@ -1168,7 +1168,7 @@
/turf/open/floor/plating,
/area/engine/storage)
"hY" = (
-/obj/structure/fluff/railing/corner,
+/obj/structure/railing/corner,
/turf/open/floor/plating,
/area/hallway/secondary/service)
"ij" = (
@@ -1192,7 +1192,7 @@
/area/hallway/secondary/service)
"iH" = (
/obj/effect/turf_decal/stripes/white/line,
-/obj/structure/fluff/railing/corner{
+/obj/structure/railing/corner{
icon_state = "railing_corner";
dir = 4
},
@@ -1216,8 +1216,7 @@
/turf/open/floor/plating,
/area/engine/storage)
"jD" = (
-/obj/structure/fluff/railing/corner{
- icon_state = "railing_corner";
+/obj/structure/railing/corner{
dir = 4
},
/turf/open/floor/plating,
@@ -1312,12 +1311,18 @@
"qo" = (
/turf/open/openspace,
/area/engine/storage)
+"qx" = (
+/obj/structure/railing/corner{
+ dir = 8
+ },
+/turf/open/floor/plating,
+/area/construction)
"qR" = (
/obj/effect/turf_decal/stripes/white/line{
icon_state = "warningline_white";
dir = 9
},
-/obj/structure/fluff/railing/corner{
+/obj/structure/railing/corner{
icon_state = "railing_corner";
dir = 1
},
@@ -1346,7 +1351,7 @@
/turf/open/floor/plating,
/area/construction)
"su" = (
-/obj/structure/fluff/railing{
+/obj/structure/railing{
icon_state = "railing";
dir = 8
},
@@ -1357,7 +1362,7 @@
icon_state = "warningline_white";
dir = 4
},
-/obj/structure/fluff/railing{
+/obj/structure/railing{
icon_state = "railing";
dir = 8
},
@@ -1447,11 +1452,11 @@
/turf/open/floor/plasteel,
/area/construction)
"zd" = (
-/obj/structure/fluff/railing{
+/obj/structure/railing{
icon_state = "railing";
dir = 4
},
-/obj/structure/fluff/railing{
+/obj/structure/railing{
icon_state = "railing";
dir = 8
},
@@ -1475,7 +1480,7 @@
/turf/open/floor/plating,
/area/engine/storage)
"Ai" = (
-/obj/structure/fluff/railing/corner{
+/obj/structure/railing/corner{
icon_state = "railing_corner";
dir = 8
},
@@ -1531,8 +1536,7 @@
/turf/open/floor/plating,
/area/hallway/secondary/service)
"CP" = (
-/obj/structure/fluff/railing{
- icon_state = "railing";
+/obj/structure/railing{
dir = 8
},
/turf/open/floor/plating,
@@ -1555,7 +1559,7 @@
/area/engine/storage)
"Eb" = (
/obj/effect/turf_decal/stripes/white/line,
-/obj/structure/fluff/railing{
+/obj/structure/railing{
icon_state = "railing";
dir = 1
},
@@ -1608,8 +1612,7 @@
/turf/open/floor/plasteel,
/area/storage/primary)
"In" = (
-/obj/structure/fluff/railing{
- icon_state = "railing";
+/obj/structure/railing{
dir = 4
},
/turf/open/floor/plating,
@@ -1619,8 +1622,8 @@
/turf/open/floor/plating,
/area/hallway/secondary/service)
"IL" = (
-/obj/structure/fluff/railing/corner,
-/obj/structure/fluff/railing/corner{
+/obj/structure/railing/corner,
+/obj/structure/railing/corner{
icon_state = "railing_corner";
dir = 8
},
@@ -1668,7 +1671,7 @@
/turf/open/floor/plating,
/area/maintenance/department/bridge)
"Lu" = (
-/obj/structure/fluff/railing{
+/obj/structure/railing{
icon_state = "railing";
dir = 4
},
@@ -1699,8 +1702,7 @@
/turf/open/floor/plating,
/area/engine/storage)
"Pm" = (
-/obj/structure/fluff/railing/corner{
- icon_state = "railing_corner";
+/obj/structure/railing/corner{
dir = 1
},
/turf/open/floor/plating,
@@ -1744,8 +1746,7 @@
/turf/open/floor/plasteel,
/area/construction)
"Tf" = (
-/obj/structure/fluff/railing{
- icon_state = "railing";
+/obj/structure/railing{
dir = 1
},
/turf/open/floor/plating,
@@ -1795,7 +1796,7 @@
/turf/open/floor/plasteel,
/area/hallway/secondary/service)
"XN" = (
-/obj/structure/fluff/railing,
+/obj/structure/railing,
/turf/open/floor/plating,
/area/hallway/secondary/service)
"XQ" = (
@@ -1809,6 +1810,10 @@
},
/turf/open/floor/plating,
/area/hallway/secondary/service)
+"Zv" = (
+/obj/structure/railing/corner,
+/turf/open/floor/plating,
+/area/construction)
"ZH" = (
/obj/structure/disposalpipe/trunk/multiz,
/turf/open/floor/plating,
@@ -2884,7 +2889,7 @@ dn
dn
dn
dn
-dn
+Zv
In
jD
dL
@@ -2992,7 +2997,7 @@ dn
dn
dn
dn
-dn
+qx
CP
Pm
ij
diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm
index f823f59f8f5..3f9acdb7ae6 100644
--- a/code/game/objects/structures/fluff.dm
+++ b/code/game/objects/structures/fluff.dm
@@ -178,19 +178,6 @@
density = TRUE
deconstructible = FALSE
-/obj/structure/fluff/railing
- name = "railing"
- desc = "Basic railing meant to protect idiots like you from falling."
- icon = 'icons/obj/fluff.dmi'
- icon_state = "railing"
- density = TRUE
- anchored = TRUE
- deconstructible = FALSE
-
-/obj/structure/fluff/railing/corner
- icon_state = "railing_corner"
- density = FALSE
-
/obj/structure/fluff/beach_towel
name = "beach towel"
desc = "A towel decorated in various beach-themed designs."
diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm
new file mode 100644
index 00000000000..422d7a06524
--- /dev/null
+++ b/code/game/objects/structures/railings.dm
@@ -0,0 +1,60 @@
+/obj/structure/railing
+ name = "railing"
+ desc = "Basic railing meant to protect idiots like you from falling."
+ icon = 'icons/obj/fluff.dmi'
+ icon_state = "railing"
+ density = TRUE
+ anchored = TRUE
+ climbable = TRUE
+
+/obj/structure/railing/corner //aesthetic corner sharp edges hurt oof ouch
+ icon_state = "railing_corner"
+ density = FALSE
+ climbable = FALSE
+
+/obj/structure/railing/attackby(obj/item/I, mob/living/user, params)
+ add_fingerprint(user)
+
+ if(I.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP)
+ if(obj_integrity < max_integrity)
+ if(!I.tool_start_check(user, amount=0))
+ return
+
+ to_chat(user, "You begin repairing [src]...")
+ if(I.use_tool(src, user, 40, volume=50))
+ obj_integrity = max_integrity
+ to_chat(user, "You repair [src].")
+ else
+ to_chat(user, "[src] is already in good condition!")
+ return
+
+ if(!(flags_1&NODECONSTRUCT_1))
+ if(I.tool_behaviour == TOOL_WRENCH)
+ to_chat(user, "You begin to [anchored ? "unfasten the railing from":"fasten the railing to"] the floor...")
+ if(I.use_tool(src, user, volume = 75, extra_checks = CALLBACK(src, .proc/check_anchored, anchored)))
+ setAnchored(!anchored)
+ to_chat(user, "You [anchored ? "fasten the railing to":"unfasten the railing from"] the floor.")
+ return
+
+/obj/structure/railing/proc/check_anchored(checked_anchored)
+ if(anchored == checked_anchored)
+ return TRUE
+
+/obj/structure/railing/CanPass(atom/movable/mover, turf/target)
+ ..()
+ if(get_dir(loc, target) & dir)
+ return !density
+ return TRUE
+
+/obj/structure/railing/corner/CanPass()
+ ..()
+ return TRUE
+
+/obj/structure/railing/CheckExit(atom/movable/O, turf/target)
+ ..()
+ if(get_dir(loc, target) & dir)
+ return 0
+ return 1
+
+/obj/structure/railing/corner/CheckExit()
+ return 1
diff --git a/tgstation.dme b/tgstation.dme
index f1de9a2dc58..f9887efb784 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1129,6 +1129,7 @@
#include "code\game\objects\structures\noticeboard.dm"
#include "code\game\objects\structures\petrified_statue.dm"
#include "code\game\objects\structures\plasticflaps.dm"
+#include "code\game\objects\structures\railings.dm"
#include "code\game\objects\structures\reflector.dm"
#include "code\game\objects\structures\safe.dm"
#include "code\game\objects\structures\showcase.dm"