diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 7c8bed1c894..27a759dfc2b 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -370,8 +370,10 @@
var/busy = 0 //Something's being washed at the moment
-/obj/structure/sink/attack_hand(mob/user)
- if(isrobot(user) || isAI(user))
+/obj/structure/sink/attack_hand(mob/living/user)
+ if(!user || !istype(user))
+ return
+ if(!iscarbon(user))
return
if(!Adjacent(user))
return
@@ -379,17 +381,32 @@
if(busy)
user << "Someone's already washing here."
return
-
- user << "You start washing your hands..."
-
+ var/selected_area = parse_zone(user.zone_sel.selecting)
+ var/washing_face = 0
+ if(selected_area in list("head", "mouth", "eyes"))
+ washing_face = 1
+ user.visible_message("[user] start washing their [washing_face ? "face" : "hands"]...", \
+ "You start washing your [washing_face ? "face" : "hands"]...")
busy = 1
- sleep(40)
+
+ if(!do_after(user, 40, target = src))
+ busy = 0
+ return
+
busy = 0
- if(!Adjacent(user)) return //Person has moved away from the sink
-
- user.clean_blood()
- user.visible_message("[user] washes their hands in [src].", "You wash your hands in [src].")
+ user.visible_message("[user] washes their [washing_face ? "face" : "hands"] using [src].", \
+ "You wash your [washing_face ? "face" : "hands"] using [src].")
+ if(washing_face)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ H.lip_style = null //Washes off lipstick
+ H.lip_color = initial(H.lip_color)
+ H.regenerate_icons()
+ user.drowsyness -= rand(2,3) //Washing your face wakes you up if you're falling asleep
+ user.drowsyness = Clamp(user.drowsyness, 0, INFINITY)
+ else
+ user.clean_blood()
/obj/structure/sink/attackby(obj/item/O, mob/user, params)
@@ -399,26 +416,24 @@
if(istype(O, /obj/item/weapon/reagent_containers))
var/obj/item/weapon/reagent_containers/RG = O
- RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this))
- user << "You fill [RG] from [src]."
- return
+ if(RG.flags & OPENCONTAINER)
+ RG.reagents.add_reagent("water", min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this))
+ user << "You fill [RG] from [src]."
+ return
if(istype(O, /obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = O
if(B.bcell)
if(B.bcell.charge > 0 && B.status == 1)
flick("baton_active", src)
- user.Stun(10)
- user.stuttering = 10
- user.Weaken(10)
- if(isrobot(user))
- var/mob/living/silicon/robot/R = user
- R.cell.charge -= 20
- else
- B.deductcharge(B.hitcost)
- user.visible_message( \
- "[user] was stunned by \his wet [O]!", \
- "[user] was stunned by \his wet [O]!")
+ var/stunforce = B.stunforce
+ user.Stun(stunforce)
+ user.Weaken(stunforce)
+ user.stuttering = stunforce
+ B.deductcharge(B.hitcost)
+ user.visible_message("[user] shocks themself while attempting to wash the active [B.name]!", \
+ "You unwisely attempt to wash [B] while it's still on.")
+ playsound(src, "sparks", 50, 1)
return
if(istype(O, /obj/item/weapon/mop))
@@ -426,26 +441,21 @@
user << "You wet [O] in [src]."
playsound(loc, 'sound/effects/slosh.ogg', 25, 1)
- var/turf/location = user.loc
- if(!isturf(location)) return
-
var/obj/item/I = O
- if(!I || !istype(I,/obj/item)) return
-
- usr << "You start washing [I]..."
+ if(!I || !istype(I))
+ return
+ if(I.flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand.
+ return
+ user << "You start washing [I]..."
busy = 1
- sleep(40)
+ if(!do_after(user, 40, target = src))
+ busy = 0
+ return
busy = 0
-
- if(user.loc != location) return //User has moved
- if(!I) return //Item's been destroyed while washing
- if(user.get_active_hand() != I) return //Person has switched hands or the item in their hands
-
O.clean_blood()
- user.visible_message( \
- "[user] washes [I] using [src].", \
- "You wash [I] using [src].")
+ user.visible_message("[user] washes [I] using [src].", \
+ "You wash [I] using [src].")
/obj/structure/sink/kitchen