diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm
index 766b470b54..27dad792aa 100644
--- a/code/game/machinery/biogenerator.dm
+++ b/code/game/machinery/biogenerator.dm
@@ -120,6 +120,7 @@
dat += "Plant bag ([round(250/build_eff)])
"
dat += "Large plant bag ([round(250/build_eff)])
"
dat += "Utility belt ([round(300/build_eff)])
"
+ dat += "Botany belt ([round(300/build_eff)])
"
dat += "Leather Satchel ([round(400/build_eff)])
"
dat += "Cash Bag ([round(400/build_eff)])
"
dat += "Chemistry Bag ([round(400/build_eff)])
"
@@ -250,6 +251,8 @@
new/obj/item/storage/bag/plants/large(loc)
if("tbelt")
new/obj/item/storage/belt/utility(loc)
+ if("plantbelt")
+ new/obj/item/storage/belt/plant(loc)
if("satchel")
new/obj/item/storage/backpack/satchel(loc)
if("cashbag")
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index 7bd3e1bd9f..5b13b5ee40 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -464,3 +464,21 @@
can_hold = list(
/obj/item/ammo_casing/afoam_dart
)
+
+/obj/item/storage/belt/plant
+ name = "botany toolbelt"
+ desc = "A belt to hold various botanical tools."
+ icon_state = "plantbelt"
+ storage_slots = 8
+ can_hold = list(
+ /obj/item/reagent_containers/glass/bottle,
+ /obj/item/reagent_containers/glass/beaker,
+ /obj/item/material/minihoe,
+ /obj/item/shovel/spade,
+ /obj/item/material/knife/machete/hatchet,
+ /obj/item/analyzer/plant_analyzer,
+ /obj/item/gun/energy/floragun,
+ /obj/item/tool/wirecutters,
+ /obj/item/tool/wrench,
+ /obj/item/multitool,
+ )
diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm
index b7e879b56e..6e519d8f6b 100644
--- a/code/modules/hydroponics/trays/tray.dm
+++ b/code/modules/hydroponics/trays/tray.dm
@@ -574,6 +574,29 @@
anchored = !anchored
to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
+ else if(istype(O, /obj/item/shovel/spade))
+ if(!weedlevel && !seed) // Don't do anything if the tray is truly empty
+ to_chat(user, SPAN_NOTICE("[src] doesn't have any plants or weeds!"))
+ return
+ user.visible_message(SPAN_NOTICE("[user] starts digging out [src]'s plants..."))
+ to_chat(user, SPAN_NOTICE("You start digging out [src]'s plants..."))
+ playsound(src, O.usesound, 50, 1)
+ if(do_after(user, 40 * O.toolspeed))
+ to_chat(user, SPAN_NOTICE("[user] digs out the plants in [src]!"), SPAN_NOTICE("You dig out all of [src]'s plants!"))
+ if(seed) // Chuck the seed -- it's basically just a forced remove_dead() without the verbosity
+ seed = null
+ dead = 0
+ sampled = 0
+ age = 0
+ yield_mod = 0
+ mutation_mod = 0
+ lastproduce = 0
+ weedlevel = 0
+ check_health()
+ force_update = 1
+ process()
+ return
+
else if(istype(O,/obj/item/multitool))
if(!anchored)
to_chat(user, "Anchor it first!")
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index 2d19da251a..ca75de3acd 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/maps/cynosure/cynosure-2.dmm b/maps/cynosure/cynosure-2.dmm
index 70445c9a6e..f0c50991c5 100644
--- a/maps/cynosure/cynosure-2.dmm
+++ b/maps/cynosure/cynosure-2.dmm
@@ -44134,6 +44134,9 @@
pixel_y = 2
},
/obj/item/reagent_containers/glass/bucket,
+/obj/item/shovel/spade,
+/obj/item/shovel/spade,
+/obj/item/shovel/spade,
/turf/simulated/floor/tiled/hydro,
/area/surface/station/hydroponics)
"tzy" = (
@@ -54049,6 +54052,8 @@
/obj/effect/floor_decal/corner/green/border{
dir = 4
},
+/obj/item/shovel/spade,
+/obj/item/shovel/spade,
/turf/simulated/floor/tiled/neutral,
/area/surface/station/rnd/xenobiology/xenoflora)
"xYt" = (