diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index ba570eca06d..8c8a68240b6 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -144,3 +144,9 @@
if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs)))
return FALSE
return ..()
+
+/mob/living/proc/CanSpreadAirborneDisease()
+ return !is_mouth_covered()
+
+/mob/living/carbon/CanSpreadAirborneDisease()
+ return !((head && (head.flags_cover & HEADCOVERSMOUTH) && (head.armor.getRating("bio") >= 25)) || (wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH) && (wear_mask.armor.getRating("bio") >= 25)))
diff --git a/code/datums/diseases/advance/symptoms/cough.dm b/code/datums/diseases/advance/symptoms/cough.dm
index 83d93c55e09..e4283101f54 100644
--- a/code/datums/diseases/advance/symptoms/cough.dm
+++ b/code/datums/diseases/advance/symptoms/cough.dm
@@ -70,6 +70,6 @@ BONUS
addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 6)
addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 12)
addtimer(CALLBACK(M, /mob/.proc/emote, "cough"), 18)
- if(infective)
+ if(infective && M.CanSpreadAirborneDisease())
A.spread(1)
diff --git a/code/datums/diseases/advance/symptoms/sneeze.dm b/code/datums/diseases/advance/symptoms/sneeze.dm
index 8fe70c542f9..2c51a134db7 100644
--- a/code/datums/diseases/advance/symptoms/sneeze.dm
+++ b/code/datums/diseases/advance/symptoms/sneeze.dm
@@ -48,4 +48,5 @@ Bonus
M.emote("sniff")
else
M.emote("sneeze")
- A.spread(4 + power)
\ No newline at end of file
+ if(M.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
+ A.spread(4 + power)
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 5c5e4603b8f..2be33563f93 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -95,7 +95,7 @@
if(BODY_ZONE_PRECISE_MOUTH)
- if((M.head && M.head.flags_cover & HEADCOVERSMOUTH) || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSMOUTH))
+ if(M.is_mouth_covered())
to_chat(user, "You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSMOUTH) ? "helmet" : "mask"] first.")
return
@@ -479,7 +479,7 @@
if(!on)
on = TRUE
START_PROCESSING(SSobj, src)
-
+
/obj/item/flashlight/glowstick/suicide_act(mob/living/carbon/human/user)
if(!fuel)
user.visible_message("[user] is trying to squirt [src]'s fluids into [user.p_their()] eyes... but it's empty!")
diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm
index 07cd3030b18..96ea5c0834c 100644
--- a/code/modules/antagonists/disease/disease_abilities.dm
+++ b/code/modules/antagonists/disease/disease_abilities.dm
@@ -152,8 +152,9 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
return FALSE
to_chat(D, "You force [L.real_name] to cough.")
L.emote("cough")
- var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
- SD.spread(2)
+ if(L.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
+ var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
+ SD.spread(2)
StartCooldown()
return TRUE
@@ -185,11 +186,12 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
return FALSE
to_chat(D, "You force [L.real_name] to sneeze.")
L.emote("sneeze")
- var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
+ if(L.CanSpreadAirborneDisease()) //don't spread germs if they covered their mouth
+ var/datum/disease/advance/sentient_disease/SD = D.hosts[L]
- for(var/mob/living/M in oview(4, SD.affected_mob))
- if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M)))
- M.AirborneContractDisease(SD, TRUE)
+ for(var/mob/living/M in oview(4, SD.affected_mob))
+ if(is_A_facing_B(SD.affected_mob, M) && disease_air_spread_walk(get_turf(SD.affected_mob), get_turf(M)))
+ M.AirborneContractDisease(SD, TRUE)
StartCooldown()
return TRUE