From b61f4f3ff8b6014d0507248598d2c1abe1b5e390 Mon Sep 17 00:00:00 2001 From: warriorstar-orion Date: Sat, 28 Sep 2024 18:28:44 -0400 Subject: [PATCH] feat: Storage shelves and gun racks. (#26744) * feat: Storage shelves and gun racks. * Apply suggestions from code review Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Signed-off-by: warriorstar-orion * review comments * better examine * fix lint * Examine for empty shelves * Apply suggestions from code review Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> Signed-off-by: warriorstar-orion * rest of review comments --------- Signed-off-by: warriorstar-orion Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> --- _maps/map_files/stations/boxstation.dmm | 83 ++--- _maps/map_files/stations/cerestation.dmm | 322 +++++++++--------- _maps/map_files/stations/deltastation.dmm | 40 ++- _maps/map_files/stations/metastation.dmm | 36 +- code/__DEFINES/dcs/movable_signals.dm | 2 + code/__DEFINES/dcs/obj_signals.dm | 13 + code/datums/components/shelved.dm | 290 ++++++++++++++++ code/game/atoms_movable.dm | 1 + .../spawners/random/furniture_spawners.dm | 18 + code/game/objects/items/crayons.dm | 3 + .../items/stacks/sheets/sheet_types.dm | 2 + code/game/objects/structures/shelves.dm | 139 ++++++++ icons/effects/random_spawners.dmi | Bin 14506 -> 14960 bytes icons/obj/structures.dmi | Bin 14077 -> 23944 bytes icons/obj/structures/shelves.dmi | Bin 0 -> 2689 bytes paradise.dme | 3 + 16 files changed, 696 insertions(+), 256 deletions(-) create mode 100644 code/datums/components/shelved.dm create mode 100644 code/game/objects/effects/spawners/random/furniture_spawners.dm create mode 100644 code/game/objects/structures/shelves.dm create mode 100644 icons/obj/structures/shelves.dmi diff --git a/_maps/map_files/stations/boxstation.dmm b/_maps/map_files/stations/boxstation.dmm index 942ebda57b2..c5a0337434f 100644 --- a/_maps/map_files/stations/boxstation.dmm +++ b/_maps/map_files/stations/boxstation.dmm @@ -1537,7 +1537,6 @@ /turf/space, /area/shuttle/gamma/station) "ahG" = ( -/obj/structure/rack, /obj/item/gun/projectile/shotgun/riot{ pixel_x = -3; pixel_y = -3 @@ -1547,13 +1546,7 @@ pixel_y = 3 }, /obj/item/gun/projectile/shotgun/riot, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, +/obj/structure/gunrack, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -1676,7 +1669,6 @@ }, /area/station/security/brig) "aif" = ( -/obj/structure/rack, /obj/item/storage/box/teargas{ pixel_x = -3; pixel_y = -3 @@ -1696,6 +1688,7 @@ /obj/structure/window/reinforced{ dir = 4 }, +/obj/structure/shelf/security, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -1768,7 +1761,6 @@ }, /area/station/security/armory/secure) "aiq" = ( -/obj/structure/rack, /obj/structure/window/reinforced{ dir = 1 }, @@ -1781,9 +1773,7 @@ pixel_x = -3; pixel_y = -3 }, -/obj/structure/window/reinforced{ - dir = 4 - }, +/obj/structure/gunrack, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -1928,7 +1918,6 @@ }, /area/station/security/brig) "aiN" = ( -/obj/structure/rack, /obj/item/gun/energy/gun{ pixel_x = 3; pixel_y = 3 @@ -1938,9 +1927,7 @@ pixel_x = -3; pixel_y = -3 }, -/obj/structure/window/reinforced{ - dir = 4 - }, +/obj/structure/gunrack, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -2234,7 +2221,6 @@ }, /area/station/security/armory/secure) "ajr" = ( -/obj/structure/rack, /obj/structure/window/reinforced, /obj/item/gun/energy/disabler{ pixel_x = 3; @@ -2245,9 +2231,7 @@ pixel_x = -3; pixel_y = -3 }, -/obj/structure/window/reinforced{ - dir = 4 - }, +/obj/structure/gunrack, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -8723,7 +8707,6 @@ /obj/item/stack/rods{ amount = 50 }, -/obj/structure/rack, /obj/item/stack/cable_coil{ pixel_x = -3; pixel_y = 3 @@ -8732,6 +8715,7 @@ amount = 5 }, /obj/effect/decal/cleanable/dirt, +/obj/structure/shelf/engineering, /turf/simulated/floor/plasteel, /area/station/maintenance/electrical) "aCV" = ( @@ -16306,10 +16290,6 @@ }, /area/station/ai_monitored/storage/eva) "baj" = ( -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, /obj/item/clothing/shoes/magboots{ pixel_x = 2; pixel_y = 2 @@ -16330,6 +16310,7 @@ pixel_x = 2; pixel_y = 2 }, +/obj/structure/shelf/command, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -21853,9 +21834,9 @@ /turf/simulated/floor/plasteel, /area/station/hallway/secondary/entry/lounge) "bpG" = ( -/obj/structure/table, /obj/item/reagent_containers/glass/bucket, /obj/item/reagent_containers/glass/bucket, +/obj/structure/shelf/service, /turf/simulated/floor/plasteel{ icon_state = "hydrofloor" }, @@ -26020,9 +26001,9 @@ }, /area/station/science/robotics) "bEO" = ( -/obj/structure/rack, /obj/effect/spawner/random_spawners/cobweb_left_frequent, /obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/storage, /obj/effect/spawner/random/maintenance, /turf/simulated/floor/plasteel, /area/station/maintenance/apmaint) @@ -27657,10 +27638,6 @@ }, /area/station/hallway/primary/central/west) "bKT" = ( -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, /obj/item/storage/belt/utility, /obj/item/clothing/head/welding{ pixel_x = -3; @@ -27670,6 +27647,7 @@ pixel_x = -3 }, /obj/item/clothing/glasses/welding, +/obj/structure/shelf/science, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitepurple" @@ -28790,7 +28768,7 @@ pixel_x = 6; pixel_y = -2 }, -/obj/structure/rack, +/obj/structure/shelf/medbay, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "whiteyellow" @@ -42608,10 +42586,6 @@ }, /area/station/engineering/smes) "cOf" = ( -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, /obj/item/tank/internals/emergency_oxygen/engi, /obj/item/clothing/suit/storage/hazardvest/staff, /obj/item/clothing/suit/storage/hazardvest/staff, @@ -42625,6 +42599,7 @@ name = "west bump"; pixel_x = -28 }, +/obj/structure/shelf/engineering, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "caution" @@ -42840,10 +42815,6 @@ /turf/simulated/wall/r_wall, /area/station/engineering/atmos/distribution) "cOY" = ( -/obj/structure/rack{ - dir = 8; - layer = 2.9 - }, /obj/item/clothing/suit/storage/hazardvest/staff, /obj/item/tank/internals/emergency_oxygen/engi, /obj/item/clothing/suit/storage/hazardvest/staff, @@ -42860,6 +42831,7 @@ d2 = 4; icon_state = "0-4" }, +/obj/structure/shelf/engineering, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "caution" @@ -43793,7 +43765,6 @@ }, /area/station/science/xenobiology) "cSh" = ( -/obj/structure/table, /obj/item/clothing/glasses/science{ pixel_y = 4 }, @@ -43801,6 +43772,7 @@ /obj/structure/sign/poster/official/safety_eye_protection{ pixel_y = 32 }, +/obj/structure/shelf/science, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whitepurple" @@ -55500,6 +55472,11 @@ icon_state = "redcorner" }, /area/station/security/prisonershuttle) +"fvC" = ( +/obj/effect/spawner/random/storage, +/obj/effect/spawner/random/maintenance, +/turf/simulated/floor/plating, +/area/station/maintenance/fsmaint) "fvV" = ( /obj/structure/table, /obj/item/toy/crayon/spraycan, @@ -56738,7 +56715,6 @@ /area/station/public/dorms) "gdp" = ( /obj/machinery/alarm/directional/west, -/obj/structure/rack, /obj/item/clothing/head/helmet/space/plasmaman{ pixel_x = -3; pixel_y = 2 @@ -56757,6 +56733,7 @@ pixel_x = -3; pixel_y = 2 }, +/obj/structure/shelf/medbay, /turf/simulated/floor/plasteel{ icon_state = "darkred" }, @@ -63922,10 +63899,6 @@ /turf/simulated/floor/plating, /area/station/security/permabrig) "jFJ" = ( -/obj/structure/rack{ - dir = 1 - }, -/obj/item/storage/box/lights/mixed, /obj/item/storage/box/lights/mixed, /obj/item/storage/box/lights/mixed, /obj/item/storage/box/lights/mixed, @@ -63937,6 +63910,7 @@ name = "west bump"; pixel_x = -28 }, +/obj/structure/shelf/service, /turf/simulated/floor/plasteel, /area/station/service/janitor) "jGd" = ( @@ -71170,6 +71144,11 @@ icon_state = "neutralfull" }, /area/station/hallway/secondary/exit) +"njn" = ( +/obj/effect/spawner/random/storage, +/obj/effect/spawner/random/maintenance, +/turf/simulated/floor/plating, +/area/station/maintenance/apmaint) "nju" = ( /obj/structure/disposalpipe/segment/corner{ dir = 4 @@ -71613,7 +71592,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/fpmaint2) "nyC" = ( -/obj/structure/rack, +/obj/effect/spawner/random/storage, /turf/simulated/floor/plating, /area/station/maintenance/aft) "nzc" = ( @@ -86237,7 +86216,6 @@ pixel_x = -4 }, /obj/item/tank/internals/emergency_oxygen/nitrogen, -/obj/structure/rack, /obj/item/tank/internals/emergency_oxygen/plasma{ pixel_x = 5 }, @@ -86246,6 +86224,7 @@ }, /obj/item/clothing/mask/breath/vox, /obj/item/clothing/mask/breath/vox, +/obj/structure/shelf/medbay, /turf/simulated/floor/plasteel{ icon_state = "darkbluefull" }, @@ -118962,8 +118941,8 @@ cwl wFR fnV cwz -sCW -sCW +njn +njn cgQ dCM ieW @@ -135609,7 +135588,7 @@ aHb aHb aOG aGX -aHb +fvC aOG aGY aTg diff --git a/_maps/map_files/stations/cerestation.dmm b/_maps/map_files/stations/cerestation.dmm index 6c25b7379ce..cd57fa0c0e3 100644 --- a/_maps/map_files/stations/cerestation.dmm +++ b/_maps/map_files/stations/cerestation.dmm @@ -2332,8 +2332,8 @@ }, /area/station/security/permabrig) "aoE" = ( -/obj/structure/table, /obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/storage, /turf/simulated/floor/plating, /area/station/maintenance/disposal/northeast) "aoF" = ( @@ -6850,12 +6850,6 @@ /obj/effect/mapping_helpers/airlock/access/all/engineering/maintenance, /turf/simulated/floor/plating, /area/station/maintenance/disposal/east) -"aUB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/turf/simulated/floor/plasteel{ - icon_state = "darkgreenfull" - }, -/area/station/service/hydroponics) "aUE" = ( /obj/machinery/light{ dir = 8 @@ -15137,7 +15131,6 @@ }, /area/station/science/genetics) "bLf" = ( -/obj/structure/rack, /obj/item/gun/projectile/shotgun/riot{ pixel_x = -3; pixel_y = 3 @@ -15147,16 +15140,10 @@ pixel_x = 3; pixel_y = -3 }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, /obj/machinery/camera{ c_tag = "Brig Secure Armory" }, +/obj/structure/gunrack, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -15222,6 +15209,9 @@ pixel_x = 3; pixel_y = -3 }, +/obj/structure/window/reinforced{ + dir = 8 + }, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -18675,9 +18665,6 @@ /obj/item/clothing/head/helmet/alt, /obj/item/clothing/suit/armor/bulletproof, /obj/item/clothing/head/helmet/alt, -/obj/structure/window/reinforced{ - dir = 8 - }, /obj/structure/window/reinforced, /turf/simulated/floor/plasteel{ dir = 8; @@ -18685,7 +18672,6 @@ }, /area/station/security/armory/secure) "ccO" = ( -/obj/structure/rack, /obj/item/gun/energy/disabler{ pixel_x = -3; pixel_y = 3 @@ -18699,6 +18685,7 @@ dir = 4 }, /obj/structure/window/reinforced, +/obj/structure/gunrack, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -19397,7 +19384,6 @@ }, /area/station/security/warden) "cgG" = ( -/obj/structure/rack, /obj/item/storage/box/seccarts{ pixel_x = 3; pixel_y = 2 @@ -19412,17 +19398,16 @@ pixel_x = -3; pixel_y = -3 }, -/obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 4 }, +/obj/structure/shelf/security, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" }, /area/station/security/armory/secure) "cgL" = ( -/obj/structure/rack, /obj/item/gun/energy/laser{ pixel_x = -3; pixel_y = 3 @@ -19432,20 +19417,13 @@ pixel_x = 3; pixel_y = -3 }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, +/obj/structure/gunrack, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" }, /area/station/security/armory/secure) "cgR" = ( -/obj/structure/rack, /obj/item/gun/energy/gun{ pixel_x = -3; pixel_y = 3 @@ -19458,10 +19436,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/window/reinforced{ - dir = 1; - layer = 2.9 - }, +/obj/structure/gunrack, /turf/simulated/floor/plasteel{ dir = 8; icon_state = "vault" @@ -26914,11 +26889,6 @@ icon_state = "redcorner" }, /area/station/security/prison/cell_block/A) -"dcR" = ( -/obj/structure/table, -/obj/effect/spawner/random/maintenance, -/turf/simulated/floor/plating/asteroid/ancient, -/area/station/maintenance/port) "dda" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 8 @@ -28052,6 +28022,17 @@ /obj/machinery/ai_status_display, /turf/simulated/wall/r_wall, /area/station/security/prisonlockers) +"dkb" = ( +/obj/machinery/requests_console/directional/south, +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/turf/simulated/floor/plasteel{ + icon_state = "grimy" + }, +/area/station/security/detective) "dkc" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 @@ -33867,11 +33848,11 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/structure/rack, /obj/effect/spawner/random/maintenance, /obj/structure/window/basic{ dir = 8 }, +/obj/effect/spawner/random/storage, /turf/simulated/floor/plating, /area/station/maintenance/disposal) "eot" = ( @@ -35929,12 +35910,6 @@ }, /turf/simulated/floor/plating, /area/station/maintenance/port) -"eTe" = ( -/obj/machinery/hologram/holopad, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/station/service/hydroponics) "eTg" = ( /obj/machinery/recharge_station, /turf/simulated/floor/plasteel{ @@ -35981,7 +35956,8 @@ /turf/simulated/floor/grass, /area/station/hallway/spacebridge/scidock) "eTI" = ( -/obj/effect/decal/cleanable/blood/splatter, +/obj/structure/table, +/obj/effect/spawner/random/maintenance, /turf/simulated/floor/plating/asteroid/ancient, /area/station/maintenance/port) "eTJ" = ( @@ -36443,9 +36419,9 @@ /turf/simulated/floor/plating, /area/station/engineering/smes) "fcE" = ( -/obj/structure/table, /obj/item/stack/packageWrap, /obj/item/destTagger, +/obj/structure/shelf/command, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "darkblue" @@ -37654,6 +37630,13 @@ }, /turf/simulated/floor/plating, /area/station/hallway/primary/central/west) +"fvV" = ( +/obj/structure/chair/office/dark{ + dir = 4 + }, +/obj/effect/landmark/start/detective, +/turf/simulated/floor/carpet, +/area/station/security/detective) "fwd" = ( /obj/effect/decal/cleanable/crayon, /turf/simulated/floor/wood, @@ -38774,6 +38757,12 @@ icon_state = "dark" }, /area/station/engineering/control) +"fPD" = ( +/obj/structure/reagent_dispensers/fueltank, +/turf/simulated/floor/plating{ + icon_state = "asteroidplating" + }, +/area/station/maintenance/port) "fPE" = ( /obj/structure/disposalpipe/segment/corner{ dir = 4 @@ -41282,25 +41271,6 @@ icon_state = "whitepurple" }, /area/station/science/genetics) -"gEI" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Walkway" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/preopen{ - id_tag = "servlockdown"; - layer = 2.6; - name = "Service Lockdown" - }, -/obj/structure/disposalpipe/segment{ - color = "#954535" - }, -/obj/effect/turf_decal/caution/red, -/turf/simulated/floor/plasteel{ - dir = 8; - icon_state = "neutralcorner" - }, -/area/station/hallway/spacebridge/sercom) "gEJ" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 @@ -43834,7 +43804,6 @@ /area/station/service/bar) "htz" = ( /obj/effect/spawner/random_spawners/dirt_often, -/obj/effect/turf_decal/delivery, /turf/simulated/floor/plasteel{ icon_state = "darkgreenfull" }, @@ -44696,11 +44665,11 @@ pixel_x = 8; pixel_y = 2 }, -/obj/structure/table/glass, /obj/item/radio/intercom{ pixel_y = 28; name = "custom placement" }, +/obj/structure/shelf/medbay, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "whiteblue" @@ -44900,8 +44869,8 @@ d2 = 2; icon_state = "1-2" }, -/obj/structure/rack, /obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/storage, /turf/simulated/floor/plating, /area/station/maintenance/fore2) "hIo" = ( @@ -46238,12 +46207,12 @@ /turf/simulated/floor/carpet/blue, /area/station/command/office/blueshield) "hZk" = ( -/obj/structure/rack, /obj/item/storage/belt/utility, /obj/item/storage/belt/utility, /obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas, /obj/item/clothing/mask/gas, +/obj/structure/shelf/engineering, /turf/simulated/floor/plasteel{ icon_state = "darkyellow" }, @@ -47286,6 +47255,13 @@ icon_state = "browncorner" }, /area/station/hallway/primary/fore/east) +"inP" = ( +/obj/structure/rack, +/obj/effect/spawner/random/maintenance, +/turf/simulated/floor/plating{ + icon_state = "asteroidplating" + }, +/area/station/maintenance/port) "inQ" = ( /obj/machinery/door/airlock/maintenance{ name = "Port Asteroid Maintenance" @@ -50504,6 +50480,21 @@ icon_state = "dark" }, /area/station/hallway/primary/starboard/south) +"jeu" = ( +/obj/machinery/hologram/holopad, +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/station/service/hydroponics) "jeB" = ( /obj/structure/transit_tube/station/reverse/flipped{ dir = 4 @@ -51168,6 +51159,22 @@ /obj/structure/disposalpipe/segment, /turf/simulated/floor/plasteel, /area/station/security/lobby) +"joS" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ + dir = 4 + }, +/obj/structure/cable/orange{ + d1 = 4; + d2 = 8; + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/hidden/supply{ + dir = 4 + }, +/turf/simulated/floor/plasteel{ + icon_state = "dark" + }, +/area/station/service/hydroponics) "joZ" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 @@ -51969,8 +51976,8 @@ /turf/simulated/floor/plasteel/white, /area/station/command/office/rd) "jyk" = ( -/obj/structure/rack, /obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/storage, /turf/simulated/floor/plating, /area/station/maintenance/fsmaint) "jyn" = ( @@ -55810,15 +55817,6 @@ /area/station/medical/medbay) "kAT" = ( /obj/machinery/hologram/holopad, -/obj/structure/cable/orange{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/supply{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -57780,12 +57778,6 @@ }, /turf/simulated/floor/plating, /area/station/maintenance/port) -"lhc" = ( -/obj/effect/spawner/random_spawners/dirt_often, -/turf/simulated/floor/plasteel{ - icon_state = "darkgreenfull" - }, -/area/station/service/hydroponics) "lhf" = ( /obj/effect/spawner/window/reinforced/grilled, /obj/structure/cable/orange{ @@ -58019,6 +58011,10 @@ }, /turf/simulated/floor/plasteel/freezer, /area/station/service/kitchen) +"ljz" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/simulated/floor/plating/asteroid/ancient, +/area/station/maintenance/port) "ljL" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/disposalpipe/segment, @@ -61319,11 +61315,12 @@ /turf/simulated/floor/plating, /area/station/maintenance/port) "mgq" = ( -/obj/structure/reagent_dispensers/fueltank, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" +/obj/effect/spawner/random_spawners/dirt_often, +/obj/effect/turf_decal/delivery, +/turf/simulated/floor/plasteel{ + icon_state = "darkgreenfull" }, -/area/station/maintenance/port) +/area/station/service/hydroponics) "mgu" = ( /obj/docking_port/stationary{ dir = 4; @@ -65409,16 +65406,8 @@ /turf/simulated/floor/plating, /area/station/engineering/tech_storage) "nsy" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ - dir = 4 - }, -/obj/structure/cable/orange{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/hidden/supply{ - dir = 4 +/obj/machinery/atmospherics/unary/vent_pump/on{ + dir = 1 }, /turf/simulated/floor/plasteel{ icon_state = "dark" @@ -68212,17 +68201,6 @@ }, /turf/simulated/floor/plating, /area/station/maintenance/asmaint) -"olh" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/simulated/floor/plasteel{ - icon_state = "darkgreenfull" - }, -/area/station/service/hydroponics) "olr" = ( /obj/structure/table, /obj/item/paper{ @@ -84532,14 +84510,6 @@ icon_state = "asteroidplating" }, /area/station/maintenance/port) -"sNb" = ( -/obj/machinery/atmospherics/unary/vent_pump/on{ - dir = 1 - }, -/turf/simulated/floor/plasteel{ - icon_state = "dark" - }, -/area/station/service/hydroponics) "sNm" = ( /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/line{ @@ -87195,12 +87165,12 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/table, /obj/item/stack/packageWrap, /obj/item/destTagger{ pixel_x = 4; pixel_y = 3 }, +/obj/structure/shelf/science, /turf/simulated/floor/plasteel{ icon_state = "whitepurple" }, @@ -87468,6 +87438,22 @@ /obj/item/storage/backpack/satchel/explorer, /turf/simulated/floor/plating/asteroid/ancient, /area/station/maintenance/starboard) +"tDi" = ( +/obj/item/storage/bag/plants/portaseeder, +/obj/item/storage/bag/plants/portaseeder, +/obj/item/storage/bag/plants, +/obj/item/storage/bag/plants, +/obj/structure/shelf/service, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/simulated/floor/plasteel{ + icon_state = "darkgreenfull" + }, +/area/station/service/hydroponics) "tDm" = ( /obj/machinery/firealarm/directional/south, /turf/simulated/floor/plasteel{ @@ -88048,6 +88034,12 @@ /obj/effect/spawner/airlock/s_to_n, /turf/simulated/wall, /area/station/hallway/primary/central/north) +"tMD" = ( +/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/turf/simulated/floor/plasteel{ + icon_state = "darkgreenfull" + }, +/area/station/service/hydroponics) "tMN" = ( /obj/machinery/door/airlock/external{ id_tag = "laborcamp_home"; @@ -92059,7 +92051,7 @@ /turf/simulated/floor/plating, /area/station/engineering/tech_storage) "uQB" = ( -/obj/machinery/atmospherics/pipe/simple/hidden/supply, +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/simulated/floor/plasteel{ icon_state = "darkgreenfull" }, @@ -99330,7 +99322,6 @@ }, /area/station/public/fitness) "wOh" = ( -/obj/structure/table, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -99343,6 +99334,7 @@ name = "south bump"; pixel_y = -28 }, +/obj/structure/shelf/supply, /turf/simulated/floor/plasteel{ icon_state = "darkbrown" }, @@ -102017,13 +102009,25 @@ icon_state = "dark" }, /area/station/engineering/control) -"xCH" = ( -/obj/structure/rack, -/obj/effect/spawner/random/maintenance, -/turf/simulated/floor/plating{ - icon_state = "asteroidplating" +"xCu" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Walkway" }, -/area/station/maintenance/port) +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/preopen{ + id_tag = "servlockdown"; + layer = 2.6; + name = "Service Lockdown" + }, +/obj/structure/disposalpipe/segment{ + color = "#954535" + }, +/obj/effect/turf_decal/caution/red, +/turf/simulated/floor/plasteel{ + dir = 8; + icon_state = "neutralcorner" + }, +/area/station/hallway/spacebridge/sercom) "xCR" = ( /obj/machinery/computer/security/telescreen/entertainment, /turf/simulated/mineral/ancient, @@ -102400,13 +102404,6 @@ /obj/machinery/light/small, /turf/simulated/floor/plating/asteroid/ancient, /area/station/maintenance/port) -"xHt" = ( -/obj/structure/chair/office/dark{ - dir = 4 - }, -/obj/effect/landmark/start/detective, -/turf/simulated/floor/carpet, -/area/station/security/detective) "xHF" = ( /obj/structure/cable/orange{ d1 = 4; @@ -103232,17 +103229,6 @@ icon_state = "whitepurple" }, /area/station/maintenance/apmaint) -"xTG" = ( -/obj/machinery/requests_console/directional/south, -/obj/structure/cable/orange{ - d1 = 4; - d2 = 8; - icon_state = "4-8" - }, -/turf/simulated/floor/plasteel{ - icon_state = "grimy" - }, -/area/station/security/detective) "xTL" = ( /turf/simulated/floor/plasteel{ icon_state = "white" @@ -113294,7 +113280,7 @@ rho uSf ygl wzC -mgq +fPD aXn aXn aXn @@ -113551,7 +113537,7 @@ aXn wGX ygl wzC -xCH +inP aXn aXn aXn @@ -114587,7 +114573,7 @@ eHn ohJ gUw xZV -eTI +ljz iuf mkL aXn @@ -115104,7 +115090,7 @@ aXn aXn dLa hwS -eTI +ljz kad uCK aXn @@ -116086,7 +116072,7 @@ eHu aXn aXn aXn -xCH +inP eCI ltk wzC @@ -117875,7 +117861,7 @@ uCK aXn aXn hvI -dcR +eTI pAV pXy dHZ @@ -119922,7 +119908,7 @@ aXn aXn eCI pDl -xCH +inP aXn aXn ock @@ -120156,8 +120142,8 @@ chV evL qwd pPN -xHt -xTG +fvV +dkb emw abW nxA @@ -122795,7 +122781,7 @@ btd btd uql cBs -nsy +joS cBs cBs biB @@ -122998,7 +122984,7 @@ bpf pbY pbY pbY -gEI +xCu abT jSU grv @@ -123052,9 +123038,9 @@ cuk prN mcu pcu -kAT +jeu jKU -sNb +nsy biB hqe btd @@ -123829,7 +123815,7 @@ biB biB xNP biB -eTe +kAT kDy biB etV @@ -124344,7 +124330,7 @@ glI gIv uCO noy -olh +tDi nWX qxR btd @@ -124603,7 +124589,7 @@ lJR lJR btd pNE -htz +mgq btd cEM eQC @@ -125364,11 +125350,11 @@ muv lYO riS mcu -aUB -aUB -aUB -hpP uQB +uQB +uQB +hpP +tMD haI lUc xAS @@ -125621,7 +125607,7 @@ baF jUW fPp cxx -lhc +htz xnz wFD rxy diff --git a/_maps/map_files/stations/deltastation.dmm b/_maps/map_files/stations/deltastation.dmm index 18e3bccec2b..d99242fca89 100644 --- a/_maps/map_files/stations/deltastation.dmm +++ b/_maps/map_files/stations/deltastation.dmm @@ -2805,10 +2805,9 @@ }, /area/station/maintenance/fore2) "aqn" = ( -/obj/structure/rack, -/obj/item/crowbar, -/obj/effect/spawner/random/maintenance, /obj/effect/decal/cleanable/dirt, +/obj/effect/spawner/random/storage, +/obj/effect/spawner/random/maintenance, /turf/simulated/floor/plasteel{ icon_state = "neutral" }, @@ -17818,12 +17817,12 @@ /area/station/service/kitchen) "bdN" = ( /obj/machinery/alarm/directional/west, -/obj/structure/rack, /obj/item/stack/packageWrap, /obj/item/hand_labeler, /obj/item/book/manual/wiki/chef_recipes, /obj/effect/turf_decal/delivery/hollow, /obj/item/wrench, +/obj/structure/shelf/service, /turf/simulated/floor/plasteel{ icon_state = "white" }, @@ -20864,7 +20863,6 @@ }, /area/station/security/processing) "bme" = ( -/obj/structure/rack, /obj/item/gun/energy/laser{ pixel_x = 3; pixel_y = 3 @@ -20875,6 +20873,7 @@ pixel_y = -3 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/gunrack, /turf/simulated/floor/plasteel/dark, /area/station/security/armory/secure) "bmg" = ( @@ -21366,7 +21365,6 @@ name = "west bump"; pixel_x = -30 }, -/obj/structure/rack, /obj/item/storage/toolbox/emergency{ pixel_x = 3; pixel_y = -4 @@ -21377,6 +21375,7 @@ /obj/item/pickaxe, /obj/item/pickaxe, /obj/effect/turf_decal/delivery/hollow, +/obj/structure/shelf/supply, /turf/simulated/floor/plasteel, /area/station/supply/miningdock) "bnk" = ( @@ -22776,7 +22775,6 @@ }, /area/station/security/processing) "bqW" = ( -/obj/structure/rack, /obj/item/gun/projectile/shotgun/riot{ pixel_x = 3; pixel_y = 3 @@ -22787,6 +22785,7 @@ pixel_y = -3 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, +/obj/structure/gunrack, /turf/simulated/floor/plasteel/dark, /area/station/security/armory/secure) "bqX" = ( @@ -27819,7 +27818,6 @@ }, /area/station/public/storage/tools) "bDP" = ( -/obj/structure/table/reinforced, /obj/item/stack/rods, /obj/item/stack/cable_coil/random, /obj/item/stack/cable_coil/random, @@ -27829,6 +27827,7 @@ icon_state = "0-4" }, /obj/effect/turf_decal/delivery/hollow, +/obj/structure/shelf, /turf/simulated/floor/plasteel, /area/station/public/storage/tools) "bDQ" = ( @@ -28504,7 +28503,6 @@ /turf/simulated/floor/carpet, /area/station/command/bridge) "bFL" = ( -/obj/structure/rack, /obj/item/storage/toolbox/emergency, /obj/item/wrench, /obj/machinery/light/small, @@ -28512,6 +28510,7 @@ pixel_y = -3 }, /obj/item/multitool/command, +/obj/structure/shelf/command, /turf/simulated/floor/plasteel{ dir = 10; icon_state = "darkblue" @@ -30523,7 +30522,6 @@ /turf/simulated/floor/plasteel/dark, /area/station/engineering/tech_storage) "bKA" = ( -/obj/structure/rack, /obj/item/book/manual/wiki/hacking, /obj/item/book/manual/wiki/engineering_guide, /obj/item/book/manual/wiki/engineering_construction, @@ -30531,6 +30529,7 @@ pixel_x = -32 }, /obj/effect/turf_decal/delivery/hollow, +/obj/structure/shelf, /turf/simulated/floor/plasteel, /area/station/public/storage/tools) "bKB" = ( @@ -38570,12 +38569,12 @@ }, /area/station/security/evidence) "cgp" = ( -/obj/structure/table, /obj/item/hand_labeler, /obj/item/storage/box/evidence, /obj/item/storage/box/evidence, /obj/item/pen, /obj/machinery/firealarm/directional/south, +/obj/structure/shelf/security, /turf/simulated/floor/plasteel{ icon_state = "dark" }, @@ -44755,11 +44754,11 @@ /turf/simulated/floor/plating/airless, /area/station/engineering/control) "cxH" = ( -/obj/structure/rack, /obj/item/clothing/gloves/color/black, /obj/item/wrench, /obj/item/clothing/glasses/meson/engine, /obj/effect/turf_decal/delivery/hollow, +/obj/structure/shelf/engineering, /turf/simulated/floor/plasteel, /area/station/engineering/hardsuitstorage) "cxI" = ( @@ -46961,8 +46960,8 @@ /turf/simulated/floor/plasteel/dark, /area/station/ai_monitored/storage/eva) "cDP" = ( -/obj/structure/rack, /obj/machinery/light/small, +/obj/structure/shelf, /turf/simulated/floor/plating, /area/station/maintenance/port) "cDQ" = ( @@ -71516,7 +71515,6 @@ }, /area/station/hallway/secondary/exit) "ibR" = ( -/obj/structure/rack, /obj/item/gun/energy/gun{ pixel_x = 3; pixel_y = 3 @@ -71532,6 +71530,7 @@ pixel_x = -3; pixel_y = -3 }, +/obj/structure/gunrack, /turf/simulated/floor/plasteel/dark, /area/station/security/armory/secure) "ibT" = ( @@ -73048,8 +73047,8 @@ }, /area/station/hallway/primary/central/nw) "iXL" = ( -/obj/structure/rack, /obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/storage, /turf/simulated/floor/plating, /area/station/maintenance/fsmaint) "iXM" = ( @@ -79061,7 +79060,6 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/port2) "mEk" = ( -/obj/structure/rack, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/item/gun/energy/disabler{ pixel_x = 3; @@ -79072,6 +79070,7 @@ pixel_x = -3; pixel_y = -3 }, +/obj/structure/gunrack, /turf/simulated/floor/plasteel/dark, /area/station/security/armory/secure) "mEu" = ( @@ -85947,7 +85946,6 @@ }, /area/station/medical/storage) "qys" = ( -/obj/structure/table/glass, /obj/item/storage/box/syringes{ pixel_x = 4; pixel_y = 4 @@ -85957,6 +85955,7 @@ name = "east bump"; pixel_x = 28 }, +/obj/structure/shelf/medbay, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "whiteblue" @@ -95004,6 +95003,11 @@ /obj/item/weldingtool/research, /turf/simulated/floor/plasteel/white, /area/station/science/explab) +"vys" = ( +/obj/effect/spawner/random/maintenance, +/obj/effect/spawner/random/storage, +/turf/simulated/floor/plating, +/area/station/maintenance/port) "vyO" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -119857,7 +119861,7 @@ cie cie cie bXU -jJj +vys drn dhG cHA diff --git a/_maps/map_files/stations/metastation.dmm b/_maps/map_files/stations/metastation.dmm index 744fe6d45ab..8b402a5b12f 100644 --- a/_maps/map_files/stations/metastation.dmm +++ b/_maps/map_files/stations/metastation.dmm @@ -4770,11 +4770,11 @@ }, /area/station/security/permabrig) "aBx" = ( -/obj/structure/rack, /obj/structure/reagent_dispensers/peppertank{ pixel_x = -32 }, /obj/item/gun/energy/ionrifle, +/obj/structure/gunrack, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "darkred" @@ -5853,7 +5853,6 @@ /turf/simulated/floor/plasteel, /area/station/engineering/control) "aGb" = ( -/obj/structure/table, /obj/effect/turf_decal/delivery/hollow, /obj/item/storage/belt/utility, /obj/item/storage/belt/utility, @@ -5861,6 +5860,7 @@ /obj/item/clothing/glasses/meson, /obj/item/clothing/glasses/meson, /obj/item/clothing/glasses/meson, +/obj/structure/shelf/engineering, /turf/simulated/floor/plasteel, /area/station/engineering/control) "aGc" = ( @@ -7944,7 +7944,6 @@ /turf/simulated/floor/plasteel, /area/station/public/construction) "aMN" = ( -/obj/structure/rack, /obj/item/gun/energy/gun{ pixel_y = 6 }, @@ -7952,6 +7951,7 @@ pixel_y = 3 }, /obj/item/gun/energy/gun, +/obj/structure/gunrack, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "darkred" @@ -15477,6 +15477,10 @@ name = "south bump"; pixel_y = -28 }, +/obj/item/destTagger{ + pixel_x = 4; + pixel_y = 3 + }, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "brown" @@ -15597,7 +15601,6 @@ /turf/simulated/floor/plating, /area/station/maintenance/maintcentral) "bjd" = ( -/obj/structure/rack, /obj/item/stack/packageWrap{ pixel_x = 2; pixel_y = -3 @@ -15616,10 +15619,7 @@ }, /obj/item/stack/wrapping_paper, /obj/item/stack/wrapping_paper, -/obj/item/destTagger{ - pixel_x = 4; - pixel_y = 3 - }, +/obj/structure/shelf/supply, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "brown" @@ -21394,7 +21394,6 @@ /area/station/command/bridge) "byx" = ( /obj/machinery/light, -/obj/structure/rack, /obj/item/storage/toolbox/emergency, /obj/item/storage/toolbox/emergency{ pixel_x = -2; @@ -21407,6 +21406,7 @@ pixel_y = -28 }, /obj/item/multitool/command, +/obj/structure/shelf/command, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "darkblue" @@ -29611,11 +29611,11 @@ pixel_x = -2; pixel_y = -2 }, -/obj/structure/table/reinforced, /obj/machinery/requests_console/directional/north, /obj/machinery/light{ dir = 1 }, +/obj/structure/shelf/medbay, /turf/simulated/floor/plasteel{ icon_state = "whitebluefull" }, @@ -30001,7 +30001,7 @@ /turf/simulated/floor/plating, /area/station/maintenance/port) "cdG" = ( -/obj/structure/rack, +/obj/effect/spawner/random/storage, /obj/effect/spawner/random/maintenance, /turf/simulated/floor/plating, /area/station/maintenance/port) @@ -30222,7 +30222,6 @@ /obj/structure/sign/poster/official/random{ pixel_y = -32 }, -/obj/structure/table/glass, /obj/item/reagent_containers/spray/plantbgone{ pixel_x = 2; pixel_y = 6 @@ -30243,6 +30242,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, +/obj/structure/shelf/service, /turf/simulated/floor/plasteel, /area/station/service/hydroponics) "ceE" = ( @@ -44286,7 +44286,6 @@ }, /area/station/security/main) "dCp" = ( -/obj/structure/rack, /obj/machinery/firealarm/directional/west, /obj/item/gun/energy/disabler{ pixel_y = 6 @@ -44295,6 +44294,7 @@ pixel_y = 3 }, /obj/item/gun/energy/disabler, +/obj/structure/gunrack, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "darkred" @@ -53420,7 +53420,6 @@ /turf/simulated/floor/plasteel, /area/station/maintenance/starboard2) "htP" = ( -/obj/structure/table, /obj/item/reagent_containers/condiment/milk{ pixel_x = 6; pixel_y = 8 @@ -53441,6 +53440,7 @@ /obj/structure/noticeboard{ pixel_y = 32 }, +/obj/structure/shelf, /turf/simulated/floor/plasteel/dark, /area/station/service/cafeteria) "huo" = ( @@ -68122,7 +68122,6 @@ /turf/simulated/floor/plasteel, /area/station/hallway/secondary/bridge) "nxO" = ( -/obj/structure/rack, /obj/item/gun/projectile/shotgun/riot{ pixel_y = 6 }, @@ -68136,6 +68135,7 @@ icon_state = "4-8" }, /obj/machinery/alarm/directional/north, +/obj/structure/gunrack, /turf/simulated/floor/plasteel{ dir = 6; icon_state = "darkred" @@ -70089,13 +70089,13 @@ /turf/simulated/floor/greengrid, /area/station/science/robotics/chargebay) "otp" = ( -/obj/structure/table, /obj/structure/sign/poster/official/random{ pixel_y = -32 }, /obj/item/book/manual/wiki/sop_supply, /obj/item/storage/belt/utility, /obj/item/screwdriver/cargo, +/obj/structure/shelf/supply, /turf/simulated/floor/plasteel{ dir = 1; icon_state = "brown" @@ -70235,7 +70235,6 @@ /turf/simulated/floor/plasteel, /area/station/security/permabrig) "oAs" = ( -/obj/structure/table/reinforced, /obj/machinery/firealarm/directional/west, /obj/structure/extinguisher_cabinet{ name = "north bump"; @@ -70257,6 +70256,7 @@ pixel_y = 4 }, /obj/item/mecha_parts/core, +/obj/structure/shelf/science, /turf/simulated/floor/plasteel, /area/station/science/robotics) "oAL" = ( @@ -83284,7 +83284,6 @@ /turf/simulated/floor/carpet, /area/station/legal/magistrate) "uba" = ( -/obj/structure/rack, /obj/item/gun/energy/laser{ pixel_y = 6 }, @@ -83292,6 +83291,7 @@ pixel_y = 3 }, /obj/item/gun/energy/laser, +/obj/structure/gunrack, /turf/simulated/floor/plasteel{ dir = 4; icon_state = "darkred" diff --git a/code/__DEFINES/dcs/movable_signals.dm b/code/__DEFINES/dcs/movable_signals.dm index 2d197e1d0dd..c0ac15e5393 100644 --- a/code/__DEFINES/dcs/movable_signals.dm +++ b/code/__DEFINES/dcs/movable_signals.dm @@ -39,6 +39,8 @@ #define COMSIG_MOVABLE_POST_THROW "movable_post_throw" ///from base of datum/thrownthing/finalize(): (obj/thrown_object, datum/thrownthing) used for when a throw is finished #define COMSIG_MOVABLE_THROW_LANDED "movable_throw_landed" +///from base of atom/movable/shove_impact(): (mob/living/target, mob/living/attacker) +#define COMSIG_MOVABLE_SHOVE_IMPACT "movable_shove_impact" ///from base of atom/movable/onTransitZ(): (old_z, new_z) #define COMSIG_MOVABLE_Z_CHANGED "movable_ztransit" diff --git a/code/__DEFINES/dcs/obj_signals.dm b/code/__DEFINES/dcs/obj_signals.dm index 1cee071550e..936667d709f 100644 --- a/code/__DEFINES/dcs/obj_signals.dm +++ b/code/__DEFINES/dcs/obj_signals.dm @@ -20,3 +20,16 @@ #define COMSIG_CURSED_SLOT_MACHINE_LOST "cursed_slot_machine_lost" /// from /obj/structure/cursed_slot_machine/determine_victor() when someone finally wins. #define COMSIG_GLOB_CURSED_SLOT_MACHINE_WON "cursed_slot_machine_won" + + +// other subtypes + +/// from /datum/component/shelved/UnregisterFromParent(): (parent_uid) +#define COMSIG_SHELF_ITEM_REMOVED "shelf_item_removed" +/// from /datum/component/shelver/add_item(): (obj/item/to_add, placement_idx, list/position_details) +#define COMSIG_SHELF_ITEM_ADDED "shelf_item_added" +/// from Initialize on objects implementing /datum/component/shelved +#define COMSIG_SHELF_ADDED_ON_MAPLOAD "shelf_added_on_mapload" +/// from /datum/component/shelver/shelf_items() +#define COMSIG_SHELF_ATTEMPT_PICKUP "shelf_attempt_pickup" + #define SHELF_PICKUP_FAILURE (1 << 0) diff --git a/code/datums/components/shelved.dm b/code/datums/components/shelved.dm new file mode 100644 index 00000000000..86692d7b6b1 --- /dev/null +++ b/code/datums/components/shelved.dm @@ -0,0 +1,290 @@ +#define MAX_SHELF_ITEMS 6 + +/datum/component/shelver + /// A list whose keys are a 4-tuple of (left, bottom, right, top) bounding boxes to position details. + /// Position details include "x" and "y" as pixel offsets, and "layer" as appearance layer for a placed object. + var/list/placement_zones = list() + /// A list of slots, one per placement zone. Either empty, or containing the UID of the object in that place. + var/list/used_places = list() + /// A list of types which are are valid to place on this shelf. + var/list/allowed_types = list() + /// The default scale transformation for objects placed on the shelf. + var/default_scale = 0.70 + /// The default rotation transformation for objects placed on the shelf. + var/default_rotation = 0 + /// Whether objects auto-shelved by the component are placed in random order on the shelf. + var/random_pickup_locations = FALSE + +/datum/component/shelver/Initialize(list/allowed_types_ = null, random_pickup_locations_ = FALSE) + if(!isstructure(parent)) + return COMPONENT_INCOMPATIBLE + used_places.len = length(placement_zones) + if(length(allowed_types_)) + allowed_types += allowed_types_ + random_pickup_locations = random_pickup_locations_ + +/datum/component/shelver/RegisterWithParent() + RegisterSignal(parent, COMSIG_SHELF_ATTEMPT_PICKUP, PROC_REF(on_shelf_attempt_pickup)) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attackby)) + RegisterSignal(parent, COMSIG_SHELF_ITEM_REMOVED, PROC_REF(on_shelf_item_removed)) + RegisterSignal(parent, COMSIG_SHELF_ADDED_ON_MAPLOAD, PROC_REF(prepare_autoshelf)) + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) + +/datum/component/shelver/proc/on_examine(datum/source, mob/user, list/examine_list) + SIGNAL_HANDLER // COMSIG_PARENT_EXAMINE + var/list/results = list() + for(var/uid in used_places) + if(uid) + var/obj/item/I = locateUID(uid) + if(istype(I)) + results += "\a [I.name]" + + if(!length(results)) + return + + var/joined_results = english_list(results) + examine_list += "It currently holds: [joined_results]." + +/datum/component/shelver/proc/prepare_autoshelf() + SIGNAL_HANDLER // COMSIG_SHELF_ADDED_ON_MAPLOAD + + // See /obj/structure/closet/Initialize for explanation of + // addtimer use here + addtimer(CALLBACK(src, PROC_REF(shelf_items)), 0) + +/datum/component/shelver/proc/shelf_items() + var/obj/structure/structure_parent = parent + + var/list/nearby_empty_tiles = list() + for(var/turf/turf_in_view in view(2, get_turf(structure_parent))) + if(!isfloorturf(turf_in_view)) + continue + for(var/turf/potential_blockage as anything in get_line(get_turf(structure_parent), turf_in_view)) + if(!is_blocked_turf(potential_blockage, exclude_mobs = TRUE, excluded_objs = list(parent))) + nearby_empty_tiles += turf_in_view + + var/itemcount = 1 + for(var/obj/item/I in structure_parent.loc) + if(I.density || I.anchored || I == structure_parent) + continue + if(itemcount > MAX_SHELF_ITEMS) + // If we can't fit it on the shelf, toss it somewhere nearby + if(length(nearby_empty_tiles)) + var/turf/T = pick(nearby_empty_tiles) + I.pixel_x = 0 + I.pixel_y = 0 + I.forceMove(T) + if(!(SEND_SIGNAL(structure_parent, COMSIG_SHELF_ATTEMPT_PICKUP, I) & SHELF_PICKUP_FAILURE)) + itemcount++ + +/datum/component/shelver/proc/on_shelf_attempt_pickup(datum/source, obj/item/to_add) + SIGNAL_HANDLER // COMSIG_SHELF_ATTEMPT_PICKUP + + if(!istype(to_add)) + return SHELF_PICKUP_FAILURE + + var/free_slot = get_free_slot() + if(!free_slot) + return SHELF_PICKUP_FAILURE + + var/coords = placement_zones[free_slot] + var/position_details = placement_zones[coords] + add_item(to_add, free_slot, position_details) + +/datum/component/shelver/proc/get_free_slot() + var/list/free_slots = list() + for(var/i in 1 to length(used_places)) + if(!used_places[i]) + free_slots += i + + if(!length(free_slots)) + return + + if(random_pickup_locations) + return pick(free_slots) + + return free_slots[1] + +/datum/component/shelver/proc/on_shelf_item_removed(datum/source, uid) + SIGNAL_HANDLER // COMSIG_SHELF_ITEM_REMOVED + + for(var/i in 1 to length(used_places)) + if(used_places[i] == uid) + used_places[i] = null + + var/obj/O = parent + if(istype(O)) + O.update_appearance(UPDATE_ICON) + +/datum/component/shelver/proc/on_attackby(datum/source, obj/item/attacker, mob/user, params) + SIGNAL_HANDLER // COMSIG_PARENT_ATTACKBY + + if(isrobot(user)) + return COMPONENT_NO_AFTERATTACK + if(attacker.flags & ABSTRACT) + return COMPONENT_NO_AFTERATTACK + if(user.a_intent == INTENT_HARM) + return + + if(length(allowed_types) && !(attacker.type in allowed_types)) + to_chat(user, "[attacker] won't fit on [parent]!") + return COMPONENT_NO_AFTERATTACK + + var/list/PL = params2list(params) + var/icon_x = text2num(PL["icon-x"]) + var/icon_y = text2num(PL["icon-y"]) + + var/i = 0 + for(var/coords in placement_zones) + i++ + if(icon_x >= coords[1] && icon_x <= coords[3] && icon_y >= coords[2] && icon_y <= coords[4]) + if(used_places[i]) + to_chat(user, "There's already something there on [parent].") + return COMPONENT_NO_AFTERATTACK + + var/position_details = placement_zones[coords] + if(user.drop_item()) + add_item(attacker, i, position_details) + user.visible_message( + "[user] places [attacker] on [parent].", + "You place [attacker] on [parent].", + ) + return COMPONENT_NO_AFTERATTACK + +/** + * Add an item to the shelf. + * + * Arguments: + * * to_add - The item to add. Adding will fail if not an `/obj/item`. + * * placement_idx - The slot on the shelf to add the item to. + * * position_details - A list containing the "x" and "y" pixel offsets of the position, and the "layer" the object will be set to, if applicable. + */ +/datum/component/shelver/proc/add_item(obj/item/to_add, placement_idx, list/position_details) + if(!istype(to_add)) + return + to_add.forceMove(get_turf(parent)) + to_add.AddComponent(/datum/component/shelved, parent) + to_add.pixel_x = position_details["x"] + to_add.pixel_y = position_details["y"] + to_add.appearance_flags |= PIXEL_SCALE + if("layer" in position_details) + to_add.layer = position_details["layer"] + used_places[placement_idx] = to_add.UID() + var/obj/O = parent + if(istype(O)) + O.update_appearance(UPDATE_ICON) + + if(default_scale) + to_add.transform *= default_scale + if(default_rotation) + to_add.transform = turn(to_add.transform, default_rotation) + + SEND_SIGNAL(to_add, COMSIG_SHELF_ITEM_ADDED, default_scale) + +/datum/component/shelver/basic_shelf + placement_zones = list( + // Bottom Shelf + list(1, 1, 10, 16) = list("x" = -9, "y" = -5, "layer" = BELOW_OBJ_LAYER), + list(11, 1, 20, 16) = list("x" = 0, "y" = -5, "layer" = BELOW_OBJ_LAYER), + list(21, 1, 32, 16) = list("x" = 9, "y" = -5, "layer" = BELOW_OBJ_LAYER), + + // Top Shelf + list(1, 17, 10, 32) = list("x" = -9, "y" = 9), + list(11, 17, 20, 32) = list("x" = 0, "y" = 9), + list(21, 17, 32, 32) = list("x" = 9, "y" = 9), + ) + +/datum/component/shelver/gun_rack + placement_zones = list( + list(1, 1, 10, 32) = list("x" = -8, "y" = -1), + list(11, 1, 20, 32) = list("x" = 0, "y" = -1), + list(21, 1, 32, 32) = list("x" = 8, "y" = -1), + ) + default_scale = 0.80 + default_rotation = -90 + +/// A component for items stored on shelves, propagated by [/datum/component/shelver] components. +/datum/component/shelved + /// The UID of the object acting as the shelf + var/shelf_uid + /// A copy of the shelved object's original transform, to restore after removing from the shelf. + var/matrix/original_transform + /// A copy of the shelved object's original layer, to restore after removing from the shelf. + var/original_layer + /// A copy of the shelved object's original appearance flags, to restore after removing from the shelf. + var/original_appearance_flags + +/datum/component/shelved/Initialize(atom/shelf) + if(!isobj(parent)) + return COMPONENT_INCOMPATIBLE + var/obj/O = parent + + shelf_uid = shelf.UID() + original_transform = O.transform + original_layer = O.layer + original_appearance_flags = O.appearance_flags + +/datum/component/shelved/RegisterWithParent() + . = ..() + RegisterSignal(parent, COMSIG_ITEM_PICKUP, PROC_REF(on_item_pickup)) + var/obj/shelf = locateUID(shelf_uid) + if(shelf) + RegisterSignal(shelf, COMSIG_MOVABLE_SHOVE_IMPACT, PROC_REF(on_movable_shove_impact)) + RegisterSignal(shelf, COMSIG_ATOM_HITBY, PROC_REF(on_atom_hitby)) + RegisterSignal(shelf, COMSIG_OBJ_DECONSTRUCT, PROC_REF(on_shelf_deconstruct)) + +/datum/component/shelved/proc/on_shelf_deconstruct() + SIGNAL_HANDLER // COMSIG_OBJ_DECONSTRUCT + qdel(src) + +/datum/component/shelved/proc/on_item_pickup(obj/item/I, mob/user) + SIGNAL_HANDLER // COMSIG_ITEM_PICKUP + qdel(src) + +/datum/component/shelved/UnregisterFromParent() + . = ..() + var/obj/O = parent + O.transform = original_transform + O.layer = original_layer + O.appearance_flags = original_appearance_flags + O.pixel_x = 0 + O.pixel_y = 0 + + var/obj/shelf = locateUID(shelf_uid) + if(istype(shelf)) + UnregisterSignal(shelf, COMSIG_MOVABLE_SHOVE_IMPACT) + UnregisterSignal(shelf, COMSIG_ATOM_HITBY) + + SEND_SIGNAL(shelf, COMSIG_SHELF_ITEM_REMOVED, parent.UID()) + +/datum/component/shelved/proc/scatter() + var/list/clear_turfs = list() + var/obj/O = parent + for(var/turf/T in orange(1, get_turf(O))) + if(isfloorturf(T) && T != get_turf(O)) + clear_turfs |= T + + if(length(clear_turfs)) + var/obj/shelf = locateUID(shelf_uid) + if(!isobj(shelf)) + // not sure what else we can do here to clean up after ourselves + CRASH("received non-obj shelf with UID [shelf_uid]") + + var/shelf_name = shelf ? "flies off [shelf]" : "falls down" + O.visible_message("[O] [shelf_name]!") + O.throw_at(pick(clear_turfs), 2, 3) + qdel(src) + +/datum/component/shelved/proc/on_movable_shove_impact(datum/source, atom/movable/target) + SIGNAL_HANDLER // COMSIG_MOVABLE_SHOVE_IMPACT + if(prob(50)) + scatter() + +/datum/component/shelved/proc/on_atom_hitby(datum/source, mob/living/carbon/human/hitby) + SIGNAL_HANDLER // COMSIG_ATOM_HITBY + if(!istype(hitby)) + return + if(prob(50)) + scatter() + +#undef MAX_SHELF_ITEMS diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 3f6c50803ec..e6d9a5a3af3 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -661,6 +661,7 @@ /// called when a mob gets shoved into an items turf. false means the mob will be shoved backwards normally, true means the mob will not be moved by the disarm proc. /atom/movable/proc/shove_impact(mob/living/target, mob/living/attacker) + SEND_SIGNAL(src, COMSIG_MOVABLE_SHOVE_IMPACT, target, attacker) return FALSE /** diff --git a/code/game/objects/effects/spawners/random/furniture_spawners.dm b/code/game/objects/effects/spawners/random/furniture_spawners.dm new file mode 100644 index 00000000000..f5c41a3e050 --- /dev/null +++ b/code/game/objects/effects/spawners/random/furniture_spawners.dm @@ -0,0 +1,18 @@ +/obj/effect/spawner/random/storage + name = "storage furniture spawner" + icon = 'icons/effects/random_spawners.dmi' + icon_state = "shelf" + layer = BELOW_OBJ_LAYER + loot = list( + list( + /obj/structure/shelf = 10, + /obj/structure/shelf/command, + /obj/structure/shelf/engineering, + /obj/structure/shelf/medbay, + /obj/structure/shelf/science, + /obj/structure/shelf/security, + /obj/structure/shelf/service, + /obj/structure/shelf/supply, + ), + /obj/structure/rack, + ) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 107beb35373..13fb3a5cf09 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -359,6 +359,9 @@ attackee.lip_color = colour attackee.update_body() + play_spray_sound(user) + +/obj/item/toy/crayon/spraycan/proc/play_spray_sound(mob/user) playsound(user, 'sound/effects/spray.ogg', 5, TRUE, 5) /obj/item/toy/crayon/spraycan/update_icon_state() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index def83cd1a56..fe49e58b540 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -81,6 +81,8 @@ GLOBAL_LIST_INIT(metal_recipes, list( new /datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), new /datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), + new /datum/stack_recipe("storage shelf", /obj/structure/shelf, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), + new /datum/stack_recipe("gun rack", /obj/structure/gunrack, 5, time = 2.5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), null, new /datum/stack_recipe_list("airlock assemblies", list( new /datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 5 SECONDS, one_per_turf = TRUE, on_floor = TRUE), diff --git a/code/game/objects/structures/shelves.dm b/code/game/objects/structures/shelves.dm new file mode 100644 index 00000000000..602ba57fe2d --- /dev/null +++ b/code/game/objects/structures/shelves.dm @@ -0,0 +1,139 @@ +GLOBAL_LIST_INIT(shelf_colors, list("basic", "sci", "sup", "serv", "med", "sec", "cmd", "engi")) + +/obj/structure/shelf + name = "shelf" + desc = "A piece of furniture used for vertical storage." + icon = 'icons/obj/structures/shelves.dmi' + icon_state = "shelf_basic" + layer = TABLE_LAYER + density = TRUE + anchored = TRUE + pass_flags_self = PASSTAKE + max_integrity = 80 + /// The suffix of the icon state used for the shelf. Indexed into `GLOB.shelf_colors`. + var/shelf_style = "basic" + /// The current overlay of the top shelf. Used for interleaving objects and shelf layers for the illusion of depth. + var/image/shelf_overlay + COOLDOWN_DECLARE(spraypaint_cd) + +/obj/structure/shelf/Initialize(mapload) + . = ..() + var/area/A = get_area(src) + AddComponent(/datum/component/shelver/basic_shelf, random_pickup_locations_ = istype(A, /area/station/maintenance)) + update_icon() + set_style(shelf_style) + + if(mapload) + SEND_SIGNAL(src, COMSIG_SHELF_ADDED_ON_MAPLOAD) + +/obj/structure/shelf/attackby(obj/item/I, mob/living/user, params) + var/obj/item/toy/crayon/spraycan/spraycan = I + if(!istype(spraycan)) + return ..() + if(spraycan.capped) + return ..() + + if(!COOLDOWN_FINISHED(src, spraypaint_cd)) + to_chat(user, "The paint on [src] is still drying!") + return + + var/cur_idx = GLOB.shelf_colors.Find(shelf_style) + if(!cur_idx) + cur_idx = 1 + cur_idx++ + if(cur_idx > length(GLOB.shelf_colors)) + cur_idx = 1 + set_style(GLOB.shelf_colors[cur_idx]) + spraycan.play_spray_sound(user) + + // Tiny cooldown to prevent constant spamming of the action + COOLDOWN_START(src, spraypaint_cd, 1 SECONDS) + +/obj/structure/shelf/proc/set_style(new_style) + if(shelf_style == new_style && !isnull(shelf_overlay)) + return + shelf_style = new_style + icon_state = "shelf_[shelf_style]" + // Don't think I can get away with both icon smoothing across tiles + // and dealing with this overlay shit + shelf_overlay = mutable_appearance('icons/obj/structures/shelves.dmi', "shelf_[shelf_style]-top") + shelf_overlay.layer = LOW_ITEM_LAYER + update_appearance(UPDATE_OVERLAYS) + +/obj/structure/shelf/update_overlays() + return list(shelf_overlay) + +/obj/structure/shelf/wrench_act(mob/living/user, obj/item/I) + . = TRUE + if(user.a_intent == INTENT_HELP) + return FALSE + if(!I.use_tool(src, user, 2.5 SECONDS, volume = I.tool_volume)) + return + + to_chat(user, "You disassemble [src].") + deconstruct() + +/obj/structure/shelf/deconstruct(disassembled) + new /obj/item/stack/sheet/metal(get_turf(src), 5) + return ..() + +/obj/structure/shelf/engineering + icon_state = "shelf_engi" + shelf_style = "engi" + +/obj/structure/shelf/medbay + icon_state = "shelf_med" + shelf_style = "med" + +/obj/structure/shelf/security + icon_state = "shelf_sec" + shelf_style = "sec" + +/obj/structure/shelf/service + icon_state = "shelf_serv" + shelf_style = "serv" + +/obj/structure/shelf/science + icon_state = "shelf_sci" + shelf_style = "sci" + +/obj/structure/shelf/command + icon_state = "shelf_cmd" + shelf_style = "cmd" + +/obj/structure/shelf/supply + icon_state = "shelf_sup" + shelf_style = "sup" + +/obj/structure/gunrack + name = "gun rack" + desc = "A rack for stowing firearms." + icon = 'icons/obj/structures.dmi' + icon_state = "gunrack" + layer = TABLE_LAYER + density = TRUE + anchored = TRUE + pass_flags_self = PASSTAKE + max_integrity = 80 + +/obj/structure/gunrack/Initialize(mapload) + . = ..() + var/static/list/gun_subtypes = subtypesof(/obj/item/gun) + AddComponent(/datum/component/shelver/gun_rack, allowed_types_ = gun_subtypes) + + if(mapload) + SEND_SIGNAL(src, COMSIG_SHELF_ADDED_ON_MAPLOAD) + +/obj/structure/gunrack/wrench_act(mob/living/user, obj/item/I) + . = TRUE + if(user.a_intent == INTENT_HELP) + return FALSE + if(!I.use_tool(src, user, 2.5 SECONDS, volume = I.tool_volume)) + return + + to_chat(user, "You disassemble [src].") + deconstruct() + +/obj/structure/shelf/deconstruct(disassembled) + new /obj/item/stack/sheet/metal(get_turf(src), 5) + return ..() diff --git a/icons/effects/random_spawners.dmi b/icons/effects/random_spawners.dmi index 325fb1ae5e09ebe0f103129139126428acd940df..fbf0d77c86e62a649bea1f96173ab4bb25d12acc 100644 GIT binary patch literal 14960 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 diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi index 56837b40a89c160da90f80398226f558eb3c2c42..8a21b505ce4eeb436e81d79c1d5eb554940c0e15 100644 GIT binary patch literal 23944 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 D`hbC8 diff --git a/icons/obj/structures/shelves.dmi b/icons/obj/structures/shelves.dmi new file mode 100644 index 0000000000000000000000000000000000000000..fd3991998c4ff9df3c324d23e9fe6384d6a3d4b2 GIT binary patch literal 2689 zcmbuBdpwkB8^`Zw90sFQ&K0BWWg;4+mq`W_rE#njLNp?W4Iybp%~;z3Y06@g8Pm$4 zR!HSAo71*5s6}E#+E+OYIn9VQ!;IO-X4`lFdH;Ez&*#4H>vLV#=kwgx@4mm+^Q3sV z?O&s`Q3(LB=75vKA$X;&3%**Cv}P z%Mapkjhf85hFk>Rd=I4QTHvt@Wxj(#=vHRN&bA z_XJaKd`K>}tiZ7fOlft3h`sfKbuX?d*FNQyZ0XKXGufS5zTa?nuebMvEov{_CH#kA zB4RoLp;^NUpU&@pq{+mL&gs8qqS?#eM4s$^)}$e0)?W+_5% z>UOHSH(w=6V&q|0i%;i5%h$OZ9u&s4nAcQh?J}HdJ>H{)rJ zdb4zU7a(*1O06x>_!PUVDApuKG?fz zLVukNxFr{;5$y}|L@y%sDNxk%($zvJlu{VbdfaXz?JQS`Pkah*axb>ZdsezMe-X}+ zdi$MP1B_)yM1;2(~Drd;)G zudPmTa5Em)i*4Dp3D+!&l1!1>ZSm)siNR@w!n7FX;w;%-11y{_>u!h^eNaDEL1t&7 z1Ka1DbIi5?*R#Loplx=!)gQt=y*cXVFVP`@A2;Q74&{_%JKHE+CxInzsLljq5i4Rvm zt3lu3C^2$h$kmZJS=x8j_GOztL5;0UJ+JE`@DI3TzMPldOT>NmcIs5w zh5p@C4|*}y{g6NjNB=e_mPvOEog1@nrv^OUkHRycKy&=wU_6dKoD=Ja-&mNeb3m8Y za|BgM*<_xk9x&gu$_n=Sz_5Iy@8-^p5!GX778=7=(Q1mz{DkF~_ZlUekoRbWVS*+d zM*WPrq-2J4aipNqB4Mtk4s+o7o0OMq?>(UxZ5WW<4&q;2X+ncVQoVL0jj930dCf(< z#mq@LHBGKB*(ke6se4i`Gdx>-B~sm}4|UJS^i*quuE>a9U0P6*SDE35gK!OPllyDJ3_1RpzXmKF?55i8HfZq6eu2iF{@y6 z-AUMsvS0D8nqN);gh03C1~h1AO)Rq}dTiq9;TEY^lGc|21W z)+&wiEi>#x33=oCT+m4H$ivF|JJq`zJ$e3#;w)n-X#RGCbatuDM8skejRgPk{#Y?g zb$ulQ&e3=vKJ)jO`wo6R4FFl72f)Zq@Zd~=Kql+-&@G4bt?3o1cS-3Rc3ro4Zgf3$ z7qQ!_ORL1nh`TLrts~DP0<=tOuM}gGJPGt3pIT`JzbikI1Go3zrC6;NMH9=~T{cD4 zphBS1w^b3PrEll4_s6s|kNUn<47Wc2%_bTj>Ix_1=;DmX@`bz9+zy7?sx%%(K06i^ z`dGJQCG(t6xvtK(Nz^d7)x`U@D19YSJ%{+J*vh;cMB#RToM-PQ08hT zgeN}VoE6V#zRQ4_^T}(>7DigL&(x4M7|wS9HRD)Bqbqeih+Jg-A_Dvl1n3wZ5$sIb z27hYdb_W00c)$`N08j(q4qTTU0Dp#NAyCVre}ed$SK;X*9==$!L^y7@(p=U7+N?I< zT6GDNzKBSKMRe-6%2@hU>HnAWFGl}V^Q+x%=*>Fs&s@l=rLFzWiUAxg~onx-8UwzIt}bf-|56neoS!BSW_Ux1KrHtm@w3KvYBzwESP3v7mycUuSjS+Q!2w4% KhcZIoH-7*jk->)m literal 0 HcmV?d00001 diff --git a/paradise.dme b/paradise.dme index d8a427de2c0..378f9525bc6 100644 --- a/paradise.dme +++ b/paradise.dme @@ -447,6 +447,7 @@ #include "code\datums\components\proximity_monitor.dm" #include "code\datums\components\radioactive.dm" #include "code\datums\components\scope.dm" +#include "code\datums\components\shelved.dm" #include "code\datums\components\shielded.dm" #include "code\datums\components\slippery.dm" #include "code\datums\components\spawner.dm" @@ -1030,6 +1031,7 @@ #include "code\game\objects\effects\spawners\windowspawner.dm" #include "code\game\objects\effects\spawners\random\engineering_spawners.dm" #include "code\game\objects\effects\spawners\random\food_spawners.dm" +#include "code\game\objects\effects\spawners\random\furniture_spawners.dm" #include "code\game\objects\effects\spawners\random\maint_loot_spawners.dm" #include "code\game\objects\effects\spawners\random\misc_spawners.dm" #include "code\game\objects\effects\spawners\random\random_spawner.dm" @@ -1318,6 +1320,7 @@ #include "code\game\objects\structures\railings.dm" #include "code\game\objects\structures\reflector.dm" #include "code\game\objects\structures\safe.dm" +#include "code\game\objects\structures\shelves.dm" #include "code\game\objects\structures\signs.dm" #include "code\game\objects\structures\snow.dm" #include "code\game\objects\structures\spirit_board.dm"