diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index 568ad40f33a..ffc12efc49b 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -1,13 +1,14 @@
-var/global/list/datum/stack_recipe/rod_recipes = list ( \
- new/datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("mine track", /obj/structure/track, 3, time = 10, one_per_turf = 1, on_floor = 1), \
- new/datum/stack_recipe("cane", /obj/item/weapon/cane, 1, time = 6), \
- new/datum/stack_recipe("crowbar", /obj/item/weapon/crowbar, 1, time = 6), \
- new/datum/stack_recipe("screwdriver", /obj/item/weapon/screwdriver, 1, time = 12), \
- new/datum/stack_recipe("wrench", /obj/item/weapon/wrench, 1, time = 6), \
- new/datum/stack_recipe("spade", /obj/item/weapon/shovel/spade, 2, time = 12), \
- new/datum/stack_recipe("bolt", /obj/item/weapon/arrow, 1, time = 6)
- )
+var/global/list/datum/stack_recipe/rod_recipes = list(
+ new /datum/stack_recipe("grille", /obj/structure/grille, 2, time = 10, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("floor-mounted catwalk", /obj/structure/lattice/catwalk/indoor, 4, time = 10, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("mine track", /obj/structure/track, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE),
+ new /datum/stack_recipe("cane", /obj/item/weapon/cane, 1, time = 6),
+ new /datum/stack_recipe("crowbar", /obj/item/weapon/crowbar, 1, time = 6),
+ new /datum/stack_recipe("screwdriver", /obj/item/weapon/screwdriver, 1, time = 12),
+ new /datum/stack_recipe("wrench", /obj/item/weapon/wrench, 1, time = 6),
+ new /datum/stack_recipe("spade", /obj/item/weapon/shovel/spade, 2, time = 12),
+ new /datum/stack_recipe("bolt", /obj/item/weapon/arrow, 1, time = 6)
+)
/obj/item/stack/rods
name = "metal rod"
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index 2a1df7531d1..8bb33655660 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -3,11 +3,12 @@
desc = "A lightweight support lattice."
icon = 'icons/obj/smooth/lattice.dmi'
icon_state = "lattice"
- density = 0
- anchored = 1.0
+ density = FALSE
+ anchored = TRUE
w_class = 3
layer = 2.3 //under pipes
// flags = CONDUCT
+ var/restrict_placement = TRUE
smooth = SMOOTH_MORE
canSmoothWith = list(
/obj/structure/lattice,
@@ -21,11 +22,10 @@
/obj/structure/lattice/Initialize()
. = ..()
-///// Z-Level Stuff
- if(!(istype(src.loc, /turf/space) || istype(src.loc, /turf/simulated/open) || istype(src.loc, /turf/simulated/floor/asteroid)))
-///// Z-Level Stuff
- return INITIALIZE_HINT_QDEL
- for(var/obj/structure/lattice/LAT in src.loc)
+ if (restrict_placement)
+ if(!(istype(loc, /turf/space) || istype(loc, /turf/simulated/open) || istype(loc, /turf/simulated/floor/asteroid)))
+ return INITIALIZE_HINT_QDEL
+ for(var/obj/structure/lattice/LAT in loc)
if(LAT != src)
qdel(LAT)
@@ -38,7 +38,6 @@
return
/obj/structure/lattice/attackby(obj/item/C as obj, mob/user as mob)
-
if (istype(C, /obj/item/stack/tile/floor))
var/turf/T = get_turf(src)
T.attackby(C, user) //BubbleWrap - hand this off to the underlying turf instead
@@ -66,12 +65,28 @@
smooth = SMOOTH_TRUE
canSmoothWith = null
-/obj/structure/lattice/catwalk/Initialize()
- . = ..()
-///// Z-Level Stuff
- if(!(istype(src.loc, /turf/space) || istype(src.loc, /turf/simulated/open) || istype(src.loc, /turf/simulated/floor/asteroid)))
-///// Z-Level Stuff
- return INITIALIZE_HINT_QDEL
- for(var/obj/structure/lattice/catwalk/LAT in src.loc)
- if(LAT != src)
- qdel(LAT)
+// Special catwalk that can be placed on regular flooring.
+/obj/structure/lattice/catwalk/indoor
+ desc = "A floor-mounted catwalk designed to protect pipes & station wiring from passing feet."
+ restrict_placement = FALSE
+ can_be_unanchored = TRUE
+ layer = 2.7 // Above wires.
+
+/obj/structure/lattice/catwalk/attackby(obj/item/C, mob/user)
+ if (iswelder(C))
+ var/obj/item/weapon/weldingtool/WT = C
+ if (do_after(user, 5, act_target = src) && WT.remove_fuel(1, user))
+ user << "You slice apart [src]."
+ playsound(src, 'sound/items/Welder.ogg', 50, 1)
+ new /obj/item/stack/rods{amount = 3}(loc)
+ qdel(src)
+
+/obj/structure/lattice/catwalk/indoor/attackby(obj/item/C, mob/user)
+ if (isscrewdriver(C))
+ anchored = !anchored
+ user << "You [anchored ? "" : "un"]anchor [src]."
+ playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
+ queue_smooth(src)
+ queue_smooth_neighbors(src)
+ else
+ ..()