Beanbag Launchers (#22961)

* Added less-than-lethal beanbag rounds for grenade launchers. These
have been mapped in to the armory, alongside a single grenade launcher.
More ammo can be ordered from cargo.


AI usage disclosure: The code for this was created in-part using GPT 5.6
Sol. Sprites are all my own.
This commit is contained in:
Geeves
2026-08-27 22:06:52 +00:00
committed by GitHub
parent 6b20b35ae1
commit b5fe470856
10 changed files with 92 additions and 1 deletions
+14
View File
@@ -168,6 +168,20 @@
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/grenade_launcher_beanbags_box
category = "security"
name = "box of beanbag rounds"
supplier = "zavodskoi"
description = "A box containing 7 less-lethal beanbag rounds. These rounds can only be fired from a grenade launcher."
price = 400
items = list(
/obj/item/storage/box/tactical/beanbags
)
access = ACCESS_SECURITY
container_type = "crate"
groupable = TRUE
spawn_amount = 1
/singleton/cargo_item/empgrenades_box
category = "security"
name = "box of EMP grenades"
@@ -100,15 +100,63 @@
chambered.activate(null)
return chambered
/obj/item/gun/launcher/grenade/process_projectile(obj/item/projectile, mob/user, atom/target, target_zone, params, pointblank, reflex)
var/obj/item/grenade/grenade = projectile
if(grenade.special_launcher_handling)
return grenade.process_launcher_projectile(src, user, target, target_zone, params)
return ..()
/obj/item/gun/launcher/grenade/handle_post_fire(mob/user)
message_admins("[key_name_admin(user)] fired a grenade ([chambered.name]) from a grenade launcher ([src.name]).")
if(chambered.notify_admins_on_launcher_fire)
message_admins("[key_name_admin(user)] fired a grenade ([chambered.name]) from a grenade launcher ([src.name]).")
log_game("[key_name_admin(user)] used a grenade ([chambered.name]).")
if(chambered.special_launcher_handling)
chambered.handle_launcher_post_fire(src)
chambered = null
update_maptext()
/obj/item/gun/launcher/grenade/get_ammo()
return grenades.len + (chambered? 1 : 0)
/**
* A less-lethal round which the grenade launcher converts into a conventional
* beanbag projectile when fired. The inert item cannot be activated by hand
* or produce the beanbag effect when thrown by other means.
*/
/obj/projectile/bullet/shotgun/beanbag/grenade_launcher
icon_state = "beanbag"
damage = 20
agony = 70
/obj/item/grenade/beanbag
name = "beanbag round"
desc = "A less-than-lethal round intended to be fired by a standard grenade launcher."
icon_state = "beanbag"
item_state = "grenade"
throwforce = 0
special_launcher_handling = TRUE
notify_admins_on_launcher_fire = FALSE
/obj/item/grenade/beanbag/attack_self(mob/user)
to_chat(user, SPAN_WARNING("\The [src] has no hand-operated firing mechanism. It must be loaded into a grenade launcher."))
/obj/item/grenade/beanbag/activate(atom/user)
return
/obj/item/grenade/beanbag/process_launcher_projectile(obj/item/gun/launcher/grenade/launcher, mob/user, atom/target, target_zone, params)
var/obj/projectile/bullet/shotgun/beanbag/grenade_launcher/beanbag = new(get_turf(user))
if(!beanbag.preparePixelProjectile(target, launcher, params))
qdel(beanbag)
return FALSE
beanbag.firer = user
beanbag.fired_from = launcher
beanbag.def_zone = target_zone
return !beanbag.fire()
/obj/item/grenade/beanbag/handle_launcher_post_fire(obj/item/gun/launcher/grenade/launcher)
launcher.play_fire_sound()
qdel(src)
//Underslung grenade launcher to be used with the Z8
/obj/item/gun/launcher/grenade/underslung
name = "underslung grenade launcher"