diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index d43251a2e48..39d8cf6b0f5 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -157,9 +157,14 @@
name = "bear trap"
throw_speed = 1
throw_range = 1
- icon_state = "beartrap0"
+ icon_state = "beartrap"
desc = "A trap used to catch bears and other legged creatures."
var/armed = 0
+ var/trap_damage = 20
+
+/obj/item/weapon/restraints/legcuffs/beartrap/New()
+ ..()
+ icon_state = "[initial(icon_state)][armed]"
/obj/item/weapon/restraints/legcuffs/beartrap/suicide_act(mob/user)
user.visible_message("[user] is sticking \his head in the [src.name]! It looks like \he's trying to commit suicide.")
@@ -170,10 +175,9 @@
..()
if(ishuman(user) && !user.stat && !user.restrained())
armed = !armed
- icon_state = "beartrap[armed]"
+ icon_state = "[initial(icon_state)][armed]"
user << "[src] is now [armed ? "armed" : "disarmed"]"
-
/obj/item/weapon/restraints/legcuffs/beartrap/Crossed(AM as mob|obj)
if(armed && isturf(src.loc))
if(isliving(AM))
@@ -196,9 +200,31 @@
snap = 1
if(snap)
armed = 0
- icon_state = "beartrap0"
+ icon_state = "[initial(icon_state)][armed]"
playsound(src.loc, 'sound/effects/snap.ogg', 50, 1)
L.visible_message("[L] triggers \the [src].", \
"You trigger \the [src]!")
- L.apply_damage(20,BRUTE, def_zone)
- ..()
\ No newline at end of file
+ L.apply_damage(trap_damage,BRUTE, def_zone)
+ ..()
+
+/obj/item/weapon/restraints/legcuffs/beartrap/energy
+ name = "energy snare"
+ armed = 1
+ icon_state = "e_snare"
+ trap_damage = 0
+
+/obj/item/weapon/restraints/legcuffs/beartrap/energy/New()
+ ..()
+ spawn(100)
+ if(!istype(loc, /mob))
+ var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread
+ sparks.set_up(1, 1, src)
+ sparks.start()
+ qdel(src)
+
+/obj/item/weapon/restraints/legcuffs/beartrap/energy/dropped()
+ ..()
+ qdel(src)
+
+/obj/item/weapon/restraints/legcuffs/beartrap/energy/attack_hand(mob/user)
+ Crossed(user) //honk
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index a4c73816557..f98a2f72ef9 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -466,6 +466,7 @@ var/const/GALOSHES_DONT_HELP = 8
return
if(legcuffed)
legcuffed.loc = loc
+ legcuffed.dropped()
legcuffed = null
update_inv_legcuffed(0)
else
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
index d170962a7ae..3518b4c35ab 100644
--- a/code/modules/projectiles/ammunition/energy.dm
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -154,3 +154,13 @@
/obj/item/ammo_casing/energy/bolt/large
projectile_type = /obj/item/projectile/energy/bolt/large
select_name = "heavy bolt"
+
+obj/item/ammo_casing/energy/net
+ projectile_type = /obj/item/projectile/energy/net
+ select_name = "netting"
+ pellets = 6
+ variance = 1
+
+/obj/item/ammo_casing/energy/trap
+ projectile_type = /obj/item/projectile/energy/trap
+ select_name = "snare"
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index aa1d4931ea4..6de08880434 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -19,6 +19,15 @@
force = 10
ammo_type = list(/obj/item/ammo_casing/energy/electrode/hos, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/disabler)
+/obj/item/weapon/gun/energy/gun/dragnet
+ name = "DRAGnet"
+ desc = "The \"Dynamic Rapid-Apprehension of the Guilty\" net is a revolution in law enforcement technology."
+ icon_state = "dragnet"
+ item_state = null
+ origin_tech = "combat=3;magnets=3;materials=4; bluespace=4"
+ ammo_type = list(/obj/item/ammo_casing/energy/net, /obj/item/ammo_casing/energy/trap)
+ can_flashlight = 0
+
/obj/item/weapon/gun/energy/gun/nuclear
name = "advanced energy gun"
desc = "An energy gun with an experimental miniaturized nuclear reactor that automatically charges the internal power cell."
@@ -127,4 +136,4 @@
trigger_guard = 0
/obj/item/weapon/gun/energy/gun/turret/update_icon()
- icon_state = initial(icon_state)
+ icon_state = initial(icon_state)
\ No newline at end of file
diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm
index ea3b048e13e..2cfe90da467 100644
--- a/code/modules/projectiles/projectile/energy.dm
+++ b/code/modules/projectiles/projectile/energy.dm
@@ -38,6 +38,78 @@
sparks.start()
..()
+/obj/item/projectile/energy/net
+ name = "energy netting"
+ icon_state = "e_netting"
+ damage = 10
+ damage_type = STAMINA
+ hitsound = 'sound/weapons/taserhit.ogg'
+ range = 10
+
+/obj/item/projectile/energy/net/New()
+ ..()
+ SpinAnimation()
+
+/obj/item/projectile/energy/net/on_hit(var/atom/target, var/blocked = 0)
+ if(isliving(target) && !locate(/obj/effect/nettingportal) in loc)
+ new/obj/effect/nettingportal(get_turf(target))
+ ..()
+
+/obj/item/projectile/energy/net/on_range()
+ var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread
+ sparks.set_up(1, 1, src)
+ sparks.start()
+ ..()
+
+/obj/effect/nettingportal
+ name = "DRAGnet teleportation field"
+ desc = "A field of bluespace energy, locking on to teleport a target."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "dragnetfield"
+ anchored = 1
+ unacidable = 1
+
+/obj/effect/nettingportal/New()
+ ..()
+ SetLuminosity(3)
+ var/obj/item/device/radio/beacon/teletarget = null
+ for(var/obj/machinery/computer/teleporter/com in machines)
+ if(com.target)
+ if(com.power_station && com.power_station.teleporter_hub && com.power_station.engaged)
+ teletarget = com.target
+ if(teletarget)
+ spawn(30)
+ for(var/mob/living/L in get_turf(src))
+ do_teleport(L, teletarget, 2)//teleport what's in the tile to the beacon
+ qdel(src)
+ else
+ spawn(30)
+ for(var/mob/living/L in get_turf(src))
+ do_teleport(L, L, 15) //Otherwise it just warps you off somewhere.
+ qdel(src)
+
+
+/obj/item/projectile/energy/trap
+ name = "energy snare"
+ icon_state = "e_snare"
+ nodamage = 1
+ weaken = 1
+ hitsound = 'sound/weapons/taserhit.ogg'
+ range = 4
+
+/obj/item/projectile/energy/trap/on_hit(var/atom/target, var/blocked = 0)
+ if(!ismob(target) || blocked >= 2) //Fully blocked by mob or collided with dense object - drop a trap
+ new/obj/item/weapon/restraints/legcuffs/beartrap/energy(get_turf(loc))
+ else if(iscarbon(target))
+ var/obj/item/weapon/restraints/legcuffs/beartrap/B = new /obj/item/weapon/restraints/legcuffs/beartrap/energy(get_turf(target))
+ B.Crossed(target)
+ ..()
+
+/obj/item/projectile/energy/trap/on_range()
+ new/obj/item/weapon/restraints/legcuffs/beartrap/energy(loc)
+ ..()
+
+
/obj/item/projectile/energy/declone
name = "radiation beam"
icon_state = "declone"
@@ -45,7 +117,6 @@
damage_type = CLONE
irradiate = 40
-
/obj/item/projectile/energy/dart //ninja throwing dart
name = "dart"
icon_state = "toxin"
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 39df26748eb..dc275c2512d 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi
index ff23c626c9f..09fa557ac1a 100644
Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index fabc21f2d9e..4979d68a241 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 52619ce1640..cc0325cdfae 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ