diff --git a/code/game/dna.dm b/code/game/dna.dm
index ca875d91d06..d0f8d1d5df4 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -354,6 +354,28 @@
if(open) return close()
else return open()
+/obj/machinery/dna_scannernew/container_resist()
+ var/mob/living/user = usr
+ var/breakout_time = 2
+ if(open || !locked) //Open and unlocked, no need to escape
+ open = 1
+ return
+ user.next_move = world.time + 100
+ user.last_special = world.time + 100
+ user << "You lean on the back of [src] and start pushing the door open. (this will take about [breakout_time] minutes.)"
+ for(var/mob/O in viewers(src))
+ O << "You hear a metallic creaking from [src]!"
+
+ if(do_after(user,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds
+ if(!user || user.stat != CONSCIOUS || user.loc != src || open || !locked)
+ return
+
+ locked = 0
+ visible_message("[user] successfully broke out of [src]!")
+ user << "You successfully break out of [src]!"
+
+ open()
+
/obj/machinery/dna_scannernew/proc/close()
if(open)
open = 0
@@ -920,4 +942,4 @@ proc/deconstruct_block(value, values, blocksize=DNA_BLOCK_SIZE)
value = round(hex2num(value) / width) + 1
if(value > values)
value = values
- return value
\ No newline at end of file
+ return value
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 082802c3b98..04ed801f6b9 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -65,6 +65,8 @@
dat += "Scan"
+ dat += "Eject occupant"
+
dat += "
Injector
"
if(occupant)
dat += "Inject Inaprovaline"
@@ -92,7 +94,11 @@
return
usr.set_machine(src)
if(connected && connected.occupant)
- if(connected.occupant.health > 0)
+ if(href_list["eject"])
+ connected.eject()
+ updateUsrDialog()
+ return
+ else if(connected.occupant.health > 0)
if(href_list["inap"])
connected.inject_inap(usr)
if(href_list["stox"])
@@ -294,14 +300,10 @@
var/units = round(occupant.reagents.get_reagent_amount("dexalin"))
user << "Occupant now has [units] unit\s of dexalin in their bloodstream."
+/obj/machinery/sleeper/container_resist()
+ eject()
-/obj/machinery/sleeper/verb/eject()
- set name = "Eject occupant"
- set category = "Object"
- set src in oview(1)
- if(usr.stat || isslime(usr) || ispAI(usr))
- return
- icon_state = "sleeper-open"
+/obj/machinery/sleeper/proc/eject()
go_out()
add_fingerprint(usr)
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index fd99f2065ab..c8498e2bdd2 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -60,8 +60,8 @@
return 0
-/obj/machinery/atmospherics/unary/cryo_cell/relaymove(mob/user)
- if(user.stat)
+/obj/machinery/atmospherics/unary/cryo_cell/container_resist()
+ if(usr.stat)
return
go_out()
return
diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm
index 0c103dbd641..b8500393002 100644
--- a/code/game/machinery/kitchen/gibber.dm
+++ b/code/game/machinery/kitchen/gibber.dm
@@ -65,7 +65,7 @@
/obj/machinery/gibber/attack_paw(mob/user as mob)
return src.attack_hand(user)
-/obj/machinery/gibber/relaymove(mob/user as mob)
+/obj/machinery/gibber/container_resist()
src.go_out()
return
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 6e4432382ed..546261b66fe 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -419,15 +419,26 @@
return
-/obj/machinery/suit_storage_unit/verb/get_out()
- set name = "Eject Suit Storage Unit"
- set category = "Object"
- set src in oview(1)
+/obj/machinery/suit_storage_unit/container_resist()
+ var/mob/living/user = usr
+ if(islocked)
+ user.next_move = world.time + 100
+ user.last_special = world.time + 100
+ var/breakout_time = 2
+ user << "You start kicking against the doors to escape! (This will take about [breakout_time] minutes.)"
+ visible_message("You see [user] kicking against the doors of the [src]!")
+ if(do_after(user,(breakout_time*60*10)))
+ if(!user || user.stat != CONSCIOUS || user.loc != src || isopen || !islocked)
+ return
+ else
+ isopen = 1
+ islocked = 0
+ visible_message("[user] successfully broke out of [src]!")
- if (usr.stat != 0)
- return
- src.eject_occupant(usr)
- add_fingerprint(usr)
+ else
+ return
+ src.eject_occupant(user)
+ add_fingerprint(user)
src.updateUsrDialog()
src.update_icon()
return
@@ -568,4 +579,4 @@
return
-//////////////////////////////REMINDER: Make it lock once you place some fucker inside.
\ No newline at end of file
+//////////////////////////////REMINDER: Make it lock once you place some fucker inside.
diff --git a/code/game/mecha/equipment/tools/medical_tools.dm b/code/game/mecha/equipment/tools/medical_tools.dm
index 8609595057d..f890ae633df 100644
--- a/code/game/mecha/equipment/tools/medical_tools.dm
+++ b/code/game/mecha/equipment/tools/medical_tools.dm
@@ -210,6 +210,9 @@
return 1
return
+ container_resist()
+ go_out()
+
/datum/global_iterator/mech_sleeper
process(var/obj/item/mecha_parts/mecha_equipment/tool/sleeper/S)
@@ -682,4 +685,4 @@
for(var/reagent in S.processed_reagents)
S.reagents.add_reagent(reagent,amount)
S.chassis.use_power(energy_drain)
- return 1
\ No newline at end of file
+ return 1
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 7180ff57234..e8aa4092290 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -1094,6 +1094,9 @@
add_fingerprint(usr)
return
+/obj/mecha/container_resist()
+ go_out()
+
/obj/mecha/proc/go_out()
if(!src.occupant) return
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index b231aac9052..09ac5bc814c 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -191,9 +191,23 @@
icon_state = "cocoon1"
health = 60
- New()
+/obj/effect/spider/cocoon/New()
icon_state = pick("cocoon1","cocoon2","cocoon3")
+/obj/effect/spider/cocoon/container_resist()
+ var/mob/living/user = usr
+ var/breakout_time = 2
+ user.next_move = world.time + 100
+ user.last_special = world.time + 100
+ user << "You struggle against the tight bonds! (This will take about [breakout_time] minutes.)"
+ visible_message("You see something struggling and writhing in the [src]!")
+ if(do_after(user,(breakout_time*60*10)))
+ if(!user || user.stat != CONSCIOUS || user.loc != src)
+ return
+ Del()
+
+
+
/obj/effect/spider/cocoon/Del()
src.visible_message("\red \The [src] splits open.")
for(var/atom/movable/A in contents)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 79fbaffa987..7ea06f0c942 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -93,6 +93,9 @@
/obj/proc/interact(mob/user)
return
+/obj/proc/container_resist()
+ return
+
/obj/proc/update_icon()
return
@@ -126,4 +129,4 @@
var/rendered = "[M.name]: [text]"
mo.show_message(rendered, 2)
*/
- return
\ No newline at end of file
+ return
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 7e976607110..4979345dffa 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -296,3 +296,30 @@
if(AM.loc == src) return 0
return 1
+/obj/structure/closet/container_resist()
+ var/mob/living/user = usr
+ var/breakout_time = 2 //2 minutes by default
+ if(istype(user.loc, /obj/structure/closet/critter) && !welded)
+ breakout_time = 0.75 //45 seconds if it's an unwelded critter crate
+
+ if(opened || (!welded && !locked))
+ return //Door's open, not locked or welded, no point in resisting.
+
+ //okay, so the closet is either welded or locked... resist!!!
+ user.next_move = world.time + 100
+ user.last_special = world.time + 100
+ user << "You lean on the back of [src] and start pushing the door open. (this will take about [breakout_time] minutes.)"
+ for(var/mob/O in viewers(src))
+ O << "[src] begins to shake violently!"
+
+ if(do_after(user,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds
+ if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded))
+ return
+ //we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting
+
+ welded = 0 //applies to all lockers lockers
+ locked = 0 //applies to critter crates and secure lockers only
+ broken = 1 //applies to secure lockers only
+ visible_message("[user] successfully broke out of [src]!")
+ user << "You successfully break out of [src]!"
+ open()
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm
index 5fc016321c8..30fa750b85d 100644
--- a/code/game/objects/structures/crates_lockers/closets/statue.dm
+++ b/code/game/objects/structures/crates_lockers/closets/statue.dm
@@ -147,4 +147,7 @@
user.dust()
dump_contents()
visible_message("\red [src] shatters!. ")
- del(src)
\ No newline at end of file
+ del(src)
+
+/obj/structure/closet/statue/container_resist()
+ return
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 9f546bcf15c..5d9ddd4cdca 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -101,9 +101,7 @@
src.add_fingerprint(user)
return
-/obj/structure/morgue/relaymove(mob/user as mob)
- if (user.stat)
- return
+/obj/structure/morgue/container_resist()
src.connected = new /obj/structure/m_tray( src.loc )
step(src.connected, EAST)
src.connected.layer = OBJ_LAYER
@@ -271,9 +269,7 @@
src.add_fingerprint(user)
return
-/obj/structure/crematorium/relaymove(mob/user as mob)
- if (user.stat || locked)
- return
+/obj/structure/crematorium/container_resist()
src.connected = new /obj/structure/c_tray( src.loc )
step(src.connected, SOUTH)
src.connected.layer = OBJ_LAYER
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index f828a4f5756..79bd9c84486 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -462,37 +462,11 @@
else
L.buckled.manual_unbuckle(L)
- //Breaking out of a locker?
- else if(loc && istype(loc, /obj/structure/closet))
- var/obj/structure/closet/C = L.loc
- var/breakout_time = 2 //2 minutes by default
- if(istype(L.loc, /obj/structure/closet/critter) && !C.welded)
- breakout_time = 0.75 //45 seconds if it's an unwelded critter crate
-
- if(C.opened || (!C.welded && !C.locked))
- return //Door's open, not locked or welded, no point in resisting.
-
- //okay, so the closet is either welded or locked... resist!!!
- usr.next_move = world.time + 100
- L.last_special = world.time + 100
- L << "You lean on the back of [C] and start pushing the door open. (this will take about [breakout_time] minutes.)"
- for(var/mob/O in viewers(C))
- O << "[C] begins to shake violently!"
-
- if(do_after(usr,(breakout_time*60*10))) //minutes * 60seconds * 10deciseconds
- if(!C || !L || L.stat != CONSCIOUS || L.loc != C || C.opened || (!C.locked && !C.welded))
- return
- //we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting
-
- C.welded = 0 //applies to all lockers lockers
- C.locked = 0 //applies to critter crates and secure lockers only
- C.broken = 1 //applies to secure lockers only
- L.visible_message("[L] successfully broke out of [C]!", \
- "You successfully break out of [C]!")
- if(istype(C.loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace)
- var/obj/structure/bigDelivery/BD = C.loc
- BD.attack_hand(usr)
- C.open()
+ //Breaking out of a container (Locker, sleeper, cryo...)
+ else if(loc && istype(loc, /obj) && !isturf(loc))
+ if(L.stat == CONSCIOUS && !L.stunned && !L.weakened && !L.paralysis)
+ var/obj/C = loc
+ C.container_resist(L)
//Stop drop and roll & Handcuffs
else if(iscarbon(L))
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 0454c42af7d..eeabbc2e236 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -193,11 +193,11 @@
/obj/machinery/disposal/alter_health()
return get_turf(src)
-// attempt to move while inside
-/obj/machinery/disposal/relaymove(mob/user as mob)
- if(user.stat || src.flushing)
+// resist to escape the bin
+/obj/machinery/disposal/container_resist()
+ if(src.flushing)
return
- src.go_out(user)
+ go_out(usr)
return
// leave the disposal