From e5f8ac50b49120140ebc633e3fd645c24953abc8 Mon Sep 17 00:00:00 2001 From: mwerezak Date: Sat, 14 Feb 2015 13:05:38 -0500 Subject: [PATCH] Rewrites grenade launchers --- baystation12.dme | 2 +- .../guns/launcher/grenade_launcher.dm | 82 +++++++++++++++++++ code/modules/reagents/grenade_launcher.dm | 63 -------------- maps/exodus-2.dmm | 2 +- 4 files changed, 84 insertions(+), 65 deletions(-) create mode 100644 code/modules/projectiles/guns/launcher/grenade_launcher.dm delete mode 100644 code/modules/reagents/grenade_launcher.dm diff --git a/baystation12.dme b/baystation12.dme index f71ff8f3c59..6810ce9c32c 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -1329,6 +1329,7 @@ #include "code\modules\projectiles\guns\energy\stun.dm" #include "code\modules\projectiles\guns\energy\temperature.dm" #include "code\modules\projectiles\guns\launcher\crossbow.dm" +#include "code\modules\projectiles\guns\launcher\grenade_launcher.dm" #include "code\modules\projectiles\guns\launcher\pneumatic.dm" #include "code\modules\projectiles\guns\launcher\rocket.dm" #include "code\modules\projectiles\guns\launcher\syringe_gun.dm" @@ -1353,7 +1354,6 @@ #include "code\modules\reagents\Chemistry-Reagents-Antidepressants.dm" #include "code\modules\reagents\Chemistry-Reagents.dm" #include "code\modules\reagents\Chemistry-Recipes.dm" -#include "code\modules\reagents\grenade_launcher.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" diff --git a/code/modules/projectiles/guns/launcher/grenade_launcher.dm b/code/modules/projectiles/guns/launcher/grenade_launcher.dm new file mode 100644 index 00000000000..514e68a6b25 --- /dev/null +++ b/code/modules/projectiles/guns/launcher/grenade_launcher.dm @@ -0,0 +1,82 @@ +/obj/item/weapon/gun/launcher/grenade + name = "grenade launcher" + desc = "A bulky pump-action grenade launcher. Holds up to 5 grenades in a revolving magazine." + icon = 'icons/obj/gun.dmi' + icon_state = "riotgun" + item_state = "riotgun" + w_class = 4 + 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 = 4 //holds this + one in the chamber + matter = list("metal" = 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 << "You pump [src], loading \a [next] into the chamber." + else + M << "You pump [src], but the magazine is empty." + 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/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))) + if(grenades.len >= max_grenades) + user << "[src] is full." + return + user.remove_from_mob(I) + I.loc = src + grenades.Insert(1, I) //add to the head of the list, so that it is loaded on the next pump + user.visible_message("[user] inserts \a [I] into [src].", "You insert \a [I] into [src].") + else + ..() + +/obj/item/weapon/gun/launcher/grenade/attack_hand(mob/user) + if(src in 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].", "You remove \a [G] from [src].") + else + user << "[src] is empty." + 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 diff --git a/code/modules/reagents/grenade_launcher.dm b/code/modules/reagents/grenade_launcher.dm deleted file mode 100644 index b96455a178d..00000000000 --- a/code/modules/reagents/grenade_launcher.dm +++ /dev/null @@ -1,63 +0,0 @@ - - -/obj/item/weapon/gun/grenadelauncher - name = "grenade launcher" - icon = 'icons/obj/gun.dmi' - icon_state = "riotgun" - item_state = "riotgun" - w_class = 4.0 - throw_speed = 2 - throw_range = 10 - force = 5.0 - var/list/grenades = new/list() - var/max_grenades = 3 - matter = list("metal" = 2000) - - examine(mob/user) - if(..(user, 2)) - user << "\blue [grenades] / [max_grenades] Grenades." - - attackby(obj/item/I as obj, mob/user as mob) - - if((istype(I, /obj/item/weapon/grenade))) - if(grenades.len < max_grenades) - user.drop_item() - I.loc = src - grenades += I - user << "\blue You put the grenade in the grenade launcher." - user << "\blue [grenades.len] / [max_grenades] Grenades." - else - usr << "\red The grenade launcher cannot hold more grenades." - - afterattack(obj/target, mob/user , flag) - - if (istype(target, /obj/item/weapon/storage/backpack )) - return - - else if (locate (/obj/structure/table, src.loc)) - return - - else if(target == user) - return - - if(grenades.len) - spawn(0) fire_grenade(target,user) - else - usr << "\red The grenade launcher is empty." - - proc - fire_grenade(atom/target, mob/user) - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("\red [] fired a grenade!", user), 1) - user << "\red You fire the grenade launcher!" - var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! - grenades -= F - F.loc = user.loc - F.throw_at(target, 30, 2, user) - message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") - log_game("[key_name_admin(user)] used a grenade ([src.name]).") - F.active = 1 - F.icon_state = initial(icon_state) + "_active" - playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - spawn(15) - F.prime() \ No newline at end of file diff --git a/maps/exodus-2.dmm b/maps/exodus-2.dmm index d6701f77af1..7a50f27ee67 100644 --- a/maps/exodus-2.dmm +++ b/maps/exodus-2.dmm @@ -1046,7 +1046,7 @@ "uf" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/control) "ug" = (/turf/unsimulated/wall,/area/centcom/test) "uh" = (/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/centcom/specops) -"ui" = (/obj/structure/table/rack,/obj/item/weapon/gun/grenadelauncher,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) +"ui" = (/obj/structure/table/rack,/obj/item/weapon/gun/launcher/grenade,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) "uj" = (/obj/structure/table/rack,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/shoes/magboots,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom) "uk" = (/obj/structure/table/rack,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/suit/armor/vest/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/clothing/head/helmet/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/obj/item/weapon/storage/backpack/ert/security,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom/specops) "ul" = (/obj/structure/table/rack,/obj/item/weapon/rig/ert/security,/obj/item/clothing/accessory/storage/black_vest,/obj/item/weapon/rig/ert/security,/obj/item/clothing/accessory/storage/black_vest,/turf/unsimulated/floor{icon_state = "vault"; dir = 1},/area/centcom)