diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 4d32a8bc824..7ba79eac771 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -17,6 +17,9 @@
var/breakout_time = 2
var/lastbang
var/can_weld_shut = 1
+ var/allow_mobs = TRUE
+ var/allow_objects = FALSE
+ var/allow_dense = FALSE
var/max_mob_size = MOB_SIZE_HUMAN //Biggest mob_size accepted by the container
var/mob_storage_capacity = 3 // how many human sized mob/living can fit together inside a closet.
var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate then open it in a populated area to crash clients.
@@ -117,27 +120,34 @@
if(contents.len >= storage_capacity)
return -1
- if(istype(AM, /mob/living))
- var/mob/living/L = AM
- if(L.buckled || L.buckled_mob || L.mob_size > max_mob_size) //buckled mobs, mobs with another mob attached, and mobs too big for the container don't get inside closets.
- return 0
- if(L.mob_size > MOB_SIZE_TINY) //decently sized mobs take more space than objects.
+ var/mob/living/L = AM
+ if(istype(L))
+ if(L.buckled || L.buckled_mob)
+ return
+ if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items.
+ if(!allow_mobs)
+ return
+ if(L.mob_size > max_mob_size)
+ return
var/mobs_stored = 0
for(var/mob/living/M in contents)
- mobs_stored++
- if(mobs_stored >= mob_storage_capacity)
- return 0
- L.reset_perspective(src)
+ if(++mobs_stored >= mob_storage_capacity)
+ return
L.stop_pulling()
- else if(!istype(AM, /obj/item) && !istype(AM, /obj/effect/dummy/chameleon))
- return 0
- else if(AM.density || AM.anchored)
- return 0
- else if(AM.flags & NODROP)
- return 0
+ else if(istype(AM, /obj/structure/closet))
+ return
+ else
+ if(!allow_objects && !istype(AM, /obj/item) && !istype(AM, /obj/effect/dummy/chameleon))
+ return
+ if(!allow_dense && AM.density)
+ return
+ if(AM.anchored || AM.buckled_mob || (AM.flags & NODROP))
+ return
+
AM.forceMove(src)
if(AM.pulledby)
AM.pulledby.stop_pulling()
+
return 1
/obj/structure/closet/proc/close()
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index b84231bc0b1..a1176535d49 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -4,7 +4,10 @@
icon = 'icons/obj/crates.dmi'
icon_state = "crate"
req_access = null
- var/allow_mobs = FALSE
+ can_weld_shut = FALSE
+ allow_mobs = FALSE
+ allow_objects = TRUE
+ allow_dense = TRUE
var/obj/item/weapon/paper/manifest/manifest
/obj/structure/closet/crate/New()
@@ -37,22 +40,6 @@
else if(!place(user, W))
attack_hand(user)
-/obj/structure/closet/crate/insert(atom/movable/AM)
- if(contents.len >= storage_capacity)
- return -1
-
- if(istype(AM, /mob/living))
- var/mob/living/L = AM
- if(!allow_mobs || L.buckled || L.buckled_mob)
- return
- L.stop_pulling()
- if(AM.flags & NODROP || AM.density || AM.anchored || AM.buckled_mob || istype(AM, /obj/structure/closet))
- return
- AM.forceMove(src)
- if(AM.pulledby)
- AM.pulledby.stop_pulling()
- return 1
-
/obj/structure/closet/crate/proc/tear_manifest(mob/user)
user << "You tear the manifest off of the crate."
playsound(src, 'sound/items/poster_ripped.ogg', 75, 1)
diff --git a/code/game/objects/structures/crates_lockers/crates/critter.dm b/code/game/objects/structures/crates_lockers/crates/critter.dm
index d7df978ecae..2082a8eeba6 100644
--- a/code/game/objects/structures/crates_lockers/crates/critter.dm
+++ b/code/game/objects/structures/crates_lockers/crates/critter.dm
@@ -1,9 +1,26 @@
/obj/structure/closet/crate/critter
name = "critter crate"
- desc = "A crate designed for safe transport of animals. Only openable from the the outside."
+ desc = "A crate designed for safe transport of animals. It has an oxygen tank for safe transport in space."
icon_state = "crittercrate"
allow_mobs = TRUE
+ allow_objects = FALSE
breakout_time = 1
+ material_drop = /obj/item/stack/sheet/mineral/wood
+ var/obj/item/weapon/tank/internals/emergency_oxygen/tank
+
+/obj/structure/closet/crate/critter/New()
+ ..()
+ tank = new
+
+/obj/structure/closet/crate/critter/Destroy()
+ var/turf/T = get_turf(src)
+ tank.loc = T
+ tank = null
+
+ for(var/i in 1 to rand(2, 5))
+ new material_drop(T)
+
+ return ..()
/obj/structure/closet/crate/critter/update_icon()
overlays.Cut()
@@ -14,8 +31,8 @@
if(manifest)
overlays += "manifest"
-/obj/structure/closet/crate/critter/attack_hand(mob/user)
- if(user in src)
- user << "It won't budge!"
+/obj/structure/closet/crate/critter/return_air()
+ if(tank)
+ return tank.air_contents
else
- ..()
+ return loc.return_air()
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm
index 93a81516a7c..8e346125205 100644
--- a/code/game/objects/structures/crates_lockers/crates/large.dm
+++ b/code/game/objects/structures/crates_lockers/crates/large.dm
@@ -9,10 +9,8 @@
add_fingerprint(user)
if(manifest)
tear_manifest(user)
- return
else
user << "You need a crowbar to pry this open!"
- return
/obj/structure/closet/crate/large/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/crowbar))