diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm
index 4c6d8b2798..808b65cb41 100644
--- a/code/modules/hydroponics/seed_storage.dm
+++ b/code/modules/hydroponics/seed_storage.dm
@@ -445,6 +445,27 @@
piles -= N
qdel(N)
break
+ if(hacked || emagged)
+ for (var/datum/seed_pile/N in piles_contra)
+ if (N.ID == ID)
+ if (task == "vend")
+ var/obj/O = pick(N.seeds)
+ if (O)
+ --N.amount
+ N.seeds -= O
+ if (N.amount <= 0 || N.seeds.len <= 0)
+ piles_contra -= N
+ qdel(N)
+ O.loc = src.loc
+ else
+ piles_contra -= N
+ qdel(N)
+ else if (task == "purge")
+ for (var/obj/O in N.seeds)
+ qdel(O)
+ piles_contra -= N
+ qdel(N)
+ break
updateUsrDialog()
/obj/machinery/seed_storage/attackby(var/obj/item/O as obj, var/mob/user as mob)
@@ -477,6 +498,23 @@
else if((istype(O, /obj/item/weapon/wirecutters) || istype(O, /obj/item/device/multitool)) && panel_open)
wires.Interact(user)
+/obj/machinery/seed_storage/emag_act(var/remaining_charges, var/mob/user)
+ if(!src.emagged)
+ emagged = 1
+ if(lockdown)
+ to_chat(user, "\The [src]'s control panel thunks, as its cover retracts.")
+ lockdown = 0
+ if(req_access || req_one_access)
+ req_access = list()
+ req_one_access = list()
+ to_chat(user, "\The [src]'s access mechanism shorts out.")
+ var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
+ sparks.set_up(3, 0, get_turf(src))
+ sparks.start()
+ visible_message("\The [src]'s panel sparks!")
+ qdel(sparks)
+ return 1
+
/obj/machinery/seed_storage/proc/add(var/obj/item/seeds/O as obj, var/contraband = 0)
if (istype(O.loc, /mob))
var/mob/user = O.loc
@@ -489,6 +527,8 @@
var/newID = 0
if(contraband)
+ var/datum/seed_pile/final_pile = piles[piles.len]
+ newID = final_pile.ID + 1
for (var/datum/seed_pile/N in piles_contra)
if (N.matches(O))
++N.amount