diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm
index e13e1d5f0b..1ce94796fc 100644
--- a/code/modules/projectiles/guns/energy/energy_gun.dm
+++ b/code/modules/projectiles/guns/energy/energy_gun.dm
@@ -65,6 +65,9 @@
name = "\improper DRAGnet"
desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology."
icon_state = "dragnet"
+ item_state = "dragnet"
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
origin_tech = "combat=4;magnets=3;bluespace=4"
ammo_type = list(/obj/item/ammo_casing/energy/net, /obj/item/ammo_casing/energy/trap)
can_flashlight = 0
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index fddf73dfbf..fa7540315e 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -1,290 +1,290 @@
-/obj/item/gun/energy/ionrifle
- name = "ion rifle"
- desc = "A man-portable anti-armor weapon designed to disable mechanical threats at range."
- icon_state = "ionrifle"
- item_state = null //so the human update icon uses the icon_state instead.
- origin_tech = "combat=4;magnets=4"
- can_flashlight = 1
- w_class = WEIGHT_CLASS_HUGE
+/obj/item/gun/energy/ionrifle
+ name = "ion rifle"
+ desc = "A man-portable anti-armor weapon designed to disable mechanical threats at range."
+ icon_state = "ionrifle"
+ item_state = null //so the human update icon uses the icon_state instead.
+ origin_tech = "combat=4;magnets=4"
+ can_flashlight = 1
+ w_class = WEIGHT_CLASS_HUGE
flags_1 = CONDUCT_1
- slot_flags = SLOT_BACK
- ammo_type = list(/obj/item/ammo_casing/energy/ion)
- ammo_x_offset = 3
- flight_x_offset = 17
- flight_y_offset = 9
-
-/obj/item/gun/energy/ionrifle/emp_act(severity)
- return
-
-/obj/item/gun/energy/ionrifle/carbine
- name = "ion carbine"
- desc = "The MK.II Prototype Ion Projector is a lightweight carbine version of the larger ion rifle, built to be ergonomic and efficient."
- icon_state = "ioncarbine"
- w_class = WEIGHT_CLASS_NORMAL
- slot_flags = SLOT_BELT
- pin = null
- ammo_x_offset = 2
- flight_x_offset = 18
- flight_y_offset = 11
-
-/obj/item/gun/energy/decloner
- name = "biological demolecularisor"
- desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
- icon_state = "decloner"
- origin_tech = "combat=4;materials=4;biotech=5;plasmatech=6"
- ammo_type = list(/obj/item/ammo_casing/energy/declone)
- pin = null
- ammo_x_offset = 1
-
-/obj/item/gun/energy/decloner/update_icon()
- ..()
- var/obj/item/ammo_casing/energy/shot = ammo_type[select]
- if(cell.charge > shot.e_cost)
- add_overlay("decloner_spin")
-
-/obj/item/gun/energy/floragun
- name = "floral somatoray"
- desc = "A tool that discharges controlled radiation which induces mutation in plant cells."
- icon_state = "flora"
- item_state = "gun"
- ammo_type = list(/obj/item/ammo_casing/energy/flora/yield, /obj/item/ammo_casing/energy/flora/mut)
- origin_tech = "materials=2;biotech=4"
- modifystate = 1
- ammo_x_offset = 1
- selfcharge = 1
-
-/obj/item/gun/energy/meteorgun
- name = "meteor gun"
- desc = "For the love of god, make sure you're aiming this the right way!"
- icon_state = "meteor_gun"
- item_state = "c20r"
- w_class = WEIGHT_CLASS_BULKY
- ammo_type = list(/obj/item/ammo_casing/energy/meteor)
- cell_type = "/obj/item/stock_parts/cell/potato"
- clumsy_check = 0 //Admin spawn only, might as well let clowns use it.
- selfcharge = 1
-
-/obj/item/gun/energy/meteorgun/pen
- name = "meteor pen"
- desc = "The pen is mightier than the sword."
- icon = 'icons/obj/bureaucracy.dmi'
- icon_state = "pen"
- item_state = "pen"
- lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/items_righthand.dmi'
- w_class = WEIGHT_CLASS_TINY
-
-/obj/item/gun/energy/mindflayer
- name = "\improper Mind Flayer"
- desc = "A prototype weapon recovered from the ruins of Research-Station Epsilon."
- icon_state = "xray"
- item_state = null
- ammo_type = list(/obj/item/ammo_casing/energy/mindflayer)
- ammo_x_offset = 2
-
-/obj/item/gun/energy/kinetic_accelerator/crossbow
- name = "mini energy crossbow"
- desc = "A weapon favored by syndicate stealth specialists."
- icon_state = "crossbow"
- item_state = "crossbow"
- w_class = WEIGHT_CLASS_SMALL
- materials = list(MAT_METAL=2000)
- origin_tech = "combat=4;magnets=4;syndicate=5"
- suppressed = 1
- ammo_type = list(/obj/item/ammo_casing/energy/bolt)
- weapon_weight = WEAPON_LIGHT
- unique_rename = 0
- overheat_time = 20
- holds_charge = TRUE
- unique_frequency = TRUE
- can_flashlight = 0
- max_mod_capacity = 0
- empty_state = null
-
-/obj/item/gun/energy/kinetic_accelerator/crossbow/halloween
- name = "candy corn crossbow"
- desc = "A weapon favored by Syndicate trick-or-treaters."
- icon_state = "crossbow_halloween"
- item_state = "crossbow"
- ammo_type = list(/obj/item/ammo_casing/energy/bolt/halloween)
-
-/obj/item/gun/energy/kinetic_accelerator/crossbow/large
- name = "energy crossbow"
- desc = "A reverse engineered weapon using syndicate technology."
- icon_state = "crossbowlarge"
- w_class = WEIGHT_CLASS_NORMAL
- materials = list(MAT_METAL=4000)
- origin_tech = "combat=4;magnets=4;syndicate=2"
- suppressed = 0
- ammo_type = list(/obj/item/ammo_casing/energy/bolt/large)
- pin = null
-
-/obj/item/gun/energy/plasmacutter
- name = "plasma cutter"
- desc = "A mining tool capable of expelling concentrated plasma bursts. You could use it to cut limbs off xenos! Or, you know, mine stuff."
- icon_state = "plasmacutter"
- item_state = "plasmacutter"
- origin_tech = "combat=1;materials=3;magnets=2;plasmatech=3;engineering=1"
- ammo_type = list(/obj/item/ammo_casing/energy/plasma)
+ slot_flags = SLOT_BACK
+ ammo_type = list(/obj/item/ammo_casing/energy/ion)
+ ammo_x_offset = 3
+ flight_x_offset = 17
+ flight_y_offset = 9
+
+/obj/item/gun/energy/ionrifle/emp_act(severity)
+ return
+
+/obj/item/gun/energy/ionrifle/carbine
+ name = "ion carbine"
+ desc = "The MK.II Prototype Ion Projector is a lightweight carbine version of the larger ion rifle, built to be ergonomic and efficient."
+ icon_state = "ioncarbine"
+ w_class = WEIGHT_CLASS_NORMAL
+ slot_flags = SLOT_BELT
+ pin = null
+ ammo_x_offset = 2
+ flight_x_offset = 18
+ flight_y_offset = 11
+
+/obj/item/gun/energy/decloner
+ name = "biological demolecularisor"
+ desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
+ icon_state = "decloner"
+ origin_tech = "combat=4;materials=4;biotech=5;plasmatech=6"
+ ammo_type = list(/obj/item/ammo_casing/energy/declone)
+ pin = null
+ ammo_x_offset = 1
+
+/obj/item/gun/energy/decloner/update_icon()
+ ..()
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+ if(cell.charge > shot.e_cost)
+ add_overlay("decloner_spin")
+
+/obj/item/gun/energy/floragun
+ name = "floral somatoray"
+ desc = "A tool that discharges controlled radiation which induces mutation in plant cells."
+ icon_state = "flora"
+ item_state = "gun"
+ ammo_type = list(/obj/item/ammo_casing/energy/flora/yield, /obj/item/ammo_casing/energy/flora/mut)
+ origin_tech = "materials=2;biotech=4"
+ modifystate = 1
+ ammo_x_offset = 1
+ selfcharge = 1
+
+/obj/item/gun/energy/meteorgun
+ name = "meteor gun"
+ desc = "For the love of god, make sure you're aiming this the right way!"
+ icon_state = "meteor_gun"
+ item_state = "c20r"
+ w_class = WEIGHT_CLASS_BULKY
+ ammo_type = list(/obj/item/ammo_casing/energy/meteor)
+ cell_type = "/obj/item/stock_parts/cell/potato"
+ clumsy_check = 0 //Admin spawn only, might as well let clowns use it.
+ selfcharge = 1
+
+/obj/item/gun/energy/meteorgun/pen
+ name = "meteor pen"
+ desc = "The pen is mightier than the sword."
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "pen"
+ item_state = "pen"
+ lefthand_file = 'icons/mob/inhands/items_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items_righthand.dmi'
+ w_class = WEIGHT_CLASS_TINY
+
+/obj/item/gun/energy/mindflayer
+ name = "\improper Mind Flayer"
+ desc = "A prototype weapon recovered from the ruins of Research-Station Epsilon."
+ icon_state = "xray"
+ item_state = null
+ ammo_type = list(/obj/item/ammo_casing/energy/mindflayer)
+ ammo_x_offset = 2
+
+/obj/item/gun/energy/kinetic_accelerator/crossbow
+ name = "mini energy crossbow"
+ desc = "A weapon favored by syndicate stealth specialists."
+ icon_state = "crossbow"
+ item_state = "crossbow"
+ w_class = WEIGHT_CLASS_SMALL
+ materials = list(MAT_METAL=2000)
+ origin_tech = "combat=4;magnets=4;syndicate=5"
+ suppressed = 1
+ ammo_type = list(/obj/item/ammo_casing/energy/bolt)
+ weapon_weight = WEAPON_LIGHT
+ unique_rename = 0
+ overheat_time = 20
+ holds_charge = TRUE
+ unique_frequency = TRUE
+ can_flashlight = 0
+ max_mod_capacity = 0
+ empty_state = null
+
+/obj/item/gun/energy/kinetic_accelerator/crossbow/halloween
+ name = "candy corn crossbow"
+ desc = "A weapon favored by Syndicate trick-or-treaters."
+ icon_state = "crossbow_halloween"
+ item_state = "crossbow"
+ ammo_type = list(/obj/item/ammo_casing/energy/bolt/halloween)
+
+/obj/item/gun/energy/kinetic_accelerator/crossbow/large
+ name = "energy crossbow"
+ desc = "A reverse engineered weapon using syndicate technology."
+ icon_state = "crossbowlarge"
+ w_class = WEIGHT_CLASS_NORMAL
+ materials = list(MAT_METAL=4000)
+ origin_tech = "combat=4;magnets=4;syndicate=2"
+ suppressed = 0
+ ammo_type = list(/obj/item/ammo_casing/energy/bolt/large)
+ pin = null
+
+/obj/item/gun/energy/plasmacutter
+ name = "plasma cutter"
+ desc = "A mining tool capable of expelling concentrated plasma bursts. You could use it to cut limbs off xenos! Or, you know, mine stuff."
+ icon_state = "plasmacutter"
+ item_state = "plasmacutter"
+ origin_tech = "combat=1;materials=3;magnets=2;plasmatech=3;engineering=1"
+ ammo_type = list(/obj/item/ammo_casing/energy/plasma)
flags_1 = CONDUCT_1
container_type = OPENCONTAINER_1
- attack_verb = list("attacked", "slashed", "cut", "sliced")
- force = 12
- sharpness = IS_SHARP
- can_charge = 0
- heat = 3800
- toolspeed = 0.7 //plasmacutters can be used as welders for a few things, and are faster than standard welders
-
-/obj/item/gun/energy/plasmacutter/examine(mob/user)
- ..()
- if(cell)
- to_chat(user, "[src] is [round(cell.percent())]% charged.")
-
-/obj/item/gun/energy/plasmacutter/attackby(obj/item/A, mob/user)
- if(istype(A, /obj/item/stack/sheet/mineral/plasma))
- var/obj/item/stack/sheet/S = A
- S.use(1)
- cell.give(1000)
- recharge_newshot(1)
- to_chat(user, "You insert [A] in [src], recharging it.")
- else if(istype(A, /obj/item/ore/plasma))
- qdel(A)
- cell.give(500)
- recharge_newshot(1)
- to_chat(user, "You insert [A] in [src], recharging it.")
- else
- ..()
-
-/obj/item/gun/energy/plasmacutter/update_icon()
- return
-
-/obj/item/gun/energy/plasmacutter/adv
- name = "advanced plasma cutter"
- icon_state = "adv_plasmacutter"
- origin_tech = "combat=3;materials=4;magnets=3;plasmatech=4;engineering=2"
- force = 15
- ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv)
-
-/obj/item/gun/energy/wormhole_projector
- name = "bluespace wormhole projector"
- desc = "A projector that emits high density quantum-coupled bluespace beams."
- ammo_type = list(/obj/item/ammo_casing/energy/wormhole, /obj/item/ammo_casing/energy/wormhole/orange)
- item_state = null
- icon_state = "wormhole_projector"
- origin_tech = "combat=4;bluespace=6;plasmatech=4;engineering=4"
- var/obj/effect/portal/p_blue
- var/obj/effect/portal/p_orange
-
-/obj/item/gun/energy/wormhole_projector/update_icon()
- icon_state = "[initial(icon_state)][select]"
- item_state = icon_state
- return
-
-/obj/item/gun/energy/wormhole_projector/process_chamber()
- ..()
- select_fire()
-
-/obj/item/gun/energy/wormhole_projector/proc/on_portal_destroy(obj/effect/portal/P)
- if(P == p_blue)
- p_blue = null
- else if(P == p_orange)
- p_orange = null
-
-/obj/item/gun/energy/wormhole_projector/proc/has_blue_portal()
- if(istype(p_blue) && !QDELETED(p_blue))
- return TRUE
- return FALSE
-
-/obj/item/gun/energy/wormhole_projector/proc/has_orange_portal()
- if(istype(p_orange) && !QDELETED(p_orange))
- return TRUE
- return FALSE
-
-/obj/item/gun/energy/wormhole_projector/proc/crosslink()
- if(!has_blue_portal() && !has_orange_portal())
- return
- if(!has_blue_portal() && has_orange_portal())
- p_orange.link_portal(null)
- return
- if(!has_orange_portal() && has_blue_portal())
- p_blue.link_portal(null)
- return
- p_orange.link_portal(p_blue)
- p_blue.link_portal(p_orange)
-
-/obj/item/gun/energy/wormhole_projector/proc/create_portal(obj/item/projectile/beam/wormhole/W, turf/target)
- var/obj/effect/portal/P = new /obj/effect/portal(target, src, 300, null, FALSE, null)
- if(istype(W, /obj/item/projectile/beam/wormhole/orange))
- qdel(p_orange)
- p_orange = P
- P.icon_state = "portal1"
- else
- qdel(p_blue)
- p_blue = P
- crosslink()
-
-/* 3d printer 'pseudo guns' for borgs */
-
-/obj/item/gun/energy/printer
- name = "cyborg lmg"
- desc = "A machinegun that fires 3d-printed flechettes slowly regenerated using a cyborg's internal power source."
- icon_state = "l6closed0"
- icon = 'icons/obj/guns/projectile.dmi'
- cell_type = "/obj/item/stock_parts/cell/secborg"
- ammo_type = list(/obj/item/ammo_casing/energy/c3dbullet)
- can_charge = 0
- use_cyborg_cell = 1
-
-/obj/item/gun/energy/printer/update_icon()
- return
-
-/obj/item/gun/energy/printer/emp_act()
- return
-
-/obj/item/gun/energy/temperature
- name = "temperature gun"
- icon_state = "freezegun"
- desc = "A gun that changes temperatures."
- origin_tech = "combat=4;materials=4;powerstorage=3;magnets=2"
- ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot)
- cell_type = "/obj/item/stock_parts/cell/high"
- pin = null
-
-/obj/item/gun/energy/temperature/security
- name = "security temperature gun"
- desc = "A weapon that can only be used to its full potential by the truly robust."
- origin_tech = "combat=2;materials=2;powerstorage=1;magnets=1"
- pin = /obj/item/device/firing_pin
-
-/obj/item/gun/energy/laser/instakill
- name = "instakill rifle"
- icon_state = "instagib"
- item_state = "instagib"
- desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit."
- ammo_type = list(/obj/item/ammo_casing/energy/instakill)
- force = 60
- origin_tech = "combat=7;magnets=6"
-
-/obj/item/gun/energy/laser/instakill/red
- desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a red design."
- icon_state = "instagibred"
- item_state = "instagibred"
- ammo_type = list(/obj/item/ammo_casing/energy/instakill/red)
-
-/obj/item/gun/energy/laser/instakill/blue
- desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a blue design."
- icon_state = "instagibblue"
- item_state = "instagibblue"
- ammo_type = list(/obj/item/ammo_casing/energy/instakill/blue)
-
-/obj/item/gun/energy/laser/instakill/emp_act() //implying you could stop the instagib
- return
-
-/obj/item/gun/energy/gravity_gun
- name = "one-point bluespace-gravitational manipulator"
- desc = "An experimental, multi-mode device that fires bolts of Zero-Point Energy, causing local distortions in gravity."
- ammo_type = list(/obj/item/ammo_casing/energy/gravityrepulse, /obj/item/ammo_casing/energy/gravityattract, /obj/item/ammo_casing/energy/gravitychaos)
- origin_tech = "combat=4;magnets=4;materials=6;powerstorage=4;bluespace=4"
- item_state = null
- icon_state = "gravity_gun"
- var/power = 4
+ attack_verb = list("attacked", "slashed", "cut", "sliced")
+ force = 12
+ sharpness = IS_SHARP
+ can_charge = 0
+ heat = 3800
+ toolspeed = 0.7 //plasmacutters can be used as welders for a few things, and are faster than standard welders
+
+/obj/item/gun/energy/plasmacutter/examine(mob/user)
+ ..()
+ if(cell)
+ to_chat(user, "[src] is [round(cell.percent())]% charged.")
+
+/obj/item/gun/energy/plasmacutter/attackby(obj/item/A, mob/user)
+ if(istype(A, /obj/item/stack/sheet/mineral/plasma))
+ var/obj/item/stack/sheet/S = A
+ S.use(1)
+ cell.give(1000)
+ recharge_newshot(1)
+ to_chat(user, "You insert [A] in [src], recharging it.")
+ else if(istype(A, /obj/item/ore/plasma))
+ qdel(A)
+ cell.give(500)
+ recharge_newshot(1)
+ to_chat(user, "You insert [A] in [src], recharging it.")
+ else
+ ..()
+
+/obj/item/gun/energy/plasmacutter/update_icon()
+ return
+
+/obj/item/gun/energy/plasmacutter/adv
+ name = "advanced plasma cutter"
+ icon_state = "adv_plasmacutter"
+ origin_tech = "combat=3;materials=4;magnets=3;plasmatech=4;engineering=2"
+ force = 15
+ ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv)
+
+/obj/item/gun/energy/wormhole_projector
+ name = "bluespace wormhole projector"
+ desc = "A projector that emits high density quantum-coupled bluespace beams."
+ ammo_type = list(/obj/item/ammo_casing/energy/wormhole, /obj/item/ammo_casing/energy/wormhole/orange)
+ item_state = null
+ icon_state = "wormhole_projector"
+ origin_tech = "combat=4;bluespace=6;plasmatech=4;engineering=4"
+ var/obj/effect/portal/p_blue
+ var/obj/effect/portal/p_orange
+
+/obj/item/gun/energy/wormhole_projector/update_icon()
+ icon_state = "[initial(icon_state)][select]"
+ item_state = icon_state
+ return
+
+/obj/item/gun/energy/wormhole_projector/process_chamber()
+ ..()
+ select_fire()
+
+/obj/item/gun/energy/wormhole_projector/proc/on_portal_destroy(obj/effect/portal/P)
+ if(P == p_blue)
+ p_blue = null
+ else if(P == p_orange)
+ p_orange = null
+
+/obj/item/gun/energy/wormhole_projector/proc/has_blue_portal()
+ if(istype(p_blue) && !QDELETED(p_blue))
+ return TRUE
+ return FALSE
+
+/obj/item/gun/energy/wormhole_projector/proc/has_orange_portal()
+ if(istype(p_orange) && !QDELETED(p_orange))
+ return TRUE
+ return FALSE
+
+/obj/item/gun/energy/wormhole_projector/proc/crosslink()
+ if(!has_blue_portal() && !has_orange_portal())
+ return
+ if(!has_blue_portal() && has_orange_portal())
+ p_orange.link_portal(null)
+ return
+ if(!has_orange_portal() && has_blue_portal())
+ p_blue.link_portal(null)
+ return
+ p_orange.link_portal(p_blue)
+ p_blue.link_portal(p_orange)
+
+/obj/item/gun/energy/wormhole_projector/proc/create_portal(obj/item/projectile/beam/wormhole/W, turf/target)
+ var/obj/effect/portal/P = new /obj/effect/portal(target, src, 300, null, FALSE, null)
+ if(istype(W, /obj/item/projectile/beam/wormhole/orange))
+ qdel(p_orange)
+ p_orange = P
+ P.icon_state = "portal1"
+ else
+ qdel(p_blue)
+ p_blue = P
+ crosslink()
+
+/* 3d printer 'pseudo guns' for borgs */
+
+/obj/item/gun/energy/printer
+ name = "cyborg lmg"
+ desc = "A machinegun that fires 3d-printed flechettes slowly regenerated using a cyborg's internal power source."
+ icon_state = "l6closed0"
+ icon = 'icons/obj/guns/projectile.dmi'
+ cell_type = "/obj/item/stock_parts/cell/secborg"
+ ammo_type = list(/obj/item/ammo_casing/energy/c3dbullet)
+ can_charge = 0
+ use_cyborg_cell = 1
+
+/obj/item/gun/energy/printer/update_icon()
+ return
+
+/obj/item/gun/energy/printer/emp_act()
+ return
+
+/obj/item/gun/energy/temperature
+ name = "temperature gun"
+ icon_state = "freezegun"
+ desc = "A gun that changes temperatures."
+ origin_tech = "combat=4;materials=4;powerstorage=3;magnets=2"
+ ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot)
+ cell_type = "/obj/item/stock_parts/cell/high"
+ pin = null
+
+/obj/item/gun/energy/temperature/security
+ name = "security temperature gun"
+ desc = "A weapon that can only be used to its full potential by the truly robust."
+ origin_tech = "combat=2;materials=2;powerstorage=1;magnets=1"
+ pin = /obj/item/device/firing_pin
+
+/obj/item/gun/energy/laser/instakill
+ name = "instakill rifle"
+ icon_state = "instagib"
+ item_state = "instagib"
+ desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit."
+ ammo_type = list(/obj/item/ammo_casing/energy/instakill)
+ force = 60
+ origin_tech = "combat=7;magnets=6"
+
+/obj/item/gun/energy/laser/instakill/red
+ desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a red design."
+ icon_state = "instagibred"
+ item_state = "instagibred"
+ ammo_type = list(/obj/item/ammo_casing/energy/instakill/red)
+
+/obj/item/gun/energy/laser/instakill/blue
+ desc = "A specialized ASMD laser-rifle, capable of flat-out disintegrating most targets in a single hit. This one has a blue design."
+ icon_state = "instagibblue"
+ item_state = "instagibblue"
+ ammo_type = list(/obj/item/ammo_casing/energy/instakill/blue)
+
+/obj/item/gun/energy/laser/instakill/emp_act() //implying you could stop the instagib
+ return
+
+/obj/item/gun/energy/gravity_gun
+ name = "one-point bluespace-gravitational manipulator"
+ desc = "An experimental, multi-mode device that fires bolts of Zero-Point Energy, causing local distortions in gravity."
+ ammo_type = list(/obj/item/ammo_casing/energy/gravityrepulse, /obj/item/ammo_casing/energy/gravityattract, /obj/item/ammo_casing/energy/gravitychaos)
+ origin_tech = "combat=4;magnets=4;materials=6;powerstorage=4;bluespace=4"
+ item_state = "gravity_gun"
+ icon_state = "gravity_gun"
+ var/power = 4
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 9d7579c9dc..869076081e 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -1,80 +1,80 @@
-/obj/item/reagent_containers/spray
- name = "spray bottle"
- desc = "A spray bottle, with an unscrewable top."
- icon = 'icons/obj/janitor.dmi'
- icon_state = "cleaner"
- item_state = "cleaner"
+/obj/item/reagent_containers/spray
+ name = "spray bottle"
+ desc = "A spray bottle, with an unscrewable top."
+ icon = 'icons/obj/janitor.dmi'
+ icon_state = "cleaner"
+ item_state = "cleaner"
lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
flags_1 = NOBLUDGEON_1
container_type = OPENCONTAINER_1
- slot_flags = SLOT_BELT
- throwforce = 0
- w_class = WEIGHT_CLASS_SMALL
- throw_speed = 3
- throw_range = 7
- var/stream_mode = 0 //whether we use the more focused mode
- var/current_range = 3 //the range of tiles the sprayer will reach.
- var/spray_range = 3 //the range of tiles the sprayer will reach when in spray mode.
- var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode.
- var/stream_amount = 10 //the amount of reagents transfered when in stream mode.
- amount_per_transfer_from_this = 5
- volume = 250
- possible_transfer_amounts = list(5,10,15,20,25,30,50,100)
-
-
-/obj/item/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user)
- if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics))
- return
-
- if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution
- if(!A.reagents.total_volume && A.reagents)
- to_chat(user, "\The [A] is empty.")
- return
-
- if(reagents.total_volume >= reagents.maximum_volume)
- to_chat(user, "\The [src] is full.")
- return
-
- var/trans = A.reagents.trans_to(src, 50) //transfer 50u , using the spray's transfer amount would take too long to refill
- to_chat(user, "You fill \the [src] with [trans] units of the contents of \the [A].")
- return
-
- if(reagents.total_volume < amount_per_transfer_from_this)
- to_chat(user, "\The [src] is empty!")
- return
-
- spray(A)
-
- playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
- user.changeNext_move(CLICK_CD_RANGE*2)
- user.newtonian_move(get_dir(A, user))
- var/turf/T = get_turf(src)
- var/area/area = get_area(src)
- if(reagents.has_reagent("sacid"))
- message_admins("[ADMIN_LOOKUPFLW(user)] fired sulphuric acid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
- log_game("[key_name(user)] fired sulphuric acid from \a [src] at [area] ([T.x], [T.y], [T.z]).")
- if(reagents.has_reagent("facid"))
- message_admins("[ADMIN_LOOKUPFLW(user)] fired Fluacid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
- log_game("[key_name(user)] fired Fluacid from \a [src] at [area] [COORD(T)].")
- if(reagents.has_reagent("lube"))
- message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [area] [ADMIN_COORDJMP(T)].")
- log_game("[key_name(user)] fired Space lube from \a [src] at [area] [COORD(T)].")
- return
-
-
-/obj/item/reagent_containers/spray/proc/spray(atom/A)
- var/range = max(min(current_range, get_dist(src, A)), 1)
- var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))
- D.create_reagents(amount_per_transfer_from_this)
- var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed
- if(stream_mode)
- reagents.trans_to(D, amount_per_transfer_from_this)
- puff_reagent_left = 1
- else
- reagents.trans_to(D, amount_per_transfer_from_this, 1/range)
- D.color = mix_color_from_reagents(D.reagents.reagent_list)
- var/wait_step = max(round(2+3/range), 2)
+ slot_flags = SLOT_BELT
+ throwforce = 0
+ w_class = WEIGHT_CLASS_SMALL
+ throw_speed = 3
+ throw_range = 7
+ var/stream_mode = 0 //whether we use the more focused mode
+ var/current_range = 3 //the range of tiles the sprayer will reach.
+ var/spray_range = 3 //the range of tiles the sprayer will reach when in spray mode.
+ var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode.
+ var/stream_amount = 10 //the amount of reagents transfered when in stream mode.
+ amount_per_transfer_from_this = 5
+ volume = 250
+ possible_transfer_amounts = list(5,10,15,20,25,30,50,100)
+
+
+/obj/item/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user)
+ if(istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics))
+ return
+
+ if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution
+ if(!A.reagents.total_volume && A.reagents)
+ to_chat(user, "\The [A] is empty.")
+ return
+
+ if(reagents.total_volume >= reagents.maximum_volume)
+ to_chat(user, "\The [src] is full.")
+ return
+
+ var/trans = A.reagents.trans_to(src, 50) //transfer 50u , using the spray's transfer amount would take too long to refill
+ to_chat(user, "You fill \the [src] with [trans] units of the contents of \the [A].")
+ return
+
+ if(reagents.total_volume < amount_per_transfer_from_this)
+ to_chat(user, "\The [src] is empty!")
+ return
+
+ spray(A)
+
+ playsound(src.loc, 'sound/effects/spray2.ogg', 50, 1, -6)
+ user.changeNext_move(CLICK_CD_RANGE*2)
+ user.newtonian_move(get_dir(A, user))
+ var/turf/T = get_turf(src)
+ var/area/area = get_area(src)
+ if(reagents.has_reagent("sacid"))
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired sulphuric acid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired sulphuric acid from \a [src] at [area] ([T.x], [T.y], [T.z]).")
+ if(reagents.has_reagent("facid"))
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired Fluacid from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired Fluacid from \a [src] at [area] [COORD(T)].")
+ if(reagents.has_reagent("lube"))
+ message_admins("[ADMIN_LOOKUPFLW(user)] fired Space lube from \a [src] at [area] [ADMIN_COORDJMP(T)].")
+ log_game("[key_name(user)] fired Space lube from \a [src] at [area] [COORD(T)].")
+ return
+
+
+/obj/item/reagent_containers/spray/proc/spray(atom/A)
+ var/range = max(min(current_range, get_dist(src, A)), 1)
+ var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src))
+ D.create_reagents(amount_per_transfer_from_this)
+ var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed
+ if(stream_mode)
+ reagents.trans_to(D, amount_per_transfer_from_this)
+ puff_reagent_left = 1
+ else
+ reagents.trans_to(D, amount_per_transfer_from_this, 1/range)
+ D.color = mix_color_from_reagents(D.reagents.reagent_list)
+ var/wait_step = max(round(2+3/range), 2)
do_spray(A, wait_step, D, range, puff_reagent_left)
/obj/item/reagent_containers/spray/proc/do_spray(atom/A, wait_step, obj/effect/decal/chempuff/D, range, puff_reagent_left)
@@ -96,153 +96,155 @@
var/mob/M = T
if(!M.lying || !range_left)
D.reagents.reaction(M, VAPOR)
- puff_reagent_left -= 1
+ puff_reagent_left -= 1
else if(!range_left)
D.reagents.reaction(T, VAPOR)
else
D.reagents.reaction(T, VAPOR)
if(ismob(T))
puff_reagent_left -= 1
-
+
if(puff_reagent_left > 0 && (!stream_mode || !range_left))
D.reagents.reaction(get_turf(D), VAPOR)
puff_reagent_left -= 1
-
+
if(puff_reagent_left <= 0) // we used all the puff so we delete it.
qdel(D)
return
qdel(D)
-
-/obj/item/reagent_containers/spray/attack_self(mob/user)
- stream_mode = !stream_mode
- if(stream_mode)
- amount_per_transfer_from_this = stream_amount
- current_range = stream_range
- else
- amount_per_transfer_from_this = initial(amount_per_transfer_from_this)
- current_range = spray_range
- to_chat(user, "You switch the nozzle setting to [stream_mode ? "\"stream\"":"\"spray\""]. You'll now use [amount_per_transfer_from_this] units per use.")
-
-/obj/item/reagent_containers/spray/verb/empty()
- set name = "Empty Spray Bottle"
- set category = "Object"
- set src in usr
- if(usr.incapacitated())
- return
- if (alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes")
- return
- if(isturf(usr.loc) && src.loc == usr)
- to_chat(usr, "You empty \the [src] onto the floor.")
- reagents.reaction(usr.loc)
- src.reagents.clear_reagents()
-
-//space cleaner
-/obj/item/reagent_containers/spray/cleaner
- name = "space cleaner"
- desc = "BLAM!-brand non-foaming space cleaner!"
- list_reagents = list("cleaner" = 250)
-
-//spray tan
-/obj/item/reagent_containers/spray/spraytan
- name = "spray tan"
- volume = 50
- desc = "Gyaro brand spray tan. Do not spray near eyes or other orifices."
- list_reagents = list("spraytan" = 50)
-
-
-/obj/item/reagent_containers/spray/medical
- name = "medical spray"
- icon = 'icons/obj/chemical.dmi'
- icon_state = "medspray"
- volume = 100
-
-
-/obj/item/reagent_containers/spray/medical/sterilizer
- name = "sterilizer spray"
- desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery."
- list_reagents = list("sterilizine" = 100)
-
-
-//pepperspray
-/obj/item/reagent_containers/spray/pepper
- name = "pepperspray"
- desc = "Manufactured by UhangInc, used to blind and down an opponent quickly."
- icon = 'icons/obj/items_and_weapons.dmi'
- icon_state = "pepperspray"
- item_state = "pepperspray"
+
+/obj/item/reagent_containers/spray/attack_self(mob/user)
+ stream_mode = !stream_mode
+ if(stream_mode)
+ amount_per_transfer_from_this = stream_amount
+ current_range = stream_range
+ else
+ amount_per_transfer_from_this = initial(amount_per_transfer_from_this)
+ current_range = spray_range
+ to_chat(user, "You switch the nozzle setting to [stream_mode ? "\"stream\"":"\"spray\""]. You'll now use [amount_per_transfer_from_this] units per use.")
+
+/obj/item/reagent_containers/spray/verb/empty()
+ set name = "Empty Spray Bottle"
+ set category = "Object"
+ set src in usr
+ if(usr.incapacitated())
+ return
+ if (alert(usr, "Are you sure you want to empty that?", "Empty Bottle:", "Yes", "No") != "Yes")
+ return
+ if(isturf(usr.loc) && src.loc == usr)
+ to_chat(usr, "You empty \the [src] onto the floor.")
+ reagents.reaction(usr.loc)
+ src.reagents.clear_reagents()
+
+//space cleaner
+/obj/item/reagent_containers/spray/cleaner
+ name = "space cleaner"
+ desc = "BLAM!-brand non-foaming space cleaner!"
+ list_reagents = list("cleaner" = 250)
+
+//spray tan
+/obj/item/reagent_containers/spray/spraytan
+ name = "spray tan"
+ volume = 50
+ desc = "Gyaro brand spray tan. Do not spray near eyes or other orifices."
+ list_reagents = list("spraytan" = 50)
+
+
+/obj/item/reagent_containers/spray/medical
+ name = "medical spray"
+ icon = 'icons/obj/chemical.dmi'
+ icon_state = "medspray"
+ volume = 100
+
+
+/obj/item/reagent_containers/spray/medical/sterilizer
+ name = "sterilizer spray"
+ desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery."
+ list_reagents = list("sterilizine" = 100)
+
+
+//pepperspray
+/obj/item/reagent_containers/spray/pepper
+ name = "pepperspray"
+ desc = "Manufactured by UhangInc, used to blind and down an opponent quickly."
+ icon = 'icons/obj/items_and_weapons.dmi'
+ icon_state = "pepperspray"
+ item_state = "pepperspray"
lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi'
- volume = 40
- stream_range = 4
- amount_per_transfer_from_this = 5
- list_reagents = list("condensedcapsaicin" = 40)
-
-// Fix pepperspraying yourself
-/obj/item/reagent_containers/spray/pepper/afterattack(atom/A as mob|obj, mob/user)
- if (A.loc == user)
- return
- ..()
-
-//water flower
-/obj/item/reagent_containers/spray/waterflower
- name = "water flower"
- desc = "A seemingly innocent sunflower...with a twist."
- icon = 'icons/obj/hydroponics/harvest.dmi'
- icon_state = "sunflower"
- item_state = "sunflower"
- amount_per_transfer_from_this = 1
- volume = 10
- list_reagents = list("water" = 10)
-
-/obj/item/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays
- return
-
-//chemsprayer
-/obj/item/reagent_containers/spray/chemsprayer
- name = "chem sprayer"
- desc = "A utility used to spray large amounts of reagents in a given area."
- icon = 'icons/obj/guns/projectile.dmi'
- icon_state = "chemsprayer"
- item_state = "chemsprayer"
- throwforce = 0
- w_class = WEIGHT_CLASS_NORMAL
- stream_mode = 1
- current_range = 7
- spray_range = 4
- stream_range = 7
- amount_per_transfer_from_this = 10
- volume = 600
- origin_tech = "combat=3;materials=3;engineering=3"
-
-/obj/item/reagent_containers/spray/chemsprayer/afterattack(atom/A as mob|obj, mob/user)
- // Make it so the bioterror spray doesn't spray yourself when you click your inventory items
- if (A.loc == user)
- return
- ..()
-
-/obj/item/reagent_containers/spray/chemsprayer/spray(atom/A)
- var/direction = get_dir(src, A)
- var/turf/T = get_turf(A)
- var/turf/T1 = get_step(T,turn(direction, 90))
- var/turf/T2 = get_step(T,turn(direction, -90))
- var/list/the_targets = list(T,T1,T2)
-
- for(var/i=1, i<=3, i++) // intialize sprays
- if(reagents.total_volume < 1)
- return
- ..(the_targets[i])
-
-/obj/item/reagent_containers/spray/chemsprayer/bioterror
- list_reagents = list("sodium_thiopental" = 100, "coniine" = 100, "venom" = 100, "condensedcapsaicin" = 100, "initropidril" = 100, "polonium" = 100)
-
-// Plant-B-Gone
-/obj/item/reagent_containers/spray/plantbgone // -- Skie
- name = "Plant-B-Gone"
- desc = "Kills those pesky weeds!"
- icon = 'icons/obj/hydroponics/equipment.dmi'
- icon_state = "plantbgone"
- item_state = "plantbgone"
+ volume = 40
+ stream_range = 4
+ amount_per_transfer_from_this = 5
+ list_reagents = list("condensedcapsaicin" = 40)
+
+// Fix pepperspraying yourself
+/obj/item/reagent_containers/spray/pepper/afterattack(atom/A as mob|obj, mob/user)
+ if (A.loc == user)
+ return
+ ..()
+
+//water flower
+/obj/item/reagent_containers/spray/waterflower
+ name = "water flower"
+ desc = "A seemingly innocent sunflower...with a twist."
+ icon = 'icons/obj/hydroponics/harvest.dmi'
+ icon_state = "sunflower"
+ item_state = "sunflower"
+ amount_per_transfer_from_this = 1
+ volume = 10
+ list_reagents = list("water" = 10)
+
+/obj/item/reagent_containers/spray/waterflower/attack_self(mob/user) //Don't allow changing how much the flower sprays
+ return
+
+//chemsprayer
+/obj/item/reagent_containers/spray/chemsprayer
+ name = "chem sprayer"
+ desc = "A utility used to spray large amounts of reagents in a given area."
+ icon = 'icons/obj/guns/projectile.dmi'
+ icon_state = "chemsprayer"
+ item_state = "chemsprayer"
+ lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi'
+ throwforce = 0
+ w_class = WEIGHT_CLASS_NORMAL
+ stream_mode = 1
+ current_range = 7
+ spray_range = 4
+ stream_range = 7
+ amount_per_transfer_from_this = 10
+ volume = 600
+ origin_tech = "combat=3;materials=3;engineering=3"
+
+/obj/item/reagent_containers/spray/chemsprayer/afterattack(atom/A as mob|obj, mob/user)
+ // Make it so the bioterror spray doesn't spray yourself when you click your inventory items
+ if (A.loc == user)
+ return
+ ..()
+
+/obj/item/reagent_containers/spray/chemsprayer/spray(atom/A)
+ var/direction = get_dir(src, A)
+ var/turf/T = get_turf(A)
+ var/turf/T1 = get_step(T,turn(direction, 90))
+ var/turf/T2 = get_step(T,turn(direction, -90))
+ var/list/the_targets = list(T,T1,T2)
+
+ for(var/i=1, i<=3, i++) // intialize sprays
+ if(reagents.total_volume < 1)
+ return
+ ..(the_targets[i])
+
+/obj/item/reagent_containers/spray/chemsprayer/bioterror
+ list_reagents = list("sodium_thiopental" = 100, "coniine" = 100, "venom" = 100, "condensedcapsaicin" = 100, "initropidril" = 100, "polonium" = 100)
+
+// Plant-B-Gone
+/obj/item/reagent_containers/spray/plantbgone // -- Skie
+ name = "Plant-B-Gone"
+ desc = "Kills those pesky weeds!"
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ icon_state = "plantbgone"
+ item_state = "plantbgone"
lefthand_file = 'icons/mob/inhands/equipment/hydroponics_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/hydroponics_righthand.dmi'
- volume = 100
- list_reagents = list("plantbgone" = 100)
+ volume = 100
+ list_reagents = list("plantbgone" = 100)
diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi
index 60233a4dc9..de77656a15 100644
Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ
diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi
index fe15449aba..33f88d0d96 100644
Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ