diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index 7ad5041344d..c3db29286d5 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -87,6 +87,7 @@
//Bit flags for the flags_inv variable, which determine when a piece of clothing hides another. IE a helmet hiding glasses.
+//Make sure to update check_obscured_slots() if you add more.
#define HIDEGLOVES (1<<0)
#define HIDESUITSTORAGE (1<<1)
#define HIDEJUMPSUIT (1<<2) //these first four are only used in exterior suits
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 009db633085..416758453b4 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -349,56 +349,52 @@
check_heat(M)
for(var/obj/item/I in M.held_items)
wash_obj(I)
- if(M.back)
- if(wash_obj(M.back))
- M.update_inv_back(0)
+
+ if(M.back && wash_obj(M.back))
+ M.update_inv_back(0)
+
+ var/list/obscured = M.check_obscured_slots()
+
+ if(M.head && wash_obj(M.head))
+ M.update_inv_head()
+
+ if(M.glasses && !(SLOT_GLASSES in obscured) && wash_obj(M.glasses))
+ M.update_inv_glasses()
+
+ if(M.wear_mask && !(SLOT_WEAR_MASK in obscured) && wash_obj(M.wear_mask))
+ M.update_inv_wear_mask()
+
+ if(M.ears && !(HIDEEARS in obscured) && wash_obj(M.ears))
+ M.update_inv_ears()
+
+ if(M.wear_neck && !(SLOT_NECK in obscured) && wash_obj(M.wear_neck))
+ M.update_inv_neck()
+
+ if(M.shoes && !(HIDESHOES in obscured) && wash_obj(M.shoes))
+ M.update_inv_shoes()
+
+ var/washgloves = FALSE
+ if(M.gloves && !(HIDEGLOVES in obscured))
+ washgloves = TRUE
+
if(ishuman(M))
var/mob/living/carbon/human/H = M
- var/washgloves = TRUE
- var/washshoes = TRUE
- var/washmask = TRUE
- var/washears = TRUE
- var/washglasses = TRUE
- if(H.wear_suit)
- washgloves = !(H.wear_suit.flags_inv & HIDEGLOVES)
- washshoes = !(H.wear_suit.flags_inv & HIDESHOES)
-
- if(H.head)
- washmask = !(H.head.flags_inv & HIDEMASK)
- washglasses = !(H.head.flags_inv & HIDEEYES)
- washears = !(H.head.flags_inv & HIDEEARS)
-
- if(H.wear_mask)
- if (washears)
- washears = !(H.wear_mask.flags_inv & HIDEEARS)
- if (washglasses)
- washglasses = !(H.wear_mask.flags_inv & HIDEEYES)
-
- if(H.head && wash_obj(H.head))
- H.update_inv_head()
if(H.wear_suit && wash_obj(H.wear_suit))
H.update_inv_wear_suit()
else if(H.w_uniform && wash_obj(H.w_uniform))
H.update_inv_w_uniform()
+
if(washgloves)
SEND_SIGNAL(H, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
- if(H.shoes && washshoes && wash_obj(H.shoes))
- H.update_inv_shoes()
- if(H.wear_mask && washmask && wash_obj(H.wear_mask))
- H.update_inv_wear_mask()
- else
+
+ if(!H.is_mouth_covered())
H.lip_style = null
H.update_body()
- if(H.glasses && washglasses && wash_obj(H.glasses))
- H.update_inv_glasses()
- if(H.ears && washears && wash_obj(H.ears))
- H.update_inv_ears()
+
if(H.belt && wash_obj(H.belt))
H.update_inv_belt()
else
- if(M.wear_mask && wash_obj(M.wear_mask))
- M.update_inv_wear_mask(0)
SEND_SIGNAL(M, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
else
SEND_SIGNAL(L, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_STRENGTH_BLOOD)
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 57a43484ecd..d5349700e65 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -243,6 +243,27 @@
"[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM.name].")
+/mob/living/carbon/proc/check_obscured_slots()
+ var/list/obscured = list()
+
+ if(head)
+ if(head.flags_inv & HIDENECK)
+ obscured |= SLOT_NECK
+ if(head.flags_inv & HIDEMASK)
+ obscured |= SLOT_WEAR_MASK
+ if(head.flags_inv & HIDEEYES)
+ obscured |= SLOT_GLASSES
+ if(head.flags_inv & HIDEEARS)
+ obscured |= SLOT_EARS
+
+ if(wear_mask)
+ if(wear_mask.flags_inv & HIDEEYES)
+ obscured |= SLOT_GLASSES
+ if(wear_mask.flags_inv & HIDEEARS)
+ obscured |= SLOT_EARS
+
+ return obscured
+
/mob/living/carbon/fall(forced)
loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing
@@ -895,7 +916,7 @@
for(var/X in internal_organs)
var/obj/item/organ/I = X
I.Insert(src)
-
+
/mob/living/carbon/proc/update_disabled_bodyparts()
for(var/B in bodyparts)
var/obj/item/bodypart/BP = B
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 4fc56f56c8c..8353460a232 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -508,33 +508,17 @@
// Might need re-wording.
to_chat(user, "There is no exposed flesh or thin material [above_neck(target_zone) ? "on [p_their()] head" : "on [p_their()] body"].")
-/mob/living/carbon/human/proc/check_obscured_slots()
- var/list/obscured = list()
-
+/mob/living/carbon/human/check_obscured_slots()
+ . = ..()
if(wear_suit)
+ if(wear_suit.flags_inv & HIDENECK)
+ . |= SLOT_NECK
if(wear_suit.flags_inv & HIDEGLOVES)
- obscured |= SLOT_GLOVES
+ . |= SLOT_GLOVES
if(wear_suit.flags_inv & HIDEJUMPSUIT)
- obscured |= SLOT_W_UNIFORM
+ . |= SLOT_W_UNIFORM
if(wear_suit.flags_inv & HIDESHOES)
- obscured |= SLOT_SHOES
-
- if(head)
- if(head.flags_inv & HIDEMASK)
- obscured |= SLOT_WEAR_MASK
- if(head.flags_inv & HIDEEYES)
- obscured |= SLOT_GLASSES
- if(head.flags_inv & HIDEEARS)
- obscured |= SLOT_EARS
-
- if(wear_mask)
- if(wear_mask.flags_inv & HIDEEYES)
- obscured |= SLOT_GLASSES
-
- if(obscured.len)
- return obscured
- else
- return null
+ . |= SLOT_SHOES
/mob/living/carbon/human/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null)
if(judgement_criteria & JUDGE_EMAGGED)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index f3ab7ba347d..79547a21c1e 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1546,50 +1546,45 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(H.on_fire)
//the fire tries to damage the exposed clothes and items
var/list/burning_items = list()
+ var/list/obscured = H.check_obscured_slots()
//HEAD//
- var/obj/item/clothing/head_clothes = null
- if(H.glasses)
- head_clothes = H.glasses
- if(H.wear_mask)
- head_clothes = H.wear_mask
- if(H.wear_neck)
- head_clothes = H.wear_neck
- if(H.head)
- head_clothes = H.head
- if(head_clothes)
- burning_items += head_clothes
- else if(H.ears)
+
+ if(H.glasses && !(SLOT_GLASSES in obscured))
+ burning_items += H.glasses
+ if(H.wear_mask && !(SLOT_WEAR_MASK in obscured))
+ burning_items += H.wear_mask
+ if(H.wear_neck && !(SLOT_NECK in obscured))
+ burning_items += H.wear_neck
+ if(H.ears && !(SLOT_EARS in obscured))
burning_items += H.ears
+ if(H.head)
+ burning_items += H.head
//CHEST//
- var/obj/item/clothing/chest_clothes = null
- if(H.w_uniform)
- chest_clothes = H.w_uniform
+ if(H.w_uniform && !(SLOT_W_UNIFORM in obscured))
+ burning_items += H.w_uniform
if(H.wear_suit)
- chest_clothes = H.wear_suit
-
- if(chest_clothes)
- burning_items += chest_clothes
+ burning_items += H.wear_suit
//ARMS & HANDS//
var/obj/item/clothing/arm_clothes = null
- if(H.gloves)
+ if(H.gloves && !(SLOT_GLOVES in obscured))
arm_clothes = H.gloves
- if(H.w_uniform && ((H.w_uniform.body_parts_covered & HANDS) || (H.w_uniform.body_parts_covered & ARMS)))
- arm_clothes = H.w_uniform
- if(H.wear_suit && ((H.wear_suit.body_parts_covered & HANDS) || (H.wear_suit.body_parts_covered & ARMS)))
+ else if(H.wear_suit && ((H.wear_suit.body_parts_covered & HANDS) || (H.wear_suit.body_parts_covered & ARMS)))
arm_clothes = H.wear_suit
+ else if(H.w_uniform && ((H.w_uniform.body_parts_covered & HANDS) || (H.w_uniform.body_parts_covered & ARMS)))
+ arm_clothes = H.w_uniform
if(arm_clothes)
burning_items |= arm_clothes
//LEGS & FEET//
var/obj/item/clothing/leg_clothes = null
- if(H.shoes)
+ if(H.shoes && !(SLOT_SHOES in obscured))
leg_clothes = H.shoes
- if(H.w_uniform && ((H.w_uniform.body_parts_covered & FEET) || (H.w_uniform.body_parts_covered & LEGS)))
- leg_clothes = H.w_uniform
- if(H.wear_suit && ((H.wear_suit.body_parts_covered & FEET) || (H.wear_suit.body_parts_covered & LEGS)))
+ else if(H.wear_suit && ((H.wear_suit.body_parts_covered & FEET) || (H.wear_suit.body_parts_covered & LEGS)))
leg_clothes = H.wear_suit
+ else if(H.w_uniform && ((H.w_uniform.body_parts_covered & FEET) || (H.w_uniform.body_parts_covered & LEGS)))
+ leg_clothes = H.w_uniform
if(leg_clothes)
burning_items |= leg_clothes
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index b677a57d7fd..8d65c7e9b17 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -136,7 +136,7 @@
inv.update_icon()
if(wear_neck)
- if(!(head && (head.flags_inv & HIDENECK)))
+ if(!(SLOT_NECK in check_obscured_slots()))
overlays_standing[NECK_LAYER] = wear_neck.build_worn_icon(state = wear_neck.icon_state, default_layer = NECK_LAYER, default_icon_file = 'icons/mob/neck.dmi')
update_hud_neck(wear_neck)