mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-27 02:22:26 +00:00
Adds Stinger Grenades (#17474)
* balls * lint this * lint deez * le change * Update stinger.dm * i am going to murder the new linter * sprite * Update CampinKiller24-ready-or-not.yml
This commit is contained in:
@@ -762,7 +762,8 @@
|
||||
)
|
||||
contraband = list(
|
||||
/obj/item/clothing/glasses/sunglasses = 2,
|
||||
/obj/item/grenade/flashbang = 4
|
||||
/obj/item/grenade/flashbang = 4,
|
||||
/obj/item/grenade/stinger = 4
|
||||
)
|
||||
restock_blocked_items = list(
|
||||
/obj/item/storage/box/fancy/donut,
|
||||
|
||||
60
code/game/objects/items/weapons/grenades/stinger.dm
Normal file
60
code/game/objects/items/weapons/grenades/stinger.dm
Normal file
@@ -0,0 +1,60 @@
|
||||
///Stinger grenade projectile
|
||||
/obj/item/projectile/bullet/rubberball/stinger_ball
|
||||
damage = 2
|
||||
agony = 50
|
||||
armor_penetration = 10
|
||||
range_step = 2
|
||||
embed = FALSE
|
||||
|
||||
base_spread = 0
|
||||
spread_step = 20
|
||||
|
||||
suppressed = TRUE //embedding messages are still produced so it's kind of weird when enabled.
|
||||
no_attack_log = 1
|
||||
muzzle_type = null
|
||||
|
||||
/obj/item/grenade/stinger
|
||||
name = "stinger grenade"
|
||||
desc = "A stinger grenade, designed to explode and expel rubber balls over an area for less-lethal takedowns. Popular with many law enforcement agencies."
|
||||
icon_state = "stinger"
|
||||
|
||||
var/num_fragments = 70 ///total number of balls produced by the grenade
|
||||
var/fragment_damage = 2
|
||||
var/damage_step = 2 //projectiles lose a fragment each time they travel this distance. Can be a non-integer.
|
||||
var/explosion_size = 1 ///size of the center explosion
|
||||
|
||||
//The radius of the circle used to launch projectiles. Lower values mean less projectiles are used but if set too low gaps may appear in the spread pattern
|
||||
var/spread_range = 7
|
||||
|
||||
/obj/item/grenade/stinger/proc/sting(var/source, var/fragmin, var/fragmax, var/light_dam, var/flash_dam, var/p_dam, var/p_range, var/can_cover=TRUE, var/shard_range = 50)
|
||||
var/turf/O = get_turf(source)
|
||||
var/fragger = rand(fragmin,fragmax)
|
||||
explosion(O, -1, -1, light_dam, flash_dam)
|
||||
var/list/target_turfs = getcircle(O, 7)
|
||||
var/fragments_per_projectile = round(fragger/target_turfs.len)
|
||||
|
||||
for(var/turf/T in target_turfs)
|
||||
var/obj/item/projectile/bullet/rubberball/stinger_ball/P = new (O)
|
||||
|
||||
P.damage = p_dam
|
||||
P.balls = fragments_per_projectile
|
||||
P.range_step = p_range
|
||||
P.shot_from = source
|
||||
P.range = shard_range
|
||||
P.name = "rubber ball"
|
||||
|
||||
P.launch_projectile(T)
|
||||
|
||||
if(can_cover)
|
||||
for(var/mob/living/M in O)
|
||||
if(M.lying && isturf(get_turf(source)))
|
||||
P.attack_mob(M, 0, 0)
|
||||
else
|
||||
P.attack_mob(M, 0, 100)
|
||||
|
||||
/obj/item/grenade/stinger/prime()
|
||||
..()
|
||||
|
||||
INVOKE_ASYNC(src, PROC_REF(sting), src, num_fragments, num_fragments, explosion_size, explosion_size+1, fragment_damage, damage_step, TRUE)
|
||||
|
||||
qdel(src)
|
||||
@@ -387,6 +387,14 @@
|
||||
illustration = "flashbang"
|
||||
starts_with = list(/obj/item/grenade/flashbang = 7)
|
||||
|
||||
/obj/item/storage/box/stingers
|
||||
name = "box of stinger grenades"
|
||||
desc = "A box containing 7 antipersonnel stinger grenades. <br> WARNING: These devices are extremely dangerous and can cause injury."
|
||||
icon_state = "secbox"
|
||||
item_state = "secbox"
|
||||
illustration = "stinger"
|
||||
starts_with = list(/obj/item/grenade/stinger = 7)
|
||||
|
||||
/obj/item/storage/box/firingpins
|
||||
name = "box of firing pins"
|
||||
desc = "A box of NT brand Firearm authentication pins; Needed to operate most weapons."
|
||||
|
||||
@@ -144,7 +144,8 @@
|
||||
/obj/item/grenade/smokebomb,
|
||||
/obj/item/grenade/flashbang,
|
||||
/obj/item/grenade/empgrenade,
|
||||
/obj/item/grenade/chem_grenade/incendiary
|
||||
/obj/item/grenade/chem_grenade/incendiary,
|
||||
/obj/item/grenade/stinger
|
||||
)
|
||||
var/obj/item/storage/bag/plasticbag/bag = new /obj/item/storage/bag/plasticbag(spawned.loc)
|
||||
for(var/i in 1 to 7)
|
||||
|
||||
@@ -102,6 +102,7 @@
|
||||
//Supply
|
||||
new /obj/item/storage/box/flashbangs(src)
|
||||
new /obj/item/storage/box/ids(src)
|
||||
new /obj/item/storage/box/stingers(src)
|
||||
//Appearance
|
||||
if(prob(50))
|
||||
new /obj/item/storage/backpack/security(src)
|
||||
@@ -170,6 +171,7 @@
|
||||
new /obj/item/storage/box/ids(src)
|
||||
new /obj/item/storage/box/flashbangs(src)
|
||||
new /obj/item/storage/box/teargas(src)
|
||||
new /obj/item/storage/box/stingers(src)
|
||||
//Appearance
|
||||
if(prob(50))
|
||||
new /obj/item/storage/backpack/security(src)
|
||||
|
||||
@@ -42,6 +42,7 @@
|
||||
new /obj/item/ammo_magazine/a10mm(src)
|
||||
new /obj/item/storage/box/handcuffs(src)
|
||||
new /obj/item/storage/box/flashbangs(src)
|
||||
new /obj/item/storage/box/stingers(src)
|
||||
new /obj/item/gun/energy/gun(src)
|
||||
new /obj/item/gun/energy/gun(src)
|
||||
new /obj/item/gun/energy/gun(src)
|
||||
|
||||
@@ -30,6 +30,11 @@
|
||||
unit_name = "flashbang grenade"
|
||||
export_types = list(/obj/item/grenade/flashbang)
|
||||
|
||||
/datum/export/weapon/stinger
|
||||
cost = 5
|
||||
unit_name = "stinger grenade"
|
||||
export_types = list(/obj/item/grenade/stinger)
|
||||
|
||||
/datum/export/weapon/teargas
|
||||
cost = 5
|
||||
unit_name = "tear gas grenade"
|
||||
@@ -46,4 +51,5 @@
|
||||
cost = 3
|
||||
unit_name = "pair"
|
||||
message = "of handcuffs"
|
||||
export_types = list(/obj/item/handcuffs)
|
||||
export_types = list(/obj/item/handcuffs)
|
||||
|
||||
|
||||
@@ -48,6 +48,9 @@ STOCK_ITEM_UNCOMMON(implants, 1)
|
||||
STOCK_ITEM_UNCOMMON(flashbang, 0.75)
|
||||
new /obj/item/storage/box/flashbangs(L)
|
||||
|
||||
STOCK_ITEM_UNCOMMON(stinger, 0.75)
|
||||
new /obj/item/storage/box/stingers(L)
|
||||
|
||||
STOCK_ITEM_UNCOMMON(arrest, 1)
|
||||
if(prob(60))
|
||||
new /obj/item/storage/box/handcuffs(L)
|
||||
|
||||
@@ -34,7 +34,8 @@
|
||||
charges = list(
|
||||
list("flashbang", "flashbang", /obj/item/grenade/flashbang, 3),
|
||||
list("smoke bomb", "smoke bomb", /obj/item/grenade/smokebomb, 3),
|
||||
list("EMP grenade", "EMP grenade", /obj/item/grenade/empgrenade, 3)
|
||||
list("EMP grenade", "EMP grenade", /obj/item/grenade/empgrenade, 3),
|
||||
list("stinger", "stinger", /obj/item/grenade/stinger, 3)
|
||||
)
|
||||
|
||||
/obj/item/rig_module/grenade_launcher/accepts_item(var/obj/item/input_device, var/mob/living/user)
|
||||
|
||||
@@ -133,6 +133,13 @@
|
||||
holding_type = /obj/item/gun/launcher/mech/mountedgl/fl
|
||||
restricted_hardpoints = list(HARDPOINT_LEFT_SHOULDER, HARDPOINT_RIGHT_SHOULDER)
|
||||
|
||||
/obj/item/mecha_equipment/mounted_system/combat/grenadestinger
|
||||
name = "stinger grenade launcher"
|
||||
desc = "The SGL-6SG grenade launcher is designated to launch primed stinger grenades."
|
||||
icon_state = "mech_gl"
|
||||
holding_type = /obj/item/gun/launcher/mech/mountedgl/st
|
||||
restricted_hardpoints = list(HARDPOINT_LEFT_SHOULDER, HARDPOINT_RIGHT_SHOULDER)
|
||||
|
||||
/obj/item/mecha_equipment/mounted_system/combat/grenadetear
|
||||
name = "teargas launcher"
|
||||
desc = "The SGL-6TGL grenade launcher is designated to launch primed teargas grenades."
|
||||
@@ -234,6 +241,11 @@
|
||||
grenade_type = /obj/item/grenade/flashbang
|
||||
proj_gen_time = 200
|
||||
|
||||
/obj/item/gun/launcher/mech/mountedgl/st
|
||||
desc = "The SGL-6SG grenade launcher is designated to launch primed stinger grenades."
|
||||
grenade_type = /obj/item/grenade/stinger
|
||||
proj_gen_time = 200
|
||||
|
||||
/obj/item/gun/launcher/mech/mountedgl/tg
|
||||
name = "mounted teargas launcher"
|
||||
desc = "The SGL-6TGL grenade launcher is designated to launch primed teargas grenades."
|
||||
|
||||
@@ -118,6 +118,58 @@
|
||||
if(Collide(M)) //Bump will make sure we don't hit a mob multiple times
|
||||
return
|
||||
|
||||
/obj/item/projectile/bullet/rubberball
|
||||
name = "rubber ball"
|
||||
icon_state = "pellets"
|
||||
damage = 2
|
||||
agony = 45
|
||||
embed = FALSE
|
||||
var/balls = 4
|
||||
///projectile will lose a fragment each time it travels this distance. Can be a non-integer.
|
||||
var/range_step = 2
|
||||
var/base_spread = 90
|
||||
var/spread_step = 10
|
||||
|
||||
/obj/item/projectile/bullet/rubberball/proc/get_balls(var/distance)
|
||||
var/ball_loss = round((distance - 1)/range_step)
|
||||
return max(balls - ball_loss, 1)
|
||||
|
||||
/obj/item/projectile/bullet/rubberball/attack_mob(var/mob/living/target_mob, var/distance, var/miss_modifier)
|
||||
if (balls < 0)
|
||||
return TRUE
|
||||
|
||||
var/total_balls = get_balls(distance)
|
||||
var/spread = max(base_spread - (spread_step*distance), 0)
|
||||
|
||||
var/prone_chance = 0
|
||||
if(!base_spread)
|
||||
prone_chance = max(spread_step*(distance - 2), 0)
|
||||
|
||||
var/hits = 0
|
||||
for (var/i in 1 to total_balls)
|
||||
if(target_mob.lying && target_mob != original && prob(prone_chance))
|
||||
continue
|
||||
|
||||
var/old_zone = def_zone
|
||||
def_zone = ran_zone(def_zone, spread)
|
||||
if (..())
|
||||
hits++
|
||||
def_zone = old_zone
|
||||
|
||||
balls -= hits
|
||||
if (hits >= total_balls || balls <= 0)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/obj/item/projectile/bullet/rubberball/Move()
|
||||
. = ..()
|
||||
|
||||
if(. && !base_spread && isturf(loc))
|
||||
for(var/mob/living/M in loc)
|
||||
if(M.lying || !M.CanPass(src, loc))
|
||||
if(Collide(M))
|
||||
return
|
||||
|
||||
/* short-casing projectiles, like the kind used in pistols or SMGs */
|
||||
|
||||
/obj/item/projectile/bullet/pistol
|
||||
|
||||
@@ -78,6 +78,12 @@
|
||||
build_path = /obj/item/mecha_equipment/mounted_system/combat/grenadeflash
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 20000, MATERIAL_GOLD = 3000, MATERIAL_SILVER = 3000)
|
||||
|
||||
/datum/design/item/mechfab/exosuit_equipment/stinger
|
||||
name = "Mounted Stinger Launcher"
|
||||
req_tech = list(TECH_COMBAT = 3)
|
||||
build_path = /obj/item/mecha_equipment/mounted_system/combat/grenadestinger
|
||||
materials = list(DEFAULT_WALL_MATERIAL = 20000, MATERIAL_GOLD = 3000, MATERIAL_SILVER = 3000)
|
||||
|
||||
/datum/design/item/mechfab/exosuit_equipment/cleaner
|
||||
name = "Mounted Cleaner Grenade Launcher"
|
||||
req_tech = list(TECH_MATERIAL = 2)
|
||||
@@ -141,4 +147,5 @@
|
||||
|
||||
/datum/design/item/mechfab/exosuit_equipment/phazon/AssembleDesignDesc()
|
||||
. = ..()
|
||||
desc += " It needs an anomaly core to function, however."
|
||||
desc += " It needs an anomaly core to function, however."
|
||||
|
||||
|
||||
Reference in New Issue
Block a user