mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-24 17:11:40 +00:00
A lot of new defines are now in inventory_sizes.dm, which contains; All the size identifiers (the thing that tells the game if something is bulky, or w/e). Storage costs for all the sizes, which are exponents of two, as previously. A few constants for inventory size. Also changes all storage item's capacity definitions by basing it off of how many 'normal slots' exist for it. This allows one to change the definition for all of the defines in the file, and everything will follow along without needing to change 500 files. In testing, I made all ITEMSIZE_COST_* defines doubled, and nothing had broke. The benefit of doing all of this is that it makes adding new weight classes in the future much simpler, and makes knowing how much space a container has easier, as seeing ITEMSIZE_COST_NORMAL * 7 means it can hold seven normal items.
124 lines
4.4 KiB
Plaintext
124 lines
4.4 KiB
Plaintext
/obj/item/weapon/gun/launcher/grenade
|
|
name = "grenade launcher"
|
|
desc = "A bulky pump-action grenade launcher. Holds up to 6 grenades in a revolving magazine."
|
|
icon_state = "riotgun"
|
|
item_state = "riotgun"
|
|
w_class = ITEMSIZE_LARGE
|
|
force = 10
|
|
|
|
fire_sound = 'sound/weapons/empty.ogg'
|
|
fire_sound_text = "a metallic thunk"
|
|
recoil = 0
|
|
throw_distance = 7
|
|
release_force = 5
|
|
|
|
var/obj/item/weapon/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/weapon/gun/launcher/grenade/proc/pump(mob/M as mob)
|
|
playsound(M, 'sound/weapons/shotgunpump.ogg', 60, 1)
|
|
|
|
var/obj/item/weapon/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
|
|
M << "<span class='warning'>You pump [src], loading \a [next] into the chamber.</span>"
|
|
else
|
|
M << "<span class='warning'>You pump [src], but the magazine is empty.</span>"
|
|
update_icon()
|
|
|
|
/obj/item/weapon/gun/launcher/grenade/examine(mob/user)
|
|
if(..(user, 2))
|
|
var/grenade_count = grenades.len + (chambered? 1 : 0)
|
|
user << "Has [grenade_count] grenade\s remaining."
|
|
if(chambered)
|
|
user << "\A [chambered] is chambered."
|
|
|
|
/obj/item/weapon/gun/launcher/grenade/proc/load(obj/item/weapon/grenade/G, mob/user)
|
|
if(G.loadable)
|
|
if(grenades.len >= max_grenades)
|
|
user << "<span class='warning'>[src] is full.</span>"
|
|
return
|
|
user.remove_from_mob(G)
|
|
G.loc = 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>")
|
|
return
|
|
user << "<span class='warning'>[G] doesn't seem to fit in the [src]!</span>"
|
|
|
|
/obj/item/weapon/gun/launcher/grenade/proc/unload(mob/user)
|
|
if(grenades.len)
|
|
var/obj/item/weapon/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>")
|
|
playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1)
|
|
else
|
|
user << "<span class='warning'>[src] is empty.</span>"
|
|
|
|
/obj/item/weapon/gun/launcher/grenade/attack_self(mob/user)
|
|
pump(user)
|
|
|
|
/obj/item/weapon/gun/launcher/grenade/attackby(obj/item/I, mob/user)
|
|
if((istype(I, /obj/item/weapon/grenade)))
|
|
load(I, user)
|
|
else
|
|
..()
|
|
|
|
/obj/item/weapon/gun/launcher/grenade/attack_hand(mob/user)
|
|
if(user.get_inactive_hand() == src)
|
|
unload(user)
|
|
else
|
|
..()
|
|
|
|
/obj/item/weapon/gun/launcher/grenade/consume_next_projectile()
|
|
if(chambered)
|
|
chambered.det_time = 10
|
|
chambered.activate(null)
|
|
return chambered
|
|
|
|
/obj/item/weapon/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]).")
|
|
chambered = null
|
|
|
|
//Underslung grenade launcher to be used with the Z8
|
|
/obj/item/weapon/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 = ITEMSIZE_NORMAL
|
|
force = 5
|
|
max_grenades = 0
|
|
|
|
/obj/item/weapon/gun/launcher/grenade/underslung/attack_self()
|
|
return
|
|
|
|
//load and unload directly into chambered
|
|
/obj/item/weapon/gun/launcher/grenade/underslung/load(obj/item/weapon/grenade/G, mob/user)
|
|
if(G.loadable)
|
|
if(chambered)
|
|
user << "<span class='warning'>[src] is already loaded.</span>"
|
|
return
|
|
user.remove_from_mob(G)
|
|
G.loc = src
|
|
chambered = G
|
|
user.visible_message("[user] load \a [G] into [src].", "<span class='notice'>You load \a [G] into [src].</span>")
|
|
return
|
|
user << "<span class='warning'>[G] doesn't seem to fit in the [src]!</span>"
|
|
|
|
/obj/item/weapon/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>")
|
|
playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1)
|
|
chambered = null
|
|
else
|
|
user << "<span class='warning'>[src] is empty.</span>" |