diff --git a/aurorastation.dme b/aurorastation.dme
index f535063139d..1b1bcbf5fe8 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -1429,7 +1429,6 @@
#include "code\game\objects\structures\displaycase.dm"
#include "code\game\objects\structures\door_assembly.dm"
#include "code\game\objects\structures\ECD.dm"
-#include "code\game\objects\structures\engicart.dm"
#include "code\game\objects\structures\extinguisher.dm"
#include "code\game\objects\structures\fireaxe_cabinet.dm"
#include "code\game\objects\structures\flags_banners.dm"
@@ -1440,7 +1439,6 @@
#include "code\game\objects\structures\hadii_statue.dm"
#include "code\game\objects\structures\hivebot_head.dm"
#include "code\game\objects\structures\inflatable.dm"
-#include "code\game\objects\structures\janicart.dm"
#include "code\game\objects\structures\kitchen_spike.dm"
#include "code\game\objects\structures\large.dm"
#include "code\game\objects\structures\lattice.dm"
@@ -1477,6 +1475,10 @@
#include "code\game\objects\structures\barricades\metal.dm"
#include "code\game\objects\structures\barricades\plasteel.dm"
#include "code\game\objects\structures\barricades\wood.dm"
+#include "code\game\objects\structures\carts\carts.dm"
+#include "code\game\objects\structures\carts\engicart.dm"
+#include "code\game\objects\structures\carts\janicart.dm"
+#include "code\game\objects\structures\carts\parcelcart.dm"
#include "code\game\objects\structures\crates_lockers\closets.dm"
#include "code\game\objects\structures\crates_lockers\crates.dm"
#include "code\game\objects\structures\crates_lockers\largecrate.dm"
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 38e6a429f1f..4624f885319 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -194,8 +194,8 @@
else
do_animate("deny")
return
- if(istype(bumped_atom, /obj/structure/janitorialcart) || istype(bumped_atom, /obj/structure/engineeringcart))
- var/obj/structure/janitorialcart/cart = bumped_atom
+ if(istype(bumped_atom, /obj/structure/cart))
+ var/obj/structure/cart/cart = bumped_atom
if(density)
if(cart.pulling && (src.allowed(cart.pulling)))
open()
diff --git a/code/game/objects/structures/carts/carts.dm b/code/game/objects/structures/carts/carts.dm
new file mode 100644
index 00000000000..18acf44e6bf
--- /dev/null
+++ b/code/game/objects/structures/carts/carts.dm
@@ -0,0 +1,141 @@
+ABSTRACT_TYPE(/obj/structure/cart)
+ name = "cart parent item"
+ desc = DESC_PARENT
+ icon_state = "cart"
+ anchored = FALSE
+ density = TRUE
+ climbable = TRUE
+ build_amt = 15
+ material = DEFAULT_WALL_MATERIAL
+ slowdown = 0
+ var/movesound = 'sound/effects/roll.ogg'
+ var/driving
+ var/mob/living/pulling
+
+/obj/structure/cart/mechanics_hints(mob/user, distance, is_adjacent)
+ . += ..()
+ . += "\
+ You can CTRL-Click to start dragging this cart. This object has a special dragging behaviour: when dragged, character's movement \
+ directs the cart and the character is subsequently pulled by it. \
+ "
+
+/obj/structure/cart/disassembly_hints(mob/user, distance, is_adjacent)
+ . += ..()
+ . += "An empty cart can be taken apart with a wrench or a welder. Or a plasma cutter, if you're that hardcore."
+
+/obj/structure/cart/proc/take_apart(var/mob/user = null, var/obj/I)
+ if(user)
+ if(iswelder(I))
+ var/obj/item/welder = I
+ welder.play_tool_sound(get_turf(src), 50)
+
+ user.visible_message("[user] starts taking apart the [src]...", SPAN_NOTICE("You start disassembling the [src]..."))
+ if (!do_after(user, 30, do_flags = DO_DEFAULT & ~DO_USER_SAME_HAND))
+ return
+
+ dismantle()
+
+/obj/structure/cart/ex_act(severity)
+ spill(100 / severity)
+ ..()
+
+/obj/structure/cart/proc/spill(var/chance = 100)
+
+/obj/structure/cart/proc/update_slowdown()
+
+/obj/structure/cart/relaymove(mob/living/user, direction)
+ . = ..()
+
+ if(user.stat || user.stunned || user.weakened || user.paralysis || user.lying || user.restrained())
+ if(user==pulling)
+ pulling = null
+ user.pulledby = null
+ to_chat(user, SPAN_WARNING("You lost your grip!"))
+ return
+ if(user.pulling && (user == pulling))
+ pulling = null
+ user.pulledby = null
+ return
+ if(pulling && (get_dist(src, pulling) > 1))
+ pulling = null
+ user.pulledby = null
+ if(user==pulling)
+ return
+ if(pulling && (get_dir(src.loc, pulling.loc) == direction))
+ to_chat(user, SPAN_WARNING("You cannot go there."))
+ return
+
+ driving = 1
+ var/turf/T = null
+ if(pulling)
+ T = pulling.loc
+ if(get_dist(src, pulling) >= 1)
+ step(pulling, get_dir(pulling.loc, src.loc))
+ step(src, direction)
+ set_dir(direction)
+ if(pulling)
+ if(pulling.loc == src.loc)
+ pulling.forceMove(T)
+ else
+ spawn(0)
+ if(get_dist(src, pulling) > 1)
+ pulling = null
+ user.pulledby = null
+ pulling.set_dir(get_dir(pulling, src))
+ driving = 0
+
+
+/obj/structure/cart/Move()
+ . = ..()
+ if (pulling && (get_dist(src, pulling) > 1))
+ pulling.pulledby = null
+ to_chat(pulling, SPAN_WARNING("You lost your grip!"))
+ pulling = null
+ if(has_gravity())
+ playsound(src, movesound, 50, 1)
+
+/obj/structure/cart/CtrlClick(var/mob/user)
+ if(in_range(src, user))
+ if(!ishuman(user)) return
+ if(!pulling)
+ pulling = user
+ user.pulledby = src
+ if(user.pulling)
+ user.stop_pulling()
+ user.set_dir(get_dir(user, src))
+ to_chat(user, SPAN_NOTICE("You grip \the [name]'s handles."))
+ else
+ to_chat(user, SPAN_NOTICE("You let go of \the [name]'s handles."))
+ pulling.pulledby = null
+ pulling = null
+ return
+
+/obj/structure/cart/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(air_group || (height==0))
+ return TRUE
+ if(mover?.movement_type & PHASING)
+ return TRUE
+ if(istype(mover) && mover.pass_flags & PASSTABLE)
+ return TRUE
+ if(istype(mover, /mob/living) && mover == pulling)
+ return TRUE
+ else
+ if(istype(mover, /obj/projectile))
+ return prob(20)
+ else
+ return !density
+
+ABSTRACT_TYPE(/obj/structure/cart/storage)
+ var/has_items = FALSE
+
+ /// Used for displaying and handling radial menu. Collective list of every single item this object contains.
+ var/list/storage_contents = list()
+
+/obj/structure/cart/storage/proc/handle_storing(var/attacking_item, var/mob/user, var/should_store, var/storage_is_full)
+
+/obj/structure/cart/storage/proc/get_storage_contents_list()
+
+/obj/structure/cart/storage/take_apart(var/mob/user = null, var/obj/I)
+ if(has_items)
+ spill()
+ . = ..()
diff --git a/code/game/objects/structures/engicart.dm b/code/game/objects/structures/carts/engicart.dm
similarity index 69%
rename from code/game/objects/structures/engicart.dm
rename to code/game/objects/structures/carts/engicart.dm
index 70b76778cc1..7a10a2e75bc 100644
--- a/code/game/objects/structures/engicart.dm
+++ b/code/game/objects/structures/carts/engicart.dm
@@ -1,27 +1,16 @@
-/obj/structure/engineeringcart
+/obj/structure/cart/storage/engineeringcart
name = "engineering cart"
desc = "A cart for your engineering-related storage needs."
icon = 'icons/obj/engicart.dmi'
icon_state = "cart"
- anchored = FALSE
- density = TRUE
- climbable = TRUE
- build_amt = 15
- material = DEFAULT_TABLE_REINF_MATERIAL
- slowdown = 0
- var/has_items = FALSE
var/list/my_glass = list()
var/list/my_metal = list()
var/list/my_plasteel = list()
- /// Used for displaying and handling radial menu. Collective list of every single item this object contains.
- var/list/storage_contents = list()
var/obj/item/device/lightreplacer/my_lightreplacer = null
var/obj/item/storage/toolbox/mechanical/my_blue_toolbox = null
var/obj/item/storage/toolbox/electrical/my_yellow_toolbox = null
var/obj/item/storage/toolbox/emergency/my_red_toolbox = null
- var/driving
- var/mob/living/pulling
/// Amount of stacks the cart is capable to store.
var/stack_capacity = 2
@@ -35,19 +24,11 @@
/obj/item/storage/toolbox/emergency
))
-/obj/structure/engineeringcart/mechanics_hints(mob/user, distance, is_adjacent)
+/obj/structure/cart/storage/engineeringcart/mechanics_hints(mob/user, distance, is_adjacent)
. += ..()
. += "You can use steel, plasteel, glass sheets, toolboxes and light replacers on the cart to store them."
- . += "\
- You can CTRL-Click to start dragging this cart. This object has a special dragging behaviour: when dragged, character's movement \
- directs the cart and the character is subsequently pulled by it. \
- "
-/obj/structure/engineeringcart/disassembly_hints(mob/user, distance, is_adjacent)
- . += ..()
- . += "An empty engineering cart can be taken apart with a wrench or a welder. Or a plasma cutter, if you're that hardcore."
-
-/obj/structure/engineeringcart/feedback_hints(mob/user, distance, is_adjacent)
+/obj/structure/cart/storage/engineeringcart/feedback_hints(mob/user, distance, is_adjacent)
. += ..()
if(distance <= 1)
if(locate(/obj/item/stack/material) in storage_contents)
@@ -75,7 +56,7 @@
else
. += "[icon2html(src, user)] There is no material in this cart!"
-/obj/structure/engineeringcart/proc/get_storage_contents_list()
+/obj/structure/cart/storage/engineeringcart/get_storage_contents_list()
storage_contents.Cut()
var/list/lists_to_check = list(
my_glass, my_metal, my_plasteel
@@ -90,7 +71,7 @@
if(O)
storage_contents += O
-/obj/structure/engineeringcart/Destroy()
+/obj/structure/cart/storage/engineeringcart/Destroy()
QDEL_NULL(my_glass)
QDEL_NULL(my_metal)
QDEL_NULL(my_plasteel)
@@ -100,7 +81,7 @@
QDEL_NULL(my_red_toolbox)
return ..()
-/obj/structure/engineeringcart/attackby(obj/item/attacking_item, mob/user)
+/obj/structure/cart/storage/engineeringcart/attackby(obj/item/attacking_item, mob/user)
if(is_type_in_typecache(attacking_item, allowed_types))
var/should_store = FALSE
var/storage_is_full = FALSE
@@ -171,28 +152,7 @@
return
..()
-// copied from janicart code
-/obj/structure/engineeringcart/proc/take_apart(var/mob/user = null, var/obj/I)
- if(has_items)
- spill()
-
- if(user)
-
- if(iswelder(I))
- var/obj/item/welder = I
- welder.play_tool_sound(get_turf(src), 50)
-
- user.visible_message("[user] starts taking apart the [src]...", SPAN_NOTICE("You start disassembling the [src]..."))
- if (!do_after(user, 30, do_flags = DO_DEFAULT & ~DO_USER_SAME_HAND))
- return
-
- dismantle()
-
-/obj/structure/engineeringcart/ex_act(severity)
- spill(100 / severity)
- ..()
-
-/obj/structure/engineeringcart/proc/spill(var/chance = 100)
+/obj/structure/cart/storage/engineeringcart/spill(var/chance = 100)
var/turf/dropspot = get_turf(src)
if(LAZYLEN(my_glass) && prob(chance))
var/obj/item/stack/material/glass/G
@@ -243,7 +203,7 @@
update_icon()
-/obj/structure/engineeringcart/proc/handle_storing(var/attacking_item, var/mob/user, var/should_store, var/storage_is_full)
+/obj/structure/cart/storage/engineeringcart/handle_storing(var/attacking_item, var/mob/user, var/should_store, var/storage_is_full)
if(should_store)
user.drop_from_inventory(attacking_item, src)
get_storage_contents_list()
@@ -254,7 +214,7 @@
else
to_chat(user, SPAN_WARNING("You can't store this here!"))
-/obj/structure/engineeringcart/attack_hand(mob/user)
+/obj/structure/cart/storage/engineeringcart/attack_hand(mob/user)
if(!isliving(user))
return
@@ -309,7 +269,7 @@
else
to_chat(user, SPAN_WARNING("\The [chosen_item] is not in the cart anymore!"))
-/obj/structure/engineeringcart/update_icon()
+/obj/structure/cart/storage/engineeringcart/update_icon()
ClearOverlays()
has_items = FALSE
if(my_plasteel.len)
@@ -334,92 +294,9 @@
AddOverlays("cart_redtoolbox")
has_items = TRUE
+/obj/structure/cart/storage/engineeringcart/half_filled
-/// For future reference, this kind of pulling functions are dependant on a type-check in `mob_movement.dm` line:332
-/obj/structure/engineeringcart/relaymove(mob/living/user, direction)
- . = ..()
-
- if(user.stat || user.stunned || user.weakened || user.paralysis || user.lying || user.restrained())
- if(user==pulling)
- pulling = null
- user.pulledby = null
- to_chat(user, SPAN_WARNING("You lost your grip!"))
- return
- if(user.pulling && (user == pulling))
- pulling = null
- user.pulledby = null
- return
- if(pulling && (get_dist(src, pulling) > 1))
- pulling = null
- user.pulledby = null
- if(user==pulling)
- return
- if(pulling && (get_dir(src.loc, pulling.loc) == direction))
- to_chat(user, SPAN_WARNING("You cannot go there."))
- return
-
- driving = 1
- var/turf/T = null
- if(pulling)
- T = pulling.loc
- if(get_dist(src, pulling) >= 1)
- step(pulling, get_dir(pulling.loc, src.loc))
- step(src, direction)
- set_dir(direction)
- if(pulling)
- if(pulling.loc == src.loc)
- pulling.forceMove(T)
- else
- spawn(0)
- if(get_dist(src, pulling) > 1)
- pulling = null
- user.pulledby = null
- pulling.set_dir(get_dir(pulling, src))
- driving = 0
-
-/obj/structure/engineeringcart/Move()
- . = ..()
- if (pulling && (get_dist(src, pulling) > 1))
- pulling.pulledby = null
- to_chat(pulling, SPAN_WARNING("You lost your grip!"))
- pulling = null
- if(has_gravity())
- playsound(src, 'sound/effects/roll.ogg', 50, 1)
-
-/obj/structure/engineeringcart/CtrlClick(var/mob/user)
- if(in_range(src, user))
- if(!ishuman(user)) return
- if(!pulling)
- pulling = user
- user.pulledby = src
- if(user.pulling)
- user.stop_pulling()
- user.set_dir(get_dir(user, src))
- to_chat(user, "You grip \the [name]'s handles.")
- else
- to_chat(usr, "You let go of \the [name]'s handles.")
- pulling.pulledby = null
- pulling = null
- return
-
-/obj/structure/engineeringcart/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0))
- return TRUE
- if(mover?.movement_type & PHASING)
- return TRUE
- if(istype(mover) && mover.pass_flags & PASSTABLE)
- return TRUE
- if(istype(mover, /mob/living) && mover == pulling)
- return TRUE
- else
- if(istype(mover, /obj/projectile))
- return prob(30)
- else
- return !density
-
-/obj/structure/engineeringcart/half_filled
-
-/obj/structure/engineeringcart/half_filled/Initialize()
+/obj/structure/cart/storage/engineeringcart/half_filled/Initialize()
. = ..()
my_blue_toolbox = new /obj/item/storage/toolbox/mechanical(src)
my_yellow_toolbox = new /obj/item/storage/toolbox/electrical(src)
@@ -427,9 +304,9 @@
get_storage_contents_list()
update_icon()
-/obj/structure/engineeringcart/full
+/obj/structure/cart/storage/engineeringcart/full
-/obj/structure/engineeringcart/full/Initialize()
+/obj/structure/cart/storage/engineeringcart/full/Initialize()
. = ..()
my_lightreplacer = new /obj/item/device/lightreplacer(src)
my_blue_toolbox = new /obj/item/storage/toolbox/mechanical(src)
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/carts/janicart.dm
similarity index 70%
rename from code/game/objects/structures/janicart.dm
rename to code/game/objects/structures/carts/janicart.dm
index 4e597edb0fb..620f03e73e0 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/carts/janicart.dm
@@ -1,14 +1,8 @@
-/obj/structure/janitorialcart
+/obj/structure/cart/storage/janitorialcart
name = "custodial cart"
desc = "The ultimate in custodial carts. Has space for water, mops, signs, trash bags, and more."
icon = 'icons/obj/janitor.dmi'
icon_state = "cart"
- anchored = FALSE
- density = TRUE
- climbable = TRUE
- atom_flags = ATOM_FLAG_OPEN_CONTAINER
- build_amt = 15
- slowdown = 0
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
var/obj/item/storage/bag/trash/mybag = null
@@ -17,22 +11,15 @@
var/obj/item/device/lightreplacer/myreplacer = null
var/obj/structure/mopbucket/mybucket = null
var/signs = 0 //maximum capacity hardcoded below
- var/has_items = FALSE //This is set true whenever the cart has anything loaded/mounted on it
- var/driving
- var/mob/living/pulling
-/obj/structure/janitorialcart/mechanics_hints(mob/user, distance, is_adjacent)
+/obj/structure/cart/storage/janitorialcart/mechanics_hints(mob/user, distance, is_adjacent)
. += ..()
. += "Click and drag a mop bucket onto the cart to mount it."
. += "ALT-Click with a mop to put it away; a normal click will wet it in the bucket."
. += "ALT-Click with a container, such as a bucket, to pour its contents into the mounted bucket. A normal click will toss it into the trash."
. += "You can use a light replacer, spraybottle (of space cleaner) and four wet-floor signs on the cart to store them."
-/obj/structure/janitorialcart/disassembly_hints(mob/user, distance, is_adjacent)
- . += ..()
- . += "An empty custodial cart can be taken apart with a wrench or a welder. Or a plasma cutter, if you're that hardcore."
-
-/obj/structure/janitorialcart/feedback_hints(mob/user, distance, is_adjacent)
+/obj/structure/cart/storage/janitorialcart/feedback_hints(mob/user, distance, is_adjacent)
. += ..()
if(distance <= 1)
if (mybucket)
@@ -44,7 +31,7 @@
// Regular Variant
// No trashbag and no light replacer, this is inside the custodian's locker.
-/obj/structure/janitorialcart/Initialize()
+/obj/structure/cart/storage/janitorialcart/Initialize()
. = ..()
mymop = new /obj/item/mop(src)
myspray = new /obj/item/reagent_containers/spray/cleaner(src)
@@ -58,7 +45,7 @@
// Full Variant
// Has everything.
-/obj/structure/janitorialcart/full/Initialize()
+/obj/structure/cart/storage/janitorialcart/full/Initialize()
. = ..()
mybag = new /obj/item/storage/bag/trash(src)
mymop = new /obj/item/mop(src)
@@ -74,7 +61,7 @@
// Full with Water Variant
// Has everything as well as water in the mop bucket.
-/obj/structure/janitorialcart/full/water/Initialize()
+/obj/structure/cart/storage/janitorialcart/full/water/Initialize()
. = ..()
mybag = new /obj/item/storage/bag/trash(src)
mymop = new /obj/item/mop(src)
@@ -89,12 +76,12 @@
update_icon()
-/obj/structure/janitorialcart/New()
+/obj/structure/cart/storage/janitorialcart/New()
..()
if(is_station_turf(get_turf(src)))
GLOB.janitorial_supplies |= src
-/obj/structure/janitorialcart/Destroy()
+/obj/structure/cart/storage/janitorialcart/Destroy()
if(src in GLOB.janitorial_supplies)
GLOB.janitorial_supplies -= src
QDEL_NULL(mybag)
@@ -104,10 +91,10 @@
QDEL_NULL(mybucket)
return ..()
-/obj/structure/janitorialcart/proc/get_short_status()
+/obj/structure/cart/storage/janitorialcart/proc/get_short_status()
return "Contents: [english_list(contents)]"
-/obj/structure/janitorialcart/mouse_drop_receive(atom/dropped, mob/user, params)
+/obj/structure/cart/storage/janitorialcart/mouse_drop_receive(atom/dropped, mob/user, params)
var/atom/movable/O = dropped
if (istype(O, /obj/structure/mopbucket) && !mybucket)
O.forceMove(src)
@@ -120,7 +107,7 @@
//New Altclick functionality!
//Altclick the cart with a mop to stow the mop away
//Altclick the cart with a reagent container to pour things into the bucket without putting the bottle in trash
-/obj/structure/janitorialcart/AltClick()
+/obj/structure/cart/storage/janitorialcart/AltClick()
if(!usr || usr.stat || usr.lying || usr.restrained() || !Adjacent(usr)) return
var/obj/I = usr.get_active_hand()
if(istype(I, /obj/item/mop))
@@ -141,7 +128,7 @@
if (LR.store_broken)
return mybag.attackby(I, usr)
-/obj/structure/janitorialcart/attackby(obj/item/attacking_item, mob/user)
+/obj/structure/cart/storage/janitorialcart/attackby(obj/item/attacking_item, mob/user)
if(istype(attacking_item, /obj/item/mop) || istype(attacking_item, /obj/item/reagent_containers/glass/rag) || istype(attacking_item, /obj/item/soap))
if (mybucket)
if(attacking_item.reagents.total_volume < attacking_item.reagents.maximum_volume)
@@ -205,28 +192,8 @@
return
..()
-/obj/structure/janitorialcart/proc/take_apart(var/mob/user = null, var/obj/I)
- if(has_items)
- spill()
-
- if(user)
-
- if(iswelder(I))
- var/obj/item/welder = I
- welder.play_tool_sound(get_turf(src), 50)
-
- user.visible_message("[user] starts taking apart the [src]...", SPAN_NOTICE("You start disassembling the [src]..."))
- if (!do_after(user, 30, do_flags = DO_DEFAULT & ~DO_USER_SAME_HAND))
- return
-
- dismantle()
-
-/obj/structure/janitorialcart/ex_act(severity)
- spill(100 / severity)
- ..()
-
//This is called if the cart is caught in an explosion, or destroyed by weapon fire
-/obj/structure/janitorialcart/proc/spill(var/chance = 100)
+/obj/structure/cart/storage/janitorialcart/spill(var/chance = 100)
var/turf/dropspot = get_turf(src)
if (mymop && prob(chance))
mymop.forceMove(dropspot)
@@ -267,11 +234,11 @@
update_icon()
-/obj/structure/janitorialcart/attack_hand(mob/user)
+/obj/structure/cart/storage/janitorialcart/attack_hand(mob/user)
ui_interact(user)
return
-/obj/structure/janitorialcart/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+/obj/structure/cart/storage/janitorialcart/ui_interact(var/mob/user, var/ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
var/data[0]
data["name"] = capitalize(name)
data["bag"] = mybag ? capitalize(mybag.name) : null
@@ -287,7 +254,7 @@
ui.set_initial_data(data)
ui.open()
-/obj/structure/janitorialcart/Topic(href, href_list)
+/obj/structure/cart/storage/janitorialcart/Topic(href, href_list)
if(!in_range(src, usr))
return
if(!isliving(usr))
@@ -335,7 +302,7 @@
update_icon()
updateUsrDialog()
-/obj/structure/janitorialcart/update_icon()
+/obj/structure/cart/storage/janitorialcart/update_icon()
ClearOverlays()
has_items = 0
if(mybucket)
@@ -361,83 +328,3 @@
if(signs)
AddOverlays("cart_sign[signs]")
has_items = 1
-
-//Shamelessly copied from wheelchair code
-/obj/structure/janitorialcart/relaymove(mob/living/user, direction)
- . = ..()
-
- if(user.stat || user.stunned || user.weakened || user.paralysis || user.lying || user.restrained())
- if(user==pulling)
- pulling = null
- user.pulledby = null
- to_chat(user, SPAN_WARNING("You lost your grip!"))
- return
- if(user.pulling && (user == pulling))
- pulling = null
- user.pulledby = null
- return
- if(pulling && (get_dist(src, pulling) > 1))
- pulling = null
- user.pulledby = null
- if(user==pulling)
- return
- if(pulling && (get_dir(src.loc, pulling.loc) == direction))
- to_chat(user, SPAN_WARNING("You cannot go there."))
- return
-
- driving = 1
- var/turf/T = null
- if(pulling)
- T = pulling.loc
- if(get_dist(src, pulling) >= 1)
- step(pulling, get_dir(pulling.loc, src.loc))
- step(src, direction)
- set_dir(direction)
- if(pulling)
- if(pulling.loc == src.loc)
- pulling.forceMove(T)
- else
- spawn(0)
- if(get_dist(src, pulling) > 1)
- pulling = null
- user.pulledby = null
- pulling.set_dir(get_dir(pulling, src))
- driving = 0
-
-/obj/structure/janitorialcart/Move()
- . = ..()
- if (pulling && (get_dist(src, pulling) > 1))
- pulling.pulledby = null
- to_chat(pulling, SPAN_WARNING("You lost your grip!"))
- pulling = null
-
-/obj/structure/janitorialcart/CtrlClick(var/mob/user)
- if(in_range(src, user))
- if(!ishuman(user)) return
- if(!pulling)
- pulling = user
- user.pulledby = src
- if(user.pulling)
- user.stop_pulling()
- user.set_dir(get_dir(user, src))
- to_chat(user, "You grip \the [name]'s handles.")
- else
- to_chat(usr, "You let go of \the [name]'s handles.")
- pulling.pulledby = null
- pulling = null
- return
-
-/obj/structure/janitorialcart/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0))
- return TRUE
- if(mover?.movement_type & PHASING)
- return TRUE
- if(istype(mover) && mover.pass_flags & PASSTABLE)
- return TRUE
- if(istype(mover, /mob/living) && mover == pulling)
- return TRUE
- else
- if(istype(mover, /obj/projectile))
- return prob(30)
- else
- return !density
diff --git a/code/game/objects/structures/carts/parcelcart.dm b/code/game/objects/structures/carts/parcelcart.dm
new file mode 100644
index 00000000000..21113e621dd
--- /dev/null
+++ b/code/game/objects/structures/carts/parcelcart.dm
@@ -0,0 +1,123 @@
+/obj/structure/cart/storage/parcelcart
+ name = "parcel cart"
+ desc = "A cart for moving parcels and packages around."
+ icon = 'icons/obj/parcelcart.dmi'
+ icon_state = "cart"
+
+ var/list/my_parcels = list()
+
+ /// Amount of parcels the cart is capable to store.
+ var/parcel_capacity = 17
+
+ var/static/list/allowed_types = typecacheof(list(
+ /obj/item/smallDelivery
+ ))
+
+/obj/structure/cart/storage/parcelcart/mechanics_hints(mob/user, distance, is_adjacent)
+ . += ..()
+ . += "You can use hand held parcels on the cart to store them."
+ . += "It slows down at 5 packages, and becomes even slower when there is 11 packages or more loaded."
+
+/obj/structure/cart/storage/parcelcart/get_storage_contents_list()
+ storage_contents.Cut()
+ var/list/lists_to_check = list(
+ my_parcels
+ )
+ for(var/list/list_to_check in lists_to_check)
+ if(list_to_check?.len) //null check
+ storage_contents += list_to_check
+
+ var/list/non_sheet_objects = list(my_parcels)
+
+ for(var/obj/O in non_sheet_objects)
+ if(O)
+ storage_contents += O
+
+/obj/structure/cart/storage/parcelcart/Destroy()
+ QDEL_NULL(my_parcels)
+ return ..()
+
+/obj/structure/cart/storage/parcelcart/attackby(obj/item/attacking_item, mob/user)
+ if(is_type_in_typecache(attacking_item, allowed_types))
+ var/should_store = FALSE
+ var/storage_is_full = FALSE
+ if(my_parcels.len < parcel_capacity)
+ my_parcels += attacking_item
+ should_store = TRUE
+ else
+ storage_is_full = TRUE
+
+ handle_storing(attacking_item, user, should_store, storage_is_full)
+ return TRUE
+
+ else if (!has_items && (attacking_item.iswrench() || attacking_item.iswelder() || istype(attacking_item, /obj/item/gun/energy/plasmacutter)))
+ take_apart(user, attacking_item)
+ return
+ ..()
+
+/obj/structure/cart/storage/parcelcart/spill(var/chance = 100)
+ var/turf/dropspot = get_turf(src)
+
+ if(LAZYLEN(my_parcels) && prob(chance))
+ var/obj/item/smallDelivery/M
+ for(var/I in my_parcels)
+ M = I
+ M.forceMove(dropspot)
+ M.tumble(1)
+ my_parcels -= M
+ my_parcels.Cut()
+ update_icon()
+
+/obj/structure/cart/storage/parcelcart/handle_storing(var/attacking_item, var/mob/user, var/should_store, var/storage_is_full)
+ if(should_store)
+ user.drop_from_inventory(attacking_item, src)
+ get_storage_contents_list()
+ update_slowdown()
+ update_icon()
+ to_chat(user, SPAN_NOTICE("You put [attacking_item] into [src]."))
+ else if(storage_is_full)
+ to_chat(user, SPAN_WARNING("There isn't any space to store [attacking_item] in [src]!"))
+ else
+ to_chat(user, SPAN_WARNING("You can't store this here!"))
+
+/obj/structure/cart/storage/parcelcart/update_slowdown()
+ if(my_parcels.len <= 4)
+ slowdown = 0
+ else if(my_parcels.len > 4 && my_parcels.len < 11)
+ slowdown = 1
+ else if(my_parcels.len >= 11)
+ slowdown = 2
+
+/obj/structure/cart/storage/parcelcart/attack_hand(mob/user)
+ if(!isliving(user))
+ return
+
+ if(LAZYLEN(storage_contents))
+ for(var/obj/O in storage_contents)
+ storage_contents[O] = image(O.icon, O.icon_state)
+
+ var/obj/item/chosen_item = show_radial_menu(user, src, storage_contents, require_near = TRUE, tooltips = TRUE)
+
+ if(isnull(chosen_item))
+ return
+ if(chosen_item in storage_contents)
+ switch(chosen_item.type)
+ if(/obj/item/smallDelivery)
+ if(my_parcels.len)
+ user.put_in_hands(chosen_item)
+ to_chat(user, SPAN_NOTICE("You take [my_parcels[chosen_item]] from [src]."))
+ my_parcels -= chosen_item
+
+ get_storage_contents_list()
+ update_slowdown()
+ update_icon()
+ else
+ to_chat(user, SPAN_WARNING("\The [chosen_item] is not in the cart anymore!"))
+
+/obj/structure/cart/storage/parcelcart/update_icon()
+ ClearOverlays()
+ has_items = FALSE
+ if(my_parcels.len)
+ var/amount_to_show = min(length(my_parcels), parcel_capacity)
+ AddOverlays("pack_[amount_to_show]")
+ has_items = TRUE
diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm
index 22c38ee95f0..c0e242a34f5 100644
--- a/code/game/objects/structures/mop_bucket.dm
+++ b/code/game/objects/structures/mop_bucket.dm
@@ -44,8 +44,8 @@
/obj/structure/mopbucket/on_reagent_change()
. = ..()
- if(istype(loc,/obj/structure/janitorialcart))
- var/obj/structure/janitorialcart/cart = loc
+ if(istype(loc,/obj/structure/cart/storage/janitorialcart))
+ var/obj/structure/cart/storage/janitorialcart/cart = loc
cart.update_icon()
else
update_icon()
diff --git a/code/modules/cargo/items/custodial.dm b/code/modules/cargo/items/custodial.dm
index 16b4c7479c8..20d6e15835d 100644
--- a/code/modules/cargo/items/custodial.dm
+++ b/code/modules/cargo/items/custodial.dm
@@ -145,7 +145,7 @@
description = "The ultimate in custodial carts. Has space for water, mops, signs, trash bags, and more."
price = 190
items = list(
- /obj/structure/janitorialcart
+ /obj/structure/cart/storage/janitorialcart
)
access = ACCESS_JANITOR
container_type = "crate"
diff --git a/code/modules/cargo/items/engineering.dm b/code/modules/cargo/items/engineering.dm
index 793d8ff94b2..a506f5395db 100644
--- a/code/modules/cargo/items/engineering.dm
+++ b/code/modules/cargo/items/engineering.dm
@@ -903,7 +903,7 @@
description = "A cart for your engineering-related storage needs."
price = 100
items = list(
- /obj/structure/engineeringcart
+ /obj/structure/cart/storage/engineeringcart
)
access = ACCESS_ENGINE
container_type = "crate"
diff --git a/code/modules/cargo/items/operations.dm b/code/modules/cargo/items/operations.dm
index edc03323285..18b15942094 100644
--- a/code/modules/cargo/items/operations.dm
+++ b/code/modules/cargo/items/operations.dm
@@ -185,7 +185,7 @@
description = "A set of items to restock the janitors closet."
price = 2000
items = list(
- /obj/structure/janitorialcart,
+ /obj/structure/cart/storage/janitorialcart,
/obj/structure/mopbucket,
/obj/item/mop,
/obj/item/storage/bag/trash,
diff --git a/code/modules/item_worth/worths_list.dm b/code/modules/item_worth/worths_list.dm
index 445d8911368..a1a99f08924 100644
--- a/code/modules/item_worth/worths_list.dm
+++ b/code/modules/item_worth/worths_list.dm
@@ -689,7 +689,7 @@ var/list/worths = list(
/obj/structure/girder = 15,
/obj/structure/grille = 5,
/obj/structure/inflatable = 1,
- /obj/structure/janitorialcart = 12,
+ /obj/structure/cart/storage/janitorialcart = 12,
/obj/structure/kitchenspike = 35,
/obj/structure/lattice = 1,
/obj/structure/morgue = 10,
diff --git a/code/modules/materials/material_recipes.dm b/code/modules/materials/material_recipes.dm
index 26c452f42f3..3cc43ed85a9 100644
--- a/code/modules/materials/material_recipes.dm
+++ b/code/modules/materials/material_recipes.dm
@@ -71,8 +71,9 @@
recipes += new /datum/stack_recipe_list("miscellaneous construction",
list(
new /datum/stack_recipe("key", /obj/item/key, 1, time = 10, one_per_turf = 0, on_floor = 1),
- new /datum/stack_recipe("custodial cart", /obj/structure/janitorialcart, BUILD_AMT, time = 120, one_per_turf = 1, on_floor = 1),
- new /datum/stack_recipe("engineering cart", /obj/structure/engineeringcart, BUILD_AMT, time = 120, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("custodial cart", /obj/structure/cart/storage/janitorialcart, BUILD_AMT, time = 120, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("engineering cart", /obj/structure/cart/storage/engineeringcart, BUILD_AMT, time = 120, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("parcel cart", /obj/structure/cart/storage/parcelcart, BUILD_AMT, time = 120, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("steel closet", /obj/structure/closet, BUILD_AMT, time = 15, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("canister", /obj/machinery/portable_atmospherics/canister, 10, time = 15, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("target stake", /obj/structure/target_stake, BUILD_AMT, time = 15, one_per_turf = 1, on_floor = 1),
diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm
index 59fb6e6773c..fe2a1d965f6 100644
--- a/code/modules/mob/mob_movement.dm
+++ b/code/modules/mob/mob_movement.dm
@@ -329,7 +329,7 @@
//Wheelchair pushing goes here for now.
//TODO: Fuck wheelchairs.
- if(istype(mob.pulledby, /obj/structure/bed/stool/chair/office/wheelchair) || istype(mob.pulledby, /obj/structure/janitorialcart) || istype(mob.pulledby, /obj/structure/engineeringcart))
+ if(istype(mob.pulledby, /obj/structure/bed/stool/chair/office/wheelchair) || istype(mob.pulledby, /obj/structure/cart))
var/obj/structure/S = mob.pulledby
move_delay += S.slowdown
return mob.pulledby.relaymove(mob, direct)
diff --git a/code/modules/modular_computers/file_system/programs/civilian/janitor.dm b/code/modules/modular_computers/file_system/programs/civilian/janitor.dm
index eb6c521040b..3520b22ad3b 100644
--- a/code/modules/modular_computers/file_system/programs/civilian/janitor.dm
+++ b/code/modules/modular_computers/file_system/programs/civilian/janitor.dm
@@ -48,8 +48,8 @@
var/mob/living/bot/cleanbot/C = A
status = C.on ? "Online" : "Offline"
supply_type = "Cleanbots"
- else if(istype(A, /obj/structure/janitorialcart))
- var/obj/structure/janitorialcart/J = A
+ else if(istype(A, /obj/structure/cart/storage/janitorialcart))
+ var/obj/structure/cart/storage/janitorialcart/J = A
status = J.get_short_status()
supply_type = "Janicarts"
else
diff --git a/html/changelogs/ParcelCart.yml b/html/changelogs/ParcelCart.yml
new file mode 100644
index 00000000000..b98c1a007c3
--- /dev/null
+++ b/html/changelogs/ParcelCart.yml
@@ -0,0 +1,7 @@
+author: TheGreyWolf & Tomixcomics
+
+delete-after: True
+
+changes:
+ - rscadd: "Added a parcel cart to the operations mail room. It can carry up to 17 handheld packages regardless of size."
+ - bugfix: "Fixed the engineering cart giving plasteel when taken apart."
diff --git a/icons/obj/parcelcart.dmi b/icons/obj/parcelcart.dmi
new file mode 100644
index 00000000000..aa89a986ce7
Binary files /dev/null and b/icons/obj/parcelcart.dmi differ
diff --git a/maps/away/away_site/abandoned_diner/abandoned_diner.dmm b/maps/away/away_site/abandoned_diner/abandoned_diner.dmm
index bb533b3d7f7..9b8663f8cdc 100644
--- a/maps/away/away_site/abandoned_diner/abandoned_diner.dmm
+++ b/maps/away/away_site/abandoned_diner/abandoned_diner.dmm
@@ -1601,7 +1601,7 @@
/obj/effect/floor_decal/corner_wide/blue{
dir = 9
},
-/obj/structure/janitorialcart/full{
+/obj/structure/cart/storage/janitorialcart/full{
dir = 8
},
/obj/item/reagent_containers/glass/bucket,
diff --git a/maps/away/away_site/abandoned_industrial/abandoned_industrial_station.dmm b/maps/away/away_site/abandoned_industrial/abandoned_industrial_station.dmm
index 6d3703b2665..2e516b197d6 100644
--- a/maps/away/away_site/abandoned_industrial/abandoned_industrial_station.dmm
+++ b/maps/away/away_site/abandoned_industrial/abandoned_industrial_station.dmm
@@ -2510,7 +2510,7 @@
/turf/simulated/floor/reinforced/airless,
/area/abandoned_industrial_station/exterior)
"ig" = (
-/obj/structure/janitorialcart{
+/obj/structure/cart/storage/janitorialcart{
dir = 4
},
/obj/effect/floor_decal/industrial/outline/custodial,
@@ -15846,7 +15846,7 @@
/area/abandoned_industrial_station/service)
"Yn" = (
/obj/effect/floor_decal/industrial/outline/custodial,
-/obj/structure/janitorialcart{
+/obj/structure/cart/storage/janitorialcart{
dir = 4
},
/obj/random/dirt_75,
diff --git a/maps/away/away_site/hivebot_hub/hivebot_hub.dmm b/maps/away/away_site/hivebot_hub/hivebot_hub.dmm
index daea0554869..78896f2c050 100644
--- a/maps/away/away_site/hivebot_hub/hivebot_hub.dmm
+++ b/maps/away/away_site/hivebot_hub/hivebot_hub.dmm
@@ -663,7 +663,7 @@
dir = 9
},
/obj/effect/decal/cleanable/dirt,
-/obj/structure/janitorialcart{
+/obj/structure/cart/storage/janitorialcart{
dir = 4
},
/turf/simulated/floor/airless,
diff --git a/maps/away/away_site/konyang/point_verdant/point_verdant.dmm b/maps/away/away_site/konyang/point_verdant/point_verdant.dmm
index 7df45c84979..89e649a7930 100644
--- a/maps/away/away_site/konyang/point_verdant/point_verdant.dmm
+++ b/maps/away/away_site/konyang/point_verdant/point_verdant.dmm
@@ -6460,7 +6460,7 @@
/turf/simulated/floor/asphalt,
/area/point_verdant/outdoors)
"dwp" = (
-/obj/structure/janitorialcart{
+/obj/structure/cart/storage/janitorialcart{
dir = 4
},
/obj/effect/floor_decal/corner_wide/black{
@@ -34812,7 +34812,7 @@
/area/point_verdant/interior/streetvendor)
"uho" = (
/obj/random/dirt_75,
-/obj/structure/janitorialcart/full{
+/obj/structure/cart/storage/janitorialcart/full{
dir = 4
},
/obj/structure/sink/kitchen{
diff --git a/maps/away/away_site/magshield/magshield.dmm b/maps/away/away_site/magshield/magshield.dmm
index c81473d4582..6f05894e251 100644
--- a/maps/away/away_site/magshield/magshield.dmm
+++ b/maps/away/away_site/magshield/magshield.dmm
@@ -3088,7 +3088,7 @@
/turf/template_noop,
/area/magshield/east)
"ji" = (
-/obj/structure/janitorialcart{
+/obj/structure/cart/storage/janitorialcart{
dir = 4
},
/turf/simulated/floor/airless,
diff --git a/maps/away/away_site/sensor_relay/solarian_prewar/sensor_relay.dmm b/maps/away/away_site/sensor_relay/solarian_prewar/sensor_relay.dmm
index 9b2ce669b3e..61e6eec031f 100644
--- a/maps/away/away_site/sensor_relay/solarian_prewar/sensor_relay.dmm
+++ b/maps/away/away_site/sensor_relay/solarian_prewar/sensor_relay.dmm
@@ -1554,7 +1554,7 @@
},
/obj/effect/floor_decal/corner/mauve/diagonal,
/obj/random/dirt_75,
-/obj/structure/janitorialcart/full{
+/obj/structure/cart/storage/janitorialcart/full{
dir = 4
},
/turf/simulated/floor/tiled/white,
diff --git a/maps/away/away_site/uueoaesa/reclamation/ihss_reclamation.dmm b/maps/away/away_site/uueoaesa/reclamation/ihss_reclamation.dmm
index 3cc288f9eda..cd508afa6de 100644
--- a/maps/away/away_site/uueoaesa/reclamation/ihss_reclamation.dmm
+++ b/maps/away/away_site/uueoaesa/reclamation/ihss_reclamation.dmm
@@ -10110,7 +10110,7 @@
/turf/simulated/floor/tiled/dark,
/area/ihss_reclamation/northhall)
"WM" = (
-/obj/structure/janitorialcart/full/water{
+/obj/structure/cart/storage/janitorialcart/full/water{
dir = 4
},
/turf/simulated/floor/tiled/dark,
diff --git a/maps/away/scenarios/enviro_testing_facility/enviro_testing_facility_submaps_layouts.dmm b/maps/away/scenarios/enviro_testing_facility/enviro_testing_facility_submaps_layouts.dmm
index 906a9048c7d..81d0fc9bd43 100644
--- a/maps/away/scenarios/enviro_testing_facility/enviro_testing_facility_submaps_layouts.dmm
+++ b/maps/away/scenarios/enviro_testing_facility/enviro_testing_facility_submaps_layouts.dmm
@@ -2358,7 +2358,7 @@
/turf/simulated/wall,
/area/enviro_testing_facility/inside/hallway/central)
"hX" = (
-/obj/structure/janitorialcart/full/water{
+/obj/structure/cart/storage/janitorialcart/full/water{
dir = 4
},
/obj/effect/floor_decal/corner/mauve{
@@ -10636,7 +10636,7 @@
/turf/simulated/floor/plating,
/area/enviro_testing_facility/inside/operations/storage_long_term)
"Jy" = (
-/obj/structure/janitorialcart/full/water{
+/obj/structure/cart/storage/janitorialcart/full/water{
dir = 4
},
/obj/effect/floor_decal/corner/mauve{
@@ -13505,7 +13505,7 @@
/turf/simulated/floor/tiled/dark,
/area/enviro_testing_facility/inside/hallway/east)
"Tv" = (
-/obj/structure/janitorialcart/full/water{
+/obj/structure/cart/storage/janitorialcart/full/water{
dir = 4
},
/obj/effect/floor_decal/corner/mauve{
diff --git a/maps/away/scenarios/enviro_testing_facility/enviro_testing_facility_submaps_main.dmm b/maps/away/scenarios/enviro_testing_facility/enviro_testing_facility_submaps_main.dmm
index f9fe54da75d..187be978843 100644
--- a/maps/away/scenarios/enviro_testing_facility/enviro_testing_facility_submaps_main.dmm
+++ b/maps/away/scenarios/enviro_testing_facility/enviro_testing_facility_submaps_main.dmm
@@ -18236,7 +18236,7 @@
/turf/unsimulated/marker/blue,
/area/enviro_testing_facility/inside/crew/quarters)
"syU" = (
-/obj/structure/janitorialcart/full/water{
+/obj/structure/cart/storage/janitorialcart/full/water{
dir = 4
},
/obj/effect/floor_decal/corner/mauve{
diff --git a/maps/away/ships/biesel/tcaf_corvette/tcaf_corvette.dmm b/maps/away/ships/biesel/tcaf_corvette/tcaf_corvette.dmm
index 2f0bdf21ae5..a0445355dde 100644
--- a/maps/away/ships/biesel/tcaf_corvette/tcaf_corvette.dmm
+++ b/maps/away/ships/biesel/tcaf_corvette/tcaf_corvette.dmm
@@ -11176,7 +11176,7 @@
/obj/machinery/alarm/south{
req_one_access = list(204)
},
-/obj/structure/janitorialcart{
+/obj/structure/cart/storage/janitorialcart{
dir = 4
},
/obj/item/reagent_containers/glass/bucket,
diff --git a/maps/away/ships/coc/coc_ranger/coc_ship.dmm b/maps/away/ships/coc/coc_ranger/coc_ship.dmm
index fd6e35dd20e..67f681f65a3 100644
--- a/maps/away/ships/coc/coc_ranger/coc_ship.dmm
+++ b/maps/away/ships/coc/coc_ranger/coc_ship.dmm
@@ -4495,7 +4495,7 @@
/obj/machinery/atmospherics/unary/vent_scrubber/on{
dir = 4
},
-/obj/structure/janitorialcart/full,
+/obj/structure/cart/storage/janitorialcart/full,
/turf/simulated/floor/tiled/dark,
/area/ship/ranger_corvette/janitor)
"rzM" = (
diff --git a/maps/away/ships/coc/coc_surveyor/coc_surveyor.dmm b/maps/away/ships/coc/coc_surveyor/coc_surveyor.dmm
index 8ac62752d61..6c49bd0f459 100644
--- a/maps/away/ships/coc/coc_surveyor/coc_surveyor.dmm
+++ b/maps/away/ships/coc/coc_surveyor/coc_surveyor.dmm
@@ -5797,7 +5797,7 @@
"VM" = (
/obj/effect/floor_decal/industrial/outline/yellow,
/obj/item/mop,
-/obj/structure/janitorialcart/full,
+/obj/structure/cart/storage/janitorialcart/full,
/turf/simulated/floor/tiled/dark,
/area/coc_survey_ship/cargo)
"VP" = (
diff --git a/maps/away/ships/dominia/dominian_corvette/dominian_corvette.dmm b/maps/away/ships/dominia/dominian_corvette/dominian_corvette.dmm
index 928cdc25e0b..f1bf4773586 100644
--- a/maps/away/ships/dominia/dominian_corvette/dominian_corvette.dmm
+++ b/maps/away/ships/dominia/dominian_corvette/dominian_corvette.dmm
@@ -7300,7 +7300,7 @@
/obj/effect/floor_decal/industrial/outline_segment/custodial{
dir = 1
},
-/obj/structure/janitorialcart/full/water{
+/obj/structure/cart/storage/janitorialcart/full/water{
dir = 8
},
/obj/random/dirt_75,
diff --git a/maps/away/ships/dominia/dominian_unathi_privateer/dominian_unathi_privateer.dmm b/maps/away/ships/dominia/dominian_unathi_privateer/dominian_unathi_privateer.dmm
index ba8ead9203f..cad25341d19 100644
--- a/maps/away/ships/dominia/dominian_unathi_privateer/dominian_unathi_privateer.dmm
+++ b/maps/away/ships/dominia/dominian_unathi_privateer/dominian_unathi_privateer.dmm
@@ -2263,7 +2263,7 @@
/turf/simulated/floor/plating/cooled,
/area/ship/dominian_unathi/portthrust)
"qq" = (
-/obj/structure/janitorialcart/full,
+/obj/structure/cart/storage/janitorialcart/full,
/obj/item/reagent_containers/glass/bucket,
/turf/simulated/floor/tiled/dark,
/area/ship/dominian_unathi/janitor)
diff --git a/maps/away/ships/golden_deep/golden_deep.dmm b/maps/away/ships/golden_deep/golden_deep.dmm
index dcf70c08fec..3048370cb49 100644
--- a/maps/away/ships/golden_deep/golden_deep.dmm
+++ b/maps/away/ships/golden_deep/golden_deep.dmm
@@ -6779,7 +6779,7 @@
/obj/machinery/light/small{
dir = 4
},
-/obj/structure/janitorialcart{
+/obj/structure/cart/storage/janitorialcart{
dir = 4
},
/obj/item/reagent_containers/glass/bucket,
diff --git a/maps/away/ships/hegemony/hegemony_corvette/hegemony_corvette.dmm b/maps/away/ships/hegemony/hegemony_corvette/hegemony_corvette.dmm
index d392ba64097..e9a47bea021 100644
--- a/maps/away/ships/hegemony/hegemony_corvette/hegemony_corvette.dmm
+++ b/maps/away/ships/hegemony/hegemony_corvette/hegemony_corvette.dmm
@@ -4489,7 +4489,7 @@
/turf/simulated/floor/plating,
/area/shuttle/hegemony)
"Aa" = (
-/obj/structure/janitorialcart/full/water{
+/obj/structure/cart/storage/janitorialcart/full/water{
dir = 4
},
/turf/simulated/floor/tiled,
diff --git a/maps/away/ships/heph/heph_security/heph_security.dmm b/maps/away/ships/heph/heph_security/heph_security.dmm
index 3a436464448..50eecb5e82c 100644
--- a/maps/away/ships/heph/heph_security/heph_security.dmm
+++ b/maps/away/ships/heph/heph_security/heph_security.dmm
@@ -2391,7 +2391,7 @@
dir = 8;
icon_state = "tube_empty"
},
-/obj/structure/janitorialcart,
+/obj/structure/cart/storage/janitorialcart,
/turf/simulated/floor,
/area/heph_security_ship/thrusterport)
"pM" = (
diff --git a/maps/away/ships/himeo/himeo_patrol_ship.dmm b/maps/away/ships/himeo/himeo_patrol_ship.dmm
index 27b9e92b209..b8fae723884 100644
--- a/maps/away/ships/himeo/himeo_patrol_ship.dmm
+++ b/maps/away/ships/himeo/himeo_patrol_ship.dmm
@@ -3588,7 +3588,7 @@
/turf/simulated/floor,
/area/himeo_patrol_ship/generator)
"oN" = (
-/obj/structure/janitorialcart/full/water{
+/obj/structure/cart/storage/janitorialcart/full/water{
dir = 4
},
/obj/effect/floor_decal/industrial/outline/custodial,
diff --git a/maps/away/ships/iac/iac_rescue_ship.dmm b/maps/away/ships/iac/iac_rescue_ship.dmm
index 5efb92c7a41..fd87cef4315 100644
--- a/maps/away/ships/iac/iac_rescue_ship.dmm
+++ b/maps/away/ships/iac/iac_rescue_ship.dmm
@@ -6893,7 +6893,7 @@
/turf/simulated/floor/tiled/white,
/area/shuttle/iac_shuttle)
"pGN" = (
-/obj/structure/janitorialcart{
+/obj/structure/cart/storage/janitorialcart{
dir = 4
},
/turf/simulated/floor/tiled/dark,
diff --git a/maps/away/ships/idris/idris_cruiser.dmm b/maps/away/ships/idris/idris_cruiser.dmm
index ec420dd3e94..5d2711de1e8 100644
--- a/maps/away/ships/idris/idris_cruiser.dmm
+++ b/maps/away/ships/idris/idris_cruiser.dmm
@@ -7667,7 +7667,7 @@
/turf/simulated/floor/tiled,
/area/ship/idris_cruiser/corridor/dockingarm/port)
"BK" = (
-/obj/structure/janitorialcart{
+/obj/structure/cart/storage/janitorialcart{
dir = 4
},
/obj/item/reagent_containers/glass/bucket,
diff --git a/maps/away/ships/orion/orion_express_ship.dmm b/maps/away/ships/orion/orion_express_ship.dmm
index 7610aee84bf..a17f69ca4fb 100644
--- a/maps/away/ships/orion/orion_express_ship.dmm
+++ b/maps/away/ships/orion/orion_express_ship.dmm
@@ -3846,7 +3846,7 @@
/turf/simulated/floor/tiled/white,
/area/ship/orion/forehall)
"nkI" = (
-/obj/structure/janitorialcart/full,
+/obj/structure/cart/storage/janitorialcart/full,
/turf/simulated/floor,
/area/ship/orion/forehall)
"nmt" = (
diff --git a/maps/away/ships/pra/headmaster/headmaster_ship.dmm b/maps/away/ships/pra/headmaster/headmaster_ship.dmm
index 2b0745bb6a1..d72a1fbf2db 100644
--- a/maps/away/ships/pra/headmaster/headmaster_ship.dmm
+++ b/maps/away/ships/pra/headmaster/headmaster_ship.dmm
@@ -9049,7 +9049,7 @@
},
/area/headmaster_ship/cic)
"Ld" = (
-/obj/structure/janitorialcart/full{
+/obj/structure/cart/storage/janitorialcart/full{
dir = 8
},
/obj/effect/floor_decal/industrial/outline_corner/custodial{
diff --git a/maps/away/ships/sol/sol_splf/splf_raider.dmm b/maps/away/ships/sol/sol_splf/splf_raider.dmm
index cb69b6ada41..2049ff8a71b 100644
--- a/maps/away/ships/sol/sol_splf/splf_raider.dmm
+++ b/maps/away/ships/sol/sol_splf/splf_raider.dmm
@@ -5806,7 +5806,7 @@
/obj/machinery/alarm/west,
/obj/effect/floor_decal/industrial/outline/operations,
/obj/random/dirt_75,
-/obj/structure/janitorialcart/full{
+/obj/structure/cart/storage/janitorialcart/full{
dir = 8
},
/turf/simulated/floor/tiled/dark/full,
diff --git a/maps/away/ships/sol/sol_ssrm/ssrm_ship.dmm b/maps/away/ships/sol/sol_ssrm/ssrm_ship.dmm
index 3ea5afd3c93..7616651ae78 100644
--- a/maps/away/ships/sol/sol_ssrm/ssrm_ship.dmm
+++ b/maps/away/ships/sol/sol_ssrm/ssrm_ship.dmm
@@ -1459,7 +1459,7 @@
/area/space)
"dll" = (
/obj/effect/floor_decal/industrial/outline/custodial,
-/obj/structure/janitorialcart/full{
+/obj/structure/cart/storage/janitorialcart/full{
dir = 8
},
/obj/machinery/alarm/north{
diff --git a/maps/away/ships/tirakqi_smuggler/tirakqi_smuggler.dmm b/maps/away/ships/tirakqi_smuggler/tirakqi_smuggler.dmm
index aa236639cb0..f79829c34ed 100644
--- a/maps/away/ships/tirakqi_smuggler/tirakqi_smuggler.dmm
+++ b/maps/away/ships/tirakqi_smuggler/tirakqi_smuggler.dmm
@@ -7063,7 +7063,7 @@
/turf/simulated/floor/shuttle/skrell/blue,
/area/ship/tirakqi_smuggler/hall)
"QR" = (
-/obj/structure/janitorialcart/full{
+/obj/structure/cart/storage/janitorialcart/full{
dir = 8
},
/obj/effect/floor_decal/industrial/outline/emergency_closet,
diff --git a/maps/away/ships/xanu/xanu_frigate.dmm b/maps/away/ships/xanu/xanu_frigate.dmm
index 69aa93f9af3..1001447c096 100644
--- a/maps/away/ships/xanu/xanu_frigate.dmm
+++ b/maps/away/ships/xanu/xanu_frigate.dmm
@@ -12027,7 +12027,7 @@
/area/ship/xanu_frigate/corridor/aft)
"Pj" = (
/obj/effect/floor_decal/corner/purple/full,
-/obj/structure/janitorialcart{
+/obj/structure/cart/storage/janitorialcart{
dir = 8
},
/obj/machinery/power/apc/west,
diff --git a/maps/away/ships/yacht/yacht.dmm b/maps/away/ships/yacht/yacht.dmm
index 0059468cab5..90830caaa2b 100644
--- a/maps/away/ships/yacht/yacht.dmm
+++ b/maps/away/ships/yacht/yacht.dmm
@@ -728,7 +728,7 @@
/turf/simulated/floor/wood/yew,
/area/shuttle/yacht/living)
"cl" = (
-/obj/structure/janitorialcart,
+/obj/structure/cart/storage/janitorialcart,
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/wood/yew,
/area/shuttle/yacht/living)
diff --git a/maps/event/generic_dock/generic_dock-1.dmm b/maps/event/generic_dock/generic_dock-1.dmm
index 2fd9b50c69c..cf14790defe 100644
--- a/maps/event/generic_dock/generic_dock-1.dmm
+++ b/maps/event/generic_dock/generic_dock-1.dmm
@@ -6442,7 +6442,7 @@
/turf/unsimulated/floor/plating,
/area/shuttle/administration)
"gLC" = (
-/obj/structure/janitorialcart/full{
+/obj/structure/cart/storage/janitorialcart/full{
dir = 8
},
/turf/unsimulated/floor{
diff --git a/maps/event/idris_cruise/idris_cruise-1.dmm b/maps/event/idris_cruise/idris_cruise-1.dmm
index 17c39fc82df..e7c7d4eedca 100644
--- a/maps/event/idris_cruise/idris_cruise-1.dmm
+++ b/maps/event/idris_cruise/idris_cruise-1.dmm
@@ -489,7 +489,7 @@
},
/area/cruise/escort)
"arM" = (
-/obj/structure/janitorialcart/full{
+/obj/structure/cart/storage/janitorialcart/full{
dir = 1
},
/obj/item/reagent_containers/glass/bucket,
@@ -1360,7 +1360,7 @@
},
/area/cruise/fore_s)
"aWs" = (
-/obj/structure/janitorialcart/full{
+/obj/structure/cart/storage/janitorialcart/full{
dir = 1
},
/obj/item/reagent_containers/glass/bucket,
diff --git a/maps/event/rooftop/rooftop-1.dmm b/maps/event/rooftop/rooftop-1.dmm
index 0483a9d0dcd..dc249ec72dc 100644
--- a/maps/event/rooftop/rooftop-1.dmm
+++ b/maps/event/rooftop/rooftop-1.dmm
@@ -4750,7 +4750,7 @@
},
/area/city/mendell)
"BK" = (
-/obj/structure/janitorialcart/full{
+/obj/structure/cart/storage/janitorialcart/full{
dir = 8
},
/turf/simulated/floor/tiled/dark,
diff --git a/maps/random_ruins/exoplanets/moghes/moghes_bar.dmm b/maps/random_ruins/exoplanets/moghes/moghes_bar.dmm
index 5feb61e24f5..49ec4fc5335 100644
--- a/maps/random_ruins/exoplanets/moghes/moghes_bar.dmm
+++ b/maps/random_ruins/exoplanets/moghes/moghes_bar.dmm
@@ -1560,7 +1560,7 @@
},
/area/moghes_bar)
"WN" = (
-/obj/structure/janitorialcart/full,
+/obj/structure/cart/storage/janitorialcart/full,
/obj/item/clothing/gloves/janitor/unathi,
/obj/effect/floor_decal/spline/fancy/wood{
dir = 5
diff --git a/maps/random_ruins/exoplanets/ouerea/ouerea_bar.dmm b/maps/random_ruins/exoplanets/ouerea/ouerea_bar.dmm
index ade946ca244..b578db33256 100644
--- a/maps/random_ruins/exoplanets/ouerea/ouerea_bar.dmm
+++ b/maps/random_ruins/exoplanets/ouerea/ouerea_bar.dmm
@@ -8,7 +8,7 @@
},
/area/ouerea_bar)
"ah" = (
-/obj/structure/janitorialcart/full,
+/obj/structure/cart/storage/janitorialcart/full,
/obj/item/clothing/gloves/janitor/unathi,
/turf/simulated/floor/exoplanet/wood{
temperature = 298.15
diff --git a/maps/sccv_horizon/sccv_horizon.dmm b/maps/sccv_horizon/sccv_horizon.dmm
index 3c40ed7e6cb..41837333a63 100644
--- a/maps/sccv_horizon/sccv_horizon.dmm
+++ b/maps/sccv_horizon/sccv_horizon.dmm
@@ -26917,6 +26917,7 @@
dir = 4
},
/obj/machinery/light,
+/obj/structure/cart/storage/parcelcart,
/turf/simulated/floor/tiled,
/area/horizon/operations/mail_room)
"dJp" = (
@@ -41163,7 +41164,7 @@
dir = 10
},
/obj/effect/floor_decal/industrial/outline/custodial,
-/obj/structure/janitorialcart,
+/obj/structure/cart/storage/janitorialcart,
/turf/simulated/floor/tiled,
/area/horizon/service/custodial)
"fNz" = (
@@ -60210,7 +60211,7 @@
/turf/simulated/floor/tiled,
/area/horizon/security/brig)
"iuN" = (
-/obj/structure/janitorialcart/full{
+/obj/structure/cart/storage/janitorialcart/full{
dir = 8
},
/turf/unsimulated/floor{
@@ -76724,7 +76725,7 @@
/turf/simulated/floor/plating,
/area/horizon/maintenance/deck_1/auxatmos)
"kMw" = (
-/obj/structure/janitorialcart/full{
+/obj/structure/cart/storage/janitorialcart/full{
dir = 8
},
/turf/unsimulated/floor/plating,
@@ -89353,7 +89354,7 @@
dir = 10
},
/obj/effect/floor_decal/industrial/outline/custodial,
-/obj/structure/janitorialcart,
+/obj/structure/cart/storage/janitorialcart,
/turf/simulated/floor/tiled,
/area/horizon/service/custodial)
"mFX" = (
@@ -156202,7 +156203,7 @@
"wgu" = (
/obj/machinery/light,
/obj/effect/floor_decal/industrial/outline/engineering,
-/obj/structure/engineeringcart/half_filled{
+/obj/structure/cart/storage/engineeringcart/half_filled{
dir = 4
},
/turf/simulated/floor/tiled/dark/full,
@@ -161372,7 +161373,7 @@
dir = 4
},
/obj/machinery/firealarm/east,
-/obj/structure/janitorialcart{
+/obj/structure/cart/storage/janitorialcart{
dir = 4
},
/turf/simulated/floor/tiled,
@@ -164689,7 +164690,7 @@
/obj/effect/floor_decal/corner/grey/diagonal{
dir = 4
},
-/obj/structure/janitorialcart/full{
+/obj/structure/cart/storage/janitorialcart/full{
dir = 8
},
/turf/unsimulated/floor,
diff --git a/maps/sccv_horizon/submaps/ops_warehouse_small_storage.dmm b/maps/sccv_horizon/submaps/ops_warehouse_small_storage.dmm
index 622baec97dc..13f47ec77f0 100644
--- a/maps/sccv_horizon/submaps/ops_warehouse_small_storage.dmm
+++ b/maps/sccv_horizon/submaps/ops_warehouse_small_storage.dmm
@@ -296,7 +296,7 @@
/turf/template_noop,
/area/template_noop)
"hs" = (
-/obj/structure/janitorialcart,
+/obj/structure/cart/storage/janitorialcart,
/turf/template_noop,
/area/template_noop)
"ht" = (
@@ -1529,7 +1529,7 @@
/turf/template_noop,
/area/template_noop)
"NJ" = (
-/obj/structure/janitorialcart/full,
+/obj/structure/cart/storage/janitorialcart/full,
/turf/template_noop,
/area/template_noop)
"NR" = (