mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-24 17:11:22 +00:00
139 lines
4.6 KiB
Plaintext
139 lines
4.6 KiB
Plaintext
/obj/item/gun/launcher/grenade
|
|
name = "grenade launcher"
|
|
desc = "A bulky pump-action grenade launcher. Holds up to 6 grenades in a revolving magazine."
|
|
icon = 'icons/obj/guns/grenade_launcher.dmi'
|
|
icon_state = "grenadelauncher"
|
|
item_state = "grenadelauncher"
|
|
w_class = ITEMSIZE_LARGE
|
|
force = 10
|
|
|
|
fire_sound = 'sound/weapons/grenadelaunch.ogg'
|
|
fire_sound_text = "a metallic thunk"
|
|
recoil = 0
|
|
throw_distance = 7
|
|
release_force = 5
|
|
|
|
needspin = FALSE
|
|
|
|
var/blacklisted_grenades = list(
|
|
/obj/item/grenade/flashbang/clusterbang,
|
|
/obj/item/grenade/frag
|
|
)
|
|
|
|
var/obj/item/grenade/chambered
|
|
var/list/grenades = new/list()
|
|
var/max_grenades = 5 //holds this + one in the chamber
|
|
matter = list(DEFAULT_WALL_MATERIAL = 2000)
|
|
|
|
//revolves the magazine, allowing players to choose between multiple grenade types
|
|
/obj/item/gun/launcher/grenade/proc/pump(mob/M as mob)
|
|
playsound(M, 'sound/weapons/shotgun_pump.ogg', 60, 1)
|
|
|
|
var/obj/item/grenade/next
|
|
if(grenades.len)
|
|
next = grenades[1] //get this first, so that the chambered grenade can still be removed if the grenades list is empty
|
|
if(chambered)
|
|
grenades += chambered //rotate the revolving magazine
|
|
chambered = null
|
|
if(next)
|
|
grenades -= next //Remove grenade from loaded list.
|
|
chambered = next
|
|
to_chat(M, "<span class='warning'>You pump [src], loading \a [next] into the chamber.</span>")
|
|
else
|
|
to_chat(M, "<span class='warning'>You pump [src], but the magazine is empty.</span>")
|
|
update_icon()
|
|
|
|
/obj/item/gun/launcher/grenade/examine(mob/user)
|
|
. = ..()
|
|
if(Adjacent(user))
|
|
to_chat(user, SPAN_NOTICE("It has [get_ammo()] grenade\s remaining."))
|
|
if(chambered)
|
|
to_chat(user, SPAN_NOTICE("\A [chambered] is chambered."))
|
|
|
|
/obj/item/gun/launcher/grenade/proc/load(obj/item/grenade/G, mob/user)
|
|
if(!can_load_grenade_type(G, user))
|
|
return
|
|
if(grenades.len >= max_grenades)
|
|
to_chat(user, "<span class='warning'>[src] is full.</span>")
|
|
return
|
|
user.remove_from_mob(G)
|
|
G.forceMove(src)
|
|
grenades.Insert(1, G) //add to the head of the list, so that it is loaded on the next pump
|
|
user.visible_message("[user] inserts \a [G] into [src].", "<span class='notice'>You insert \a [G] into [src].</span>")
|
|
update_maptext()
|
|
|
|
/obj/item/gun/launcher/grenade/proc/unload(mob/user)
|
|
if(grenades.len)
|
|
var/obj/item/grenade/G = grenades[grenades.len]
|
|
grenades.len--
|
|
user.put_in_hands(G)
|
|
user.visible_message("[user] removes \a [G] from [src].", "<span class='notice'>You remove \a [G] from [src].</span>")
|
|
else
|
|
to_chat(user, "<span class='warning'>[src] is empty.</span>")
|
|
update_maptext()
|
|
|
|
/obj/item/gun/launcher/grenade/proc/can_load_grenade_type(obj/item/grenade/G, mob/user)
|
|
if(is_type_in_list(G, blacklisted_grenades))
|
|
to_chat(user, "<span class='warning'>\The [G] doesn't seem to fit in \the [src]!</span>")
|
|
return FALSE
|
|
return TRUE
|
|
|
|
/obj/item/gun/launcher/grenade/attack_self(mob/user)
|
|
pump(user)
|
|
|
|
/obj/item/gun/launcher/grenade/attackby(obj/item/I, mob/user)
|
|
if((istype(I, /obj/item/grenade)))
|
|
load(I, user)
|
|
else
|
|
..()
|
|
|
|
/obj/item/gun/launcher/grenade/attack_hand(mob/user)
|
|
if(user.get_inactive_hand() == src)
|
|
unload(user)
|
|
else
|
|
..()
|
|
|
|
/obj/item/gun/launcher/grenade/consume_next_projectile()
|
|
if(chambered)
|
|
chambered.det_time = 10
|
|
chambered.activate(null)
|
|
return chambered
|
|
|
|
/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]).")
|
|
log_game("[key_name_admin(user)] used a grenade ([chambered.name]).",ckey=key_name(user))
|
|
chambered = null
|
|
update_maptext()
|
|
|
|
/obj/item/gun/launcher/grenade/get_ammo()
|
|
return grenades.len + (chambered? 1 : 0)
|
|
|
|
//Underslung grenade launcher to be used with the Z8
|
|
/obj/item/gun/launcher/grenade/underslung
|
|
name = "underslung grenade launcher"
|
|
desc = "Not much more than a tube and a firing mechanism, this grenade launcher is designed to be fitted to a rifle."
|
|
w_class = 3
|
|
force = 5
|
|
max_grenades = 0
|
|
|
|
/obj/item/gun/launcher/grenade/underslung/attack_self()
|
|
return
|
|
|
|
//load and unload directly into chambered
|
|
/obj/item/gun/launcher/grenade/underslung/load(obj/item/grenade/G, mob/user)
|
|
if(chambered)
|
|
to_chat(user, "<span class='warning'>[src] is already loaded.</span>")
|
|
return
|
|
user.remove_from_mob(G)
|
|
G.forceMove(src)
|
|
chambered = G
|
|
user.visible_message("[user] load \a [G] into [src].", "<span class='notice'>You load \a [G] into [src].</span>")
|
|
|
|
/obj/item/gun/launcher/grenade/underslung/unload(mob/user)
|
|
if(chambered)
|
|
user.put_in_hands(chambered)
|
|
user.visible_message("[user] removes \a [chambered] from [src].", "<span class='notice'>You remove \a [chambered] from [src].</span>")
|
|
chambered = null
|
|
else
|
|
to_chat(user, "<span class='warning'>[src] is empty.</span>")
|