From 03e1d0d60a934b75832af18e2fb839995db6cdcd Mon Sep 17 00:00:00 2001 From: Cheridan Date: Mon, 12 Jan 2015 21:21:34 -0600 Subject: [PATCH] -Adds firing pin box define -Examining a gun now shows its pin -You can now emag a firing pin to make it function without checks. -Loyalty pins unable to be constructed --- .../objects/items/weapons/storage/boxes.dm | 15 +++++++++++++ code/modules/projectiles/gun.dm | 21 ++++++++++++++++++- .../projectiles/guns/projectile/launchers.dm | 3 ++- .../projectiles/guns/projectile/revolver.dm | 14 ------------- code/modules/projectiles/pins.dm | 6 ++++++ .../research/designs/weapon_designs.dm | 4 ++-- 6 files changed, 45 insertions(+), 18 deletions(-) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 3995d527137..2b13b54cf50 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -433,6 +433,21 @@ new /obj/item/weapon/cartridge/security(src) new /obj/item/weapon/cartridge/security(src) +/obj/item/weapon/storage/box/firingpins + name = "box of standard firing pins" + desc = "A box full of standard firing pins, to allow newly-developed firearms to operate." + icon_state = "id" + +/obj/item/weapon/storage/box/firingpins/New() + ..() + new /obj/item/device/firing_pin(src) + new /obj/item/device/firing_pin(src) + new /obj/item/device/firing_pin(src) + new /obj/item/device/firing_pin(src) + new /obj/item/device/firing_pin(src) + new /obj/item/device/firing_pin(src) + new /obj/item/device/firing_pin(src) + /obj/item/weapon/storage/box/handcuffs name = "box of spare handcuffs" desc = "A box full of handcuffs." diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index d8f0d24abe0..be7e5f659ff 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -36,24 +36,37 @@ var/obj/item/device/flashlight/F = null var/can_flashlight = 0 + /obj/item/weapon/gun/New() ..() if(pin) pin = new pin(src) + +/obj/item/weapon/gun/examine(mob/user) + ..() + if(pin) + user << "It has a [pin] installed." + else + user << "It doesn't have a firing pin installed, and won't fire." + + /obj/item/weapon/gun/proc/process_chamber() return 0 + //check if there's enough ammo/energy/whatever to shoot one time //i.e if clicking would make it shoot /obj/item/weapon/gun/proc/can_shoot() return 1 + /obj/item/weapon/gun/proc/shoot_with_empty_chamber(mob/living/user as mob|obj) user << "*click*" playsound(user, 'sound/weapons/empty.ogg', 100, 1) return + /obj/item/weapon/gun/proc/shoot_live_shot(mob/living/user as mob|obj, var/pointblank = 0, var/mob/pbtarget = null, var/message = 1) if(recoil) spawn() @@ -70,10 +83,12 @@ else user.visible_message("[user] fires [src]!", "You fire [src]!", "You hear a [istype(src, /obj/item/weapon/gun/energy) ? "laser blast" : "gunshot"]!") + /obj/item/weapon/gun/emp_act(severity) for(var/obj/O in contents) O.emp_act(severity) + /obj/item/weapon/gun/afterattack(atom/target as mob|obj|turf, mob/living/carbon/human/user as mob|obj, flag, params)//TODO: go over this if(flag) //It's adjacent, is the user, or is on the user's person if(istype(target, /mob/) && target != user && !(target in user.contents)) //We make sure that it is a mob, it's not us or part of us. @@ -99,11 +114,13 @@ process_fire(target,user,1,params) + /obj/item/weapon/gun/proc/can_trigger_gun(mob/living/carbon/user) if (!user.IsAdvancedToolUser()) user << "You don't have the dexterity to do this!" return 0 + if(trigger_guard) if(istype(user) && user.dna) if(user.dna.check_mutation(HULK)) @@ -114,9 +131,10 @@ return 0 return 1 + /obj/item/weapon/gun/proc/handle_pins(mob/living/user) if(pin) - if(pin.pin_auth(user)) + if(pin.pin_auth(user) || pin.emagged) return 1 else user << "INVALID USER." @@ -125,6 +143,7 @@ user << "\The [src]'s trigger is locked. This weapon doesn't have a firing pin installed!" return 0 + /obj/item/weapon/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, var/message = 1, params) add_fingerprint(user) diff --git a/code/modules/projectiles/guns/projectile/launchers.dm b/code/modules/projectiles/guns/projectile/launchers.dm index 50220780acd..5c026b2fff8 100644 --- a/code/modules/projectiles/guns/projectile/launchers.dm +++ b/code/modules/projectiles/guns/projectile/launchers.dm @@ -84,4 +84,5 @@ force = 10 m_amt = 4000 suppressed = 0 - mag_type = /obj/item/ammo_box/magazine/internal/cylinder/crossbow/large \ No newline at end of file + mag_type = /obj/item/ammo_box/magazine/internal/cylinder/crossbow/large + pin = null \ No newline at end of file diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index c44708e3f68..2e7f07102ee 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -58,19 +58,6 @@ origin_tech = "combat=2;materials=2" mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38 -/* -/obj/item/weapon/gun/projectile/revolver/detective/special_check(var/mob/living/carbon/human/M) - if(magazine.caliber == initial(magazine.caliber)) - return 1 - if(prob(70 - (magazine.ammo_count() * 10))) //minimum probability of 10, maximum of 60 - playsound(M, fire_sound, 50, 1) - M << "[src] blows up in your face!" - M.take_organ_damage(0,20) - M.drop_item() - qdel(src) - return 0 - return 1 -*/ /obj/item/weapon/gun/projectile/revolver/detective/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, var/message = 1, params) if(magazine.caliber != initial(magazine.caliber)) if(prob(70 - (magazine.ammo_count() * 10))) //minimum probability of 10, maximum of 60 @@ -83,7 +70,6 @@ ..() - /obj/item/weapon/gun/projectile/revolver/detective/verb/rename_gun() set name = "Name Gun" set category = "Object" diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index b85fb422744..6a33c1db94d 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -7,6 +7,7 @@ flags = CONDUCT w_class = 1 attack_verb = list("poked") + var/emagged = 0 /obj/item/device/firing_pin/afterattack(atom/target, mob/user, proximity_flag) if(proximity_flag) @@ -19,6 +20,11 @@ else user << "This firearm already has a firing pin installed." +/obj/item/device/firing_pin/emag_act(mob/user) + if(!emagged) + emagged = 1 + user << "You override the authentication mechanism." + /obj/item/device/firing_pin/proc/pin_auth(mob/living/user) return 1 diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index bef663b9dd7..d04d8319ab2 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -4,7 +4,7 @@ /datum/design/pin_testing name = "test-range firing pin" - desc = "This safety firing pin allows weapons to be fired within proximity to a firing range." + desc = "This safety firing pin allows firearms to be operated within proximity to a firing range." id = "pin_testing" req_tech = list("combat" = 1, "materials" = 2) build_type = PROTOLATHE @@ -16,7 +16,7 @@ name = "loyalty firing pin" desc = "This is a security firing pin which only authorizes users who are loyalty-implanted." id = "pin_loyalty" - req_tech = list("combat" = 5, "materials" = 3, "powerstorage" = 3) + req_tech = list("combat" = 10, "materials" = 3, "powerstorage" = 3) build_type = PROTOLATHE materials = list("$silver" = 600, "$diamond" = 600, "$uranium" = 200) build_path = /obj/item/device/firing_pin/implant/loyalty