diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index d604eca82cb..56fa0b28b08 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -80,10 +80,8 @@
var/turf/T = get_turf(M)
if(T)
var/obj/effect/energy_net/net = new net_type(T)
- net.layer = M.layer+1
- M.captured = 1
- net.affecting = M
- T.visible_message("[M] was caught in an energy net!")
+ if(net.buckle_mob(M))
+ T.visible_message("[M] was caught in an energy net!")
qdel(src)
// If we miss or hit an obstacle, we still want to delete the net.
@@ -99,107 +97,56 @@
density = 1
opacity = 0
mouse_opacity = 1
- anchored = 1
+ anchored = 0
- var/health = 25
- var/mob/living/affecting = null //Who it is currently affecting, if anyone.
- var/mob/living/master = null //Who shot web. Will let this person know if the net was successful.
- var/countdown = -1
+ can_buckle = 1
+ buckle_movable = 1
+ buckle_lying = 0
+ buckle_dir = SOUTH
-/obj/effect/energy_net/teleport
- countdown = 60
+ var/escape_time = 8 SECONDS
/obj/effect/energy_net/New()
..()
processing_objects |= src
/obj/effect/energy_net/Destroy()
-
- if(affecting)
- var/mob/living/carbon/M = affecting
- M.anchored = initial(affecting.anchored)
- M.captured = 0
- M << "You are free of the net!"
+ if(buckled_mob)
+ to_chat(buckled_mob,"You are free of the net!")
+ unbuckle_mob()
processing_objects -= src
..()
-/obj/effect/energy_net/proc/healthcheck()
-
- if(health <=0)
- density = 0
- src.visible_message("The energy net is torn apart!")
- qdel(src)
- return
-
/obj/effect/energy_net/process()
-
- if(isnull(affecting) || affecting.loc != loc)
+ if(isnull(buckled_mob) || buckled_mob.loc != loc)
qdel(src)
- return
- // Countdown begin set to -1 will stop the teleporter from firing.
- // Clientless mobs can be netted but they will not teleport or decrement the timer.
- var/mob/living/M = affecting
- if(countdown == -1 || (istype(M) && !M.client))
- return
-
- if(countdown > 0)
- countdown--
- return
-
- // TODO: consider removing or altering this; energy nets are useful on their own
- // merits and the teleportation was never properly implemented; it's halfassed.
- density = 0
- invisibility = 101 //Make the net invisible so all the animations can play out.
- health = INFINITY //Make the net invincible so that an explosion/something else won't kill it during anims.
-
- playsound(affecting.loc, 'sound/effects/sparks4.ogg', 50, 1)
- anim(affecting.loc,affecting,'icons/mob/mob.dmi',,"phaseout",,affecting.dir)
-
- affecting.visible_message("[affecting] vanishes in a flare of light!")
-
- if(holdingfacility.len)
- affecting.loc = pick(holdingfacility)
-
- affecting << "You appear in a strange place!"
-
- playsound(affecting.loc, 'sound/effects/phasein.ogg', 25, 1)
- playsound(affecting.loc, 'sound/effects/sparks2.ogg', 50, 1)
- anim(affecting.loc,affecting,'icons/mob/mob.dmi',,"phasein",,affecting.dir)
-
- qdel(src)
-
-/obj/effect/energy_net/bullet_act(var/obj/item/projectile/Proj)
- health -= Proj.get_structure_damage()
- healthcheck()
- return 0
-
-/obj/effect/energy_net/ex_act()
- health = 0
- healthcheck()
-
-/obj/effect/energy_net/attack_hand(var/mob/user)
-
- var/mob/living/carbon/human/H = user
- if(istype(H))
- if(H.species.can_shred(H))
- playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1)
- health -= rand(10, 20)
- else
- health -= rand(1,3)
-
- else if (HULK in user.mutations)
- health = 0
- else
- health -= rand(5,8)
-
- H << "You claw at the energy net."
-
- healthcheck()
- return
-
-/obj/effect/energy_net/attackby(obj/item/weapon/W as obj, mob/user as mob)
- health -= W.force
- healthcheck()
+/obj/effect/energy_net/Move()
..()
+ if(buckled_mob)
+ var/mob/living/occupant = buckled_mob
+ occupant.buckled = null
+ occupant.forceMove(src.loc)
+ occupant.buckled = src
+ if (occupant && (src.loc != occupant.loc))
+ unbuckle_mob()
+ qdel(src)
+
+/obj/effect/energy_net/user_unbuckle_mob(mob/user)
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
+ visible_message("[user] begins to tear at \the [src]!")
+ if(do_after(usr, escape_time, incapacitation_flags = INCAPACITATION_DEFAULT & ~(INCAPACITATION_RESTRAINED | INCAPACITATION_BUCKLED_FULLY)))
+ if(!buckled_mob)
+ return
+ visible_message("[user] manages to tear \the [src] apart!")
+ unbuckle_mob()
+
+/obj/effect/energy_net/post_buckle_mob(mob/living/M)
+ if(buckled_mob) //Just buckled someone
+ ..()
+ layer = M.layer+1
+ M.can_pull_size = 0
+ else //Just unbuckled someone
+ M.can_pull_size = initial(M.can_pull_size)
+ qdel(src)
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index dfe57c55b2d..ab55807be8d 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -770,11 +770,6 @@ default behaviour is:
if(buckled.buckle_movable)
anchored = 0
canmove = 1
-
- else if(captured)
- anchored = 1
- canmove = 0
- lying = 0
else
lying = incapacitated(INCAPACITATION_KNOCKDOWN)
canmove = !incapacitated(INCAPACITATION_DISABLED)
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index 6a5e39e961f..1901902c80d 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -153,7 +153,6 @@
var/voice_name = "unidentifiable voice"
var/faction = "neutral" //Used for checking whether hostile simple animals will attack you, possibly more stuff later
- var/captured = 0 //Functionally, should give the same effect as being buckled into a chair when true. Only used by energy nets, TODO replace with buckling
//Generic list for proc holders. Only way I can see to enable certain verbs/procs. Should be modified if needed.
var/proc_holder_list[] = list()//Right now unused.