diff --git a/code/game/objects/items/grenades/grenade.dm b/code/game/objects/items/grenades/grenade.dm
index bf2f6dd4bb..8c47c92e90 100644
--- a/code/game/objects/items/grenades/grenade.dm
+++ b/code/game/objects/items/grenades/grenade.dm
@@ -52,8 +52,9 @@
message_admins(message)
log_game("[key_name(user)] has primed \a [src] for detonation at [A.name] [COORD(T)].")
-/obj/item/grenade/proc/preprime(mob/user, delayoverride, msg = TRUE)
+/obj/item/grenade/proc/preprime(mob/user, delayoverride, msg = TRUE, volume = 60)
var/turf/T = get_turf(src)
+<<<<<<< HEAD
log_grenade(user, T)
if(iscarbon(user))
var/mob/living/carbon/C = user
@@ -64,6 +65,19 @@
active = TRUE
icon_state = initial(icon_state) + "_active"
add_fingerprint(user)
+=======
+ log_grenade(user, T) //Inbuilt admin procs already handle null users
+ if(user)
+ add_fingerprint(user)
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ C.throw_mode_on()
+ if(msg)
+ to_chat(user, "You prime \the [src]! [det_time/10] seconds!")
+ playsound(src, 'sound/weapons/armbomb.ogg', volume, 1)
+ active = TRUE
+ icon_state = initial(icon_state) + "_active"
+>>>>>>> 695fa5f... You can now hide grenades in plushies (#31986)
addtimer(CALLBACK(src, .proc/prime), isnull(delayoverride)? det_time : delayoverride)
/obj/item/grenade/proc/prime()
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index ec5f349ca9..d1d7f4d289 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -7,14 +7,66 @@
w_class = WEIGHT_CLASS_SMALL
resistance_flags = FLAMMABLE
var/list/squeak_override //Weighted list; If you want your plush to have different squeak sounds use this
+ var/stuffed = TRUE //If the plushie has stuffing in it
+ var/obj/item/grenade/grenade //You can remove the stuffing from a plushie and add a grenade to it for *nefarious uses*
/obj/item/toy/plush/Initialize()
. = ..()
AddComponent(/datum/component/squeak, squeak_override)
+/obj/item/toy/plush/Destroy()
+ QDEL_NULL(grenade)
+ return ..()
+
+/obj/item/toy/plush/handle_atom_del(atom/A)
+ if(A == grenade)
+ grenade = null
+ ..()
+
/obj/item/toy/plush/attack_self(mob/user)
. = ..()
- to_chat(user, "You pet [src]. D'awww.")
+ if(stuffed || grenade)
+ to_chat(user, "You pet [src]. D'awww.")
+ if(grenade && !grenade.active)
+ if(istype(grenade, /obj/item/grenade/chem_grenade))
+ var/obj/item/grenade/chem_grenade/G = grenade
+ if(G.nadeassembly) //We're activated through different methods
+ return
+ log_game("[key_name(user)] activated a hidden grenade in [src].")
+ grenade.preprime(user, msg = FALSE, volume = 10)
+ else
+ to_chat(user, "You try to pet [src], but it has no stuffing. Aww...")
+
+/obj/item/toy/plush/attackby(obj/item/I, mob/living/user, params)
+ if(I.is_sharp())
+ if(!grenade)
+ if(!stuffed)
+ to_chat(user, "You already murdered it!")
+ return
+ user.visible_message("[user] tears out the stuffing from [src]!", "You rip a bunch of the stuffing from [src]. Murderer.")
+ playsound(I, I.usesound, 50, TRUE)
+ stuffed = FALSE
+ else
+ to_chat(user, "You remove the grenade from [src].")
+ user.put_in_hands(grenade)
+ grenade = null
+ return
+ if(istype(I, /obj/item/grenade))
+ if(stuffed)
+ to_chat(user, "You need to remove some stuffing first!")
+ return
+ if(grenade)
+ to_chat(user, "[src] already has a grenade!")
+ return
+ if(!user.transferItemToLoc(I, src))
+ return
+ user.visible_message("[user] slides [grenade] into [src].", \
+ "You slide [I] into [src].")
+ grenade = I
+ var/turf/T = get_turf(user)
+ log_game("[key_name(user)] added a grenade ([I.name]) to [src] at [COORD(T)].")
+ return
+ return ..()
/obj/item/toy/plush/carpplushie
name = "space carp plushie"