diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index cb64f3fb22..ed855c33b9 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -465,13 +465,17 @@ Proc for attack log creation, because really why not
if(H.dna && istype(H.dna.species, species_datum))
. = TRUE
-/proc/spawn_atom_to_turf(spawn_type, target, amount, admin_spawn=FALSE)
+/proc/spawn_atom_to_turf(spawn_type, target, amount, admin_spawn=FALSE, list/extra_args)
var/turf/T = get_turf(target)
if(!T)
CRASH("attempt to spawn atom type: [spawn_type] in nullspace")
- for(var/j in 1 to amount)
- var/atom/X = new spawn_type(T)
+ var/list/new_args = list(T)
+ if(extra_args)
+ new_args += extra_args
+
+ for(var/j in 1 to amount)
+ var/atom/X = new spawn_type(arglist(new_args))
X.admin_spawned = admin_spawn
/proc/spawn_and_random_walk(spawn_type, target, amount, walk_chance=100, max_walk=3, always_max_walk=FALSE, admin_spawn=FALSE)
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index a9ea558072..58ff061e9d 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -136,13 +136,27 @@
boolets += magazine.ammo_count()
return boolets
+#define BRAINS_BLOWN_THROW_RANGE 3
+#define BRAINS_BLOWN_THROW_SPEED 1
/obj/item/gun/ballistic/suicide_act(mob/user)
- if (chambered && chambered.BB && can_trigger_gun(user) && !chambered.BB.nodamage)
+ var/obj/item/organ/brain/B = user.getorganslot("brain")
+ if (B && chambered && chambered.BB && can_trigger_gun(user) && !chambered.BB.nodamage)
user.visible_message("[user] is putting the barrel of [src] in [user.p_their()] mouth. It looks like [user.p_theyre()] trying to commit suicide!")
sleep(25)
if(user.is_holding(src))
+ var/turf/T = get_turf(user)
process_fire(user, user, 0, zone_override = "head")
user.visible_message("[user] blows [user.p_their()] brain[user.p_s()] out with [src]!")
+ var/turf/target = get_ranged_target_turf(user, turn(user.dir, 180), BRAINS_BLOWN_THROW_RANGE)
+ B.Remove(user)
+ B.forceMove(T)
+ var/datum/dna/user_dna
+ if(iscarbon(user))
+ var/mob/living/carbon/C = user
+ user_dna = C.dna
+ B.add_blood(user_dna)
+ var/datum/callback/gibspawner = CALLBACK(GLOBAL_PROC, /proc/spawn_atom_to_turf, /obj/effect/gibspawner/generic, B, 1, FALSE, list(user_dna))
+ B.throw_at(target, BRAINS_BLOWN_THROW_RANGE, BRAINS_BLOWN_THROW_SPEED, callback=gibspawner)
return(BRUTELOSS)
else
user.visible_message("[user] panics and starts choking to death!")
@@ -151,8 +165,8 @@
user.visible_message("[user] is pretending to blow [user.p_their()] brain[user.p_s()] out with [src]! It looks like [user.p_theyre()] trying to commit suicide!")
playsound(loc, 'sound/weapons/empty.ogg', 50, 1, -1)
return (OXYLOSS)
-
-
+#undef BRAINS_BLOWN_THROW_SPEED
+#undef BRAINS_BLOWN_THROW_RANGE
/obj/item/gun/ballistic/proc/sawoff(mob/user)
if(sawn_state == SAWN_OFF)