Removes goonchat, adds TGChat and TG Stat Panels (#16514)

* tgui the beginning

* binaries and the like

* Bring in the last of it

* Example radio UI

* delete example

* NTOS Main Menu, start on manifest, tgui states

* tasks.json

* gunnery ui pt 1

* okay

* fix everything

* scss update

* oops

* manifest gigablast

* downloader part 1

* download prt 2

* NTOSDownloader final

* mfw committing to_worlds

* gunnery console pt2

* i cooked

* targeting (finished)

* one vueui down

* voting ui almost done

* MY MIND FEELS LIKE AN ARCH ENEMYYYY

* voting ui down

* photocopier

* ntos config + download fixes

* photocopier 2

* refactor define

* NTOS client manager + fixes

* fax machine final (it also uses toner now)

* marching forwards... left behind...

* ntnrc part 1

* canister

* add quotes

* portable pumps pt1 + more backgrounds

* oops

* finish the portable pump

* freezers

so I'll keep on pushing forward... you haven't seen the last of me... oooooooh...

* doors ui pt1

* finish doors UI (forgive me wildkins it's a bit of shitcode)

* vitals monitor, make things use labeled lists, new backgrounds

* mais j'envoyé aucun mayday...

* maglock pt1

* pour ça je me suis perdu...

* infrared

* fix that

* prox sensor pt1

* prox sensor

* signaler (this was actually pretty hard)

* atmos control pt1

* atmos control pt1.1

* atmos pt 2

* fuel injector

* multitool UI

* jammer

* list viewer

* APC

* portgen

* targeting console updates + SMES ui

* new themes, shield generator

* supermatter

* Add ore detector and (shitty) NTNet Relay

* orderterminal pt1

* orderterminal pt2

* smartfridge

* Add (air-)tank GUI update ore detector size

* Adds Transfer Valves

* Add AtmoScrubber

* analyzer pt1

* weapons analyzer pt2

* bodyscanner pt1

* bodyscanner pt2

* fix this shitcode

* seed storage

* appearance changer

* appearance changer final

* sleeper pt1

* sleeper

* gps

* vehicles

* chem dispenser

* lily request

* holopad

* tgui modules pt1

* ppanel

* damage menu

* fixes

* im here too now

* follow menu, search bars

* quikpay

* quikpay fixes

* circuit printer

* ppanel

* ppanel updates

* pai

* turret controls (i want to kill myself)

* tweak

* remove the boardgame

* guntracker

* implant tracker

* penal mechs

come close to me, come close to me

* chem codex

* pai radio

* doorjack

* pai directives

* signaler removal, sensors

* ghost spawner

* spawnpoint

* fixes

* teleporter

* one more to the chopping block

* account database

* remove divider

* scanner, atmos

* latejoin ui pt1

* latejoin

* records pt1

* RECORDS UI DONE

* delete interpreter & records

* CHAT FUCKING CLIENT

* data updates

* fix some things

* final UI, log

* basic nanoui fix

* antag panel

* remove vueui

* atm update

* vending update

* warrants, cameras

* ntmonitor

* time comes for all

* preserve this legacy

* bring that back (oops)

* rcon, ui auto update for computer UIs, remove rcon computers

* alarm monitoring (a bit broke and also todo: add custom alarm monitoring programs to a few consoles)

* A LIKE SUPREME

* a

* power monitor

* lights on

* fuck this code, fuck nanoui modules, and fuck nanoui

* LEAVE IT OH SO FAR BEHIND

* fix alarm monitoring for synths

* I SAW IN YOU WHAT LIFE WAS MISSING

* comms console

* idcard and record updates

* turn the light on

* arcade

* pt2

* news browser

* static

* crusher

* f

* COULD I JUST SLEIGH THE GOLD FROM THE BALLS? I'M SO FRUSTRATED OH COULD YOU TELL? IF I HEAR ONE MORE VUEUI OR ONE NANOUI I'M GONNA LOSE IT SO LET ME GOOOOOOOOOOOOOOOOO

* codeowners & suit sensors

* html ui style removal

* make lint happy

* tgchat

* tgpanels pt1

* THE SOUL LONGS FOR OBLIVION!!!!!!!!!!!!!!!!!

* figure out why stat isnt working

* goodbye ping

* shhh

* stat updates

* An oath sworn in scors! Omni vortex lies!

* final almost edits

* fix that

* last skin adjustments

* resist and disorder

* i slowly get up and turn off the noise, already fed up...

* pleaseeeeeeeeeeeeeee

* THE CREDIT LARP IS NECESSARY

* i hold the keys

* RISE UP

* fix that?

* harry's suggestions xoxo

* runtime fix pt2

* You are the only thing that I still care about

* fix runtimes and cl

* whoops

* misc fixes

* fix that too

* adds build workflow

* f

* Update update_tgui.yml

* adds some needed steps

* ATM

* misc fixes and tweaks

* fixes 2

* make newscasters usable and fix use power on freezers

* turret control is clearer

* remove duplicate

* makes some verb tabs work properly

* makes verbs work properly for real

* sans moi

* fixes pt2

* fix the chat unnecessarily reloading

* fixes

* epic

* fixes

* fix missing consoles

---------

Co-authored-by: John Wildkins <john.wildkins@gmail.com>
Co-authored-by: Matt Atlas <liermattia@gmail.com>
Co-authored-by: harryob <55142896+harryob@users.noreply.github.com>
Co-authored-by: Werner <Arrow768@users.noreply.github.com>
Co-authored-by: Geeves <ggrobler447@gmail.com>
Co-authored-by: harryob <me@harryob.live>
This commit is contained in:
Matt Atlas
2023-06-26 02:00:14 +02:00
committed by GitHub
co-authored by John Wildkins Matt Atlas harryob Werner Geeves harryob
parent 3cc846c1fe
commit 659752e2ea
266 changed files with 4277 additions and 5936 deletions
+1 -1
View File
@@ -9,7 +9,7 @@
anchored = 1
density = 0
layer = OBJ_LAYER + 0.9
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
animate_movement = 0
var/solid_time = 120
var/amount = 3
+1 -1
View File
@@ -2,7 +2,7 @@
name = "water"
icon = 'icons/effects/effects.dmi'
icon_state = "extinguish"
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
pass_flags = PASSTABLE | PASSGRILLE
/obj/effect/effect/water/New(loc)
@@ -143,7 +143,7 @@
user.bloody_hands = taken
user.hand_blood_color = basecolor
user.update_inv_gloves(1)
user.verbs += /mob/living/carbon/human/proc/bloody_doodle
add_verb(user, /mob/living/carbon/human/proc/bloody_doodle)
/obj/effect/decal/cleanable/blood/splatter
random_icon_states = list("mgibbl1", "mgibbl2", "mgibbl3", "mgibbl4", "mgibbl5")
@@ -30,7 +30,7 @@
anchored = TRUE
icon = 'icons/effects/effects.dmi'
icon_state = "dirt"
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/effect/decal/cleanable/flour
name = "flour"
@@ -172,4 +172,4 @@
density = FALSE
anchored = TRUE
icon = 'icons/effects/effects.dmi'
icon_state = "acid_puddle"
icon_state = "acid_puddle"
+2 -2
View File
@@ -8,7 +8,7 @@
icon_state = "arrow"
layer = 16.0
anchored = 1
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
// Used for spray that you spray at walls, tables, hydrovats etc
/obj/effect/decal/spraystill
@@ -43,4 +43,4 @@
/obj/effect/decal/fake_object/light_source/invisible
simulated = 0
invisibility = 101
invisibility = 101
+2 -2
View File
@@ -9,7 +9,7 @@ would spawn and follow the beaker, even if it is carried or thrown.
/obj/effect/effect
name = "effect"
icon = 'icons/effects/effects.dmi'
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
unacidable = 1//So effect are not targeted by alien acid.
pass_flags = PASSTABLE | PASSGRILLE
@@ -98,7 +98,7 @@ steam.start() -- spawns the effect
icon_state = "smoke"
opacity = 1
anchored = 0.0
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/amount = 6.0
var/time_to_live = 100
@@ -4,7 +4,7 @@
icon_state = "explosion_particle"
opacity = 1
anchored = 1
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/effect/expl_particles/New()
..()
@@ -41,7 +41,7 @@
icon_state = "explosion"
opacity = 1
anchored = 1
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
pixel_x = -32
pixel_y = -32
+1 -1
View File
@@ -18,7 +18,7 @@
..(loc)
appearance = target
// Reset some vars.
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
alpha /= 4
dir = target.dir
if (!color)
+1 -1
View File
@@ -59,7 +59,7 @@
icon_state = "nothing"
anchored = 1
layer = 5
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/duration = 10 //in deciseconds
var/randomdir = TRUE
var/timerid
@@ -8,7 +8,7 @@
light_power = 1
light_range = 2
light_color = "#00ffff"
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
appearance_flags = 0
/obj/effect/projectile/singularity_pull()
@@ -53,4 +53,4 @@
forceMove(new_loc)
for(var/i in 1 to increment)
pixel_x += round((sin(angle_override)+16*sin(angle_override)*2), 1)
pixel_y += round((cos(angle_override)+16*cos(angle_override)*2), 1)
pixel_y += round((cos(angle_override)+16*cos(angle_override)*2), 1)
@@ -5,6 +5,6 @@
/obj/effect/temp_visual/incorporeal_mech/Initialize(mapload, new_dir, var/mob/living/heavy_vehicle/HV)
. = ..()
appearance = HV.appearance
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
opacity = FALSE
animate(src, time = duration, alpha = 0)
animate(src, time = duration, alpha = 0)
@@ -2,7 +2,7 @@
icon = 'icons/mob/mob.dmi'
icon_state = "phasein"
layer = ABOVE_MOB_LAYER
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
duration = 15
/obj/effect/temp_visual/phase/out
@@ -16,4 +16,4 @@
/obj/effect/temp_visual/phase/rift/Initialize(mapload, dir)
. = ..()
SpinAnimation()
SpinAnimation()
@@ -3,7 +3,7 @@
icon_state = "nothing"
anchored = TRUE
layer = ABOVE_MOB_LAYER
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
var/duration = 10 //in deciseconds
var/randomdir = TRUE
+29 -2
View File
@@ -340,10 +340,27 @@
//Apparently called whenever an item is dropped on the floor, thrown, or placed into a container.
//It is called after loc is set, so if placed in a container its loc will be that container.
/obj/item/proc/dropped(var/mob/user)
SHOULD_CALL_PARENT(TRUE)
remove_item_verbs(user)
if(zoom)
zoom(user) //binoculars, scope, etc
SEND_SIGNAL(src, COMSIG_ITEM_REMOVE, src)
/obj/item/proc/remove_item_verbs(mob/user)
if(ismech(user)) //very snowflake, but necessary due to how mechs work
return
if(QDELING(user))
return
var/list/verbs_to_remove = list()
for(var/v in verbs)
var/verbstring = "[v]"
if(length(user.item_verbs[verbstring]) == 1)
if(user.item_verbs[verbstring][1] == src)
verbs_to_remove += v
LAZYREMOVE(user.item_verbs[verbstring], src)
remove_verb(user, verbs_to_remove)
// Called whenever an object is moved around inside the mob's contents.
// Linker proc: mob/proc/prepare_for_slotmove, which is referenced in proc/handle_item_insertion and obj/item/attack_hand.
// This shit exists so that dropped() could almost exclusively be called when an item is dropped.
@@ -378,6 +395,7 @@
// slot uses the slot_X defines found in setup.dm
// for items that can be placed in multiple slots
/obj/item/proc/equipped(var/mob/user, var/slot)
SHOULD_CALL_PARENT(TRUE)
layer = SCREEN_LAYER+0.01
equip_slot = slot
if(user.client) user.client.screen |= src
@@ -389,7 +407,16 @@
playsound(src, equip_sound, EQUIP_SOUND_VOLUME)
else
playsound(src, drop_sound, DROP_SOUND_VOLUME)
return
if(item_action_slot_check(user, slot))
add_verb(user, verbs)
for(var/v in verbs)
LAZYDISTINCTADD(user.item_verbs["[v]"], src)
else
remove_item_verbs(user)
//sometimes we only want to grant the item's action if it's equipped in a specific slot.
/obj/item/proc/item_action_slot_check(mob/user, slot)
return TRUE
//Defines which slots correspond to which slot flags
var/list/global/slot_flags_enumeration = list(
@@ -1070,4 +1097,4 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
return FALSE
/obj/item/proc/is_shovel()
return FALSE
return FALSE
+1
View File
@@ -98,6 +98,7 @@
user.drop_from_inventory(src)
/obj/item/pen/crayon/augment/dropped()
. = ..()
loc = null
qdel(src)
+1 -1
View File
@@ -445,7 +445,7 @@
..()
/obj/item/device/paicard/dropped(mob/user)
. = ..()
///When an object is put into a container, drop fires twice.
//once with it on the floor, and then once in the container
//We only care about the second one
+1 -1
View File
@@ -106,7 +106,7 @@
I.color = C.color
I.alpha = 100
I.mouse_opacity = 0
I.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
. = I
// Add it to cache, cutting old entries if the list is too long
@@ -88,6 +88,7 @@
/obj/item/device/taperecorder/verb/record()
set name = "Start Recording"
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return
@@ -137,6 +138,7 @@
/obj/item/device/taperecorder/verb/clear_memory()
set name = "Clear Memory"
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return
@@ -158,6 +160,7 @@
/obj/item/device/taperecorder/verb/playback_memory()
set name = "Playback Memory"
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return
@@ -208,6 +211,7 @@
/obj/item/device/taperecorder/verb/print_transcript()
set name = "Print Transcript"
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return
@@ -240,6 +244,7 @@
/obj/item/device/taperecorder/verb/eject_usb()
set name = "Eject Portable Storage"
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return
@@ -14,6 +14,7 @@
set name = "Set Hailer Message"
set category = "Object"
set desc = "Alter the message shouted by your hailer."
set src in usr
if(!isnull(insults))
to_chat(usr, "The hailer is fried. The tiny input screen just shows a waving ASCII penis.")
+2 -2
View File
@@ -66,9 +66,9 @@
chemtraces += V
/obj/item/autopsy_scanner/verb/print_data()
set category = "Object"
set src in view(usr, 1)
set name = "Print Data"
set category = "Object"
set src in usr
if(use_check_and_message(usr))
return
@@ -723,6 +723,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
thrower.drop_from_inventory(src)
/obj/item/flame/lighter/zippo/augment/dropped()
. = ..()
loc = null
qdel(src)
@@ -166,7 +166,7 @@
..()
var/mob/living/L = target
L.cloaked = 1
L.mouse_opacity = 0
L.mouse_opacity = MOUSE_OPACITY_TRANSPARENT
L.update_icon()
/datum/modifier/cloaking_device/deactivate()
@@ -179,7 +179,7 @@
return
var/mob/living/L = target
L.cloaked = 0
L.mouse_opacity = 1
L.mouse_opacity = MOUSE_OPACITY_ICON
L.update_icon()
/datum/modifier/cloaking_device/check_validity()
@@ -1,113 +0,0 @@
/*
* SeedBag
*/
//uncomment when this is updated to match storage update
/*
/obj/item/seedbag
icon = 'icons/obj/hydroponics_machines.dmi'
icon_state = "seedbag"
name = "Seed Bag"
desc = "A small satchel made for organizing seeds."
var/mode = 1; //0 = pick one at a time, 1 = pick all on tile
var/capacity = 500; //the number of seeds it can carry.
slot_flags = SLOT_BELT
w_class = ITEMSIZE_TINY
var/list/item_quants = list()
/obj/item/seedbag/attack_self(mob/user as mob)
user.machine = src
interact(user)
/obj/item/seedbag/verb/toggle_mode()
set name = "Switch Bagging Method"
set category = "Object"
mode = !mode
switch (mode)
if(1)
to_chat(usr, "The bag now picks up all seeds in a tile at once.")
if(0)
to_chat(usr, "The bag now picks up one seed pouch at a time.")
/obj/item/seeds/attackby(var/obj/item/O as obj, var/mob/user as mob)
..()
if (istype(O, /obj/item/seedbag))
var/obj/item/seedbag/S = O
if (S.mode == 1)
for (var/obj/item/seeds/G in locate(src.x,src.y,src.z))
if (S.contents.len < S.capacity)
S.contents += G;
if(S.item_quants[G.name])
S.item_quants[G.name]++
else
S.item_quants[G.name] = 1
else
to_chat(user, "<span class='warning'>The seed bag is full.</span>")
S.updateUsrDialog()
return
to_chat(user, "<span class='notice'>You pick up all the seeds.</span>")
else
if (S.contents.len < S.capacity)
S.contents += src;
if(S.item_quants[name])
S.item_quants[name]++
else
S.item_quants[name] = 1
else
to_chat(user, "<span class='warning'>The seed bag is full.</span>")
S.updateUsrDialog()
return
/obj/item/seedbag/interact(mob/user as mob)
var/dat = "<TT><b>Select an item:</b><br>"
if (contents.len == 0)
dat += "<font color = 'red'>No seeds loaded!</font>"
else
for (var/O in item_quants)
if(item_quants[O] > 0)
var/N = item_quants[O]
dat += "<FONT color = 'blue'><B>[capitalize(O)]</B>:"
dat += " [N] </font>"
dat += "<a href='byond://?src=\ref[src];vend=[O]'>Vend</A>"
dat += "<br>"
dat += "<br><a href='byond://?src=\ref[src];unload=1'>Unload All</A>"
dat += "</TT>"
user << browse("<HEAD><TITLE>Seedbag Supplies</TITLE></HEAD><TT>[dat]</TT>", "window=seedbag")
onclose(user, "seedbag")
return
/obj/item/seedbag/Topic(href, href_list)
if(..())
return
usr.machine = src
if ( href_list["vend"] )
var/N = href_list["vend"]
if(item_quants[N] <= 0) // Sanity check, there are probably ways to press the button when it shouldn't be possible.
return
item_quants[N] -= 1
for(var/obj/O in contents)
if(O.name == N)
O.forceMove(get_turf(src))
usr.put_in_hands(O)
break
else if ( href_list["unload"] )
item_quants.Cut()
for(var/obj/O in contents )
O.forceMove(get_turf(src))
src.updateUsrDialog()
return
/obj/item/seedbag/updateUsrDialog()
var/list/nearby = range(1, src)
for(var/mob/M in nearby)
if ((M.client && M.machine == src))
src.attack_self(M)
*/
@@ -84,6 +84,8 @@
/obj/item/material/kitchen/utensil/verb/bite_size()
set name = "Change bite size"
set category = "Object"
set src in usr
var/nsize = input("Bite Size","Pick the amount of reagents to pick up.") as null|anything in bite_sizes
if(nsize)
transfer_amt = nsize
@@ -81,6 +81,7 @@
return ..()
/obj/item/material/twohanded/dropped(mob/user as mob)
. = ..()
//handles unwielding a twohanded weapon when dropped as well as clearing up the offhand
if(user)
var/obj/item/material/twohanded/O = user.get_inactive_hand()
@@ -585,6 +586,7 @@
/obj/item/material/twohanded/pike/flag/verb/plant()
set name = "Plant Flag"
set category = "Object"
set src in usr
if(ishuman(usr))
var/mob/living/user = usr
@@ -430,6 +430,7 @@
/obj/item/melee/energy/blade/dropped()
. = ..()
QDEL_IN(src, 1)
/obj/item/melee/energy/blade/process()
@@ -50,6 +50,7 @@
/obj/item/storage/belt/verb/toggle_layer()
set name = "Switch Belt Layer"
set category = "Object"
set src in usr
if(show_above_suit == -1)
to_chat(usr, SPAN_NOTICE("\The [src] cannot be worn above your suit!"))
@@ -601,4 +602,4 @@
icon_state = "belt_b"
item_state = "belt_b"
build_from_parts = TRUE
worn_overlay = "buckle"
worn_overlay = "buckle"
@@ -85,6 +85,6 @@
equip_sound = null
/obj/item/storage/laundry_basket/offhand/dropped(mob/user as mob)
. = ..()
user.drop_from_inventory(linked)
return
@@ -577,7 +577,7 @@
return handle_item_insertion(W, null, user)
/obj/item/storage/dropped(mob/user as mob)
return
return ..()
/obj/item/storage/attack_hand(mob/user)
if(ishuman(user))
@@ -610,6 +610,7 @@
/obj/item/storage/verb/toggle_gathering_mode()
set name = "Switch Gathering Method"
set category = "Object"
set src in usr
collection_mode = !collection_mode
switch (collection_mode)
@@ -622,6 +623,7 @@
/obj/item/storage/verb/quick_empty()
set name = "Empty Contents"
set category = "Object"
set src in usr
if((!ishuman(usr) && (src.loc != usr)) || usr.stat || usr.restrained())
return
@@ -53,6 +53,7 @@
/obj/item/tank/jetpack/verb/toggle_rockets()
set name = "Toggle Jetpack Stabilization"
set category = "Object"
set src in usr
toggle_rockets_stabilization(usr)
@@ -65,6 +66,7 @@
/obj/item/tank/jetpack/verb/toggle()
set name = "Toggle Jetpack"
set category = "Object"
set src in usr
toggle_jetpack(usr)
@@ -157,6 +159,7 @@
/obj/item/tank/jetpack/carbondioxide/synthetic/verb/toggle_synthetic_jetpack()
set name = "Toggle Jetpack"
set category = "Robot Commands"
set src in usr
on = !on
if(on)
@@ -171,6 +174,7 @@
/obj/item/tank/jetpack/carbondioxide/synthetic/verb/toggle_stabilizer()
set name = "Toggle Jetpack Stabilization"
set category = "Robot Commands"
set src in usr
stabilization_on = !stabilization_on
to_chat(usr, SPAN_NOTICE("You toggle the stabilization [stabilization_on ? "on" : "off"]."))
@@ -26,6 +26,8 @@
/obj/item/watertank/verb/toggle_mister()
set name = "Toggle Mister"
set category = "Object"
set src in usr
var/mob/living/carbon/human/user
if(istype(usr,/mob/living/carbon/human))
user = usr
+1
View File
@@ -41,6 +41,7 @@
/obj/item/towel/verb/lay_out()
set name = "Lay Out Towel"
set category = "Object"
set src in usr
to_chat(usr, "<span class='notice'>You lay out \the [src] flat on the ground.</span>")
var/obj/item/towel_flat/T = new /obj/item/towel_flat(usr.loc)
@@ -8,6 +8,7 @@
var/net_type = /obj/effect/energy_net
/obj/item/energy_net/dropped()
. = ..()
if(!QDELETED(src))
QDEL_IN(src, 1)
+1 -1
View File
@@ -94,7 +94,7 @@
/obj/effect/reflection
name = "reflection"
appearance_flags = KEEP_TOGETHER|TILE_BOUND|PIXEL_SCALE
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
vis_flags = VIS_HIDE
layer = ABOVE_OBJ_LAYER
var/alpha_icon = 'icons/obj/watercloset.dmi'
+1 -1
View File
@@ -161,7 +161,7 @@
icon_state = "mist"
layer = MOB_LAYER + 1
anchored = 1
mouse_opacity = 0
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
/obj/machinery/shower/attack_hand(mob/M as mob)
on = !on