Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions aurorastation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand Down Expand Up @@ -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"
Expand Down
4 changes: 2 additions & 2 deletions code/game/machinery/doors/door.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
141 changes: 141 additions & 0 deletions code/game/objects/structures/carts/carts.dm
Original file line number Diff line number Diff line change
@@ -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 <b>CTRL-Click</b> 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 <b>wrench</b> or a <b>welder</b>. Or a <b>plasma cutter</b>, 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("<b>[user]</b> 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()
. = ..()
Loading
Loading