From e3f8b4c96c80db00dbff63494b1a7a614348b1c1 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 7 Oct 2020 01:11:16 +0200 Subject: [PATCH] [MIRROR] Adds tank holders (#1177) * Merge pull request #54048 from nicbn/tank-frames Adds tank holders * Adds tank holders Co-authored-by: ShizCalev --- .../map_files/Deltastation/DeltaStation2.dmm | 74 +++++++--- .../map_files/IceBoxStation/IceBoxStation.dmm | 106 ++++++++++----- code/__DEFINES/dcs/signals.dm | 4 + .../container_item/container_item.dm | 10 ++ .../components/container_item/tank_holder.dm | 31 +++++ code/game/objects/items.dm | 1 - code/game/objects/items/extinguisher.dm | 8 ++ code/game/objects/items/miscellaneous.dm | 4 + code/game/objects/items/stacks/rods.dm | 1 + code/game/objects/items/tanks/tank_types.dm | 10 ++ code/game/objects/items/tanks/tanks.dm | 7 + code/game/objects/structures/tank_holder.dm | 127 ++++++++++++++++++ icons/obj/tank.dmi | Bin 9514 -> 12614 bytes tgstation.dme | 3 + 14 files changed, 335 insertions(+), 51 deletions(-) create mode 100644 code/datums/components/container_item/container_item.dm create mode 100644 code/datums/components/container_item/tank_holder.dm create mode 100644 code/game/objects/structures/tank_holder.dm diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 83fbc6b41c8..009858118ae 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -324,6 +324,7 @@ /obj/machinery/light{ dir = 1 }, +/obj/structure/tank_holder/extinguisher, /turf/open/floor/wood, /area/library) "aaL" = ( @@ -62724,6 +62725,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer2{ dir = 4 }, +/obj/structure/tank_holder/oxygen/red, /turf/open/floor/plasteel, /area/tcommsat/server) "cpJ" = ( @@ -68256,12 +68258,6 @@ /area/maintenance/port) "cAX" = ( /obj/structure/table/reinforced, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = 6 - }, -/obj/item/tank/internals/emergency_oxygen{ - pixel_x = -6 - }, /obj/item/clothing/mask/breath, /obj/item/clothing/mask/breath, /obj/structure/sign/warning/nosmoking{ @@ -69166,6 +69162,7 @@ /area/maintenance/port) "cCF" = ( /obj/effect/turf_decal/bot, +/obj/structure/tank_holder/emergency_oxygen, /turf/open/floor/plasteel, /area/maintenance/port) "cCG" = ( @@ -74448,8 +74445,6 @@ /area/science/xenobiology) "cMZ" = ( /obj/structure/reagent_dispensers/watertank, -/obj/item/extinguisher, -/obj/item/extinguisher, /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/xenobiology) @@ -75269,6 +75264,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, +/obj/structure/tank_holder/extinguisher, /turf/open/floor/plasteel, /area/science/xenobiology) "cOM" = ( @@ -80263,6 +80259,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/tank_holder/oxygen, /turf/open/floor/plasteel, /area/medical/medbay/central) "cYd" = ( @@ -84930,6 +84927,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 1 }, +/obj/structure/tank_holder/extinguisher, /turf/open/floor/plasteel/white, /area/medical/psychology) "dhw" = ( @@ -106153,8 +106151,8 @@ /area/hallway/secondary/exit/departure_lounge) "edf" = ( /obj/effect/decal/cleanable/dirt, -/obj/structure/closet/firecloset, /obj/effect/turf_decal/delivery, +/obj/structure/tank_holder/extinguisher, /turf/open/floor/plasteel, /area/maintenance/port/aft) "edg" = ( @@ -109022,6 +109020,11 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"hBB" = ( +/obj/effect/turf_decal/bot, +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/plasteel, +/area/science/xenobiology) "hFL" = ( /obj/machinery/stasis, /obj/effect/turf_decal/tile/blue{ @@ -112133,10 +112136,10 @@ /area/medical/chemistry) "pND" = ( /obj/effect/decal/cleanable/dirt, -/obj/item/extinguisher, /obj/machinery/light/small{ dir = 8 }, +/obj/structure/tank_holder/extinguisher, /turf/open/floor/plating, /area/maintenance/port) "pQm" = ( @@ -112899,6 +112902,14 @@ }, /turf/open/floor/plasteel/white, /area/medical/surgery/room_b) +"rLP" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/structure/tank_holder/emergency_oxygen, +/turf/open/floor/plasteel, +/area/maintenance/starboard) "rMk" = ( /obj/machinery/newscaster{ pixel_y = -32 @@ -112996,6 +113007,20 @@ /obj/machinery/telecomms/broadcaster/preset_left, /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) +"rXu" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/tank_holder/oxygen, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) "rYU" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable, @@ -113068,6 +113093,20 @@ /obj/effect/decal/remains/xeno, /turf/open/floor/engine/vacuum, /area/science/mixing/chamber) +"sfH" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/plasteel/dark/telecomms, +/area/tcommsat/server) "sfN" = ( /obj/structure/cable, /obj/effect/turf_decal/tile/neutral{ @@ -114175,6 +114214,11 @@ }, /turf/open/floor/plasteel/white, /area/science/research) +"vec" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/tank_holder/emergency_oxygen, +/turf/open/floor/plating, +/area/maintenance/port) "vjn" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/hydroponics/constructable, @@ -144473,7 +144517,7 @@ caE cAZ cCF cEm -ceb +vec cHy caE cKo @@ -147315,7 +147359,7 @@ cXk cYZ cXk dcs -ddT +hBB dfd dgz cQM @@ -152674,7 +152718,7 @@ bMw bOF bQG bIH -bUF +rXu bWW kxh bUF @@ -155758,7 +155802,7 @@ bMG bOP bQP bIV -bUF +sfH bXb bUF bUF @@ -165790,7 +165834,7 @@ cff cgT ciE bgZ -clz +rLP cnj cuE cqf diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 592c9665e2c..68a9a6cd11b 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -15884,8 +15884,6 @@ pixel_x = -2; pixel_y = -1 }, -/obj/item/extinguisher, -/obj/item/extinguisher, /obj/machinery/light{ dir = 8 }, @@ -22396,13 +22394,9 @@ "aZJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, /obj/structure/table, -/obj/item/clothing/suit/hooded/wintercoat/security, -/obj/item/clothing/suit/hooded/wintercoat/security, -/obj/item/clothing/suit/hooded/wintercoat/security{ - pixel_x = 5 - }, -/obj/item/clothing/suit/hooded/wintercoat{ - pixel_x = -5 +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 }, /obj/effect/turf_decal/tile/neutral{ dir = 8 @@ -22410,6 +22404,18 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/item/clothing/suit/hooded/wintercoat{ + pixel_x = -5 + }, +/obj/item/clothing/suit/hooded/wintercoat/security{ + pixel_x = 5 + }, +/obj/item/clothing/suit/hooded/wintercoat/security{ + pixel_x = 5 + }, +/obj/item/clothing/suit/hooded/wintercoat/security{ + pixel_x = 5 + }, /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "aZK" = ( @@ -22429,6 +22435,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/structure/tank_holder/anesthetic, /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "aZO" = ( @@ -23189,18 +23196,6 @@ /turf/open/floor/plating, /area/maintenance/port) "bbJ" = ( -/obj/structure/rack, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/tank/internals/anesthetic{ - pixel_x = -3; - pixel_y = 1 - }, -/obj/item/tank/internals/oxygen/red{ - pixel_x = 3 - }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 4 @@ -23208,6 +23203,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/tank_holder/oxygen/red, /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "bbK" = ( @@ -23581,7 +23577,7 @@ /turf/open/floor/plasteel, /area/vacant_room/commissary) "bcI" = ( -/obj/structure/closet/emcloset, +/obj/structure/tank_holder/oxygen, /turf/open/floor/plating, /area/maintenance/port) "bcK" = ( @@ -36156,6 +36152,7 @@ pixel_y = 27; receive_ore_updates = 1 }, +/obj/structure/tank_holder/extinguisher, /turf/open/floor/plasteel, /area/science/xenobiology) "bIv" = ( @@ -39073,12 +39070,12 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "bSt" = ( -/obj/structure/closet/emcloset, /obj/machinery/camera{ c_tag = "Telecomms Monitoring"; dir = 8; network = list("tcomms") }, +/obj/structure/tank_holder/oxygen, /turf/open/floor/plasteel, /area/tcommsat/computer) "bSv" = ( @@ -39901,10 +39898,10 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/closet/emcloset, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 }, +/obj/structure/tank_holder/oxygen, /turf/open/floor/plating, /area/maintenance/port/aft) "bVC" = ( @@ -43497,7 +43494,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) "cjV" = ( -/obj/structure/closet/emcloset, +/obj/structure/tank_holder/oxygen, /turf/open/floor/plasteel, /area/engine/engineering) "cjX" = ( @@ -49617,6 +49614,10 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"ffa" = ( +/obj/structure/tank_holder/oxygen/red, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "fie" = ( /obj/structure/closet/bombcloset, /obj/structure/extinguisher_cabinet{ @@ -50339,6 +50340,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plating, /area/maintenance/fore) +"hhu" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "hjZ" = ( /turf/open/floor/plasteel/white, /area/medical/medbay) @@ -50381,6 +50386,12 @@ }, /turf/open/floor/plating, /area/maintenance/aft) +"hyy" = ( +/obj/structure/tank_holder/extinguisher{ + pixel_y = 8 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) "hzQ" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -50848,6 +50859,11 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on/layer4, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/cmo) +"jbq" = ( +/obj/structure/cable, +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "jcM" = ( /obj/structure/cable, /turf/open/floor/plating, @@ -53911,6 +53927,10 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/medical/medbay) +"pYU" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/plating, +/area/maintenance/port) "pZN" = ( /obj/effect/turf_decal/tile/blue{ dir = 1 @@ -54613,6 +54633,10 @@ /obj/structure/cable, /turf/open/floor/plating, /area/maintenance/port) +"srU" = ( +/obj/structure/tank_holder, +/turf/open/floor/plating, +/area/maintenance/aft) "stP" = ( /obj/machinery/atmospherics/pipe/multiz/layer2{ color = "#ff0000"; @@ -55640,6 +55664,10 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/dark, /area/medical/medbay/aft) +"vhE" = ( +/obj/structure/tank_holder/emergency_oxygen, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "vjZ" = ( /obj/effect/turf_decal/trimline/blue/filled/line, /obj/machinery/power/apc{ @@ -55831,6 +55859,10 @@ }, /turf/open/floor/grass, /area/hydroponics/garden) +"vKc" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/plating, +/area/maintenance/aft) "vLr" = ( /obj/effect/turf_decal/trimline/blue/filled/warning{ dir = 8 @@ -56492,6 +56524,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"xpA" = ( +/obj/structure/tank_holder/extinguisher, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "xqe" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -72492,7 +72528,7 @@ aPz aPz aPz aPz -aSg +pYU aWj aXP aZr @@ -82504,7 +82540,7 @@ aAW aCa aDB aDI -azW +hyy azW azW ayW @@ -83532,7 +83568,7 @@ aBq apX aDE aFc -azW +hyy azW aJf ayW @@ -96962,7 +96998,7 @@ bzs bAw bzs bAw -bAw +vKc bzs bAw bAw @@ -98950,7 +98986,7 @@ alP anf vvP alP -anf +ffa aFm aGF aIp @@ -100480,7 +100516,7 @@ boP boP boP alO -anf +hhu anf asy anf @@ -102028,7 +102064,7 @@ anf anf anf alP -arr +jbq arr arr arr @@ -102610,7 +102646,7 @@ pTj nyR bQZ kKU -bAw +srU stP xMA caK @@ -103650,7 +103686,7 @@ hBY cmr tkC bYs -cOe +vhE kZR cNW cOe @@ -108011,7 +108047,7 @@ cOe cOe cfv cBL -cOe +xpA cNW boP boP diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index fccf1aaeccd..844f70d43bb 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -822,3 +822,7 @@ #define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" ///from monkey CtrlClickOn(): (/mob) #define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" + +// /datum/component/container_item +/// (atom/container, mob/user) - returns bool +#define COMSIG_CONTAINER_TRY_ATTACH "container_try_attach" diff --git a/code/datums/components/container_item/container_item.dm b/code/datums/components/container_item/container_item.dm new file mode 100644 index 00000000000..fda012cb0ea --- /dev/null +++ b/code/datums/components/container_item/container_item.dm @@ -0,0 +1,10 @@ +/// Container item, an item which can be stored by specialized containers. +/datum/component/container_item + +/datum/component/container_item/Initialize() + . = ..() + RegisterSignal(parent, COMSIG_CONTAINER_TRY_ATTACH, .proc/try_attach) + +/// Called when parent is added to the container. +/datum/component/container_item/proc/try_attach(datum/source, atom/container, mob/user) + return FALSE diff --git a/code/datums/components/container_item/tank_holder.dm b/code/datums/components/container_item/tank_holder.dm new file mode 100644 index 00000000000..b68c413519c --- /dev/null +++ b/code/datums/components/container_item/tank_holder.dm @@ -0,0 +1,31 @@ +/// Tank holder item - Added to an object which can be added to a tank holder. +/datum/component/container_item/tank_holder + var/tank_holder_icon_state + var/make_density + +/datum/component/container_item/tank_holder/Initialize(state, density = TRUE) + if(!isitem(parent)) + return COMPONENT_INCOMPATIBLE + + tank_holder_icon_state = state + make_density = density + return ..() + +/datum/component/container_item/tank_holder/try_attach(datum/source, obj/structure/tank_holder/container, mob/user) + if(!container || !istype(container)) + return FALSE + var/obj/item/I = parent + if(container.contents.len) + if(user) + to_chat(user, "There's already something in [container].") + return TRUE + if(user) + if(!user.transferItemToLoc(I, container)) + return TRUE + to_chat(user, "You put [I] into [container].") + else + I.forceMove(container) + container.tank = I + container.density = make_density + container.icon_state = tank_holder_icon_state + return TRUE diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index cb8a93e7e08..aaaed813409 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -187,7 +187,6 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb var/canMouseDown = FALSE - /obj/item/Initialize() if(attack_verb_continuous) diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm index f25eb0a9206..f4902e9cd90 100644 --- a/code/game/objects/items/extinguisher.dm +++ b/code/game/objects/items/extinguisher.dm @@ -26,6 +26,8 @@ var/power = 5 //Maximum distance launched water will travel var/precision = FALSE //By default, turfs picked from a spray are random, set to 1 to make it always have at least one water effect per row var/cooling_power = 2 //Sets the cooling_temperature of the water reagent datum inside of the extinguisher when it is refilled + /// Icon state when inside a tank holder + var/tank_holder_icon_state = "holder_extinguisher" /obj/item/extinguisher/mini name = "pocket fire extinguisher" @@ -52,11 +54,17 @@ . = ..() refill() +/obj/item/extinguisher/ComponentInitialize() + . = ..() + if(tank_holder_icon_state) + AddComponent(/datum/component/container_item/tank_holder, tank_holder_icon_state) + /obj/item/extinguisher/advanced name = "advanced fire extinguisher" desc = "Used to stop thermonuclear fires from spreading inside your engine." icon_state = "foam_extinguisher0" inhand_icon_state = "foam_extinguisher" + tank_holder_icon_state = "holder_foam_extinguisher" dog_fashion = null chem = /datum/reagent/firefighting_foam tanktype = /obj/structure/reagent_dispensers/foamtank diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index b88a8be22df..78f18e0a3d7 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -323,6 +323,10 @@ attack_verb_continuous = list("skubs") attack_verb_simple = list("skub") +/obj/item/skub/ComponentInitialize() + . = ..() + AddComponent(/datum/component/container_item/tank_holder, "holder_skub", FALSE) + /obj/item/skub/suicide_act(mob/living/user) user.visible_message("[user] has declared themself as anti-skub! The skub tears them apart!") diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index dbc19cf3e5c..ed060e0be29 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -4,6 +4,7 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ new/datum/stack_recipe("scooter frame", /obj/item/scooter_frame, 10, time = 25, one_per_turf = FALSE), \ new/datum/stack_recipe("linen bin", /obj/structure/bedsheetbin/empty, 2, time = 5, one_per_turf = FALSE), \ new/datum/stack_recipe("railing", /obj/structure/railing, 3, time = 18, window_checks = TRUE), \ + new/datum/stack_recipe("tank holder", /obj/structure/tank_holder, 2, time = 5, one_per_turf = TRUE, on_floor = FALSE), \ )) /obj/item/stack/rods diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 0a29033691e..c998e10af1e 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -15,6 +15,7 @@ name = "oxygen tank" desc = "A tank of oxygen, this one is blue." icon_state = "oxygen" + tank_holder_icon_state = "holder_oxygen" distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE force = 10 dog_fashion = /datum/dog_fashion/back @@ -28,11 +29,13 @@ /obj/item/tank/internals/oxygen/yellow desc = "A tank of oxygen, this one is yellow." icon_state = "oxygen_f" + tank_holder_icon_state = "holder_oxygen_f" dog_fashion = null /obj/item/tank/internals/oxygen/red desc = "A tank of oxygen, this one is red." icon_state = "oxygen_fr" + tank_holder_icon_state = "holder_oxygen_fr" dog_fashion = null /obj/item/tank/internals/oxygen/empty/populate_gas() @@ -46,6 +49,7 @@ desc = "A tank with an N2O/O2 gas mix." icon_state = "anesthetic" inhand_icon_state = "an_tank" + tank_holder_icon_state = "holder_oxygen_anesthetic" force = 10 /obj/item/tank/internals/anesthetic/populate_gas() @@ -61,6 +65,7 @@ desc = "Contains dangerous plasma. Do not inhale. Warning: extremely flammable." icon_state = "plasma" worn_icon_state = "plasmatank" + tank_holder_icon_state = null flags_1 = CONDUCT_1 slot_flags = null //they have no straps! force = 8 @@ -99,6 +104,7 @@ desc = "A tank of plasma gas designed specifically for use as internals, particularly for plasma-based lifeforms. If you're not a Plasmaman, you probably shouldn't use this." icon_state = "plasmaman_tank" inhand_icon_state = "plasmaman_tank" + tank_holder_icon_state = null force = 10 distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE @@ -115,6 +121,7 @@ icon_state = "plasmaman_tank_belt" inhand_icon_state = "plasmaman_tank_belt" worn_icon_state = "plasmaman_tank_belt" + tank_holder_icon_state = null worn_icon = null slot_flags = ITEM_SLOT_BELT force = 5 @@ -138,6 +145,7 @@ desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it." icon_state = "emergency" worn_icon_state = "emergency" + tank_holder_icon_state = "holder_emergency" worn_icon = null flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT @@ -159,6 +167,7 @@ name = "extended-capacity emergency oxygen tank" icon_state = "emergency_engi" worn_icon_state = "emergency_engi" + tank_holder_icon_state = "holder_emergency_engi" worn_icon = null volume = 6 // should last 24 minutes if full @@ -168,6 +177,7 @@ /obj/item/tank/internals/emergency_oxygen/double name = "double emergency oxygen tank" icon_state = "emergency_double" + tank_holder_icon_state = null volume = 24 /obj/item/tank/internals/emergency_oxygen/double/empty/populate_gas() diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 0fcf25f03ee..3aba2a129bf 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -20,6 +20,8 @@ var/distribute_pressure = ONE_ATMOSPHERE var/integrity = 3 var/volume = 70 + /// Icon state when in a tank holder. Null makes it incompatible with tank holder. + var/tank_holder_icon_state = "holder_generic" /obj/item/tank/ui_action_click(mob/user) toggle_internals(user) @@ -74,6 +76,11 @@ STOP_PROCESSING(SSobj, src) . = ..() +/obj/item/tank/ComponentInitialize() + . = ..() + if(tank_holder_icon_state) + AddComponent(/datum/component/container_item/tank_holder, tank_holder_icon_state) + /obj/item/tank/examine(mob/user) var/obj/icon = src . = ..() diff --git a/code/game/objects/structures/tank_holder.dm b/code/game/objects/structures/tank_holder.dm new file mode 100644 index 00000000000..3e9d0cbd4c5 --- /dev/null +++ b/code/game/objects/structures/tank_holder.dm @@ -0,0 +1,127 @@ +///? +/obj/structure/tank_holder + name = "tank holder" + desc = "A metallic frame that can hold tanks and extinguishers." + icon = 'icons/obj/tank.dmi' + icon_state = "holder" + + custom_materials = list(/datum/material/iron = 2000) + + density = FALSE + anchored = FALSE + pass_flags = LETPASSTHROW + max_integrity = 20 + + resistance_flags = FIRE_PROOF + + /// The stored tank. If this is a path, it gets created into contents at Initialize. + var/obj/item/tank + +/obj/structure/tank_holder/Initialize() + . = ..() + if(tank) + var/obj/item/tank_ = new tank(null) + tank = null + SEND_SIGNAL(tank_, COMSIG_CONTAINER_TRY_ATTACH, src, null) + +/obj/structure/tank_holder/Destroy() + QDEL_NULL(tank) + return ..() + +/obj/structure/tank_holder/CanAllowThrough(atom/movable/mover, turf/target) + . = ..() + if(istype(mover) && mover.throwing) + return TRUE + +/obj/structure/tank_holder/examine(mob/user) + . = ..() + . += "It is held together by some screws." + +/obj/structure/tank_holder/attackby(obj/item/W, mob/user, params) + if(user.a_intent == INTENT_HARM) + return ..() + if(!SEND_SIGNAL(W, COMSIG_CONTAINER_TRY_ATTACH, src, user)) + to_chat(user, "[W] does not fit in [src].") + +/obj/structure/tank_holder/screwdriver_act(mob/living/user, obj/item/I) + if(..()) + return TRUE + if(tank) + return FALSE + I.play_tool_sound(src) + deconstruct(TRUE) + return TRUE + +/obj/structure/tank_holder/deconstruct(disassembled = TRUE) + var/atom/Tsec = drop_location() + new /obj/item/stack/rods(Tsec, 2) + if(tank) + tank.forceMove(Tsec) + after_detach_tank() + qdel(src) + +/obj/structure/tank_holder/attack_paw(mob/user) + return attack_hand(user) + +/obj/structure/tank_holder/attack_hand(mob/user) + if(!tank) + return ..() + if(!Adjacent(user) || issilicon(user)) + return ..() + to_chat(user, "You take [tank] from [src].") + add_fingerprint(user) + tank.add_fingerprint(user) + user.put_in_hands(tank) + after_detach_tank() + +/obj/structure/tank_holder/handle_atom_del(atom/A) + if(A == tank) + after_detach_tank() + return ..() + +/obj/structure/tank_holder/contents_explosion(severity, target) + if(tank) + tank.ex_act(severity, target) + +/// Call this after taking the tank from contents in order to update references, icon +/// and density. +/obj/structure/tank_holder/proc/after_detach_tank() + tank = null + density = FALSE + icon_state = "holder" + +/obj/structure/tank_holder/oxygen + icon_state = "holder_oxygen" + tank = /obj/item/tank/internals/oxygen + +/obj/structure/tank_holder/anesthetic + icon_state = "holder_anesthetic" + tank = /obj/item/tank/internals/anesthetic + +/obj/structure/tank_holder/oxygen/yellow + icon_state = "holder_oxygen_f" + tank = /obj/item/tank/internals/oxygen/yellow + +/obj/structure/tank_holder/oxygen/red + icon_state = "holder_oxygen_fr" + tank = /obj/item/tank/internals/oxygen/red + +/obj/structure/tank_holder/emergency_oxygen + icon_state = "holder_emergency" + tank = /obj/item/tank/internals/emergency_oxygen + +/obj/structure/tank_holder/emergency_oxygen/engi + icon_state = "holder_emergency_engi" + tank = /obj/item/tank/internals/emergency_oxygen/engi + +/obj/structure/tank_holder/generic + icon_state = "holder_generic" + tank = /obj/item/tank/internals/generic + +/obj/structure/tank_holder/extinguisher + icon_state = "holder_extinguisher" + tank = /obj/item/extinguisher + +/obj/structure/tank_holder/extinguisher/advanced + icon_state = "holder_foam_extinguisher" + tank = /obj/item/extinguisher/advanced diff --git a/icons/obj/tank.dmi b/icons/obj/tank.dmi index 15855e8610e871ddb39212f2b6a8f2f772e7369b..e6945ac7b9af4aa2fbb84e9ff4b80d7c9094686d 100644 GIT binary patch literal 12614 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 iM>H8ER^{4ULX{o~^mQSfqOSi}_7*KQo literal 9514 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 diff --git a/tgstation.dme b/tgstation.dme index f58136cfb99..cd76edd91d4 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -494,6 +494,8 @@ #include "code\datums\components\uplink.dm" #include "code\datums\components\wearertargeting.dm" #include "code\datums\components\wet_floor.dm" +#include "code\datums\components\container_item\container_item.dm" +#include "code\datums\components\container_item\tank_holder.dm" #include "code\datums\components\crafting\crafting.dm" #include "code\datums\components\crafting\guncrafting.dm" #include "code\datums\components\crafting\recipes.dm" @@ -1250,6 +1252,7 @@ #include "code\game\objects\structures\table_frames.dm" #include "code\game\objects\structures\tables_racks.dm" #include "code\game\objects\structures\tank_dispenser.dm" +#include "code\game\objects\structures\tank_holder.dm" #include "code\game\objects\structures\target_stake.dm" #include "code\game\objects\structures\traps.dm" #include "code\game\objects\structures\votingbox.dm"